手続き型音楽の日常

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

2019年、将来の自分へ、今年の目標を、

謹んで新年のお祝辞を申し上げます。

本年もどうぞよろしくお願いいたします。

前回の記事はまだクリスマスプレゼントの記事なので年明けにカウントしないことにしますね。異論は認める。

今年の目標について

まずはじめに結論から始めたいと思います。今年は、次のことに挑戦してみたいと思っています。

  1. 1週間に1件 は、ブログを書くこと
  2. ゆずたんのAP対策日記 を、継続して更新すること
  3. 楽曲アレンジ動画を 2本 は投稿すること
  4. サイトを作ること

yuzutan-hnk-ap-taisaku.hatenablog.com

yuzutan-hnk.hatenablog.com

もう既に1つめから破綻 前回の記事までまだ年明けていないのでセーフです。

というわけで、今年は上記のことを目標にします。言ったからにはやらなきゃ。


自分を、振り返る

過去の反省は、個人的にはとても大事だと思っています。

2019年、どんな年にしようかなぁと考えたときに、やっぱり経験をもとに考えなくちゃいけなくて、必然的に過去の自分を見ざるを得ないと思うんですよね。

今までどこが良かったのか、どこがだめだったのか、結果的にどうなったのか、何が因果関係だったのか、っていう自問自答を繰り返す。

結論は出ないかもしれないけど、それで得るものは大きいと思う。

今回は、去年の自分を振り返ってみることにします。

2018年、全然活動できなかった年

2017年はいろいろなことに挑戦していた記憶がありますが、去年は全然なにも起きませんでした。うん。

守るものも増え目標も増え、どこに身を置くべきなのか悩み、大きな一歩を踏み出せない毎日を過ごしました。

どれもこれも思い当たるフシはたった一つで、やはり転職したことが一番大きかったんだろうなぁという結論に落ち着きます。

上半期は転職に向けてひた走り、転職してからは新しい職場環境になれるため頑張り、これからの人生を見つめ直す機会が社内で何度も訪れ、ストレスの現れなのか1年間の収支がゴニョゴニョ……

プライベートでは勉強会に行く頻度が極端に減り、画面に面と向かって座って開発したり作業したりする気が無くなり、ずーっとスプラトゥーンで遊び続け、前半頑張っていたMUSECAも休み始め、本職のはずの楽曲アレンジ動画もついに1本も投稿せず。。。

なぜ私はこんなにも堕落した生活をしているのか!?やる気は十分にあるのに体がついてこないのはなぜだ!?厄年か!?新手の厄年か!?!?(錯乱)

何もかも、2017年と変わってしまいました。自分でなんとかしようとか、自分から何かを起こそうとか、そういった気が全く失せてしまいました。全部受動的。

一人暮らししようとか目標を立ててましたが、そんなこと言っている場合じゃありませんでした。

何もできなかった2018年。正直に言って後悔しています。

2019年、自分自身が試される年

新しい年に過去の悔みを引きずるのは良くないので、気分を転換しよう。いや、発想を転換しよう。

つまり、2018年の自分を鏡に、今年の自分を見直そう。

転職という大きなことを成し遂げたんだ。いや、個人的にはめちゃくちゃショートカットして楽に済ませたけど、本当は大きな一歩なんだ。その後の変化が無いわけがないのだ。

だから、今の自分を原点に、また新たな自分を見つけていかなきゃいけないと思う。

そして、これまでの自分を取り戻すことも、とても大事だと思う。だって、今までの自分がなければ、これからの自分も無いのだから。

新しい自分と、これからの自分。どちらも同じ自分、見つめ直さなきゃいけない時期にきたのかな。

教えられること、学ぶこと

先日は、成人式でした。今年成人式を迎えられた皆様、おめでとうございます。

あまりニュースを見ていないので今年はどんなどんちゃん騒ぎが起こったのか知りませんが、耳に入らないってことはそんなに起こっていないのかなと思います、誰も怪我しなかったことを願います。

わたしの成人式は、本当に質素なものでしたし、特に思い出もありませんが、記憶には鮮明に残っています。皆様にも、そんな大切な思い出の一つとして残っていけばいいなと思います。

こんなふうに、年を取るごとに、自分より若い世代がどんどん社会に出てきて、びっくりしちゃうんですよね。今まで上の人にびっくりさせられることが多かったのに、どんどん若い人たちに驚かされる。

驚かされるという表現をしたけれど、厳密には 教えられる というほうが適切かもしれない。

1ヶ月ほど前、NGK2018Bという 勉強会 忘年会に行ったとき、たまたま近くの席に座った人が高校生でした。話をさせていただきましたが、全然話についていけませんでした。

IT系にいるとたまに太陽光パネル買ってる人が居たりブレードサーバを買っている人が居たりして面白いなと思いますが、高校生がここまで話せるとはにわかに信じがたいものがありました。

でも、現に目の前で喋ってる。本物だ。

自分の知識不足というよりかは、世の中にはいろいろな人が居て、いろいろな考え方があるんだな、ということをまじまじと教えられた気分でした。

あまりいろいろな人と関わってこなかった人生、社会に出て人と接することで驚かされ教えられ、成長しなければならないことがどんどん増えてきました。

まだまだ学ぶことが絶えないことを、肝に目地て置かなければならないなと感じています。

時間は有限であること

実は少し前に下書きして完成しなかった記事に、「ハタチが終わる日に向けて、人生が終わる日を考える」というのがあります。完成してないから公開もしてません。

人が居なくなる、この世になくなる、そういう経験を最近は身近に感じるなということを書きたかったのですが、なかなかまとまらず放置してあります。もう書く気はありません。

でも、今でもその時の気持ちは生きていて、何をしているときでもはっと感じるときがあります。

今、私は21歳。もうすぐ22歳になります。まだ半年以上ありますけど、きっとすぐに来る。

限られた時間の中で何をすればいいのか、何をすれば自分の理想に近づけるのか、何をすれば自分のやりたいことができるのか。

そして、どうしたら大切な人を守ることができるのか。

ずっと自分に問いかけ続けています。

さいごに

すみません、持論というか感情の押しつけというか、完全に自己満足な記事になってしまいました。ここまでお付き合い頂きありがとうございます。

今年も精一杯、がんばります。OWASPへのボランティアもできたら再開したいし、個人開発のソフトもいっぱい作りたいし、色んな場所へ旅もしたい。

そして今年こそは一人暮らしを始めたいので、それを見据えて最初に立てた目標に絞りましたが、できるならとことん挑戦していきたいと考えています。

どうぞ、これからもよろしくお願いします。

家で盆栽を育てることになった件

平成が終わる 2019年。

私は年明け早々、クリスマスプレゼントをいただきました。

f:id:yuzutan_hnk:20190109014254j:plain

盆栽。升に入った盆栽キット。

というわけで、今年は盆栽にチャレンジしてみたいと思います。

開封の儀

早速中身を確認していきます。

f:id:yuzutan_hnk:20190109014312j:plain

f:id:yuzutan_hnk:20190109014331j:plain

中身は、 取扱説明書 の 3つ。

土はとりあえず袋に入っているけれど、外箱に使われてる升に直接入れて飼育できそう。

種は数粒入っている程度。写真ではちょっと光って見づらいけど。

どうやら紅葉が栽培できるようなのですが、種がこんなに小さいのはちょっと驚き。

一体どんな盆栽に育つのだろう。

取扱説明書を読む

とりあえず、取扱説明書のとおりにやってみることにします。

IT系で言えばセットアップみたいなものですね。普段は見ずに適当にやるんですが。

なにせ相手が生物ですので、身長にやっていきたいと思います。

f:id:yuzutan_hnk:20190109014448j:plain

…ちょっと待って。

取扱説明書の一番上に "難易度が高い" って書かれてますが。こんなの見たことある?

私はちゃっちゃとセットアップ済ませて運用を開始したいというのに、いきなり難易度の話されても困ります。

それに冷蔵庫? 低温期間?? 冬??? 一体なんのこと…?

そう、相手は "生き物" だ

f:id:yuzutan_hnk:20190109014350j:plain

読み進めていくと、なんと紅葉 (とシリーズの山桜) は冬眠期間を再現するために、

1ヶ月〜3ヶ月、冷蔵庫で保管しなければならない とのことでした。

その後、冷蔵庫から出し土に植えると、冬が明けて春が来たと認識して発芽するそう。

それでも、うまく行かなければ発芽しない場合もあると書いてある。ぐぬぬ難しい。

普段こういった 何かを立ち上げる 作業って機械相手でしかしないから、こんな展開は全く予期していなかった。

実際の自然環境を再現するとはいえ、あの種だけ 1ヶ月 も冷蔵庫に入れておくとなると、あとから探し出せるか心配だ。

ということは…。

f:id:yuzutan_hnk:20190109014508j:plain

f:id:yuzutan_hnk:20190109014526j:plain

f:id:yuzutan_hnk:20190109014543j:plain

必然的に升ごと冷蔵庫に保管することになりました。

それでは、次回は 3ヶ月後。

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 という勉強会にも参加して来ました。

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

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

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

皆様、お疲れ様でした。

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