広告

$m0t0k1x2["code"].content

プログラミングっぽい話を中心にします。
そうでないほうはm0t0k1.tumblr.comのほうで。
Recent Tweets @m0t0k1m0t0k1

探している

前回はマークダウンからePubを作成する環境を探し続けていることを書いてみたけど、エディタのほうも探し続けている。

マークダウンで電子書籍を作成する環境を探し続けている

過去に出版してきたものは半分はAtomで残りはVS Codeで書いている。 それで満足ではあるのだけど、それでもまだ探し続けている。 一時期はwri.peにお世話になっていたけど、iPhoneで書くこと自体が激減したのでPCから執筆できるものを優先的に探すようになってしまった。

いままで試したもの

VimとAtom、Sublime Text、VS Codeは除外している。 というのも、電子書籍を書くときに集中してやろうとするとVS Code一択になってしまうし、さくっと書きたいときはVimになってしまっているのが現状だから。 それ以外で、ということで。

Haroopad

これ、かなりよかった。一か月くらいは電子書籍を書くために利用していた。だけど使うのをやめてしまった。原因はたぶんアイコンじゃないかな…

Haroopad

MarkDown#Editor

1年以上前に使ってみた程度だったけど、あまりにクラッシュするので使うのをやめてしまっていた。いまはもっといけてるのかな。

MarkDown#Editor

Wri.pe

もう当分メインで使っていたもの。ウェブサービスだったので外出先でも自動保存されてPCに戻ってきたら最後に書いたところから続きができてサイコーだった。 でも、ファイルを複数に分割したいという要求から頻度が減っていってしまった…

さらに、自動保存と言ってもサービスがダウンしていることがあるのか保存がローカルだけになってしまうことがあって、それはつらかった。

wri.pe

StackEdit

wri.peの後に試していたサービス。似たような感じのようで似ていない。 DropBoxへの保存やSNSへの公開機能などいろいろついてる多機能なやつ。 だけど、なぜだかあまり使っていない。 長い時間は書いていられない。ちょっと書いていくにはめちゃくちゃ良い。

StackEdit

MarkdownEdit

いまこの記事を書いているのがこれです。 これはC#で書かれた、いまどき珍しい感じのWindows専用エディタ。

MarkdownEdit

なんなのでしょう、不思議と集中できるのでブログなんかを書くときはよく使っている気がする。 スクリーンショット

ああ、日本語も使えるんだ、と思っていただけると幸いだけど、メニューなんかは日本語じゃなかった。見てみたら日本語にすることは比較的かんたんだったので、適当に訳して作ってみた。

MarkdownEdit-Language-Japanese

もっと良い日本語があれば教えてください。

これをダウンロードしたら展開して、出てくるjaフォルダをMarkdownEditがあるフォルダ内のLanguagesフォルダ内へ放り込みます。そしたらファンクションキーF9をおもむろに押すとユーザー設定がメモ帳で開きます。 この中のファイルの最後あたりにある「CultureLanguage」の値を「ja_JP」にしてやると日本語になると思います。

"CultureLanguage": "ja_JP"

テーマも複数選ぶことができて、自分でオリジナルも作成できるみたい。 ひとつだけ気になってしまうのが、終了するたびに「寄付を!」というダイアログが表示されてしまうところ。でも「寄付しました」を設定でONにすると表示はされなくなる。

Typora

最近試しているエディタ。これはnode.jsがバックにあるようでクロスプラットフォームになっている。node_moduleもインストールされている。

Typora

なんといっても見た目が美しい。もちろん日本語化されていないけど。

typora

それに、コードスニペットを書くのに対応している言語がサジェストされるのも気持ちいい。

typora

適当だけど、こんな感じにコードだけの記述ができる枠が登場するので、それはそれで集中できる。

typora

我らのPowerShellも対応しているのですばらしい!コードは適当でごめんなさい

typora

現時点での結論

現時点ではクロスプラットフォームで利用できて利便性や用途を考えると、わたしの中ではVisualStudio Code一択になってしまう。 Vimも素晴らしいけど、コードじゃないので感がある。

これらを除くとWindowsで作業することが多いのでMarkdownEditが3番目の選択肢で、しかも日本語に(勝手に)したので困らない。 typoraは素敵なんだけど、まだ使いこなせていないというのがある。 頻繁にアップデートされているようなので、使っていこうかなと思わせるところがある。

ちなみに

MarkdownEditはPandocのWindowsバイナリをそのまま内包しているので、そのままPDFに出力できたりするのが恐ろしいところ。 ただ、このときはデフォルトのスタイルシートが利用されるので、思ったように出力しようと思うとCSSのカスタマイズが必要になるー。

マークダウンで電子書籍を作成する環境を探し続けている

困ったことに、なかなか電子書籍をすんなり作成できる環境を決めかねている。

いままで出版してきたものはすべてPandocというツールを利用したものだった。

コードのハイライトはhighlight.jsで、マークダウンに対して行うにはmetalsmithというnpmモジュールとmetalsmith-metalicというmetalsmithプラグインを併用して行っていた。

しかしWindowsとmacOSで同じような環境を作成しようとすると、意外と面倒だった。

metalsmithをコマンドラインツールとして使用したいのだが、WindowsとmacOSで起動のさせ方やどのファイルを実行するかなど、マークダウンファイルの与え方など細かい差があって、結局OSで切り分けするようなgulpファイルを書いていた。

でもどうにも面倒なことが1つあって、著者情報などを含めるYAMLフォーマットだけのマークダウンファイルをmetalsmith-metalicにかけてしまうと「マークダウンじゃねーじゃん」ということで空ファイルが出力されてしまうという困ったことがあった。現在はここだけ除いてmetalicしてる。

代わりを探そう

最近はマークダウンエディタでも便利なものが多くて、直接PDFにすることができたりする。スタイルシートを指定する必要があってもmarkdown-pdfというnpmモジュールを使うと不穏なエラーは出るもののPDFは生成することが簡単にできる。もちろんWindows10でもubuntuサブシステムを利用すれば余裕だ。

一方、epubを吐き出すことだけを考えると、そういうことにはならない。

やたら売れたりするわけではないからか、環境を整えるのが面倒だからかそこまで発展してないなという印象だ。

最近試してみたものを1つ紹介してみる。

epub-gen

これまたnpmモジュールだが、非常に小さなコードでepubをサクッと出力することができる。

var epub = require('epub-gen');
var fs = require('fs');
var json = JSON.parse(fs.readFileSync(process.argv[2]), 'utf8');
new epub(json);

これでコンソールから次のようにするとファイルが出力される。

node index.js sample.json

sample.jsonはルールに従って次のようにしておく。

{
    "title": "晴れた空を誉めるなら夕暮れをウェイト",
    "author": "柏原 基規",
    "publisher": "なるーらぼ",
    "content": [
        {
            "title": "ダイヤモンドだって",
            "data":   "年をとっちゃう。<br/>まして、星なんて…<b>燃えて消えるんだ!!</b>"
        },
        {
            "title": "形あるものが",
            "data": "限りあるなんて!無常!<br/>さみしさを添えて…<b>信じあっている。</b><img src='http://localhost/03-001.JPG' />"
        }
    ],
    "output": "./sample.epub"
}

そうすると、こんな感じになる。 実行したところ

目次

ページ

便利!

epub-genで電子書籍をつくるときに困ること

非常に簡単にjsonからepubにすることができた。content[].dataをマークダウンからHTML変換した文字列にしてやれば、マークダウンから自動でepubを作成することができる仕組みも簡単にできそう!

とぬか喜びした。

お気づきかもしれないが、先ほどのepubは画像ファイルを含んでいない

どうやって表示しているかというと、ブラウザでページを見るときと同じくウェブサーバーからダウンロードして表示させているのだ。

だから画像のimgタグにあるsrc値は「http:」から始まっている。これはepub-genのreadmeにも記載があった。上記のサンプルでは手元でウェブサーバーを起動した状態にしていたわけだ。

どうやらepub-genでは画像をepubへ含めることができない。そのためこのような方式になっていると思われる。むむ、

でんでんコンバータ - http://conv.denshochan.com/

の有能さが際立つ。。。

ウェブサーバーをお持ちの電子書籍の著者さんはもしかしてたくさんいるのかな。

より良い環境を目指して

いまのところ、自分のやりたいようにやるにはPandocを利用した一連の仕組みが一番便利のようだ。

無念…しかし、もっと良い方法があるはずなのだ。

何も気にせず、マークダウンだけ記述していって画像は近くにimagesフォルダなど作成してその中へ放り込んでおいて、スタイルシートも同じフォルダ内に含めておけばまとめてepubにしてくれる未来があるはず。

きっと近い将来、MicrosoftとかがVisual Studioにマークダウンからepubにビルドしてくれるようなものを用意してくれるんだと思い込みつつ。

かなり遅まきながら自分のWindows10にもBashを連れてまいりました。 導入はものすごく簡単なので、すでにInsider Previewからご利用の方も多いのかもしれません。

わたしはそれほど興味がなかったので(PowerShellでだいたい間に合ってる)、今頃の参加となりました。 それも、導入の動機がPowerShellだからです。

PowerShellがオープンソース化された

いろんなところで話題になったようでなっていない、PowerShellのオープンソース化です。いよいよmacOSやLinuxでも利用できるようになりました。 いままでの電子書籍もきちんと「Windows」とつけててよかったと思っています。

こんなものより、さきにcmd.exeをオープンソース化しろという声が聞こえてきますが、せっかくなのでクロスプラットフォームのPowerShellを味わいたいなと思いましてBoW(Bash on Windows)にチャレンジです。

セットアップは割愛します

いろんなところで記事になっていたので割愛します。 「プログラムと機能」から「Windowsの機能の有効化または無効化」を開いて、「Windows Subsystem for Linux(Beta)」にチェックを入れてOKすれば有効になります。再起動後に「設定」から「更新とセキュリティ」の「開発者向け」を開いて、「開発者モード」を選択するとBashが利用できるようになります。

セットアップ

あとはコマンドプロンプトなどから「bash」とすれば自動的にUbuntuがアプリとしてインストールされます。

メニュー

どんな感じなの

ざっとしか使ってみていませんが、あちこちで記事になっているとおり、日本語入力に対応していません。 やってやろう!という方はこちらの記事を参考にしてはいかがでしょうか。

Big Sky :: Bash on Ubuntu on Windows の最高の端末環境を教えてやるからちょっと来い。

そんなことよりも、よく使いそうなものを見てみましょう。 少し感激したのはCygwinやMinGW、msys2なしでSDKMANが利用できることでしょうか。

curl -s "https://get.sdkman.io" | bash

posh-gvmを使わなくてもSDKMANが利用できるようになります。と思ったのですが、このBoWはWindowsとはまったく別の環境になっています。ですから、こちらでもJavaを利用しようと思うとこの環境用にJavaが必要になります。

すでにJava8のjdkがあったのでそこをJAVA_HOMEにしてみたりいろいろしましたが、後から冷静になれば当たり前の話で…なぜならUbuntuなんですから、ここは。

だからWindowsのバイナリはことごとく動作しません。

今回はとりあえずとしてopenjdk-1.7だったかを導入しました。 でもこれだとgroovyshやgroovyConsoleは起動にものすごく時間がかかってしまい途中でkillしてしまいました。

なお、SDKMANのインストールにはunzipが必要です。これもインストールされていませんのでインストールしましょう。

sudo apt-get install unzip

Windowsでapt-getって…

pythonは「python」だと2.7.6が、「python3」だと3.4.3が導入されていましたので、特になにもしてません。

rubyは入っていなかったのでapt-getからインストールしたら1.9.1でした。 古い。

そういえば、Ubuntuのどれ?

そういえばと思ったのでバージョンを見てみることにしました。

cat /etc/lsb-release

すると14.04でした。

バージョン

なるほど、16.04とかじゃないんですね。

rubyを入れようとrbenvを準備することにしました。 しかしGitも別です。これもインストール。

sudo apt-get install git

そしてgit cloneで導入しました。 2.3.1くらいのバージョンのものを入れようとしましたが、コンパイラもありませんのでビルドができません。gccも必要なようです。

sudo apt-get install gcc

これでrubyも用意できました。

本題:PowerShell

やっと本題のPowerShellです。GitHubのセットアップ方法を見ながらやりました。 まずは必要なライブラリを導入します。

sudo apt-get install libunwind8 libicu52

ライブラリを導入

ここまでできたらGitHubのリリースページからダウンロードしてきたpowershellのパッケージを使ってインストールします。

sudo dpkg -i powershell_6.0.0-alpha.9-1ubuntu1.14.04.1_amd64.deb

これであっさり導入完了です。

しかし…powershell自体はあっさり導入できて起動もするのですが、表示がガタガタです。本物のUbuntuでも同じなのか、それともcmd.exeだからなのかよくわかりません。Issue上がってそうですが、まだ調べてないです。

気を取り直してWindows環境、BoW環境それぞれで書いたps1ファイルを実行してみましたが、どちらもさらっと実行できました。

ここで「そりゃそうだろ」と思った方はわたしと同じです。 大事なことを忘れていませんか?実行ポリシーです。 Windows以外には無い概念だからか、普通に実行できてしまったのです。

powershell -f sample.ps1

Windows版でよくご利用の方はさらに「!?」と思うかもしれませんが、「.\」がファイル名についていません。このあたりは仕方ないのかな?

さらに。対話環境に入って実行ポリシーを確認してみたところ、「Unrestricted」でした。つまり、なんでも実行できます。

Windowsのときと同じように実行ポリシーを指定しようとすると、「サポートしてない」エラーになります。

あたりまえの結果

そこでBash上で実行権限を落としてみようとやってみたのですが…

chmod 666 sample.ps1

残念ながら777(フルアクセス)から変更されませんでした。

まだまだアルファ版とベータ版

PowerShellはアルファ版、BoWはベータ版ということで今後に期待であります。

「ls」すると「Get-ChildItem」ではなく「/bin/ls」が実行されるので、ちょっと面食らうところもあります。

Figure out aliases #929
https://github.com/PowerShell/PowerShell/issues/929

もっとC++もC#も勉強しなければ さきにPowerShellか。

もう随分このブログを更新していませんでした。

今回はタイトルの通り、新たに電子書籍を出版したのでご報告です。また懲りずにPowerShellについてのものです。

今回は入門書という形式のものではありません。 ふだんからPowerShellを使うようにしたらもっとユーザーが増えないかな、ということもあってどう使ったらいいかとか「クソが!!」って思うまえに「まぁまぁいいじゃない」というような気持ちになってもらえないかなと考えて書いてみました。

入門書としては非常にダメでして、「うごかして学ぶ〜」の方がよほどかいいと思います。

時間のない方は最速入門の記事を読んだほうがさらにいいでしょう。

PowerShell基礎文法最速マスター
http://winscript.jp/powershell/202

サンプルコードも可能なかぎりつけました。 しかしKindle E-Inkでお読みの方にはコードの部分が異様に大きく表示されます(プレビューツールで見るかぎり)

逆に解像度の高いKindle HD系のものではコード部分が小さく表示されてしまいます。 どの端末でもきれいに表示させるのは難しいですね(スタイルシートをきちんと理解して書かないからではないだろうか)。

なお、Kindle Unlimitedの対象のようです。 登録している方はタダでお読みいただけますので、どうぞどうぞ。

さらに、今回から奥付に記載していた内容を変更しています。 いままでのものは次のように書いていました。

本書の全部、または一部の複写、複製、転載を禁じます。必要な場合は発行元へご連絡ください。

今回からは本文の文章一部やコードのコピペを推奨しています。 さらに、誤りや認識違いなどございましたらブログ、SNS等でご指摘いただけると嬉しいです。

ふだんからPowerShellを使っているのであれば「もっといい方法がある」とか「このやり方はダメ。全然ダメ。こうすべき」などご指摘いただけると勉強になりますし、この書籍もアップデートしていくことができます。

なんとあつかましい…

ということで、よろしくお願い致します。

こんにちは。以前からやってみたかったMacでのASP.NETをやってみました。 というか先週くらいにやって、つまづいたりハマったりしてたので時間かかりました。

結論から言うと、やはりWindowsのVisual Studio様は素晴らしいということに尽きます。 あんなに至れり尽くせりなのにMacでやろうというのはどうかと思います。 でも、できたらMacでもやってみたいじゃないですか。

スペック

レガシーのASP(Active Server Pageと呼ばれてたやつですね)は10数年前に経験してて、.Netになってからはその時の辛さを思い出して手を出していませんでした。 もちろんASP.NETのFormなんかは情報として仕入れてましたが…

また、MVCというのもrailsかじったくらいでしかなくて、本当に理解してるかと言われると怪しいです。 いまいちどういう仕組みで実現してるのかなんてことはrailsのソースなんかも読んでないですし、rubyの黒魔術を駆使して作られてるとかいうことだったので敬遠してた気がします。 バージョン3くらいからRackアプリになったので、なんとなくレベルの理解です。

ということで、いきなりMVCじゃなくても良さそうなのですがやってみました。

まずは導入

どうやるかはまったくわからないので、Windowsのときとは違ってGetting Startみたいなものを探しました。 すると公式にあるのでそれを順にやっていきました。

Installing ASP.NET 5 On Mac OS X — ASP.NET documentation
https://docs.asp.net/en/latest/getting-started/installing-on-mac.html

こちらを参考にしますと、コマンドラインからのインストールということであります。 順番としては

  1. mono をインストールする
  2. Visual Studio Codeをインストールする
  3. ASP.NET5 for Macをインストールする

という段取りですすめていきます。 わたしは1と2はすでに導入済みだったので3からでした。

monoはHomebrewから導入するのが便利だと思います。 Visual Studio Codeは以下からダウンロードしてインストールですね。

Download Visual Studio Code - Mac OS X, Linux, Windows
https://code.visualstudio.com/download

さて、では本題のASP.NETですがHomebrewなんかと同じような導入の仕方のようです。

curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

こちらをターミナルから実行します。

これで意味がわからないかもしれませんが.Netのランタイムを切り替えするためのDNVMというツールが導入できます。 Dot Net Version Manager だそうです。なんじゃそりゃ。rbenvとかSDKMAN!みたいなものですかね。 これはあくまでもバージョン管理ツールで、ASP.NETはまだこれからです。

次にランタイムとしてDNX(Dot Net Execution environment)を導入していきます。 これはさきほど導入したDNVMを利用していきます。

まずは.Net CoreのDNXです。

dnvm upgrade -r coreclr

installではなくupgradeなのがちょっと気持ち悪いですが、これでサクッと入ります。

そうしたら次はMonoのDNXです。 なぜ両方必要なのかは後ほど嫌という程効いてきます。

dnvm upgrade -r mono

これで導入できます。この実行にはmonoが導入されている必要があります。

導入したDNXの一覧は以下のコマンドで見る事ができます。

dnvm list

じゃあ、と思うところですが、まだまだ先があります。 次はプロジェクトの雛形作成のためにYeomanを導入します。

Yeomanということは…そうです。node.jsが必要です。 わたしは電子書籍制作のために導入済みなので必要なパッケージ導入からでした。

まずはYeoman、Bower、Grunt、Gulpなどを入れていきます。

npm install -g yo bower grunt-cli gulp

そしてASP.NETの雛形を作成するパッケージを入れます。

npm install -g generator-aspnet

やっと環境が整いました!!

やってみる

長かったですが、やっと始まります。

まずはプロジェクトの雛形をYeomanに作ってもらいます。 プロジェクトフォルダをつくりたいところへ移動して、次のように実行します。

yo aspnet

そうするといつものおじさんが登場します。

yo

今回は認証機能なしのWeb Applicationにしてみます。 ご覧いただくとわかるとおり、コンソールアプリも作成できるようです。 プロジェクト名を聞かれるので、適当に入力して実行するとサクッとプロジェクト雛形が作成されます。

yo

いやー便利。 そして作成完了したところへそっと書いてくれているのが、次の内容を実行しましょうというものです。

cd MyWebApp
dnu restore
dnu build
dnx web

実際このとおり実行します。 最初は「dnu restore」が時間かかりますが、2度目以降は早いです。 なお、デフォルトでは「yo aspnet」はGulpを利用します。 Grunt派の方は「–grunt」とオプションをつけるとよいそうです。

ということで「dnx web」を実行すると「http://localhost:5000」へブラウザアクセスすればすでに雛形アプリの状態で表示されます。 Windowsに比べたらどっちが早いかなーと思いますが、yo aspnetからだけを見れば誤差かもしれません。 Visual Studioでやっても裏で同じことが起きてますからね。

ところで、.Net CoreのDNXでビルドしてしまった方はビルドに失敗すると思います。

yo

いまのところビルドにはまだmonoが必要ということです。 ですからdnvm listしてcoreclrに「*」がついてる場合は以下を実行してmonoのDNXへ切り替えてから実行しましょう。

dnvm use -r mono [dnvm listででてくるバージョン]

うまくいってたら次のようになります。

yo

ブラウザからみると…

yo

はい、もう動いてますね。ここまでは便利。ここまでは。

普通の段取り

コントローラやビューについてはyo aspnetにサブジェネレータが搭載されているのでそこから作成することができます。

コントローラだと

yo aspnet:MvcController PostsController

これでプロジェクトフォルダ内のControllersフォルダへ「PostsController.cs」が作成されます。

ビューだと

yo aspnet:MvcView PostsView

これで実行したカレントフォルダ内に「PostsView.cshtml」ファイルが作成されます。 Viewsフォルダには入りません。またさらにフォルダを用意してまとめたい場合には手動で作成、移動が必要です。

モデルに関してはMVC専用のサブジェネレータがないようで、クラス作成のサブジェネレータを使います。

yo aspnet:Class Post

これで実行したカレントフォルダに「Post.cs」が作成されます。 Modelsフォルダは雛形にありませんので自分で作成して移動するようにします。

さらにDbContextクラスを継承したクラスファイルはサブジェネレータがありません。 自分で記述していきます。

ハマる

そういうことで、つくっていって「あー、そうなるね」というのをやってみていたんですが、いくつかハマってしまいました。

bowerでビルドできなくなる

まずbowerをつかって静的コンテンツ用のライブラリを導入したのですが、いきなりビルドできなくなってしまいました。

調べてみると次のIssueに当たりました。どうやらこれのようです。

Can’t return a View on OSX when npm or bower packages have been installed #2348
https://github.com/aspnet/Mvc/issues/2348

利用していたmonoのバージョンが古かったようで(この時点では4.2.1でした)、バージョンを上げると解消しました。

brew upgrade mono

EntityFrameworkのmigrationが失敗する

次にハマったのはEntityFrameworkの利用です。 どうあがいても利用できませんでした。 しかしよくよく調べてみると、これは.Net CoreのDNXで実行する必要があるようです。 そこでDNXを切り替えてみると動作するようになりました。

なおEntityFrameworkを利用するにはWindowsではPowerShellから導入できますが、Macではproject.jsonの「dependencies」へ以下を追記するようになります。 バージョンはNuGetで検索して確認してみてください。

"EntityFramework.Sqlite": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final"

また、コマンドとして利用できるように同じくproject.jsonの「commands」へ以下のようにefを追記します。

"commands": {
  "web": "Microsoft.AspNet.Server.Kestrel",
  "ef": "EntityFramework.Commands"
},

これでEntityFrameworkを利用することができます(.Net CoreのDNXならね)。

dnx ef migrations add Initial
dnx ef database update

SQLiteのファイルがプロジェクト内に作成されるはず。

DbContextが見つからないエラーが発生

ここでホッとして気をぬくと、ブラウザからお目当のコントローラへアクセスするとエラーがでまくります。 自分で作成したDbContextが見つからない、といった内容です。 それはそうです。次の作業が抜けているからです。

DbContextを紐付けするのは「Startup.cs」の「ConfigureServices」メソッド内に記述することでできます。 こちらにもがっつり記述されています。

ASP.NET 5 Application to New Database — Entity Framework 7.0.0 documentation
https://docs.efproject.net/en/latest/platforms/aspnetcore/new-db.html

手元ではSQLiteを利用するので次のような感じになります。

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddEntityFramework()
            .AddSqlite()
            .AddDbContext<MyBlogContext>();
        services.AddMvc();
    }

ここでいう「MyBlogContext」がDbContextを継承したクラスです。

もちろんusingで以下を加えておく必要があります。

using MyWebApp.Models

これでコントローラから見つけることができます。

最後に

実はまだCRUDつくってみて「ふーん」という段階ですので慣れるまでもう少しかかりそうな気がしますがEntityFrameworkがDNX切り替えなしでビルドと両立するようになるといいですね。 テキストエディタとしてはVisual Studio Codeで十分な気がしなくはありません。 もっと込み入ったことをやりはじめると「ぐぬぅ」となるのかもしれませんが、現時点ではわかりません。

それでもまだまだ改良が進められているので楽しみではあります。

今回は勉強がてらVisual Studio Codeの拡張をつくってみました。 といっても、サンプルというかチュートリアルにあるコードをほぼ写経したに近いです。

動機

いま現在、性懲りもなく電子書籍を執筆しております。 書いているときに、Atomで書いていたときから思っていた「あーっ文字数も表示されたらいいのに」というのがありました。 そんなに気にしていなかったことだったのですが、日本語なので半角スペース単位でのワード数なんて気にもなりません。 何文字くらい書いたのかを知りたい!と唐突に思いました。

そこで、VS Codeに移行したことなのでせっかくだから拡張を書いてみることにしました。

書き方

VS Codeの拡張(Extension)はJavaScriptでもTypeScriptでも記述することができます。 よくわからないのでググるとチュートリアルに出会いました。

Your First Visual Studio Code Extension - Hello World
https://code.visualstudio.com/docs/extensions/example-hello-world

公式のチュートリアルなので、高まりますね(ん?)

これを読むに、どうやらYeomanが必要なようです。 あー、MacでもASP.NETで大変お世話になってるなーと思いつつもう導入済みだったので、拡張をつくるときに必要なものから チュートリアルに沿って導入していきました。

npm install -g generator-code

これでYeomanが入ってたらもう作り始めることができます。

yo code

このあたりはASP.NETと同じ感じがします。

Yo

PowerShellコンソールだと、ちょっと顔のずれたおじさんが登場してほっこりしますね(しないか)。

ここでNew Extension (TypeScript)を選択します。 拡張の名前や説明、パブリッシャー(Marketplaceに公開するならきちんと)などを適当にいれていけばひな形が完成します。

Yo

つくりはじめると、Gitリポジトリも初期化してくれますし、ソースコードなどの生成が終わったらnpm installも自動的にしてくれます。 便利…

Yo

ずらっとこのような感じで指定した拡張名のフォルダ内にもろもろが作成されます。

Yo

このうち、開発に必要なのはsrcフォルダとtestです。 srcフォルダ内に「extension.ts」というTypeScriptファイルができてます。 このままでも既に実行することができるので、できればVS Codeでこのフォルダを開きましょう。

開くと、F5キーでいきなり実行することができます。 足場を組んだこの時点ではコマンドパレットから「Hello World」というものを選ぶとメッセージで「Hello World」と表示されるようになっています。

Yo

拡張機能のデバッグ用にもう1つVS Codeが起動してきて、裏にはもとのVS Codeが残っています。 ここへ動作状況などが出力されます。

Yo

あとはカチャカチャとコードを書いていけば完成です。

完成した拡張

ほとんど写経で完成してしまったのですが、TypeScriptは違和感ないかもしれない…という感触です。 なにせVS Codeがほとんど補完してくれるので、躓くところはありませんでした。

Macにも同じものがほしいなーと思ったので、とりあえずローカルで作成したものをインストールすることにしました。 ユーザーフォルダ配下の「.vscode\extensions」フォルダ内に「out」フォルダと「package.json」を持っていけば動作しました。 こんな感じで動作しています。

Yo

wri.peにはあるのに…プログラミングのときは文字数なんて関係ないのでしょうね、きっと。

Marketplaceにこの拡張を公開する方法も調べて、その手前までできていますがMacで動くところだけ見届けてからにしようと思います。 いまのところWindows10でしか動かしていませんし。

とか言っていたら、Mac OSXでも動いてますね。 すごい、VS Code。

Yo

Githubに置いておきました。 うーん、置いてから見てみると雛形のままのところがあるしクイックスタートのマークダウンファイルが残ったままだったり…ダメダメですね。

しかもまだ公開してないから

ext install charcount

でインストールできないし。 勢いだけ、という感じでした。

最後に

TypeScriptはJavaScriptではありませんが、別物っぽくもなくて、どちらかというとAdobe FlexやAdobe AirをつくるActionScriptのほうが近いような感覚を受けました。 使っていたのが7年くらい前なので、違うかもしれないですけどね…

また思いついたら勉強がてらつくっていきたいと思います。

こんにちは。 ここ数か月更新してませんでした。

久しぶりに更新ですが、今回はAtomから離れてVisual Studio Codeに本格的に移行しようかと考えていることを書いていきます。

Atom

一気に普及したElectron製のエディタですね。 電子書籍なんかを記述するときに大変お世話になりました。 マークダウンを書くのが中心なのですが、ハイライトも便利でした。 ちょっと不便なのが**aaa**みたいな風に記述するときにスペースを空けておかないと ハイライトのされ方がちょっと変になるのがずっと気になってました。

これは拡張をアップデートしてないから、もっといいものがあるから、などいろいろありそうだったのですが、 徐々にAtomカッコいいけどなーということになっていました。

VS Code

昨年登場して、こちらもElectron製ですね。 まだ日本語を書くことが中心のわたしには少しつらい(見た目的に)けれど、WindowsでもMacでもということでAtomと並んで 両方使うようになっていました。

さらに「もう使うのやめよかな…」と思っていたのが拡張の「Vim」のやつです。

Vim | Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=vscodevim.vim

こちらは古くからあることもあって、リリースされてからずっと使ってたような気がします。 しかし、あまりVS Codeを使うことはなかったので長らく気づかなかったのが「*」が入力できない、というものです。

しかも妙な記号も入力されるキーがあって、「うわー」と思い一時期使っていませんでした。 ところが、ここ最近になってふとこの拡張のリポジトリを見に行ったんです。

すると、キーボードの配列を設定することができるようなのでした。 ただ残念なのが日本語キーボードの配列はなかった… 設定のところにもばっちり記述がありました。 読んでないわたしがわるい。。。

Supported Values: en-US (QWERTY) (default), es-ES (QWERTY), de-DE (QWERTZ), da-DK (QWERTY)

ですから、設定しようが何しようがこれらに当てはまらなければen-USになるというコードになっていたところで、はじめて代替を探すことにしたのでした。

代替あったよ!

ありました。ext installで表示されるvim候補の2番手です。

amVim | Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=auiworks.amvim

これはキーボード配列なんていじっていませんでした。 現時点ではおそらくこれが一番よさそうな気がします。

AtomのほうのVim拡張のコードを見たときにはキーボードの配列うんぬんのコードなんてなかったので、つくる方の考え方ひとつですね。

これが見つかったことで、ぐっと良くなりました。 Macのほうもこれに入れ替えよーっと。 というのも、MacではVS CodeだけがASP.NETを記述するときの頼りなんです。 いやいや、ほかのIDE使えよって思うかもしれませんが、あまりすごいの必要ないので… そこまでのものならWindowsでVisual Studio使ったほうが早いですし。

きっとこの調子で徐々によくなっていくと思うので、Atomがサブ、VS Codeがメインというのが続きそうです。

先日、ものすごく時間が経過してから拙著「はじめようWindows PowerShell」を読んでいただいたブログを発見しまして。

はじめようWindows PowerShell [Kindle版] を読んでみた - tech.guitarrapc.cóm

本当に失礼いたしました。

しかも、理解が怪しい箇所についても指摘いただきまして感謝しかございません!! 40近くなっても教えをいただけるというのはありがたいことです。

そのブログ記事の中で、指摘いただいたことを見ていこうと思い立ちましたので書いていきます。 今回はPSObjectとPSCustomObjectについてです。

PSObject

これはPowerShellバージョン1.0から導入されているもので、拙著の中でも取り上げているものです。 書いたときには「企業で利用されているパソコンでWindows7がまだまだ主流であることもあってバージョン2.0までの話にして、PSCustomObjectについては少し触れるくらいにしよう」というつもりでした。

PSObjectは独自の型をつくるために利用することができるもので、オブジェクト指向的なことをすることができます。 しかし、面倒なのがAdd-Memberでひとつずつメンバーを登録していく必要があるという点です。 そういうこともあって、わたしは積極的に利用してはいませんでした。 完全に無知から来るものですね。

バージョン2.0では「New-Object」コマンドレットで作成するときのオプションとして「-Property」が登場していたのでハッシュテーブルを利用すれば一度に登録することができます。

$obj = New-Object -TypeName PSObject -Property @{ "id" = 1; "name" = "m0t0k1"}

出力すると以下のようになります。

id    name
----  --------
 1    m0t0k1

このとき、上記の変数objをGetTypeメソッドで確認すると、「PSCustomObject」になっています。

PSCustomObject

こちらの方法が少しだけ触れているやり方なのですが、バージョン3.0以降でしか動作しません。

$obj = [PSCustomObject]@{"id" = 1; "name" = "m0t0k1";}

PSObjectで作成したときと同じ出力になります。

id    name
----  --------
 1    m0t0k1

とはいえ…Windows7であってもバージョン3.0を導入できないかと言えばそうでもありませんので絶対にインストール禁止とかいうような企業団体でなければ気にしなくてもよいかもしれません。 わたしが勤めていたところはそういった状況に近しいものがありましたね…

「PSCustomObject」とGoogleで検索すると、トップが@guitarrapc_techさんの以下の記事で、2番手がわたしの…というのを見るとみなさん英語でお読みなんでしょうね、きっと。あるいはごく自然に利用していらっしゃるのか。

PowerShellでPSCustomObjectに複数のObjectを追加する - tech.guitarrapc.cóm

なお、PowerShellの補完機能を使って次のようにするとエラーになりますのでお気を付けください。同じ意味のような気がしなくはありませんし、完全修飾名でも大丈夫なはずなんですけど…

$obj = [System.Management.Automation.PSCustomObject]@{"id" = 1; "name" = "m0t0k1"}

こうすると、

"System.Collections.Hashtable" の値を "System.Collections.Hashtable" 型から "System.Management.Automation.PSCustomObject" 型に変換できません。
発生場所 行:1 文字:1
+ $obj = [System.Management.Automation.PSCustomObject]@{"id" = 1; "name ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) []、RuntimeException
    + FullyQualifiedErrorId : ConvertToFinalInvalidCastException

文法上で許容してるということなんでしょうかね。もう少し追求が必要な気がしています。 そこで気になるのが、さきほどもお話ししたとおり?「どうやらハッシュテーブルであればPSCustomObject以外にも変換できる」ようなんですよね…

非カスタムオブジェクト以外への変換

こちらに書いてあるのですが、これだけ見るとさきほどのものはエラーにならなくてもいいような気がしてしまうんですよね。

about_Object_Creation
https://technet.microsoft.com/ja-jp/library/jj159398.aspx

「ハッシュ テーブルからの非カスタム オブジェクトの作成」という項目に記述がありますが、ここでは名前空間付きでクラスを指定しています。 実際にやってみました。

[System.Management.Automation.Remoting.PSSessionOption]@{IdleTimeout=43200000; SkipCnCheck=$True}

うまくいくんですよね…

MaximumConnectionRedirectionCount : 5
NoCompression                     : False
NoMachineProfile                  : False
ProxyAccessType                   : None
ProxyAuthentication               : Negotiate
以下略

これを利用できるのは条件があるようで、以下の要件があるそうです。

このメソッドは、null コンストラクター (パラメーターを持たないコンストラクター) があるクラスに対してのみ機能します。オブジェクト プロパティは、パブリックかつ設定可能である必要があります。

確かにPSSessionOptionクラスはそのようですね。コンストラクタがあります。 一方、PSCustomObjectクラスはコンストラクタがありませんね。そういう違いなのかもしれません。PSCustomObjectはPSObjectのラッパークラスなのでPSObjectのコンストラクタが呼ばれているのでしょうか… もう一度調べ直そうと思っています。

最後に

まだほかにもご指摘いただいた点があるので、まだまだ勉強が必要ですね。 バージョン3.0以降であればハッシュテーブルをPSCustomObjectに変換して使ったほうがいいですよ。 いまだバージョン2.0以前の方は仕方ないのでNew-Objectをお使いください。

.NET Coreが登場して、Monoを使わなくてもMacやLinuxでもC#でプログラミングできるようになりました。 とても楽しいですね。

現状

とはいえ、世界中でガンガン使ってもらってIssueがどんどん出ているのでしょう。 「あれ?」と思うと大抵はIssueにあがっているという状況です。

きっとこれはPashもそのうち.NET Coreで動くようになるのかな?

Getting started with .NET Core

いまいちまだよくわかっていませんが、とりあえずMacだと公式のpkgファイルがあるので素直にインストールすると大丈夫です。

「システム環境設定」>「セキュリティとプライバシー」からインストーラを実行できるようにしたらインストーラが起動できるようになります。

Windowsでも大体同じなんですが、先日ダウンロードしてみたらWindows Deffenderがマルウェアとして検疫してしまうということが起きました。 ググるとやはり世界で発生してるようで、Issueにあがってました。

Windows defender finds mailware in the donet-win-x64.latest.exe installer #1675
https://github.com/dotnet/cli/issues/1675

インストール

インストーラに従えばまったく問題ない…こともないか。

ようこそ

インストーラが起動したら「続ける」をクリックします。

使用許諾契約

使用許諾契約が表示されるので「続ける」をクリックします。

同意するか

同意が求められるので「同意する」をクリックします。

インストール先

インストール先を尋ねられるので気にせず「インストール」をクリックします。

完了

コピーが完了して完了画面が出たら終わりです。 ですが、ここでちょっとよく読んだほうがいいねってことが書いてあります。

この画面には「Install Dependencies」と書いてあります。太文字ですから、きっと大事なことなんですね。

何が大事なのかというと、Open SSLの1.0.1か1.0.2をインストールしておくようにと書かれているんです。 わたしもしれっと読み飛ばしていたのですが、いきなりエラーを食らいましたのでおとなしくインストールしておきましょう。

エラーの内容は「The type initializer for ‘Crypto’ threw an exception.」というものです。 よく見ると、DLLの読み込みができないという内容のエラーになっています。

ですが、こちらのIssueを見ていただいたらわかるとおり、先ほどの完了画面に書いてあることさえしておけば発生しません。

dotnet restore (OSX) #1161
https://github.com/dotnet/cli/issues/1161

つまりはOpenSSL入れようということです。なお、わたしの環境ではすでに1.0.1が入っていましたがエラーになりました。ですので、HomeBrewをアップデートしてからOpenSSLのバージョンを1.0.2へ上げることにしました。

ということでHomeBrewを導入済みであれば次のようにしましょう。

brew install openssl

なお、まだインストールは終わっていません。インストーラをダウンロードしたページをよく見てみると、他にもまだ書いてあります。

This installer will install the tools and put them on your PATH.

環境変数PATHへ追加してね、ということです。 しかし、どこにインストールされたんだ?と思って以前のDNVMなんかと同じかと調べてみましたが、全然違いました。こちらです。

/usr/local/share/dotnet/bin/dotnet

結局pkgファイルを展開してどこへインストールされるのか調べてしまいましたが、GitHubのリポジトリを探したらソースに書いてありました。

なんらかの方法でPATHを通してください。わたしは「.bashrc」に入れてしまいました。 さきほどの読み込めないDLLが、というCryptoなんとかも「/usr/local/share/dotnet」配下にありました。

使ってみる

Getting Started with .NET Coreのページに書いてあるとおりなのですが、ディレクトリをつくってそこで「dotnet」コマンドでプロジェクトを作ります。

mkdir sample
cd sample
dotnet new

といっても、3つのテキストファイルが作成されるだけです。 作成されるのは以下のものです。

  • Nuget.Config
  • Program.cs
  • project.json

それぞれ、名前のとおりです。プロジェクト設定がJSONなのはいいのか悪いのかよくわかりませんがXML書かなくていいそうです。

あとは適当にProgram.csを編集するか、しなくても「Hello World!」は表示できるものになっています。 一番最初はNugetで.Net Frameworkをダウンロードしてくるので時間かかります。

dotnet restore

これはASP.NETと同じですね。 終わったらビルドします。

dotnet build

もし実行も同時にしたい場合は「run」コマンドにしてください。

dotnet run

賢い?のでソースコードなどに変化がなければビルド済みのバイナリを実行してくれます。

Compiling trtest for
                 NXCore,Version=v5.0

 ompilation succeeded.
                     0 Warning(s)
    0 Error(s)

Time elapsed 00:00:02.3592674


Hello World!

正直言って、出力はまだガタガタしております。「Compilation」の先頭の「C」が消えてしまっていますし。

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var x = "Dot Net !!";
            Console.WriteLine("Hello World!");
            Console.WriteLine($"Hello {x}");
        }
    }
}

うん、C#はバージョン6ですね。

「obj」ディレクトリが同じディレクトリ内に作成されるのですが、中間ファイルなんかというよりはコンパイルに必要な設定が吐き出されているようです。

total 40
-rwx------  1 motoki  staff   4.3K  3 13 23:08 dotnet-compile-csc.rsp
-rwx------  1 motoki  staff   369B  3 13 23:08 dotnet-compile.assemblyinfo.cs
-rwx------  1 motoki  staff   4.7K  3 13 23:08 dotnet-compile.rsp

ディレクトリは「Debug」>「dnxcore50」配下になっています。なお、バイナリが出力される「bin」ディレクトリも大体同じ構成です。 ここの構成はWindowsでも同じですね。 ただ、binの直下に中間ファイル的なものが出力されて、実際の実行ファイルはさらに下の階層にできています。

手元の環境では「osx.10.10-x64」ディレクトリ配下へプロジェクト名のディレクトリと同じ名前のファイルが作成されます。みたところ、DLLなんかも出力されているようです。

total 736
-rwxr-xr-x  1 motoki  staff   295K  3 13 23:08 libhostpolicy.dylib
-rwxr-xr-x  1 motoki  staff    42K  3 13 23:08 sample
-rwx------  1 motoki  staff    13K  3 13 23:08 sample.deps
-rwx------  1 motoki  staff   4.5K  3 13 23:08 sample.dll
-rwx------  1 motoki  staff   452B  3 13 23:08 sample.pdb

最後に

まだガンガンとは使ってみていませんし、VisualStudio CodeもWindowsではまだどうかな、というところですけど楽しいですね。 Monoの力を借りなくてもC#を書いていくことができるのは素晴らしいことだと思います。

今後も少しずつやっていこうと思います。