手続き型音楽の日常

関数型音楽に乗り換えたい

C# で ウェーブレット木 を実装する話 (2018年秋 応用情報技術者試験で出題された件)

応用情報技術者試験から1週間経ちましたね。

私も今回受けてきたのですが、なかなか勉強が捗らず不安しかありません。

ただ、問題解いててほんと 目から鱗 って感じたのが、今回実装する ウェーブレット木 でした。

さいころから文字列の操作ってめちゃくちゃ苦手で、線形探索くらいしか思いつかなかったんですよね (その当時は 線形探索 なんて言葉も知りませんでしたが)。

そんな中、構文木みたいなノリで木さえ作ってしまえばあとはカウントも簡単みたいなそんな素晴らしいアルゴリズムが目の前に現れて、もう大歓喜ですよね。

これは解くしかない!と思ってやけくそで解きました (やけくそ)

というわけで、そんなウェーブレット木を C# で実装してみました。

ソース

using System;
using System.Collections.Generic;
using System.Linq;

namespace WaveletTreeNS
{
    /// <summary>
    /// ウェーブレット木を表します
    /// </summary>
    /// <typeparam name="T">列挙される値の型</typeparam>
    public class WaveletTree<T>
    {
        #region Private variables

        /// <summary> 出現する値と符号 </summary>
        private Dictionary<T, int> _dist { get; set; }
        /// <summary> 葉までの深さ </summary>
        private int _depth { get; set; }

        #endregion

        #region Public properties

        /// <summary> 左の子節 </summary>
        public WaveletTree<T> Left { get; private set; }
        /// <summary> 右の子節 </summary>
        public WaveletTree<T> Right { get; private set; }
        /// <summary> 割り当てられている列挙可能な値 </summary>
        public IEnumerable<T> Value { get; private set; }
        /// <summary> 割り当てられている列挙可能な値と符号 </summary>
        public IEnumerable<ValueTuple<T, int>> Pairs { get; private set; }

        #endregion

        #region Constructors

        /// <summary>
        /// ウェーブレット木を作成します
        /// </summary>
        /// <param name="value">列挙可能な値</param>
        public WaveletTree(IEnumerable<T> value)
        {
            // 値の種類ごとに符号をつける
            var dist = value
                .Distinct()
                .Select((item, index) => (index, item))
                .ToDictionary((item) => item.item, (item) => item.index);

            // 符号と実際の値をペアにする
            var pairs = value
                .Select((item) => (item, dist[item]));

            // 葉までの深さを計算する
            var depth = (int)Math.Ceiling(Math.Log(dist.Count(), 2));

            // フィールドに格納
            this._dist = dist;
            this._depth = depth;
            this.Value = value;
            this.Pairs = pairs;

            // 子節の計算
            if (dist.Count() != 1)
            {
                // 符号の最上位ビットを見て左右に分割
                this.Left = new WaveletTree<T>(
                    pairs
                        .Where((item) => (item.Item2 & (1 << (depth - 1))) == 0)
                        .Select((item) => item.item)
                        .ToArray()
                    );
                this.Right = new WaveletTree<T>(
                    pairs
                        .Where((item) => (item.Item2 & (1 << (depth - 1))) != 0)
                        .Select((item) => item.item)
                        .ToArray()
                    );
            }
            else
            {
                // 葉になるため子を持たない
                this.Left = this.Right = null;
            }
        }

        #endregion

        #region Public methods

        /// <summary>
        /// 指定された値の出現回数を取得します
        /// </summary>
        /// <param name="value">数える値</param>
        /// <returns>出現回数</returns>
        /// <exception cref="ArgumentNullException"><c>value</c> is <c>null</c>.</exception>
        public int Rank(T value) => _dist.ContainsKey(value) ? this._RankInner(value) : 0;

        #endregion

        #region Private methods

        /// <summary>
        /// 指定された値の出現回数を取得します
        /// </summary>
        /// <param name="value">数える値</param>
        /// <returns>出現回数</returns>
        /// <exception cref="ArgumentNullException"><c>value</c> is <c>null</c>.</exception>
        /// <exception cref="KeyNotFoundException">
        /// The property is retrieved and<c>value</c> does not exist in the collection.
        /// </exception>
        private int _RankInner(T value) =>
            this._depth == 0 ?
            this.Pairs.Count() :
            (((_dist[value] & (1 << (_depth - 1))) == 0) ? this.Left : this.Right).Rank(value);

        #endregion
    }

    /// <summary>
    /// ウェーブレット木に対する汎用的な操作を提供します
    /// </summary>
    public static class WaveletTree
    {
        /// <summary>
        /// ウェーブレット木を作成します
        /// </summary>
        /// <typeparam name="T">列挙される値の型</typeparam>
        /// <param name="value">列挙可能な値</param>
        /// <returns>ウェーブレット木</returns>
        public static WaveletTree<T> Create<T>(IEnumerable<T> value) => new WaveletTree<T>(value);
    }
}

とりあえずテストメソッドと簡単なコンソールアプリ含め、 GitHub に上げてみました。

github.com

GitHub 使ったことないので使い方がよくわからない。誰か教えて。

解説

今回は LINQ を使った抽象的な実装にしてみました。

本来であれば byte[] とか MemoryStream とか使った低レベル操作を必要としますが、簡単に実装できそうな感じでやってみました。

yuzutan-hnk.hatenablog.com

コンストラク

コンストラクタは基本的にウェーブレット木の構築を一貫して行ってしまいます。

LINQ 使っているとはいえ実行時計算だと遅いかもなと思って、全体的にゲートを設けて Array に変換しています。

あと Tuple とかと同じように、静的クラスのメソッドで型引数無しでコンストラクタを呼べるようにしてます。 C# でこのハックはほんと使い勝手いいですよね。

// 値の種類ごとに符号をつける
var dist = value
    .Distinct()
    .Select((item, index) => (index, item))
    .ToDictionary((item) => item.item, (item) => item.index);

この部分でとりあえず値の種類ごとに符号化しています。単純にインデックスつけてるだけです。

LINQDistinct() メソッドで重複を省けるのめちゃくちゃ楽です。そして ValueTuple を使ってめちゃくちゃ簡略的に書いてます。

で、後から各要素をキーに符号を検索できるように Dictionary にします。これで dist["a"] とかやれば 1 だの 2 だの返ってくるんですよね。楽。

// 符号と実際の値をペアにする
var pairs = value
    .Select((item) => (item, dist[item]));

ここは Dictionary と似ていますが、コンストラクタで渡された配列の各要素に対して先ほど算出した符号をそれぞれ紐づけています。

たとえば new WaveletTree<char>("abcdeabc") を呼ぶと、pairs{ ('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4), ('a', 0), ('b', 1), ('c', 2), } みたいな感じになりますね。

// 葉までの深さを計算する
var depth = (int)Math.Ceiling(Math.Log(dist.Count(), 2));

これはなんか、応用情報の問題に出ていたので適当に計算してみただけです。数学よくわからないのでよくわかりません。

ただ、この後なんだかんだ役に立つ値だということが判明。

// 子節の計算
if (dist.Count() != 1)
{
    // 符号の最上位ビットを見て左右に分割
    this.Left = new WaveletTree<T>(
        pairs
            .Where((item) => (item.Item2 & (1 << (depth - 1))) == 0)
            .Select((item) => item.item)
            .ToArray()
        );
    this.Right = new WaveletTree<T>(
        pairs
            .Where((item) => (item.Item2 & (1 << (depth - 1))) != 0)
            .Select((item) => item.item)
            .ToArray()
        );
}
else
{
    // 葉になるため子を持たない
    this.Left = this.Right = null;
}

もし自身が持ってる値の種類が 1個 でない場合は、左右の子節を作成します。

このとき、左右に分ける条件は 符号の最上位ビットが 0 か 1 か です。

ここで先ほど算出した depth が役に立ちます。これをもとにビットシフトしてアンド掛けしてやれば最上位ビットを取り出せます。

あれ、 item.Item2 をビットシフトしたほうが速くない…?

ここで重要なのは、実は子節が符号を再計算している、ということですね。

ウェーブレット木の基本的な考え方としては、ここで符号の再計算は行われず伝搬していくはずです。

ただし今回は簡単に実装したかったので、これをすっ飛ばして毎回再計算させることにしています。実際には再計算したとしても depth ビットより下位に関しては同じ順序になるはずですし、現状は最上位ビットしか見ることがないので他ビットは情報を持たなくても問題ないんですよね。

もし再計算無しでやるとしたら、 private WaveletTree<T>(IEnumable value, Dictionary<T, int> dist) を実装するとかいかがですかね。やだめんどくさい。

そして、最後は値の種類が 1個 の場合 (つまり depth が 0、 葉の場合)。左右の子節には null を割り当てておきます。

Rank メソッド (出現回数をカウントする関数)

Rank メソッドは応用情報技術者試験の問題にも出てきた関数です。

例えば "aaaaabbbccccdeeaaabbcddddeeeee" の中に "a" は何個含まれているか、を取得する関数ですね。

public int Rank(T value) => _dist.ContainsKey(value) ? this._RankInner(value) : 0;

private int _RankInner(T value) =>
    this._depth == 0 ?
    this.Pairs.Count() :
    (((_dist[value] & (1 << (_depth - 1))) == 0) ? this.Left : this.Right).Rank(value);

とりあえずコメントを省くとこんな感じになります。めっちゃ短い。

まず public のほうですが、こちらは まず値が存在するかどうかをチェック します。これがないと KeyNotFoundException で落ちます。

で、ワンライナーをきれいにするために内部関数に処理を投げてます。こちらは何をしているかというと…

  1. 深さが0 … つまり葉、つまり自身の値の種類が 1個 の場合は、自身の要素数をそのまま返す
  2. それ以外の場合、 value の現在の節における最上位ビットが 0 の場合、 this.Left.Rank(value) を実行
  3. それ以外の場合、 this.Right.Rank(value) を実行

という感じです。こっちはちょっとワンライナーで書きたくて意地汚くなってます。もうちょっと読みやすくしたかったですね。

結論

LINQ って楽しいな

最近は本職で JavaScript しか触っていないので、ここまで型をしっかり保っていろいろなメソッドが用意されててスラスラ書ける感覚が気持ちいいです。

次実装するときは MemoryStreambyte[] か何かで実装できればいいな。時期 C# に来る Span<T> でも面白そう。

あと、なぜかわかりませんがこれ struct にするとどのプロジェクトからも実行時に型を見失って動けなくなるので、仕方なく class にしています。誰か情報欲しいな。

あと。受かっててほしいな、応用。

「自分のブログの PV が気になる話」を考察してみる

たまーに、ブログを書こうと はてな を開くと、右上の通知になんか出てるんですね。

f:id:yuzutan_hnk:20180804194305p:plain

100PV なんてそんなに喜ばしいものではありませんが、こうやって PV が増えると少しは自分の書いたものが誰かの役に立っているのかな、と安心します。

有名にはならなくてもいいけど、何か役に立てればいいな。そう思います。

当ブログで今一番見られている記事ってなんだろう

というわけで、ちょっとアクセス解析を覗いてどんな記事が読まれているのか確認してみることにしました。

無料プランなので高機能な解析は行えませんが、それでもページ別に見られている割合は見られるっぽい。

というわけで、どーん。

f:id:yuzutan_hnk:20180804194602p:plain

いや、 1位 の記事のタイトルあかんでしょ、自分で書いておいてあれだけど…。

まあ中身は C#Stream クラス周り (特に MemoryStream クラス) の解説をしている初心者向けの記事なので、役に立っていればいいなぁ。

yuzutan-hnk.hatenablog.com

タイトルって大事じゃない?

だいたい記事が「〜の話」とか「〜した」とかに対して、 1位 の明らかなるふざけ具合、これは完全にタイトルで釣られてますね皆さん。

証拠と言ってはなんですが、加えて 2位 の記事も興味をそそりそうな感情的に訴える文言を並べていますよね。自分で書いておいてあれだけど。

yuzutan-hnk.hatenablog.com

Ubuntu の IP 固定は初心者であれば誰もが一回は躓くだろう内容、それに加えて「 2時間 かけました」という具体的な状況描写。

中身は ほとんどうろ覚えで書いていて内容不明確 なのになぜ閲覧数 2位 なのか。まあそういうことですよ。

こういう技術ブログとか、タレントやインフルエンサのブログじゃない記事って、知りたい情報で検索してその検索結果から選んで見てるんだよね。

そうなった時に、 如何に他のブログより中身が透けて見えるか如何に興味をそそられるか如何に短いか で閲覧数が決まる気がする。

個人的には「 MVVM 初心者なので、 .NET Standard 2.0 + Xamarin.Forms で Messaging クラスを実装してみた」とかめちゃくちゃ興味そそられると思うだけど、

f:id:yuzutan_hnk:20180804195819p:plain

タイトルが長すぎて中身がわからず、興味もそそられない残念な結果になってしまうとこうやって順位がどんどん落ちていく。

ほんとタイトルって大事なんですよね。

誰が必要としている記事なのか

あと、上位に来る記事ってやっぱり必要としている人が多い記事なんですよね。きっと。

今回であれば MemoryStream についてダラダラ書いた記事って多分 MemoryStream の使い方 (使いドコロ) を調べてる人が見ているような気がする。

Ubuntu の IP 固定については、初心者が個人で Linux を触るときに壁にぶち当たって見ている気がする。

AVT-C878 については、多分同じ現象を抱えている人が大勢いる (コメントも書き込まれていましたし)

yuzutan-hnk.hatenablog.com

それに比べて、それらの記事が書かれるまでずっと上位に居続けた「 C# で即時関数を書く」なんて、一体誰が読むんだろう。

個人的にはすごく面白い内容だと思うし、言語を楽しんでいる 変態 プログラマは何かと気になる話題だとは思うですよ。

でも多分そんな 変態 プログラマは言語についてggる機会はそんなに多くない。

yuzutan-hnk.hatenablog.com

読者を考えて情報を発信するってことも大事なのかもしれない。いやこれからも自分が書きたいことを書いていきますが。

PV が増えると何がいいんですか?

私は広告収入を全く得ていないので、 PV が増えようと直接的な利益は無いです。

でも、たとえば Twitter もそうですしリアルの活動もそうですし、やっぱり人との関わりってすごく大事ですよね。

極度のコミュ症なのでそもそも人と話すとき アッアッ ってなって全然会話が続かないのですが、こうやってブログを書いていたり何か実力を伝える手段が一つでもあると、そこからいろんな人とつながったり頼られたりすることがあって、すごく役に立ちます。

もしかしたら、 PV が増えることでブログを知ってもらう機会が増えて、初対面の人でも「ああ、あのブログの人か」とわかってもらえるようになったら、良いことに繋がっていくチャンスが増えるかもしれませんね。

クラウドファンディングで clockworkPi GameShell (組立式ゲームコンソール) を入手した話

クラウドファンディングって面白いですよね。

サイト眺めてると、「こんな発想があったんだ」とか「こういう人たちもいるんだ」っていう気付きがあったり、「これほしい!」っていう製品もあったり。

最近はテレビにも積極的に出てくるようになり、日本でもやる人がどんどん増えてきている印象。

というわけで私も、使っていないお金を少しは役に立てたいと思い出資を行いました。

その一つが、これ。

clockworkPi GameShell

もともと 4月 ごろに到着予定だったのですが、あまりの注文数に捌ききれなかったのか 7月中旬 までもつれ込みました。

でもまあちゃんと届いてよかった。

届いた品物がこれ。

f:id:yuzutan_hnk:20180730203742p:plain

f:id:yuzutan_hnk:20180731012501j:plain

いや不気味すぎんだろ

家の人が受け取ったのですが、なんせシンガポールからこんな真っ黒な包が届くのですから、心配して仕事中に電話を鳴らしてくる始末…。

国際便ってこんなもんなのかな?

開けてみる

f:id:yuzutan_hnk:20180731012542j:plain

f:id:yuzutan_hnk:20180731012607j:plain

f:id:yuzutan_hnk:20180731012645j:plain

箱ベッコベコ…。

Amazon もそうだけど、通販ってやたら大きな箱に入れてくるよね。外国だとこんなものなのかと改めて理解。

しかしちゃんと 1袋 に 1つ 入っている。ここらへんは物品費より人件費を削減したのかな。

さて、このベコベコの箱を開けてみよう…。

f:id:yuzutan_hnk:20180731012707j:plain

1つめの箱。

f:id:yuzutan_hnk:20180731012729j:plain

2つめの箱。

左側のケースみたいなやつが、多分背面だろう。レゴっぽくして拡張できるようになっている。

その下の薄い箱を開けてみる。

f:id:yuzutan_hnk:20180731012753j:plain

何やら部品が入っている。なんだろう、基盤っぽく見えるけどなんか違う。

続いて、少し厚めの箱を開けてみる。

f:id:yuzutan_hnk:20180731012809j:plain

f:id:yuzutan_hnk:20180731012822j:plain

これは前面ケースだ。 2色 頼んだのでちゃんと 2色 届いた。

最後に、一番下のバッグインバッグならぬボックスインボックスを開けてみる。マトリョーシカみたいだ。

f:id:yuzutan_hnk:20180731012853j:plain

説明書、ステッカーが一番上にあって、その下がいろんな部品になっている。

f:id:yuzutan_hnk:20180731012911j:plain

f:id:yuzutan_hnk:20180731012926j:plain

一番上とその下はプラスチックの部品だ。

f:id:yuzutan_hnk:20180731012944j:plain

f:id:yuzutan_hnk:20180731013008j:plain

片方はクリアで中が見えるようなもの、もうひとつは半透明。どちらも同じくらいの大きさだ。

f:id:yuzutan_hnk:20180731013056j:plain

さて、最後に残ったこの黒いスポンジ。開けてみると・・・

f:id:yuzutan_hnk:20180731013117j:plain

!?

f:id:yuzutan_hnk:20180731013134j:plain

基盤、画面、スイッチその他もろもろ。

すげえ、本格的なキットっぽい。

ちゃんと Class10 の microSD も入っている。やる。

f:id:yuzutan_hnk:20180731013150j:plain

組み立てる

とりあえず、設計書が入っているのでそのとおりに組み立ててみる。

f:id:yuzutan_hnk:20180731013315j:plain

表紙こそ英語だけど、中身はほとんど図で埋まっていて、英語が読めない私でもサクサク作っていけた。

プラモデルみたいにボードからニッパで部品を取り外して (工具出すのめんどくさくてカッターで代用。もう二度とやらないと決めた) パチパチとはめ込んでいく。

f:id:yuzutan_hnk:20180731013341j:plain

f:id:yuzutan_hnk:20180731013403j:plain

ネジ一つ使わず、ものの 1時間半 程度で完成してしまった。

f:id:yuzutan_hnk:20180731013420j:plain

動く

電源は USB microB 端子。ここらへんは RaspberryPi を踏襲していますね。とりあえず挿してみます。

f:id:yuzutan_hnk:20180731013441j:plain

f:id:yuzutan_hnk:20180731013508j:plain

こいつ…動くぞっ!

出資と対価

というわけで、とりあえず今回は組み立ててプリインストールのゲームをちょびっと遊んでみました。

ゲーム機という事もあって、メモリ 512MB でもサクサク動きます。これは色々遊べそう。

3D ゲームはちょっと辛そうだけど、マリオとかシムアントとか、工夫次第ではいろんなことができそうだなと可能性を感じる端末です。

ただ Wi-Fi を切るオプションが見当たらなかったり、 Bluetooth 対応チップなのに繋がらなかったり、色々と穴はあります。

これからの進展に期待したいところですね。何より、 出資 したんですから。

クラウドファンディングはとても良い文化だと思うので、これからも広まっていって欲しいな。

ThinkPad X270 に Debian をインストールして Wi-Fi を有効化した話

今時 Debian 系で一番盛り上がっているディストリビューションUbuntu なんですけど、どうも私には合わないと言いますか。

簡単に言えば、いらないものはいらないんですよ。自分に必要な最低限なものしかいらない。

タブレットとかはさすがに一人でセットアップできる自信がないので Ubuntu 入れていますが (一度 CentOS 入れたこともあるけど) 一応自力でセットアップできるものはセットアップするという方向でやりたい。

そのうち openSUSE とか Arch Linux とか触ってみたいなぁという気はありますが、今回はメイン機なので安牌で…。

Debian を X270 にインストールする

単純に USB から起動してインストール。焼いたツールは rufus という Windows 専用 USB 焼きツール。めっちゃ高速。おすすめ。

で、いつもの通り Install... を選択して、セットアップをしていく。

小ネタとして、 xfs ジャーナル領域にはインストールできないみたいなので、 ext4 でフォーマットしなおしてインストール。

更に、すでに CentOS がインストールされていて、 ESP とスワップ領域が共有できるので Windows Boot Manager を ESP 認識から外してインストール (念の為)

と、ここでなぜか Wi-Fi のセットアップが出て来なかったため、急遽 LAN ケーブルをさして追加コンテンツのダウンロードを行いました。

…怪しいぞ?

Wi-Fi が有効になっていない

PCIe SSD モデルにしたおかげでインストール自体は 15分程度で終了。再起動。

しかし…、やはり Wi-Fi が認識していない。

とりあえず、同じ現象がないかggってみると、

InstallingDebianOn/Thinkpad/X270/sid - Debian Wiki

Only works with a non-free driver and or firmware

の文字。ほう、プロプライエタリなドライバがいる、ということか。

WiFi

03:00.0 Network controller: Intel Corporation Wireless 8265 / 8275 (rev 78) Subsystem: Intel Corporation Wireless 8265 / 8275> Flags: bus master, fast devsel, latency 0, IRQ 130 Memory at e1100000 (64-bit, non-prefetchable) [size=8K] Capabilities: Kernel driver in use: iwlwifi Kernel modules: iwlwifi

この、 Kernel driver in use: iwlwifi って文が引っかかる。これっぽくない?

iwlwifi - Debian Wiki

ビンゴ。Intel 製の Wi-Fi デバイス向けプロプライエタリドライバですね。あとはインストールするだけ。

iwlwifi をインストール

とりあえず /etc/apt/source.list に以下の行を追加

# Debian 9 "Stretch"
deb http://httpredir.debian.org/debian/ stretch main contrib non-free

これでリポジトリが追加されたので、インストール。

# apt update
# apt install firmware-iwlwifi
# reboot

これで Wi-Fi が使えるようになった。

なぜ写真が 1枚 もないのか

こんなもの寝る 10分前 に始めるものじゃないよ。

いくつか勉強会に参加してきた話

もうね、文章を考える能力がとことんなくなってしまって、辛い。

頭回んないですよ。

誰か助けて。

勉強会に行ってきた!

6 月に入ってからというもの、 3 回も勉強会に参加して来ました。

勉強会によく参加する人から見れば珍しいことじゃないとは思うけど、最近はほんとご無沙汰していて、なんというかまあ新鮮な気分でした。

新しいことを学ぶのは楽しいし、いろんな人と話すことはいい事だし。まあ私はコミュ力が完全に欠落しているんですけれども。

懇親会も行かなかったし、本当に昼間勉強して、帰る。 まあ夜プライベートで飲みに行っているのは内緒。

色々と勉強になったのはいいけど、これだと特に進歩しないよなぁ…。頑張らないと。

というわけでコミュ力を養うため (?) 紹介も交えながら自分の意見をまとめていくぞ!

その1 OWASP Nagoya Chapter Meeting #5

owaspnagoya.connpass.com

まずは 1 つめ。 OWASP の勉強会です。

OWASP は以前の記事でも紹介したとおり The Open Web Application Security Project の頭文字をとった Web アプリケーションのセキュリティに関する情報を発信する団体ですね。

T が無いとか言わない。

以前、 Nagoya Chapter のスタッフとして何回かイベントに参加したことがありましたが、リーダーの坂梨さんをはじめセキュリティ ガチ勢 が揃いに揃っためちゃくちゃすごい集団です。 (おい)

名古屋を中心とした東海地方でのセキュリティ意識を高めていこうと、去年の夏から本格的に活動している新しいチャプターです。

今回はその勉強会、なんと第 5 回。結構な頻度で活動してますよね。

より多くの人にセキュリティの大事さを知ってもらおうと、今回も OWASP Top 10 のさわりの部分をご紹介されました。

私が去年の暮に参加した勉強会では 2 回目ということで "OWASP とは何か" を説明してましたが、半年たった今でもまだまださわりの部分を説明しています。

しかし OWASP Top 10 2017 が年明け前に滑りこみセーフで公開されたのもあり、いろいろタイムリーな話題が絶えませんでした。

大まかな内容としては、 OWASP Top 10 の読み方、そして栄えある危険度第 1 位に選ばれたインジェクションの対策を学校の課題に使ってみたという 少年 学生のお話。

大筋の内容は私も勉強したことがあったので知っていた部分が多かったですが、いろいろな小話が大いに勉強になったと思います。

もっと視野を広げないとなぁ。

その2 IoTSecJP 名古屋 #1

iotsecjp.connpass.com

次。 IoTSecJP 。名古屋初開催おめでとうございます!

前回に引き続きセキュリティの勉強会。というわけで入場早々坂梨さんを見つけ隣に座るとかいうスピードプレーをするなどしました。

しかしその直後、私の隣に坂梨さんのお知り合いの方が座りました。 OWASP Nagoya の新スタッフらしく、すでに申し合わせていたそうです。

話を聞くと…えーっと…。個人でブレードサーバー持ってるとかやべーやろ…。 OWASP Nagoya 、キャスティング力強すぎる…。

趣味でネットワークの勉強しているようで、 PHP とかインフラとか Web 系をやっているそう。えっやばっ

勉強会の内容はさておいて隣の人がめちゃくちゃ強者でもう いや登壇者の方々もめちゃくちゃお強い

IoT のセキュリティという事で実例がバンバンとび交うのでオフレコ必至なのですが、まあみなさん強すぎるのなんの…。

Vuls のコミュニティやっててドローンの未来に興味がある方、メ○カリで貯金箱を買った方、普段通り超高度なアセンブリレベルのお話でフロントエンドの方々を唖然とさせる 自己防衛おじさん 、IoT セキュリティ診断ってやべーんだなって実感させてくれる方…。

いやもうお腹いっぱいどころか頭パンクして後半話について行けなくなるという…。

黒林檎さんの出番の途中からもうメモを諦めるくらい情報量がすごくて、いや聞き流すだけでも価値がありそうなくらい本当に濃いお話を聞けました。

めちゃくちゃ大満足な勉強会でした。

その3 Windows10 1803 リリース記念 MS技術勉強会 @日本マイクロソフト株式会社中部支店

mspjp.connpass.com

最後。某 1803 記念杯。

実は主催さんが IoTSecJP 名古屋 #1 と同じ方で、オープニングセッションもほぼ同じ内容でした。

とはいえ改めて PowerShellマルチプラットフォーム化ってぜんぜん広まってないんだなぁと実感もしました。

今回のイベントでは主に Microsoftマルチプラットフォームに熱心だよ! とか WSL の進化すごいよ! とか Azure ML 無料枠あるよ!! とか、まあ Windows に限らず幅広い情報を発信されていました。

中には 1803 の新機能とか、あと次期リリースでの機能追加の情報だったり (Insider Preview で実演してくださったり) Windows に関連したお話がありましたが、もうホント Microsoft ♥ Cross Platform みたいな風潮でした。

個人的に WindowsDOS 文化から離れることは悪くはないと思いますし、 Unix の資源が日本のデファクトスタンダードである Windows で使えるようになるのはとても喜ばしいことだと思います。

ただ、あまりに Microsoft の囲い込み商法の歴史が長すぎて、少々ピンときていない方々が多くいるような気がしますよね。

会場にも幅広い年齢層の方々が集まっていて、中には SE の方や IT ドカタの方々もいることだろうと思いますが、反対に最新技術についてこれない方々や時間を割けない方々もいるかと思います。

そうした人々までこの情報が伝わっていくと、より良い世界になっていくのではないかなぁと、思うのですね。

あんまり押し付けがましいのも良くないですけど。

これからも勉強していきたいね。

以上で紹介してきたのは 2018 年 6 月の分ですが、他にも Mobile Act Nagoya や dotNET600 という勉強会にも参加して来ました。

やっぱり、普段の生活では出会うことのないような情報に触れることができて、いつでも新鮮ですし、楽しい。

最近は忙しくて目の前のことに追われてきていましたが、そろそろ新しい発見を求めて、余裕を見つけるのではなく作って行かなければと、もっと能動的にならないとなと感じました。

とりあえず、今回はここまで。また時間があれば、様々な勉強会に参加してみたいものです。

皆様、お疲れ様でした。

ブログデザインを変更しました その他私事の報告

最近ブログ記事書いて無いなぁと思いつつ、いろいろをはてブの設定を見ていたんですが。

なんかちょっとかわいいデザイン見つけちゃって「これいい!!」って一目惚れして変えました。

やっぱ明るくキラキラしているデザインのほうが個人的にも気分が上がりますし、ちょっとだけ見やすいんじゃないかな?と思いまして。

本当はダークモードとか切り替えたいんですけど、それにしてもこのデザインのほうが素敵かなと思います。

というわけで、今後はこのデザインで、今までと記事内容は 何一つ 変更なくやっていきたいと思います。

以上。

松岡修造「だわけねぇだろおぇー!」

はい、以下、私事報告タイムです。

私事その1 転職

この度、 転職 いたします。いやお前もともとどこに勤めてたんだよって話ですが。

名古屋で IT 企業といえば大抵想像はつくと思いますが、今までは小さな少数精鋭の下請け業者として働いていました。

某大企業の工場などで使われるシステムの構築などを請け負っており、私が担当したのはコーディングから導入・調整工程でした。

高校で PLC (シーケンサ) というものに出会い、ラダーや低水準な通信に興味をもって、この世界に飛び込みました。あの頃が懐かしい。

一応、入社当初は何も不満無く、楽しく仕事をさせていただいていました。それが、最近ではすこし不安を覚えるようになってきたのです。

高卒で就職したので 2年間 勤めたことになるのですが、それまで高校なり中学なり趣味なり、そこらで学習してきたスピードと職場で学ぶスピードが、かけ離れている気がしていたんです。

例えば Excel VBA とか HTML なんかは、趣味で基礎的なことはやっていてそれを応用した次のステップが欲しかったところに、実際の業務で与えられた仕事はそれ以下のレベルであったり (会社にノウハウが無いため)。

例えば git やせめて TFS 、まあ欲を言わなければ VSS なり VCS が基本的な今の時代、ファイル名管理な上、 TFS を使ったとしても複数人作業での排他ロック程度にしか使わなかったり。

例えば「工場の IoT (インターネットにはつなぐことはできません)」という謳い文句を見てしまったり。

技術面だけでもいろいろとありますが、ビジネスマナーが重要視されていない(?)ので覚える機会がないとか、フレックスタイムで個人の自由が増える反面イベントが無いとか。

結局、少数精鋭ということで既に実力や社会を見てきてこの会社に入れば、活躍する場も勉強することも自分の力で獲得できるんだろう、と思うのです。

私のように高卒でたたき上げるためにはチャンスはとても少ないし、見られる世界も少ないなと、思うわけです。

というわけで、個人的にはそういうチャンスがありそうな、というか着実に今より 仕事が絶賛ハードな 会社に転職いたします。今より確実にやることも覚えることも増えます。

この 2年間 で忘れ去ってしまったであろう学習意欲とか元気とか、やる気をもう一度取り戻すべく、頑張っていこうと思います。

いやコネって強いですね。

私事その2 サイトを作ります

先ほどとは打って変わってこちらは 実現するかわからない 宣言に近いものですが。

サイトを立ち上げてみようと思います。

すでに VPSドメインを確保してあって、あとは組み上げるだけなのですが、実はまだ企画書とか設計書とか何一つないんですよね。

それなのにドメイン3年間で取得したとか、あたしって、ほんとバカ…

私一人で作るわけではないのでいろいろと調整を重ねながらだんだんと進んでいくことにはなると思いますが。

いろいろなことを書き残せるような、ブログとは違いますがまとめサイト的な、というか初心者プログラマ向けな? IT 業界初心者向けな??

とまで言うと企画没ったときに取り返しがつかないので今回はここまd (殴)

私事その3 アレンジ作ってなくてごめんなさい

正直、 期待してる人0説 あるなと思っているんですけど。

転職とか、あと今年 3月 の年度末ラッシュがとても忙しくて、それどころじゃなかったんですよね。

年末から年始にかけて、あと 4月 あたりに 1本 ずつ出せるかなぁとかいろいろと考えてはいたものの、とても定時には帰れないし年末も大掃除で忙しいし。

スプラトゥーンとMUSECAでストレス発散する時間が多いだけのようにも見えますが、そんなことありませんよ。それ以前とやってる時間は変わってませんから。

f:id:yuzutan_hnk:20180513170935j:plain:w300

え?何か問題でも? (^q^)

最後に

まあだいたいお察しの通り、デザインを変えたのもだいたい気分を一新するためです。はい。

将来自分がどうあるべきかって考えても実現できない環境にあったのか、はたまた自分が甘いだけなのかはわかりませんが、現状は足元しか見ることができなくなっているなとつくづく思います。

これからブログや仕事、できれば勉強会やコミュニティにもできるだけ積極的に参加していきたいなとは思っています。

あ、 OWASP Nagoya スタッフも実は仕事や転職が忙しくて放置してしまっていて、ついこの間、辞退の連絡を入れさせていただきました。

その時、リーダーから「ボランティアだからいつでも参加できますよ」って本当に優しい言葉を頂いて、ほんとコミュ障すぎてなんて返していいかわからず放置してしまってるんですが。

皆さん、なんでこんなに優しいんでしょうね。なんでこんなに心が広く、自分以外のことを広く視野に入れることができるんでしょうね。

もっともっと人間として成長しないとな、と感じています。

MUSECA 名古屋交流会に参加してきた話

まさか2回連続 MUSECA の話題でブログ書くことになるとは誰が思っただろうか。私も思ってなかったよ。

でもこれは流石に書かずにはいられない。正直ここ1ヶ月で、控えめに言って最高の1日だったと思います。

というわけで、書きます。いいですか、書きますよ。

>> #Trashで踊るな <<

MUSECA 名古屋交流会に参加してきました

f:id:yuzutan_hnk:20180418024727j:plain

先日 4月14日、名古屋のレジャーランドささしま店で開催された、 MUSECA 名古屋交流会に参加してきました。

前回の記事でも書いた打鍵舞踏廻に引き続き、実に2回目となるゲームイベントへの参加でした。

なんか、たった2ヶ月空いただけなのに、なんだか懐かしいというか、なんというか。

こういう雰囲気、久しぶりだなぁという感覚でした。

こんな日に限って寝坊するとか無いわ〜、ありえないわ〜…

とりわけ私早めに行きたいなぁと思って、というか朝から開店凸ってもいいなぁとか思いつつ。

地元勢だしばっちりリハーサルも兼ねて出かけようかなぁとか思ってたんですよね。気持ちだけは。

というわけで当日の私のツイートをペタリ。

もうこれどうしようもねぇな。

一応、会自体は14時からなので、 間に合ってます 間に合ってません。

いやこれめっちゃ急いで支度して出ないとほんとに間に合わないなと思いつつ、家を飛び出し…。

なんとか直前に会場入り。みんな集まってる、というかめっちゃ人多いな!?みたいな感じでめっちゃ挙動不審してました。

そして打鍵以来のしゃーさんに名札をもらい、メカコさんに記念品(?)のアクリルキーホルダーを貰い。

打鍵舞踏廻のときにも、仔猫吸引さんがアクリルキーホルダーを作ってきてくださって、めっちゃ感動したんですけど。

今回もまた超クオリティなものを頂いてもう感謝感激…。いやいや勿体無くて使えない。でもずっと眺めてたい。

こう、ユーザ参加型のゲームなだけあって、キュレーターの中にコンテンツ提供者がいるっていうちょっと不思議な感覚ではあるんですけど。

実際にクリエイターから直接もらえるって、めちゃくちゃ嬉しい。いや今度の JB は参加したいよ。めっちゃ行きたい。前回行けなくてごめんなさい。

久々にロカマチ!

いやぁ交流会ということで、久々に筐体が4台並ぶところを拝見いたしました。拝み。写真は神様を写すということに値するかもしれないのでなし。

普段は1人でしかやらないのでどちらかといえばマイペースに別機種交えながらやるんですが。

今回はみなさんとロカマチしながら楽しくワイワイ…ワイワイ?

多分、現場にいた皆さんから見えてた私って、こんな感じだと思うんですよね。

私「アッ、アッ、えーっと、うん、アッ」

絶賛コミュ障発揮してるーーーッ!!!

あーなんでこんなコミュ障なんだろネット弁慶極めてるとかホント自慢にならない…

ほんっとなんで自分こんなに人前で緊張しちゃうんだろう、せっかく話しかけてくださった方々と気軽に話せない。うーん。

と思いつつ、何度かいろいろな方とロカマチさせていただきました。

f:id:yuzutan_hnk:20180418015247j:plain:w300 f:id:yuzutan_hnk:20180418015319j:plain:w300 f:id:yuzutan_hnk:20180418015344j:plain:w300 f:id:yuzutan_hnk:20180418015429j:plain:w300 f:id:yuzutan_hnk:20180418015457j:plain:w300 f:id:yuzutan_hnk:20180418015532j:plain:w300 f:id:yuzutan_hnk:20180418015601j:plain:w300 f:id:yuzutan_hnk:20180418015629j:plain:w300 f:id:yuzutan_hnk:20180418015658j:plain:w300 f:id:yuzutan_hnk:20180418015729j:plain:w300 f:id:yuzutan_hnk:20180418015755j:plain:w300 f:id:yuzutan_hnk:20180418015824j:plain:w300 f:id:yuzutan_hnk:20180418015849j:plain:w300 f:id:yuzutan_hnk:20180418015918j:plain:w300 f:id:yuzutan_hnk:20180418015944j:plain:w300 f:id:yuzutan_hnk:20180418020011j:plain:w300

計4回かな?いやめちゃくちゃ楽しかったですよ!

みなさんほんと上手いし、何より楽しそう。というか、 MUSECA ってやっぱ楽しいよね。何度も思う。

いつも全然やってる人を見ないので、本当に自分だけの空間みたいになっちゃうんですけど。

いろんなひとが MUSECA で楽しんでいるところを見ると、ホッとしますね。色々思うところはあります。

最後に

やっぱり MUSECA 楽しいです。

私自身、どちらかといえばエンジョイ勢に寄っているのでこれまであまり突っ込んで活動はしてこなかったのですが。

こうして交流会だったり、大会だったり、いろいろなイベントに足を運んでみると、また違った世界が見えてきます。

純粋に音楽を楽しみたいがために始めた音ゲーが、自分の中でこうも大きな存在になっているのかと改めて実感もしましたし、

色んな人がいろんな思いで一つのことに夢中になれる、本当に素晴らしいゲームなんだなと感じたりもしました。

本当に、楽しかった。

あの場にいた人全員に、感謝しています。ありがとうございました。

現在 0000/00/00 00:00 を生きています。