うぃろぅ.log

140字で綴りきれない日々の徒然備忘録

【Windows サービス】 Visual Studio 2017でWindows サービスを作る その3

うぃろぅです。

さくっとその3も公開しようと思っていたのに他の作業に追われてちょっと後回しにしている間に10日経ってしまった。

10日前の記憶なんて容易に忘れてしまうもので、アウトプットしているならなおのこと。
自分の参考のためにも前回のリンクを貼っておく。

【Windows サービス】 Visual Studio 2017でWindows サービスを作る その1
【Windows サービス】 Visual Studio 2017でWindows サービスを作る その2

では引き続き。

ゴール設定

前回はフォルダ/ファイル検知を開始するところまで作成したので、今回は

  • 検知したフォルダ/ファイルのパスをテキストファイルに出力

を目指す。

とりあえず形にする

出力先とファイル名を適当に設定し、単純にテキストファイルに書き込むならこうなる。

/// <summary>
/// 作成検知
/// </summary>
/// <param name="sender">イベント発生元</param>
/// <param name="e">イベントデータ</param>
private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    var logPath = Path.Combine(@"C:\VisualStudio\WatchService\log", "Watcher.log");

    using (StreamWriter sw = new StreamWriter(logPath, true, Encoding.UTF8))
    {
        sw.WriteLine($"作成検知 : {e.FullPath}");
    }
}

/// <summary>
/// 名前変更
/// </summary>
/// <param name="sender">イベント発生元</param>
/// <param name="e">イベントデータ</param>
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
    var logPath = Path.Combine(@"C:\VisualStudio\WatchService\log", "Watcher.log");

    using (StreamWriter sw = new StreamWriter(logPath, true, Encoding.UTF8))
    {
        sw.WriteLine($"名前変更検知 : {e.FullPath}");
    }
}

わーい頭わるーい
動かしてみる。

f:id:vviilloovv:20181126114014p:plain

サービス開始して

f:id:vviilloovv:20181126114222p:plain

適当にフォルダを置くと

f:id:vviilloovv:20181126114849p:plain

エラーで止まる。
原因はわかっているがエラーログを見てみる。

Windows サービスのエラーはイベントログとして吐き出されるため、イベントビューアーで見ることができる。

f:id:vviilloovv:20181126115103p:plain

例外情報:System.IO.DirectoryNotFoundException
   場所 System.IO.__Error.WinIOError(Int32, System.String)
   (以下略)

ログ出力フォルダを作成していなかった。

ソースに追記する。

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    var logFolderPath = @"C:\VisualStudio\WatchService\log";
    // ログ出力ディレクトリがない場合のみ作成
    if (!Directory.Exists(logFolderPath))
    {
        Directory.CreateDirectory(logFolderPath);
    }

    var logPath = Path.Combine(logFolderPath, "Watcher.log");

    using (StreamWriter sw = new StreamWriter(logPath, true, Encoding.UTF8))
    {
        sw.WriteLine($"作成検知 : {e.FullPath}");
    }
}

Watcher_Renamedの方にも同様の処理を入れてある。
これでもう一度。

ちなみに、これまで触れていなかったがWindows サービスはデバッグ実行にちょっとした手間が必要で、開始しているサービスにアタッチする必要がある。
ここでは詳しく解説しないが、以下の記事が詳しい。この記事は日本語でもわかりやすい

方法 : Windows サービス アプリケーションをデバッグする | Microsoft Docs

ソースを書き換えた場合、

  1. Windows サービスを停止(今回はエラーで停止済み)
  2. サービス削除
  3. リビルド
  4. サービス登録
  5. サービス開始

の流れで実行することになる。若干面倒だがお試しだしまあ。

f:id:vviilloovv:20181126120900p:plain

サービスを開始して

f:id:vviilloovv:20181126120944p:plain

フォルダを置いてみると

f:id:vviilloovv:20181126121218p:plain

作成検知 : C:\VisualStudio\WatchService\Watch\Test_hoge

テーレッテレー
リネームも試してみる。

f:id:vviilloovv:20181126121456p:plain

f:id:vviilloovv:20181126121518p:plain

作成検知 : C:\VisualStudio\WatchService\Watch\Test_hoge
名前変更検知 : C:\VisualStudio\WatchService\Watch\Sample_fuga  

問題なさそう。

形を整える

さすがにWatcher_CreatedWatcher_Renamedに同じ処理を書き過ぎていて、私はそこまで働き者ではない。
怠惰にいきましょう。

/// <summary>
/// ログ書き込み
/// </summary>
/// <param name="kind">イベント種別</param>
/// <param name="path">検知パス</param>
private void WriteLog (string kind, string path)
{
    var logFolderPath = @"C:\VisualStudio\WatchService\log";
    var logPath = Path.Combine(logFolderPath, "Watcher.log");

    // ログ出力ディレクトリがない場合のみ作成
    if (!Directory.Exists(logFolderPath))
    {
        Directory.CreateDirectory(logFolderPath);
    }

    using (StreamWriter sw = new StreamWriter(logPath, true, Encoding.UTF8))
    {
        sw.WriteLine($"{kind}検知 : {path}");
    }
}

ログ出力クラスを作成。
これに伴って、

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    WriteLog("作成", e.FullPath);
}

/// コメント省略
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
    WriteLog("名前変更", e.FullPath);
}

検知時処理もすっきり。
同期処理なのでイベントをとりあうこともなくこれで問題なさそう。

非同期にしてみる

今回はログ書き込みだけなので同期処理だろうが非同期処理だろうが問題なく動くが、これが

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    WriteLog("作成", e.FullPath);
    (何か時間のかかる処理)
}

だったりすると100件検知したいのにInternalBufferSizeのオーバーフローで実際には30件くらいしか取れませんでした、なんてよくある話。
というか実際あった。

取りこぼしを少しでも減らすためにはInternalBufferSizeを適当に大きくするのもいいが、それとは別に

  • Directory.EnumerateFilesかなにかを使って監視対象フォルダを定期的に走査
  • イベントハンドラを非同期実行にして処理を早く手放す

あたりの対策を打つとよさそう。
非同期処理については以下を読めば大体わかるので参考にしつつ実装してみる。

qiita.com

private async void Watcher_Created(object sender, FileSystemEventArgs e)
{
    await Task.Run(() =>
    {
        WriteLog("作成", e.FullPath);
    });
}

private async void Watcher_Renamed(object sender, RenamedEventArgs e)
{
    await Task.Run(() =>
    {
        WriteLog("名前変更", e.FullPath);
    });
}

これでOK。
結果としてソース全文は以下のようになった。

Watcher.cs(長いので折りたたみ)

using System.IO;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WatchService
{
    public partial class Watcher : ServiceBase
    {
        public Watcher()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            StartFileWatch();
        }

        protected override void OnStop()
        {
        }

        /// <summary>
        /// フォルダ監視処理
        /// </summary>
        private void StartFileWatch()
        {
            // 命名規則を設定
            // 複数条件はスペースを入れず「|」で区切る
            var folderNamingRule = "Test_*|Sample_*";

            var filters = folderNamingRule.Split('|');
            foreach(var filter in filters)
            {
                // インスタンスの設定
                var watcher = new FileSystemWatcher
                {
                    Path = @"C:\VisualStudio\WatchService\Watch",
                    Filter = filter,
                    IncludeSubdirectories = false,
                    NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName
                };

                // 監視バッファサイズの設定
                watcher.InternalBufferSize = 16 * 1024;

                // 監視イベントの設定
                watcher.Created += Watcher_Created;
                watcher.Renamed += Watcher_Renamed;

                // 監視開始
                watcher.EnableRaisingEvents = true;
            }
        }

        /// <summary>
        /// フォルダ作成
        /// </summary>
        /// <param name="sender">イベント発生元</param>
        /// <param name="e">イベントデータ</param>
        private async void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            await Task.Run(() =>
            {
                WriteLog("作成", e.FullPath);
            });
        }

        /// <summary>
        /// フォルダ名変更
        /// </summary>
        /// <param name="sender">イベント発生元</param>
        /// <param name="e">イベントデータ</param>
        private async void Watcher_Renamed(object sender, RenamedEventArgs e)
        {
            await Task.Run(() =>
            {
                WriteLog("名前変更", e.FullPath);
            });
        }

        /// <summary>
        /// ログ書き込み
        /// </summary>
        /// <param name="kind">イベント種別</param>
        /// <param name="path">検知パス</param>
        private void WriteLog (string kind, string path)
        {
            var logFolderPath = @"C:\VisualStudio\WatchService\log";
            var logPath = Path.Combine(logFolderPath, "Watcher.log");

            // ログ出力ディレクトリがない場合のみ作成
            if (!Directory.Exists(logFolderPath))
            {
                Directory.CreateDirectory(logFolderPath);
            }

            using (StreamWriter sw = new StreamWriter(logPath, true, Encoding.UTF8))
            {
                sw.WriteLine($"{kind}検知 : {path}");
            }
        }
    }
}

サービス停止時はwatcher.EnableRaisingEvents = falseにしておいた方がいいような気がするが、まあお試しだし…。

お疲れ様でした

ざっくり書いたけれどそんなに難しいことではない。難しい処理してないし。

エラー処理も全然作りこんでいないしあくまでお試し。
起こりそうなエラーとしては、

  • 非同期処理の内外で同じログに書き込むケースがある場合のIOエラー
  • 監視対象フォルダが存在しない(サービス開始後のパス設定段階でエラーを吐く)
  • ログを排他で開きっぱなし
  • 権限エラー

あたりだろうか。

無事ひと段落!!宣言どおり終わったよ!!!!

黒い画面張ってなかった。いや別に義務というわけではないけれど。

f:id:vviilloovv:20181126151917p:plain

蛇足

業務で使うってんでC#覚えてきたはいいけれど次はKotlinやるかもって気軽に宣言されてなんだその軽いノリでのしかかる学習コスト。
なのでそうと決まった場合Kotlinの記事も書く…かも。

ちなみに個人的にはRubyが好き。これもうわかんねえな

ではまた。

【FjordBootCamp】4日目 HTMLの基礎に触れる

うぃろぅです。

HTMLについて学んでいきます。

3日目もHTMLに取り掛かっていたのでタイトルは4日目です。

HTMLとはなんぞや

以前私が論文の書き方についてレクチャーを受けた時、

○○とは何か。辞書で調べてみた。

という書き出しはしないように、とアドバイスを受けた。

HTMLとは何か。Wikipediaで調べてみた。

HyperText Markup Language - Wikipedia

HyperText Markup Language(ハイパーテキスト マークアップ ランゲージ、HTML(エイチティーエムエル))は、ハイパーテキストを記述するためのマークアップ言語の1つである。

トートロジーかよ。

白鳥とは、白い鳥のことである。

みたいなものでは…?

書いてみる

ともあれ、HTMLとはWebページ用に文章を修飾する記法のことらしい。

例えば、

<h1>見出し1</h1>
    <h2>見出し2</h2>

と書くと

見出し1

見出し2

と表示される。

基本的なことは以下のページを読めばわかる。

HTMLとは?-HTMLの基本

ちなみにこのサイトには実際に手を動かしてサンプルページを作るページ、

ウェブ制作チュートリアル-HTMLクイックリファレンス

があり、これを進めていけばCSSも理解できるようになっている。
私はこれを撤退が決まって時間ができたプロジェクトの業務時間中に1週間ほどで終わらせたが、
わかりやすくまとまっており、オススメ。

ここで学んだことを下地にして課題やればなんとかなるだろうと思っていたら、
そんなことはなかった。

注意すべき点

自分しかいじらないページだからなんでもいいかーってゆるふわと書くことはもちろん可能だが、
サイトが公開されていればHTMLは誰でも参照できる。

例えばはてなブログのトップページで右クリックして、
[ページのソースを表示]を選択すると、こう見えるはず。

f:id:vviilloovv:20181117161553p:plain

上部の怒涛の空行はなんなんだろう…?

あんまりない(と思う)が、例えば電車などで知らない人に
「あのサイトHTMLの書き方汚いよねーwwww」
なんて言われたくないでしょう??
ちなみに私はそんな話題を振る人とお話ししたくない

ということで、できれば以下の点を意識したい。

改行ルールの統一

hsectionの閉じタグ後には空行を入れるなど。
入れるにせよいれないにせよ混在が一番キモチワルイ。

brタグをむやみやたらに使わない

使うなという話ではなく、同じ段落だけれど確実に行頭に持っていきたいという場合以外はpタグの方がいいという話。
最近のサイトはだいたいどこもレスポンシブ対応していて、サイトを見る端末やブラウザの横幅によって改行される場所が勝手に変わる。

なので、PCで見るう場合にはわ
かりやすくても、
スマホから同じサイトを見た場
合、
改行される箇所がPC表示用のた
め、
非常に見づらい。

↑このようなことが起きる。
ガラケーでよく見た風景だ…。

まあ、そもそも1文を短くすれば良い話である。
目指せ要約名人。

インデントを綺麗にする

HTMLに限らず、プログラミングをする場合でも必須。
これができていないとめちゃくちゃ見づらいコードが誕生する。

ソースは他人の見やすいように書く。
他人とは1ヶ月後の自分も含む。これ大事。

見た目を変えたい場合

CSSを使おう。
私もこれからマスターしていく。

短いけれど今回はここらで。
目指せ社会的マッチョ、ということでこれからも精進していきます。

ではまた

【Windows サービス】 Visual Studio 2017でWindows サービスを作る その2

うぃろぅです。

前回の記事から引き続きWindows サービスを作る。
次で終わるといったな。あれは嘘じゃ。

FileSystemWatcherについて調べていたらまた長くなったので、その2は監視処理を開始するところまでとした。
今回で終わるはずだったのに…。

その3がこちら。検知したファイルパスをテキストファイルに出力する。

vviilloovv.hatenablog.com

フォルダ監視

以下のサイトがめちゃくちゃわかりやすい。

Windows サービス - カスタマイズ可能な FileSystemWatcher Windows サービスの作成
フォルダ、ファイルの変更を監視する - .NET Tips (VB.NET,C#...)

Watcher.csのソースを表示し、作りこんでいく。

初期状態のソースはこちら。

using System.ServiceProcess;

namespace WatchService
{
    public partial class Watcher : ServiceBase
    {
        public Watcher()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
        }

        protected override void OnStop()
        {
        }
    }
}

ゴール設定

今回は、

  • Test_, Sample_ で始まるフォルダの作成、名前変更を検知
  • 検知したフォルダのパスをテキストファイルに出力

をゴールとする。

フォルダ監視設定

FileSystemWatcherというクラスがあり、これが大体何とかしてくれる。

フォルダを監視するメソッドをStartFileWatchとして作りこんでいく。

  • OnStart
    サービス開始時に呼ばれる。
    StartFileWatchを呼び出す処理だけ追加。
protected override void OnStart(string[] args)
{
        // フォルダ監視開始
        StartFileWatch();
}
  • StartFileWatch さっき貼ったサイトを参考に淡々と作るだけかと思ったら違った。
    監視対象のフィルターがstring型なので複数条件に対応できない。
    以下を参考にループさせることにした。

Second Room: .NET:FileSystemWatcherで複数フィルタ指定

こんな感じに。

/// <summary>
/// フォルダ監視処理
/// </summary>
private void StartFileWatch()
{
    // 命名規則を設定
    // 複数条件はスペースを入れず「|」で区切る
    var folderNamingRule = "Test_*|Sample_*";

    var filters = folderNamingRule.Split('|');
    foreach(var filter in filters)
    {
        // インスタンスの設定
        var watcher = new FileSystemWatcher
        {
            Path = @"C:\Visual Studio\WatchService\Watch", 
            Filter = filter,
            IncludeSubdirectories = false,
            NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName
            Inter
        };

        // 監視バッファサイズの設定
        watcher.InternalBufferSize = 16 * 1024;

        // 監視イベントの設定
        watcher.Created += Watcher_Created;
        watcher.Renamed += Watcher_Renamed;

        // 監視開始
        watcher.EnableRaisingEvents = true;
    }
}

インスタンスの設定値は、

  • Path : 監視対象のフルパス。
  • Filter : 監視対象の条件。複数条件不可。
  • IncludeSubdirectories : サブフォルダを監視対象に含めるか。
    デフォルトでfaultだが、念のため。
  • NotifyFilter : 監視対象の種類。こちらは複数条件可。ずるい。
  • InternalBufferSize : 内部バッファのサイズ。後述。
  • 監視イベント : 作成とリネーム。他には削除とか更新とかがある。

となっている。

InternalBufferSizeについて

FileSystemWatcherクラスだが、変更を確実に監視してくれるのかというと、全然そんなことはない。

FileSystemWatcher.InternalBufferSize プロパティとは何? Weblio辞書

この記事を読めば大体のことがわかると思う。
つまりは別の処理とか負荷とかでメモリがオーバーフローすると変更が通知されなくなる。
のでこれを適当に大きくすればその取りこぼしが減るよねって話。

もちろんこの値を大きくするとその分メモリを食うことになるので、
どれだけ大きくするかはパフォーマンスとの兼ね合いとなる。

今回は例なので16 * 1024バイト(16kB)としたが、
一気に1000件とか置かない限り規定値の8 * 1024でも概ね検知してくれる…はず。

  • Watcher_Created
  • Watcher_Renamed

Visual Studio 2017 はとんでもなくインテリジェントで、
watcher.Created += Watcher_Created;を書いた後タブを叩くと以下のメソッドを吐き出してくれる。

private void Watcher_Created(object sender, FileSystemEventArgs e)
{
    throw new NotImplementedException();
}

Watcher_Renamedの方も同様。

あとはここに処理を書き込んでいけばいいということになる。

また長くなった

単純にテキストファイルに書き出して終わり!
って書こうと思っていたのだけれど、どうせなら非同期で動かすかとか考えていたら絶対それだけでもう1エントリー分の文章量には達する。

なのでその3に続けることにした。
次回で絶対終わるから!!ほんとだよ!!!!

画像貼ってなかった。
今こんな感じ。

f:id:vviilloovv:20181116174120p:plain

ではまた。

【Windows サービス】 Visual Studio 2017でWindows サービスを作る その1

うぃろぅです。

業務でWindows サービスを作ることになり、今後も作ることがあるかもしれないのでまとめることに。

若干長くなったので、
その1ではWindows サービスの登録/解除までとした。

その2はこちら。監視処理を開始するところまで。

vviilloovv.hatenablog.com

その3がこちら。検知したファイルパスをテキストファイルに出力。

vviilloovv.hatenablog.com

今回の目標

フォルダの変更を検知し、ログファイルに吐き出す。

XMLファイルを検知して通信するサービスを作成しているのでそれの簡易版。

環境

Visual Studio 2017
C# 7 (規定値)

プロジェクト作成

f:id:vviilloovv:20181114115944p:plain

[新規作成] → [プロジェクト] → [Windows デスクトップ] → [Windows サービス]

名前は「WatchService」とでもしておきましょう。

f:id:vviilloovv:20181114120540p:plain

初期画面。"Service1"のようにイケてない初期値をカスタマイズ。

f:id:vviilloovv:20181114130803p:plain

"Watcher"とした。Fate/strange fake推しとしてもな。

サービス登録

Windows サービスの登録には少なくとも2種類の方法がある。
(他の方法を知っていたら教えてください…レジストリエディターからならいけそう?)

  • installutil コマンドを叩く
  • sc create コマンドを叩く

基本はinstallutilコマンドの方で大丈夫。
Visual Studio上で設定値を決めれば叩くだけなので楽。

ではsc createコマンドは何に使うかというと、ソースの変更無しに複数サービスを同時に登録したいときに使う。
サービス名を登録時に決められるから複数でも別サービスとして認識されるってワケ。
まあ普通はそんなことしないでしょう。私はしたけど。

両方見ていく。

installutil でサービス登録

Watcher.csのデザイナーを開き、右クリックメニューから [インストーラーの追加]を選択。

f:id:vviilloovv:20181114133334p:plain

するとこんな感じでインストーラーが生成される。
例によって名前の末尾に1が付与されるため消す。

f:id:vviilloovv:20181114134223p:plain

"serviceProcessInstaller"を選択し、プロパティを設定する。
ここでは"Account"を"LocalSystem"とした。
規定値の"User"だと登録時にユーザー情報を入力しなければならないため少し面倒。
アカウントの種類に関しては以下の記事が参考になる。

www.atmarkit.co.jp

f:id:vviilloovv:20181114134626p:plain

続いて"serviceInstaller"のプロパティをいじる。

  • Description : サービスの説明。なんでもよさげ。
  • DisplayName : サービスの表示名。日本語可なので"Watcherサービス"とした。
  • ServiceName : こちらはシステムに登録される名前。日本語不可なので"Watcher"とした。
  • StartType : Automaticとした。再起動すると自動的に起動するようになる。

中身はないがこれで最低限の設定はOK。ビルドしてみる。

f:id:vviilloovv:20181114135624p:plain

うまくいったっぽい。

Windows サービスはこのままデバッグ実行しても起動できない。

f:id:vviilloovv:20181114135752p:plain

ので、サービスとして登録する。
installutilコマンドはVisual Studioをインストールしたときに一緒にインストールされるプログラムのため、"開発者コマンドプロンプト for VS 2017"を起動。

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.8.5
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

> cd (Debugフォルダ)

> installutil WatchService.exe

トランザクション インストールが完了しました。

って出たら成功。
サービスに登録されているはず。

f:id:vviilloovv:20181114141807p:plain

登録を解除する場合、/uオプションをつければ良い。

> installutil /u WatchService.exe

アンインストールか完了しました。

って出たら成功。ちなみに原文ママ
まさかこんなところで誤字を発見するとは…。

sc create でサービス登録

こっちの場合、上でつらつらと並べたようなインストーラーの設定は一切必要ない。

f:id:vviilloovv:20181114143154p:plain

インストーラーを消し去った。オォウwwwwwマッサラデスwwwwww

コマンドプロンプト管理者権限で起動し、以下のコマンドを実行。
※管理者権限で起動していない場合、アクセスが拒否されました。と出るので注意。

Microsoft Windows [Version 6.1.7601]  
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.  

> sc create Watcher binPath= (Dubug配下のexeファイルのパス) displayname= Watchサービス start= auto  

[SC] CreateService SUCCESS

と出たら成功。
説明が空白だけれど、まあテストだし問題あるまいて(登録方法がわかりませんでした)。

f:id:vviilloovv:20181114144647p:plain

sc createコマンドのオプションについては以下の記事が詳しい。

Sc.exe を使用して Windows サービスを作成する方法

サービス名と表示名を変えることで同じサービスを複数登録することもできる。
sc create Watcher2 binPath= (略) displayname= 監視サービス みたいな感じ。

登録解除はsc delete (サービス名) でOK。
[SC] DeleteService SUCCESSと出たら成功。
かんたーん。

…あれ?説明をどこか別の箇所でできるのであればsc createコマンドでよくない??
まあどちらでもサービスは登録できるのでいいか。

思ったより長くなった

ここからさらにフォルダ監視とログ出力を書くと結構な長さになるため、今回はここまで。次でとりあえず終わるはず。

ではまた。

【FjordBootCamp】2日目 環境を作成する

うぃろぅです。 忙しくなるかと思ったら意外と仕事がサクサク進んだため更新していきます。

2日目

エディターやら便利ツールやらを揃えていく。

と言っても以前からRubyの学習である程度作っていたので流用する。 客先で環境作成みたいに毎回リセットされないのがいいところ。

エディター

はいこちら

f:id:vviilloovv:20181113222455p:plain

みんな大好きMacVim。

設定は以下の記事を参考にした。多謝。

自分のvimでやってきたことのまとめ - Qiita
脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定 - Qiita
ミニマリストの僕にはvim-plugが性に合っている - Qiita

大体書いてある通りにコピペしていったのでオリジナル感は出していない。
カラースキームはiceberg。

Iceberg - dark blue color scheme for Vim / Neovim

他のツールはとりあえず入れただけなのでぼちぼち慣れていきましょう。

Webサービスの仕組み

基本情報やら応用情報やらで見覚えがあったので問題なく。
ちなみに私は基本情報技術者試験は受けておらず応用だけ受かっている。

大学の時先輩に「意外と簡単だから受けるといいよ!!」
って乗せられて軽いノリで受けたら普通に落ち、
社会人になってからようやく取得した。過去問いっぱいやるといいよ!!

閑話休題

今回はこんなところで。
業務でたくさん調べたC#でのWindowsサービス関係も書いていけたらいいなぁ。
まずはVSCode入れるところから…かな。

ではまた。

【FjordBootCamp】1日目 「黒い画面」と対峙する

うぃろぅです。

FjoldBootCampに参加しました

実はアカウント自体は取得していたんですが、 稼働はさせていなかった状態が半年ほど続いていました。 特にブログに書きたいことがなかったとかそういうわけじゃないんですけどね。

で、この度FjordBootCamp (フィヨルドブートキャンプ と読みます)に参加させていただくこととなったために稼働することにしました。 ブロマガの方のセトリは…こちらで作成する課題としてかここで学習したことを活かして 何かしらの形にしようと考えています。

ひとまずはこちらに学習記録をつけていきます。そういう課題でもありますし。

1日目

学習環境は一通り揃えたので早速始めていきます。
まずは「Webデザイナーの為の「本当は怖くない」“黒い画面”入門シリーズ」に取り組みます。(リンクは最後にまとめてあります)
黒い画面は友達。怖くないよ。
いやまあそもそも業務で使っているEclipseだとかVisual Studioだとかを黒背景で使っているのでむしろ安心するけれども。 目に優しいダークカラー、素敵ですよね。

長くなるのでざっくりとまとめていきます。
※普段Windowsも触る機会があるため、そちらの知識を流用して解釈している箇所があります。
以下常体。

Part1

  • よく見る「ls」や「pwd」といったコマンドは「/bin」配下にあるプログラム名 知らなかった…。

Part2

  • echo $PATHでパスが通っているフォルダを確認できる
    WindowsJavaを入れた時に「JAVA_HOME」を設定したり、
    環境変数PathにJavaのフォルダを指定したりするあれと同じって認識。

Part3

  • lsコマンドに-aをつけることで相対パスの指定方法、隠しファイルも表示される
    ドットフォルダ/ファイルが隠しフォルダ/ファイルってことを最近知った。

Part4

  • ハイフン1つのオプションと同じ内容でハイフン2つで名前が長いものが存在する場合がある
    あーあれね、エイリアスメソッドってやつね(違う) 。

  • 困ったら-h--help-manオプションをつけてマニュアルを読もう
    マスターはお知らせが読めない
    情報社会ってやつは素晴らしいものでググっても大抵出てくる。
    あとは取捨選択だけ! …それが一番難しいのだけれど。

Part5

Part6

  • パッケージ管理ソフト「Homebrew」を使う
    Ruby自習用に既に入れてあった。 ちょっと意識しない間にすぐupdateが溜まる。
    これこそ自動化すべきかもしれない。

  • ターミナルで`(バッククウォート)で囲んだ引数はコマンドとして実行される

Part7

  • ファイル操作コマンドあれこれ mvコマンドはフォルダ名変更もできる。便利。

  • 絶対に実行してはいけないあのコマンド 「ALT + F4ブラウジングが高速になるよ!!」の悪質版。(ネタとしては)よく見るやつ。

Part8

  • スクリプトの作成、実行

  • shebangを使って自動化できる作業はどんどん自動化
    プログラマーの好きな言葉の代表、自動化。レッツ怠惰!
    echo-hello作成と結果は以下の画像にて。
    f:id:vviilloovv:20181111221422p:plain
    f:id:vviilloovv:20181111221707p:plain
    フルパス指定できていなかったので失敗しつつもバッチリ!!
    ということでPath通してから再実行
    f:id:vviilloovv:20181111222032p:plain
    今度こそ完璧ですな。

  • 気になった点
    以下引用

作業を自動化して差をつけろ 今回覚えたように“黒い画面”で行う処理は簡単にスクリプトにすることができます。スクリプトを書いておけば2度目は自動的に一瞬で作業が終わるので仕事の効率化に役立ちます。 以前、イベントのサイトを作る仕事がありました。イベントで撮った写真を次の日にはサイトに載せなければいけません。ところがその日のイベントの写真は600枚以上もあったのでとてもPhotoshopで一つ一つ縮小・形式変換していては間に合いません。 そこでImageMagickというソフトのconvertというコマンドを使って、フォルダ内のファイル全てをリサイズして変換するというスクリプトを書いて、数十分で処理を終わらせました。そしてイベントがあるたびにそのスクリプトを実行すればいいようになったのでとても助かりました。 ImageMagickはもちろんhomebrewでインストールできます。 bash $ brew install imagemagick このように“黒い画面”は自動化ととても相性がいいのです。

この箇所が私の環境(Google Chrome 70.0.3538.77)だとこう見えている。

f:id:vviilloovv:20181111214915p:plain

環境依存かタグ不発かなのでしょうか。

Part9

  • 歴史的な経緯

  • ね?怖くなかったでしょう?
    怖くなかった!!

今回のまとめ

幸いなことにこれまで業務で「黒い画面」と戯れていたため、
特につまずく箇所も抵抗感もなく最後まで進められました。
これまで理解が浅かった箇所やなんとなくで納得させていた箇所が理解できてスッキリしました!!

Links

次回

納期を2週間早めたいとかいう無茶振り要望を受けたため、
水曜までちょっと忙しそうな気配がするけれども気合いで頑張っていきたい。

ではまた。

ブログはじめました

はじめまして

うぃろぅです。

ブロマガでひっそりとセトリを更新し続けていたので 初めましてではない方もいるかもしれませんが、初めましてとしておきます。

何を書くの?

このブログの説明文にもあるように、Twitterよりも長い文章を書きたいときにPostしていきます。 最近はTwitterもあまり使っていないような気がしますが、それはそれです。

女性声優のことだったり、アニメのことだったり、ゲームのことだったり、プログラミングのことだったり。

自己紹介

太古の昔にツイプロを書いていたことを自分のbioを見返して気づきました。

と思ったら地味に2017年に更新していたようです。誰宛なんだ。

せっかくなのでこちらにもつらつら書きます。

趣味

ド頭から人名で始まる趣味。常識にとらわれてはいけない。

  • 花澤香菜さん。
    今久しぶりにフルネーム打ち込んだら勝手に嫁って変換されたので嫁です。
    アニメ系イベントは最近ご無沙汰だけれどライブは基本全部行っています。
    例外はかなめぐり。当時就活中で…。

  • ゆいかおり
    現在休止中。誰がなんと言おうと休止中なんです。
    唯ちゃんのライブもキャリさんのライブも行ってるよ!!2つの塔でry

  • UNISON SQUARE GARDEN
    自分でもこんなにハマると思っていなかった。最近のトレンド。

  • バスケ
    たまにbリーグ観ます。みるのもプレイするのも好き。

  • プログラミング
    仕事でC#やらJavaやら触っています。Ruby勉強中。


あまり長くなりすぎると自分でも読む気が起きなくなるので一旦はこの辺で。

ではまた。