Create a new world

きっと誰もが新しい世界を作り続けているんだよ。

いわゆる季節モノエントリ。退職エントリ。

(PC忘れたのでスマホから。電池ないのであとで清書する)

ずいぶんと久しぶりにブログ書きました。

ここしばらく同人誌に記事書いてたけど、ブログには書いてなかったなぁと。

ということで、久しぶりのブログ記事です。

ついでに退職エントリです。

2016/3/31をもって、グロースエクスパートナーズ株式会社を退職することとなりました。

在職中、多くの方へご迷惑をお掛けいたしました。

また、多くの方のご支援もあり、いろいろと貴重な体験もすることができました。

なんとかIT業界で引き続き生きていけそうです。

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

ということで、ここしばらくでやってたことを挙げておこうと思います。

【最近やってたこと】

なんかいろいろやってました。 あまり細かいことは書けないのですが...

BTS

デプロイツール

ビルドツール

あたりのオペレーター、ヘルプデスク、保守開発のプログラミング、設計、テスティング、バージョンアップ計画策定、旧システムクロージング、プロジェクトマネジメント。

機械学習

IoT

あたりを使ってリアル空間の事業を拡張したい。

という「Why」のもと、ビジョニングからMVP(プロブレム・ソリューション・フィット)の初期プロトタイプ構築までにおけるファシリテーター、プロトタイピング実装、プロセスモデル定義。

といったことをやっていました。

なんていえばいいのでしょう。

器用貧乏?

球拾い屋?

フルスタック・エンジニア?

きっと、なんでも屋さんなのでしょうね。

グロースエクスパートナーズ、という社名にあるように、お客様の事業をグロースさせるために、動ける範囲であれこれやっていたら、なんかなんでもやっていました。

【感じたこと】

できることの枠、って人それぞれなのかなぁって思います。

自分と上司、自分とお客様、その他諸々。いろんな人がそれぞれできることの枠を持っている。 だけども、その枠と枠の間で谷があると、だれも引き取らず、結果としてあとで痛い目に遭う。

一方で、この谷の存在に気づいて「うまいことやりましょうか」と言ってみると、うまいこと引き取れたりします。

相手からしたら領域侵犯をしていないので。

という具合で、引き取ったら何かしら得られるんじゃないかな。というくらいでやっていたら、なんかいろいろやってました。

【なぜ退職しようと考えたのか】

上記の機械学習やIoTのリアル空間への事業適用を狙っての動きをあれこれお手続きさせていただくなかで、一度事業側のエンジニアとして仕事をしてみたいと思うようになりました。

機械学習とかIoTとか関係なく、事業側の世界観や動き方を肌で感じてみたい。というところです。

そんななかで、たまたま良いポジションがあったので転職することとなりました。

ということで、2016/4/1からWeb系事業会社の中の人になります。

【この先目指したいこと】

技術を理解しているマネジメント業

マネジメントを理解している技術業

Devを理解しているQA

QAを理解しているDev

Devを理解しているOps

Opsを理解しているDev

といった具合で、あれこれいい具合に理解しながら横串的にあちこち入っていって、あれこれやる。

ということが、より高いレベルでできたらいいなと思っています。

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

【以下、テキトーに書きたいこと書く】

上でいろいろ書いたけど、読んでみると「意識高い系(笑)」とされそうなので。

ホントのところは、面白いことやって、何かしら「成し遂げた」って宣言できたときの高揚感を味わって、仲間と美味い酒を飲めればそれでいい。

その面白いことをやるために泥臭いこともやらなきゃいけないならまとめてやる。

ってだけです。

そうでないと、あれこれ引き取ってなんとかするってできなくて。

なので、全部まとめて「趣味と実益を兼ねて、伊達と酔狂でやってる」って言い張ってます。

あと、なんだかんだで面白いんですよね。作ることそのものが。料理もシステムづくりも。

家事も継続的プロセス改善というコトづくりって捉えると面白いんですよね。時には「食洗機購入」とかいう札束で殴る解決策もあったりして。

さらに言えば、上記のあれこれもひとりではできなくて。いろんな人がいたからできたのであって。

「自分ひとりじゃ絶対経験できないことばっかなんで、めちゃくちゃタメになります。頭と心の財産ッス!」という状態が心地いいのですよ。

SHIROBAKOのディーゼルさんですな。

というわけで、SHIROBAKOはいいぞ。ガルパンもいいぞ。プロジェクトマネジメントの教材としてかなりいいぞ。

【ウィッシュリスト】

https://www.amazon.co.jp/gp/aw/ls/ref=aw_wl_ov_rfn?filter&lid=92AHZB4MLHPU&reveal=unpurchased&sort=priority

豆乳は生活を支える要

フリクションボールの替え芯はお仕事を支える要

(手書きモデリングとか手書きWBSとか書くのに必須)

C#小話 : MEFってスレッドセーフなの?

「MEFって何?」という方は

Managed Extensibility Framework (MEF)

とか

.NET: はじめての MEF - sardineの日記

を見ていただくとして。 早速タイトルの解答です。

Ans. スレッドセーフです。安心して別スレッドから呼び出したりできます。

調べてみたのです。

仕事でコードを書いているときに、「MEFで使っているメソッドって、別スレッドから動かしても元のスレッドに影響しないの?」と聞かれ、分からなかったので調べてみたのです。

答えはこちら。

MEF for Beginner (Part Creation Policy) - part 6 |

に書いてありました。

What is the default instantiation?

the default instantiation model of MEF is the singleton model.

Best practice

the best-practice is to use the Shared (singleton) model. this bring us to design consideration which suggest that you should design your exportable parts as stateless and thread safe, so they won’t be affected by multiple calls (maybe on different threads) upon the same instance.

デフォルトでシングルトンになってる。ステートレスでスレッドセーフ。 複数呼び出しがかかることを前提に設計していたのですね。素晴らしい。 これで、安心してMEFを非同期で使ったりできますね。

それにしても、まさかイスラエルのサイトまで探しにいくとは思わなかったよ。Microsoftのサイトだけどさ。

WindowsストアアプリでMVVMを扱う。 MVVM Light Toolkit Messenger編

昨年の年末、コミックマーケットC85で出した

Far East Developer Review - DevLOVE Pub the booth

に寄稿した「MVVMで始めるWindowsストアアプリ」の続きになります。

(「MVVMで始めるWindowsストアアプリ」の記事が読めるFar East Developer Review - DevLOVE Pub the boothDevLOVE Pub the boothにて頒布しています。)

Messengerパターンを扱う

Messengerパターンは、ViewModelからViewに要求を送る場合にとるパターン(のよう)です。

Messageを詰めるオブジェクト(Messageオブジェクト)を用意し、ViewModelにてMessageオブジェクトを送ると、Messageオブジェクトを受け取るように定義したViewにて、Messageオブジェクトを受け取れる仕組みです。

(詳しくはこのあたりとか読んでみるといいかも。 いまさら聞けない「MVVM + Messenger パターン」超入門 - present

今回はViewModelから別のViewModelにMessageを飛ばし、受け取ったViewModelでMessageオブジェクトの中身を表示するやり方を書いてみます。

まずは、ViewModelLocator.csにViewModelの定義を追加します。

/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class ViewModelLocator
{
    static ViewModelLocator ()
    {
        ServiceLocator . SetLocatorProvider (() => SimpleIoc. Default );

        if (ViewModelBase . IsInDesignModeStatic )
        {
            SimpleIoc .Default . Register< IDataService , Design . DesignDataService >();
        }
        else
        {
            SimpleIoc .Default . Register< IDataService , DataService > ();
        }

        SimpleIoc .Default . Register< MainViewModel >();
        SimpleIoc .Default . Register< UserControlViewModel > ();
    }

    /// <summary>
    /// Gets the Main property.
    /// </summary>
    [ System .Diagnostics . CodeAnalysis. SuppressMessage ( "Microsoft.Performance" ,
        "CA1822:MarkMembersAsStatic" ,
        Justification = "This non-static member is needed for data binding purposes." )]
    public MainViewModel Main
    {
        get
        {
            return ServiceLocator . Current. GetInstance <MainViewModel > ();
        }
    }

    /// <summary>
    /// Gets the Main property.
    /// </summary>
    [ System .Diagnostics . CodeAnalysis. SuppressMessage ( "Microsoft.Performance" ,
        "CA1822:MarkMembersAsStatic" ,
        Justification = "This non-static member is needed for data binding purposes." )]
    public UserControlViewModel UserControl
    {
        get
        {
            return ServiceLocator . Current. GetInstance <UserControlViewModel > ();
        }
    }

    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup ()
    {
    }
}

Message送信元のViewにあるGridViewで選択されたItemをMessage受信先のUserControlで受け取り表示させます。 今回は手間を省きたかったので、受信先のUserControlは送信元のViewで表示するようにしています。

< Grid Grid.Row= "1" >
    < Grid.RowDefinitions >
        < RowDefinition Height = "Auto" />
    </ Grid.RowDefinitions >
    < Grid.ColumnDefinitions >
        < ColumnDefinition Width= "500" />
        < ColumnDefinition Width= "*" />
    </ Grid.ColumnDefinitions >
    < GridView x : Name= "ItemsGridView" Margin ="120, 0, 0, 0"Grid.Row ="0" Grid.Column ="0" ItemsSource="{ Binding Items} "  SelectedItem="{ Binding SelectedGridItem , Mode = TwoWay} " >
        < GridView.ItemTemplate >
            < DataTemplate>
                < TextBlock Text ="{ Binding Name } " Width = "250"Height= "60" FontSize ="40" />
            </ DataTemplate>
        </ GridView.ItemTemplate >
    </ GridView>
    < ml: UserControlView Grid.Row ="0" Grid.Column ="1" />
</ Grid >
< UserControl
    x :Class = "MvvmLight4.UserControlView"
    xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns :x = "http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns :local = "using:MvvmLight4"
    xmlns :d = "http://schemas.microsoft.com/expression/blend/2008"
    xmlns :mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns :common = "using:MvvmLight4.Common"
    xmlns :ignore = "http://www.ignore.com"
    mc :Ignorable = "d ignore"
    d :DesignHeight = "300"
    d :DesignWidth = "400"
    DataContext ="{Binding UserControl , Source ={ StaticResourceLocator}} " >
    < Grid>
        < Grid.RowDefinitions >
            < RowDefinition Height = "50" />
        </ Grid.RowDefinitions >
        < Grid.ColumnDefinitions >
            < ColumnDefinition Width= "200" />
        </ Grid.ColumnDefinitions >
        < TextBlock Grid.Row = "0" Grid.Column = "0" Text ="{ Binding ReceiveItem . Name} " />
    </ Grid>
</ UserControl >

さて、ここからが本番。 MainPage.xamlで定義しているGridViewで選択されたItemをMessageとして送信していきます。

まずは、Messageオブジェクトの定義から。

public class ItemChangeMessage
{
    public ItemChangeMessage ( Item item )
    {
        Item = item;
    }

    public Item Item{ get ; private set; }
}

このItemChangeMessageを送信するMainViewModel.csはこんな感じ。

public class MainViewModel : ViewModelBase
{
    private readonly IDataService _dataService ;

    private List < Item> _items;
    private Item _selectedGridItem ;

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel ( IDataService dataService )
    {
        _dataService = dataService;

        var items = new List < Item> ();
        items .Add ( new Item ("hogehoge" ));
        items .Add ( new Item ("hugahuga" ));

        Items = items;

        this .PropertyChanged += MainViewModel_PropertyChanged ;
    }

    void MainViewModel_PropertyChanged ( object sender , System . ComponentModel .PropertyChangedEventArgs e)
    {
        MessengerInstance . Send( new ItemChangeMessage ( _selectedGridItem ));
    }

    public List < Item> Items
    {
        get
        {
            return _items ;
        }
        set
        {
            if (_items != value )
            {
                _items = value;
                RaisePropertyChanged ( "Items" );
            }
        }
    }

    public Item SelectedGridItem
    {
        get
        {
            return _selectedGridItem ;
        }
        set
        {
            if (_selectedGridItem != value )
            {
                _selectedGridItem = value ;
                RaisePropertyChanged ( "SelectedGridItem" );
            }
        }
    }
}

GridViewで選択しているItemが変わる→SelectedGridItemが変わる→MainViewModelのプロパティが変わり、MainViewModel_PropertyChangedイベントが走る。→イベント内でMessageを送る。

という流れですね。

MainViewModelで送信したMessageを、UserControlViewModelで受けます。

public class UserControlViewModel : ViewModelBase
{
    private readonly IDataService _dataService ;

    private Item _item;

    public UserControlViewModel ( IDataService dataService )
    {
        _dataService = dataService;

        MessengerInstance . Register< ItemChangeMessage > (this ,this. GetItemChangeMessage );
    }

    public void Initialize()
    {
             
    }

    public void GetItemChangeMessage (ItemChangeMessage message)
    {
        ReceiveItem = message. Item ;       
    }

    public Item ReceiveItem
    {
        get { return _item; }
        set {
            if (_item != value )
            {
                _item = value;
                RaisePropertyChanged ( "ReceiveItem" );
            }
        }
    }
}

UserControlViewModel.csのコンストラクタで、ItemChangeMessageを受信したときに呼び出すメソッドを登録しています。 これで、MainViewModel.csからItemChangeMessageを送信したら、UserControlViewModelで受け取れるようになります。 受け取ったItemChangeMessageは、GetItemChangeMessageメソッドでMessageの中身を取り出し、プロパティに入れてViewに通知をしています。

これで、MVVM + Messengerパターンを動かすことができるようになりました。

もともと、「MVVMで作るWindowsストアアプリ」を執筆していたときは「Caliburn.micro使えないじゃんうわーん」だったのですが、どうもNuGet経由がダメだということかもしれないです。

なので、今度はCaliburn.microを使ってWindowsストアアプリを試してみようかなと思ってます。

その前に、Windowsストアアプリのちゃんとした作り方を勉強したいなぁ。

コミックマーケットC85でDevLOVE Pubの新刊「Far East Developer Review」を出します。

久々に新刊を出すことになりました。 DevLOVE Pubの新刊をコミックマーケット85 12/31 3日目 西し34a にて出します。

僕は電子書籍データの制作と「MVVMで始めるWindowsストアアプリ」の記事を執筆しました。

MVVM (Model-View-ViewModel) でWindowsストアアプリを書き始めることができるようになるための記事です。 筆者は業務でWPF/MVVMを利用して開発をしています。 今回は業務に入るまえに実践したWPF/MVVMのチュートリアルをWindowsストアアプリで書いてみたらどうなるかを実験しました。 本稿でModel/View/ViewModelとレイヤリングしてアプリを構築していくスタイルを見て取ることができます。

Far East Developer Reviewについて

『Far East Developer Review』(FEDR)とは、DevLOVE Pubの活動理念に基づいて、2013年、同集団の刊行誌として創刊する世界最新のIT技術マガジンです。 「IT業界を楽しむ、IT技術者として腕を上げる事を目指す人の総合IT技術マガジン」として、今回のリリースを皮切りに毎号書き手の興味に沿った特集企画や書き下ろし記事を組み合わせ、時宜に合ったテーマとしてまとめて掲載する予定です。多くのプログラマやコンサルタント、さらにマネージャ層から支持されたらうれしいなと思っています。

詳細については https://github.com/devlovepub/devlovepub.github.io/wiki/Far-East-Developer-Review をご覧ください。

今回もまたCD-Rでの頒布、価格は500円です。 大晦日はビッグサイトでお待ちしておりますー。

ReVIEWで作ったPDFの表紙画像を拡大する

どうしていいかわからなくて迷った末に.texファイルをいじりました。

ReVIEWでPDFを生成するとreファイルの置いてあるディレクトリに{ファイル名}-pdfディレクトリができます。 その配下にあるbook.texファイルをいじります。

いじるのは環境にもよるけどだいたい160行目からの\begin{titlepage}で始まる箇所。 そこで \newgeometry を指定してマージンをいじりました。

該当箇所のtexファイルはこういう感じになります。

\begin{titlepage}
   \newgeometry{top=5mm,bottom=5mm,left=5mm,right=5mm}
   \begin{center}
    %%%\mbox{}\vskip5zw%
   \includegraphics[width=200mm,height=287mm,keepaspectratio]{表紙画像パス}
  \end{center}
  \clearpage 
\thispagestyle{empty}
\newgeometry{top=10zw,bottom=12zw,left=10zw,right=10zw}
 \begin{center}%
  \mbox{} \vskip5zw
  {書名・著者・発行情報なので略} 
\vskip4zw\mbox{}
  \end{center}%
\end{titlepage}

表紙ページで \newgeometry を使いマージンを変えてから、次のページでまた \newgeometry を使ってマージンを元に戻します。

で、これをいじったらbook.texのあるディレクトリでコマンドを叩きます。

$ platex book.tex

$ dvipdfmx book

これで、このフォルダにあるbook.pdfの表紙画像が拡大されます。

ただ、この方法だとReVIEW側でPDFを再生成したときに \newgeometry が消えてしまうので、また書かなきゃいけないのですよね。 きっとどこかにもっといい方法があると思うんだ。うん。

そろそろはてなブログに移行する。

そういえばはてなダイアリーでしばらく記事を書いていなかったなということに気づいて、まわりもはてなブログに移行しているなぁと思ってました。

これからまたブログを書いていくなら、思い切ってはてなブログに移行しちゃえばいいと思ったので移行しました。

はてなダイアリーの記事とかは、そのうち移行するかもしれない。

「ITコミュニティ秋祭り」を今年もやります。

ぜんぜん告知できてなかったので、いまのうちにブログ書いておく。

今週金曜、10/18に東京カルチャーカルチャー様で「高速ITコミュニティ秋祭り」というイベントをやります。一昨年のITコミュニティ夏祭り、昨年のITコミュニティ秋祭りに続く第三弾です。

内容は昨年までの「ITコミュニティってこんなところだよ」というネタではなく、「おれたちのかんがえるさいきょうのITエンジニアキャリア」とでもいうべきものになっております。では、どうしてこのネタになったのでしょうか。

ITコミュニティはもう成熟した

最初の打ち合わせの席でお酒を酌み交わしていながら出てきた話は「ITコミュニティも成熟したよね」という話でした。

IT業界のコミュニティ活動については、ある意味では成熟期に入っていると言えます。
さまざまな分野のコミュニティがしっかりと人に目を向けて活性・循環を始めている感さえあります。
その存在に理解を示しはじめた企業もあり、多くの活動に場所の提供などを行う企業も出てきています。
そんな2013年に、昨年と同じようにコミュニティを知り、触れるだけの場を開催して意味があるのだろうか…
今回のITコミュニティ秋祭りはただ行うだけではなく、その意義について運営メンバーで問いゼロから造り上げました。

要するに、これまでの「コミュニティを知り、触れる場」というこれまでのITコミュニティ祭りはその役割を果たしたという実感を持っていたのです。それと合わせて僕らが「ITコミュニティってこんなところだよ」というネタでは情熱を持てなくなっていたのです。

「自分の道は自分で切り開いてきた」

じゃあなにをやろうか――そんななかで出てきたのは転職話でした。皆コミュニティに関わるなかで転職・転籍といった経験をされています。そのみんなのキャリア話が盛り上がったんですね。「新卒生え抜き」なんていうキャリアとは全く違う世界でした。社会人になる前からも含めて紆余曲折、さまざまな経験を経て今の自分に行き着いたという話ばかりでした。

そんな僕らが共通して言ってたことは「自分の道は自分で切り開いていた」ということでした。直近の転職はコミュニティの人経由だったり、転職エージェント経由だったりしてこれまた人それぞれ。ですが、転職に至るまでのあいだにコミュニティと出会いがありました。もちろん、コミュニティだけでなく日々の仕事やそれ以外の要素も山ほどあるのですが、それらの経験とそこからの直感で自らの道を選びとってきていたのです。

そして、僕らが進んだ先にあったのは「なれる!SE」のようなブラック多重請負オワコンSIの世界でもなく、35歳プログラマ定年とも違うキャリアでありました。学歴・職歴も努力次第でリカバリーでき、十分に未来を感じることのできる幸せな世界でした。

そこで僕らは思ったのです。「こんな世界があることを伝えたい。こんなキャリアだってあることを伝えたい。」ということを。
そして「これがおれたちのガイドラインだ!」というフレーズに象徴される、新たなエンジニアのキャリアを考える、今回のITコミュニティ秋祭りの企画へとなっていったのでした。

全く違うキャリア論。エンジニアの人生とはなにか。

そういうわけで、今回のITコミュニティ秋祭りはエンジニアのキャリアの話となります。
エンジニアのキャリアといっても転職エージェントや転職サイトなどで耳にする「35歳プログラマ定年説」的キャリア論とは全く違う世界が現れてくることでしょう。
うん。「キャリア」なんていう言葉は使いたくないですね。「これが俺たちの生きる道」とでも言いましょうか。
ITコミュニティと出会い、自らの意思で自らの道を歩み始めたエンジニア達。アラサー・アラフォーとなり、自らのキャリアに行き詰まりを感じたが、それを打破していったエンジニア達。そんな僕らが語るエンジニア人生譚。
「これが日本の『情熱プログラマ』だ!」という心意気と人生を、美味しいお酒と共にお楽しみください。

ということで、ITコミュニティ秋祭りは今年もやります。

「これがおれたちのガイドラインだ!! 超↑↑高速ITコミュニティ秋祭り」は、
2013/10/18(金) 東京カルチャーカルチャーにて19:30開演です。
http://tcc.nifty.com/cs/catalog/tcc_schedule/catalog_130910204376_1.htm