Open XML SDK を使って Excel ファイルを出力

C#Excel ファイルを出力する場合、.xls ファイルだと

という選択肢があった。 Microsoft.Office.InteropExcel のインストールが必要だし、 ExcelCreator は有料だしと、 趣味のアプリとかではちょっと使いづらい。 主に金銭的に。

Office 2007 以降の .xlsx ファイルでいいなら、 Microsoft が提供している Open XML SDK を使って出力できる。 なんと、Open XML SDKオープンソースになっていて、 GitHubソースコードがあるからスバラシイ。

github.com

ただ、Open XML SDKAPI はクセがあるね。 ワークシートに 2 行書き込んだだけのファイルを出力するだけのサンプルを書いてみたけど、 使い方を調べるのに思いのほか時間がかかった。 ドキュメントの構造をかなり意識したコードを書かないといけないっぽいな。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.IO;

namespace ExcelSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 出力先はデスクトップ
            var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "sample.xlsx");

            // スプレッドシートドキュメントを作成
            var document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);

            // WorkbookPart をドキュメントに追加
            var workbookPart = document.AddWorkbookPart();
            workbookPart.Workbook = new Workbook();

            // WorksheetPart を WorkbookPart に追加
            var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
            worksheetPart.Worksheet = new Worksheet(sheetData);
            
            // Sheets をワークブックに追加
            var sheets = workbookPart.Workbook.AppendChild(new Sheets());

            // ワークシートをワークブックに追加
            var sheet = new Sheet()
            {
                Id = workbookPart.GetIdOfPart(worksheetPart),
                SheetId = 1,
                Name = "Sample",
            };
            sheets.Append(sheet);

            // sheetData に行を追加
            var row1 = new Row();
            row1.Append(new Cell()
            {
                DataType = CellValues.String,
                CellValue = new CellValue("A1 のセル"),
            });
            sheetData.Append(row1);

            var row2 = new Row();
            row2.Append(new Cell()
            {
                DataType = CellValues.String,
                CellValue = new CellValue("A2 のセル"),
            });
            sheetData.Append(row2);

            // ワークブックを保存
            worksheetPart.Worksheet.Save();

            // ドキュメントを閉じる
            document.Close();

            Console.WriteLine("Excel ファイルの出力に成功しました。");
        }
    }
}

六厘舎 TOKYO のつけ麺

六厘舎のつけ麺、一度食べてみたいんだけど、 東京に行く機会はしばらく無さそう。 でも食べてみたい。 お取り寄せやってないかなと思って探してみたら、 なんとやってた。

送料別で福岡だと 860 円もする。トータルで 3 食 3398 円。 たっ、高い。でも誘惑に負けて注文してしまった。

さっそく週末に作ってみた。 2人前同時に作ったせいで、麺がザルに入りきらないというアクシデントに見舞われたけど、 なんとか完成にこぎつけた。

麺はツルツルでのど越し良し。 コシもあって、とてもお取り寄せした麺とは思えないクオリティ。 美味い。

つけ汁は予想違ってサラっとしていた。 サラっとしているけど味が凝縮されていて濃厚。 これまた美味い。

余ったつけ汁は、専用のスープで割るのもいいけど、 ご飯を投入して雑炊で〆るのがオススメ。 〆の雑炊は六厘舎の店舗ではやってないらしい。 お取り寄せの醍醐味だな。 つけ汁を気兼ねなく温められるのもいい。

六厘舎で食べたことないから、店舗の味と同じかどうかは判断できないけど、 福岡で食べたつけ麺と遜色ない味だった。 懐が暖かいときにまた注文したい。

最小の ASP.NET 5 アプリを Docker で動かす

はじめに

yo のジェネレーターを使って ASP.NET 5 プロジェクトを作成したら、 次のような Dockerfile も含まれていた。

FROM microsoft/aspnet:1.0.0-beta7

COPY project.json /app/
WORKDIR /app
RUN ["dnu", "restore"]
COPY . /app


EXPOSE 5000
ENTRYPOINT ["dnx", "-p", "project.json", "kestrel"]

せっかくなんで、Docker で動くか試してみよう。

Docker Toolbox をインストール

Mac OS X で Docker を使うために、Docker Toolbox をインストールする。

www.docker.com

Docker Toolbox は次のツールが含まれていた。

  • Docker Client
  • Docker Machine
  • Docker Compose (Mac only)
  • Docker Kitematic
  • VirtualBox

余談だけど、Docker Toolbox がインストールした VirtualBox が新しくて、 Vagrant が実行できなくなった。vagrant upgrade もできなくてツライ。

Docker Quickstart Terminal を起動

Launchpad から Docker Quickstart Terminal を起動。


                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

192.168.99.100 はコンテナにアクセスするときに使う IP アドレスだった。 これに気づかずに、ずっと localhost でアクセスしようとしていた。 そりゃ繋がらないはずだ。

コンテナイメージを作成

Dockerfile があるディレクトリに移動し、タグとバージョンを指定して、コンテナイメージを作成する。

docker build -t tnakamura/helloaspnet:1.0 .

-t オプションを使ってタグとバージョンをつけておかないと、どちらも になってしまって、 docker のサブコマンドで毎回イメージ ID を指定するハメになる(体験済み)。

コンテナを実行

docker run コマンドでコンテナを起動。

docker run -it -p 5000:5000 --name helloaspnet tnakamura/helloaspnet:1.0

-i オプションをつけると、コンテナで実行したコマンドの標準入出力に接続して、 対話的に操作できるようになる。

-t オプションはコンテナに擬似 TTY 端末を割り当てるもので、 コマンドライン操作を行うプロセスを使用するときは必須。

これら2つはほぼすべての場合に指定しておいたほうがいいみたい。 付け忘れると端末が入力を受け付けてくれなくなって、タブを閉じるしかなくなった(体験済み)。

あと、-p はポートフォワーディング、--name はコンテナに名前をつけるやつね。

Safari でアクセスしてみる

192.168.99.100:5000 にアクセスしてみたのがこちら。

f:id:griefworker:20151025203034p:plain

上手くいったけど、スクリーンショットじゃ分かりにくいかな。 ホントに Docker で動いてるからね。

まとめ

最小の ASP.NET 5 アプリではあるけど、Docker のコンテナで動かすことができた。

今回作ったコンテナが、Docker コンテナのデプロイをサポートしている PaaS でそのまま動かせるのだとしたら胸熱だな。

Google Container Engine、Elastic Beanstalk、Azure Container Services、Heroku。 Heroku は確か、 Heroku が用意したコンテナイメージから作る必要があったっけ。

そのうちデプロイも試してみよう。

Mac OS X に ASP.NET 5 開発環境を構築

はじめに

そろそろ自宅の MacBook Pro にも ASP.NET 5 の開発環境を作るとしよう。

.NET Version Manager (DNVM) をインストール

Homebrew を使ってインストールする。

brew tap aspnet/dnx
brew update
brew install dnvm

Zsh の設定に追加して、dnvm コマンドが使えるようにしておく。

echo "source dnvm.sh" > ~/.zshrc
source ~/.zshrc

.NET Execution Environment (DNX) をインストール

ランタイムは CoreCLR で。

# プレビュー版の CoreCLR を試してみる
dnvm upgrade -r coreclr

ASP.NET 5 プロジェクトの雛形を生成できるようにする

npm で yo と generator-aspnet をインストールすれば、 プロジェクトの雛形が生成できるようになる。

# Node を入れてなければインストール
brew install node

# Yeoman は deprecated みたいなので個別にインストール
npm install -g yo bower grunt-cli generator-aspnet

あと、bowser と grunt もついでにインストール。 grunt じゃなくて glup でもよかったかも。

ASP.NET 5 プロジェクトを新規作成

yo aspnet

を実行するとプロジェクトの雛型が生成される。 Dockerfile まであるね。

f:id:griefworker:20151019064355p:plain

Startup.cs の中身はこんな感じ

これが最小の ASP.NET 5 アプリケーション。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.Framework.DependencyInjection;

namespace HelloAspNet
{
    public class Startup
    {
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

ASP.NET 5 アプリを実行してみる

cd HelloAspNet
dnu restore
dnu build
dnx kestrel # または dnx web

ブラウザで表示させてみる

Safari を起動して、localhost:5000 にアクセスすると

f:id:griefworker:20151019064438p:plain

ちゃんと表示されてるね。

まとめ

Mac OS XASP.NET 5 の開発環境作れたんで、 クロスプラットフォームな Web アプリを何か作りたい。

『Web 製作者のための CSS 設計の教科書』読んだ

CSS は一応書けるけど、我流でルールなんてものは無い。 デザインを実現することが最優先。 再利用性や保守性は皆無。 これではいけないよなぁと思って購入した。

CSS の再利用性や保守性は、 「CSS のルールセットを取り換えのきく部品=コンポーネントにする」ことで高めることができる。 本書では、コンポーネントを意識した CSS 設計の考え方を学べる。

コンポーネント設計のアイデアには

  • OOCSS
  • BEM
  • SMACSS
  • MCSS
  • FLOCSS

があり、中でも興味があったのは OOCSS と BEM。 BEM は Web 上の記事を読んでもイマイチ理解できなかったけど、 OOCSS と比べながら説明していてアッサリと理解できた。

コンポーネント設計の実践では、CSS フレームワークが提供するようなコンポーネントを題材にしている。 CSS をイチから記述する場合、丁度良いお手本になりそう。 まぁ、自分は CSS フレームワーク使うんだけど。

読み終えて CSSリファクタリングしたくなる衝動に駆られると思う。 でも、いきなりなんでもかんでもコンポーネント化しようとしてはいけない。 CSS でも YAGNI。そして Rule of three。 同じパターンに 3 回出くわしたら再利用できるようにするくらいで丁度いい。

『Docker 実践入門』読んだ

Docker と、Kubernetes や Atomic Host といった周辺ツールの使い方にとどまらず、 Docker の仕組みまで解説している良書。

Docker の使い方はブログや Qiita を探せば記事が見つかるけど、 Docker の仕組みを解説する記事はそうそうない。 最初から体系的に学びたい自分のような Docker 入門者に最適だと思う。

Docker コンテナは仮想化技術というよりも、 動かすための環境ごとアプリケーションをパッケージングしたものだと理解した。 「開発環境とテスト環境と本番環境を同じにしたい」と、 開発者なら誰もが一度は考えたことがあるはず(あるよね?)。 その悲願が Docker によって叶うかもしれない。

自分の場合、Google Container Engine や Elastic Beanstalk、Heroku といった Docker コンテナをデプロイできる PaaS を使うから、 当分は Docker の基本的な使い方で十分そうだ。

池田屋のミルクセーキ

唐津駅前の商店街にある『池田屋』には、 小さい頃にカキ氷やミルクセーキをよく食べに行ったものだ。

週末用事で唐津に行った際、懐かしく思ったのと、10 月なのに昼間暑かったのもあって、 かな~り久しぶりに寄ってみた。 最後に行ってから、10 年以上経っているはず。 もしかしたら 15 年ぶりくらいかも。

昼過ぎに行ったんだけど、あいにく奥の喫茶スペースは準備中だったので、 テイクアウト用のミルクセーキを購入。

自分の中でミルクセーキといったらコレ。 ミルクセーキは食べるものでしょ。 最初濃厚なのに後味はサッパリ。 柑橘系の爽やかさがスッと残る。 懐かしい味だ。 相変わらず美味かった。 記憶の中の味と変わっていなくて嬉しいね。

関連ランキング:和菓子 | 唐津駅