Quantcast
Channel: Windowsの記事一覧|TechRacho by BPS株式会社
Viewing all 51 articles
Browse latest View live

EPUBビューア「超縦書」Windows版 よくある質問

$
0
0

EPUBビューア「超縦書」について

EPUBビューア『超縦書』は、電子書籍フォーマット「EPUB」(3.0.1)に対応した、EPUB表示・閲覧のためのビューアアプリケーションです。以下のページにてWindows版を無料でご利用いただけます。

「超縦書」Windows版 無料公開ページ

よくある質問

本ページでは、お客様からいただくご質問への回答や、トラブルシューティングを記載します。

このビューアは完全にEPUB作成業務向けなのですか? EPUBファイルを普通に見たいだけなのですが

そんなことありません! 普通にビューアとしてもお使いいただけます。 個人での利用お申し込みの場合は、利用申し込みフォームの「法人名」欄に 個人 と御記載の上お申し込みください。

いろいろ難しいこと書いてありますが、使ってみていい感じなのでそのままサービス導入したいのですが

ありがとうございます。サービスへの導入については個別にご契約いただいた上、 DRM(EPUBコンテンツ保護)の組み込みなどの初期導入対応が必要となりますので、 フォームよりお問い合わせください。

エラー(003003)が発生する

EPUBファイルが仕様通りに制作されていない可能性が考えられます。 超縦書は他ビューアに比べて仕様に対して厳格なため、他ビューアで閲覧できるEPUBファイルでも本エラーが発生することがございます。

003003は、「EPUB Navigation Document (目次)が仕様に沿っていない」際に発生します。epubcheckでエラーが発生しないかご確認ください。

※現行バージョンのepubcheckで検出できないことがある既知の問題として、以下の点が見つかっています。
・href属性の指定されていない a 要素が存在する。

ウィンドウが真っ黒になり、何も表示されない

Hyper-V上のVMなどで、ディスプレイが16bit Colorなどに設定されていると、本現象が発生します。 本アプリケーションの動作には32bit Colorへの対応が必要ですので、グラフィックスドライバや設定をご確認ください

Mac版はないの?

超縦書はWindows/Mac/Android/iOSに対応しておりますが、現在はWindows版のみ無料公開しております。 他プラットフォームの無料版に関しましては、反響が大きいようでしたら検討させていただきます。

反映されないフォントがある

カスタムフォント選択プルダウンに表示されるものの、反映されないフォントがまれに存在します。具体的にはulCodePageRangeの0ビット目が立っていないフォントで、例えば「HG行書体」「HG教科書体」などが該当します。

本件は現バージョンでの制約事項となります。恐れ入りますが、別のフォントをお試しください。

余白設定が反映されない

EPUBコンテンツのCSSで@pageルールによるmargin指定がされている場合、そちらを優先する仕様となっています。


Windows: アプリ終了時テストをPowerShellスクリプトで楽に行う

$
0
0

デスクトップアプリを開発する際、アプリ起動時や終了時に低確率で発生するバグを踏むことがあります。複数のスレッドが存在し、たまたま特定のスレッドの終了処理が完了した際に発生する、などです。

具体的には、ごくまれにウィンドウの×ボタンを押してもアプリが終了しない、というバグを踏みました。10回に1回程度発生してくれれば楽なのですが、500回に1回程度発生するものがあって修正確認が面倒だったので、以下のような手抜きPowerShellスクリプトを書きました。LinuxやMacなら普通にbashスクリプトを書けば良いのですが、Windowsのスクリプトは経験がなかったので、「はじめてのPowerShellスクリプト」です。

手順

準備

事前準備として、署名のないPowerShellスクリプトを許可しておきます。管理者として起動したPowerShellで以下のコマンドを打ちます。当然セキュリティレベルを下げる操作なので理解した上でご利用ください。

set-executionpolicy unrestricted

スクリプト

不具合が出てもクラッシュやフリーズなどが後で見てわかるようなアプリであれば、あとはこんな感じのtest.ps1を作って、

$i = 0
Do {
  echo $i
  $i += 1
  Start-Process("C:/development/MyApp.exe")
  Sleep 3
  $ps = Get-Process | Where-Object {$_.Name -match "MyApp"}
  $ps.CloseMainWindow()
  Sleep 1
} While (1)

通常権限のPowerShellでtest.ps1を実行し、PCが頑張っている間に帰宅して翌日確認すればOKです。

ポイントは Stop-Process だと強制終了されてしまうので、CloseMainWindow 関数を使うことくらいです。

関連記事

「超縦書Windows版」が窓の杜に掲載されました!

$
0
0

skkです。

先ごろ弊社より無料で公開した電子書籍ビューア「超縦書Windows版」ですが、あの窓の杜』(インプレスさん)の中の人の目に留まったらしく、窓の杜のアプリとして掲載いただきました

窓の杜で「オフィス > 入力・印刷 > 文書ビューワー」を開いても、「ホーム > 家庭・生活 > 電子書籍」を開いても、よくお見かけする Kinoppy さんや Calibre さんと同じリストに超縦書Windows版が並んでいるじゃありませんか。あの窓の杜に…もう感無量というか光栄です。

弊社では現在、超縦書をご利用の皆様からの声を直接聞ける方法の検討や、新機能の企画も進めているところです。どうぞご期待ください。

引き続き、BPSの超シリーズをぜひよろしくお願いいたします。

超縦書Windows版の使い方やよくある質問についてはこちらもどうぞ

関連サイト・記事

北海道・札幌のiOS/Android開発会社、株式会社キロルへの資本参加に関するお知らせ

$
0
0

ビヨンド・パースペクティブ・ソリューションズ株式会社(本社:東京都新宿区、代表取締役 渡辺正毅、以下BPS)は株式会社キロル(北海道札幌市、 代表取締役 坂下賢司、以下キロル)の株式取得及び第三者割当増資を引受けましたことをお知らせいたします。両者の技術力を組み合わせ自社商材開発、受託開発の両面の体制強化を図ります。

iOS/Androidアプリケーション開発会社、株式会社キロルの企業概要

株式会社キロル
本社   : 札幌市北区北10条西4丁目1-19 楠本第10ビル 8F
代表   : 坂下賢司
設立   : 2012年1月11日
資本金  : 1,000万円
事業内容 : iOS/Android/Windowsアプリケーションの
       企画、開発、販売、受託、請負、コンサルティング業務

弊社(BPS)概要

ビヨンド・パースペクティブ・ソリューションズ株式会社
本社   : 東京都新宿区西新宿6-20-7 コンシェリア西新宿TOWER’S WEST 2F
代表   : 渡辺正毅
設立   : 2007年10月31日
資本金  : 4,996万円
事業内容 : Ruby, PHP によるWebシステム開発
       iOS, Android アプリケーション開発
       電子書籍 EPUB ソリューション
       漫画の翻訳・電子化・海外販売
       学習塾向けパッケージシステム開発
       個別指導塾「トライプラス新中野校」運営

窓の杜大賞、超縦書ノミネートのご報告

$
0
0

皆様、こんにちは。BPS渡辺です。2017年もそろそろ終わりですね。今年いかがでしたでしょうか?BPSは相変わらず既存業務も全部継続しつつ新しいものに手を出すので仕事が溢れかえってます。このTECHRACHOも皆様に支えられ長く続けられてきた事業の一つですね。と同時に、協力してくださる人や会社が増え、安定感は増していると思っています。それらについては別記事にまとめさせていただくとして、今回は、ずっと継続してきた事業のひとつ、EPUBテキストビューア「超縦書」についてのご報告とお願いです。

2017年 窓の杜大賞に、超縦書をノミネートいただきました

なんと超縦書もノミネートしていただいたようです。感謝感謝。

EPUB3レンダリングエンジン超縦書の無料Windows版


電子書籍で小説やライトノベルなどテキストベースの作品を読まれるかたは既に超縦書を使っていただいているかもしれません。普段は大手さんの製品の一部に組み込んでいただいてますが、もっと広く、使ってみていただけるように無料Win版を公開していたものが、今回ノミネートいただけているようです。

ぜひこの機会に超縦書をご覧ください

普段からTECHRACHOをご覧いただいている皆様へ。すこしでも超縦書 無料Win版に興味をもっていただけましたらぜひご覧ください。もし、使ってみたり、内容をみてみて活動を気に入っていただけるようでしたら、応援ついでにぜひ投票いただけたら幸いです。興味がなくても、TECHRACHOの運営会社がRails以外でなにをやっているかもわかっていただけると思います。

超縦書の窓の杜大賞投票ページはこちらです

お恥ずかしながらノミネートされるとは思ってもみなかったので、ご協力くださった方々に御礼する品を準備できているわけではなく、本当にご興味をもっていただけたらで結構です。今後とも、TECHRACHO/BPS株式会社をよろしくお願い申し上げます。

WindowsにVagrantとVirtualBoxを使ったUbuntu GUI開発環境を構築する

$
0
0

Windows機で開発を進めていくとWindows由来の挙動に出くわすことが多く、本来開発に注ぐべきパワーをそうした挙動の調査・解消に向けなければならず、開発スピードが遅くなってしまいます。
一方でmacに環境を移し替えようと思っても、それはそれでコストやその他環境のために難しいこともあると思います。

そうしたWindowsで開発する難しさを解消するひとつの手段として、VirtualBox + Vagrantを使って仮想マシン上に開発環境を構築する、というものがあります。

正直なところ、Vagrant + VirtualBoxを利用した仮想マシン上での開発環境の構築はQiitaやその他技術ブログ等ですでに多く紹介されていますが、今回は僕なりの設定方法を交えてまとめてみようかと思います。

なお、今回のWindowsのバージョンは基本的にWindows10を想定しています。

1. まずはVagrantとVirtualBoxをインストール

※うまく動作しない場合には

上記リンク先は最新バージョンのダウンロードができるものを貼ってありますが、VagrantおよびVirtualBoxそれぞれのバージョンの相性や環境の違いなどによりうまく動作しないこともあります。
そんなときはバージョンを下げてみると動くことがありますので、下記の古いバージョンに落として確認してみてください。

2. Vagrantfileの作成

次にVagrantfileを作成していきます。
Vagrantfileというのは、VagrantおよびVirtualBoxを使うための設定が記載されたファイルです。
まず、好きなところにVagrantfileを置くためのフォルダーを作っていきます。
今回はCドライブ直下にmachineというフォルダーを作ります。
パスはこういう感じです。

C:\machine

そして次にwinodws PowerShellを起動します。
起動後、

cd C:\machine

と打ち込み、先ほど作ったmachineフォルダーに移動します。
移動後、

vagrant init

と打って下記画像のオレンジの枠内のようなメッセージが出ればOKです。

C:\machineの中にはVagrantfileというファイルができているはずです。

3. boxのインストール

boxというのは、仮想マシンで使うOSのイメージファイルのことです。
次はこのboxをインストールしていきます。

今回はUbuntu16.04というboxを追加したいので、まず先ほど作成したVagrantfileの冒頭部分(15行目前後)の

  config.vm.box = "base"

というところを

  config.vm.box = "bento/ubuntu-16.04"

と変更します。
ここは以下で説明する追加するbox名を指定します。
Vagrantfileでboxを指定した後は、PowerShell上で

vagrant box add bento/ubuntu-16.04

と打ち込めばboxがインストールされます。
これでboxのインストールは完了です。

他のboxを使いたい場合

上記サイトにいけば他にもいろいろなboxが配布されていますので確認してみてください。

4. Vagrantfileの編集

続いてVagrantfileを編集していきます。

4-1. private networkのIPアドレス設定

Vagrantfileの35行目前後に

  # config.vm.network "private_network", ip: "192.168.33.10"

という箇所があるので、先頭の#を外しコメントを解除します。
このIPアドレスは、例えば実際開発をする段になってホストOS側(今の場合はWindows側)のブラウザで見た目や動作の確認をしたいときにhttp://192.168.33.10:3000/hogehogeなどという風にして使います。
IPアドレスは特にこだわりがなければ変える必要はありません。

4-2. VirtualBoxの設定

次に、VirtualBoxの設定を行っていきます。
ここまではVagrantの設定のみを書いてきましたが、実際に仮想マシンが動くのはVirtualBox上なのでVagrantfileにはVirtualBoxの設定を書いておくこともできます。
52行目前後からの

 # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end

という箇所を変更していきます。
今回はGUI環境の構築のため、下記のように変更します。

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "4096"
    vb.cpus = 2
    vb.customize [
      "modifyvm", :id,
      "--vram", "256",
      "--clipboard", "bidirectional",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
  end

このあたりの設定は下記のリンクを参考にしています。

以上でVagrantfileの設定は完了です。

5. 仮想マシンの起動とubuntu-desktopの追加

ここまできたらいよいよ仮想マシンを起動していきます。
PowerShellに戻り

vagrant up

と打つと起動します。

ただ、現在はまだGUI環境のためのVirtualBoxの設定をしただけなのでGUIは使えません。VirtualBoxのターミナルもまだ黒い画面のCLIのままです(VirtualBoxのターミナルをクリックしてマウスポインタが見えなくなってしまったら右のコントロールキーを押せば元に戻ります)。
そこでまず、PowerShell側で

vagrant ssh

と打ちます。
すると、下記画像のような入力メッセージが表示され、Ubuntuにログインできるようになります。

その後、

# 日本のパッケージリポジトリを追加
# https://www.ubuntulinux.jp/japaneseを参考
$ wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
$ wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
$ sudo wget https://www.ubuntulinux.jp/sources.list.d/xenial.list -O /etc/apt/sources.list.d/ubuntu-ja.list

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install ubuntu-desktop

を実行し、desktop環境用のパッケージが入るのを待ちます。
ubuntu-desktopのインストールには非常に時間がかかるので、気長に待ちましょう。

インストールが完了したらPowerShell上でctrl + Dを押すなどしてUbuntuから抜けた後、

vagrant reload

でVagrantを再起動すればUbuntuのGUI環境がひとまずできました。

6. 各種日本語化対応

6-1. キーボード日本語化対応

キーボード配列を変更します。

現時点でのキーボード配列は上記のようにUS配列のはずなので、これをJIS配列にしていきます。
まず

dpkg-reconfigure keyboard-configuration

と打ち込みます。
すると、下記のような選択肢が出てくるので、こちらを参考にして

Generic 105-key (Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key→NO

と選択していきます。
その後、

画面右上の「Ja」から「Text Entry Settings」を選び、左下の「+」を押して「Japanese」を追加します。
そして既存のEngilish部分を左下の「-」で消した後、「Switch to next source using」の部分で全角/半角キーを押します。
これで普段使用するキーボード入力と同様の日本語入力ができるようになりました。

ログインしたり再起動した場合にキーボードの配列が元に戻ってしまう場合

僕自身確認は取れていないですが、場合によっては、ログインした後や再起動をした後にキーボードの配列がUS配列に戻ってしまうこともあるようです。
そういう場合には下記のサイトのやり方を参考にしてみるのもいいかもしれません。

6-2. Ubuntu日本語化対応

続いてUbuntuデスクトップ環境の日本語対応を行っていきます。
まず以下のコマンドを打ってターミナルの日本語化対応を進めます。

sudo apt-get install language-pack-ja-base language-pack-ja

localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale

その後、Windowsキーを押して出てきた入力フォームに以下のように入力してlanguage supportを開きます。

「言語サポートが完全にインストールされきってません」という風なメッセージが英語で出てくるので完了させた後以下のようにして「日本語」を一番上に持ってきます。

あとはログアウトして入りなおせばデスクトップ環境は日本語表記になっているはずです。

6-3. 日本語入力対応

まず以下のパッケージをインストールします。

sudo apt-get install fcitx fcitx-mozc

その後、上記と同じlanguage support(現在は日本語化により「言語サポート」という表記)内の「キーボード入力に使うIMシステム」というところを「fcitx」に変更します。

一度ログアウトしてログインし直してから

上記画像の一番左の長方形のようなアイコンをクリックし、「現在の入力メソッドの設定」を選択します。そして、左下の「+」ボタンを押して「Mozc」と「キーボード 日本語」を選択します。
下記の画像のようになっていればOKです。
もし他の入力メソッドがあれば、そのメソッドを選択後左下の「-」を押せば消えます。

以上です。
ありがとうございました。

Web開発環境をMacBook ProからWindows機に移行してみた話

$
0
0

メイン著者記事としてはご無沙汰しておりますmorimorihogeです。
今年もTechRachoではアドベントカレンダー特集ということで、普段あまり記事を書く機会がなくて表に出ないメンバーにも記事を書いてもらえる運びとなりました。クリスマスまではアドベントカレンダー特集進行のTechRachoをお楽しみ下さい。

今回は最近メイン開発環境をMacからWindowsに移行したので、そのあたりの感想や設定の勘所などをまとめてみたいと思います。

なぜMacから移行するのか?

僕はOS XのIntel Macが出たころからのMacユーザー(当時はまだRosettaとかがありました)で、かれこれ10年以上Macを使い続けてきました。多分Webシステム開発用途でMacを使い始めたという人の中では古参の方なのではないでしょうか。
というわけで、なんで移行するの?という話からぽえみーに綴ってみようと思います。

なお、僕のメイン開発領域はWeb開発(Rails / PHP / JavaScript)ですが、開発・提案資料のためにOfficeやAdobe製品もちょくちょく利用します。また、業務ポジション的に外に出ることも多いため、モバイル性はそれなりに重視しています(多少重くてもいいから外にいても普段通り開発できる環境が欲しい)。

そもそもMacを使い続けていた理由

Macをメイン開発端末として10年間使い続けてきた理由はいくつかあります。
僕は基本的に年に1回はメイン端末を最新に更新するというポリシに従って使ってきましたが、その中での私見です。

  • ハード面
    • 時によって賛否や人柱バージョンなどもないわけではないが、概ねデザイン・強度的に満足していた
    • それまでずっと買い続けていたThinkPadがLenovoに買収され、品質面がどうなるか怪しかったので受け皿を探していた
    • Genius Barに持ち込むことを前提とするのであれば、サポート面はとてもよかった(預かり修理でも1週間かかったことがなかったし、不具合の発生した動画や写真を見せればごねずに数分で修理交換手続きをしてくれた)
      • 他メーカーだとThinkPad以外は修理に現物発送が必要なだけでなく、不具合が直らず返ってくる事例ばかりだったのでメイン収入を稼ぐ手段を預けるには怖すぎた
      • ※ThinkPad利用時代は壊れたら自分でパーツ取り寄せして修理してました
    • 価格的にはスペックに対して多少割高なこともあったが、同等スペックのWindows機と対して変わらない時期もあり、サポート体制などを考えれば許容範囲だった
  • ソフトウェア面
    • Web開発ではOSがUNIX系OSであることが都合が良かった(VMは色々もっさりするので嫌いだった)
    • 文字がきれいで読みやすく、一度慣れるとWindowsに戻りづらかった
    • 必要なものはそれなりにシェアウェアにも投資して揃えてしまったので「Windowsならフリーソフトでできるのに」という点は特に不満にならなかった
    • Web系エンジニアを中心にMacが勢力を盛り返していく世の中の流れに乗れたため、諸々トラブルシューティングも簡単だった
    • 業務エンジニアにはありがたい機能があった。例えばTime Machineの「ある日突然メインマシンが復元不可能な壊れ方をした時に、端末購入を含めて概ね24時間以内に満足のいく開発環境を復元できる」という要素はかなり強かった。

というわけで、その他の不満がないわけではないですがそれなりに満足していました。

Macへの不満蓄積とWindowsの誘い

しかし、ここ数年はMacに対して以下のような不満を感じるようになっていました。

  • ハード面
    • 「これが欲しい」と思わせるモデルが出なくなったため、不満が気になるようになってきた
      • TouchBarは嫌いじゃないけど別にいらない(むしろないほうがうれしい。🍣を並べる以外に実用的な価値を見いだせなかった)
      • USB-C推したいのはわかるけど、ちょっとUSB機器つなぎたい時にたまたま変換アダプタがないと積むのは純粋に不便(変換アダプタはあちこちに配置していたけど、それでもたまたま忘れることはある)。
    • 欲しいスペックのマシンを買おうとすると、同等のWindows機に比べてあまりにも値段が高くなるケースが目立つようになってきた
      • メモリ32GB、SSD 2TBとかにしようとするとつらい。フルスペックなんてとてもとても・・・
      • AppleCareも+になって値上げしたし「とりあえず念の為入っておこう」というノリでポチるのに抵抗が・・・
    • MacBook Proの高いBTOモデルでも、WindowsノートPCにスペックで負ける要素が出てきた
      • 4kディスプレイがない。どうしたApple!MacBook Proは常に市場に対してハイエンドモデルが用意されていると信じてたのに・・・
      • HDMIケーブルが直接接続できないので、本体だけ持ち歩くと仕事に支障が出るケースがある
  • ソフトウェア面
    • 特に追加の不満はないが、Windows 10あたりから「Windowsもそんなに悪くないんじゃない?」と思うことが増えた

一方、Windows機についての状況も色々変わってきているなと感じました。

  • ハード面
    • MacBook系の設計をパクインスパイアしたと思われるマシンの中で、そこそこ品質的にも良さそうに見えるモデルが出てくるようになった
    • 何よりも選択肢が多いというのは良い
      • USB/HDMIが普通につながる事により、大量の変換アダプタを持ち歩かなくて良い幸せ
      • USB-C PDが普及してきたことにより、ACアダプタを忘れても充電できるモデルが出てきたのも良い
      • タッチパネルはそれほど興味ないけど4kディスプレイは使いたいと思っていた
      • nVIDIAのMax-Qデザインなど、有象無象の中でも品質を担保しようという試みも良い
  • ソフトウェア面
    • Windows 10環境がそれほど悪くなさそう(駄目なところももちろんあるが)
      • WSL(Windows Subsystem for Linux)Hyper-Vなど、開発環境向け機能の拡充
      • フォントレンダリングは昔に比べてきれいになったように思える(解像度が上がったからかもしれない)
    • Docker for Windowsなんかもある(が、結構クラッシュする印象があるのでまだ様子見中)
    • Win/Macを両サポートするマルチプラットフォームソフトウェアの多くが、OS非依存のライセンス体系に移行している

そんなわけで、不満を持ちながらも惰性でMacを使い続けるよりはもっと良い環境になる可能性のある方向を目指す方が生産的だよねということで、試しにいっちょWindows機に移行してみるか、ということにしました。

なお、100%開発にしか使わないのであれば(ぶっちゃけゲームが動かなくていいなら)、ホストOSはLinuxにした方が苦労は少ないと思います。後述するGUI重い問題もホストOSインストールなら気にならないと思いますし、何より無駄な仮想化レイヤがないぶん早いしシンプルです。
Linuxを使う選択肢についてはjoker1007さんの以下の記事あたりを読むと良いと思います。2016年の記事ですが、今も大して事情は変わらないというか、よりMacを使い続ける理由は減っていると感じます。

MacBook Proからの移行機選び

MacBook Pro 15(2017)からの移行ですが、とりあえず以下の条件で探しました。

  • 本体がそれなりに堅牢で、多少ぶつけても壊れないこと
  • 英語キーボードが選択できること
  • USB PDから充電できること
  • メモリ16GB以上
  • SSD 1TB以上、もっと載せられるならなお良い
  • nVIDIAのGPUが乗っていること(Steam積みゲーを消化したい)
  • MacBook Proと同程度にはバッテリーが持続すること

色々検討した結果、 Dell New XPS 15Razer Blade 15を眺めつつ「うーん」と半年くらい悩んでいたのですが、先日ThinkPad X1 Extremeが発表されて即決しました。
決め手はすでにサブマシンとしてThinkPad X1 Carbon(2017)を持っていたため、キーボードとタッチパッド(+トラックポイント)の使用感にそこそこの信頼が置けた点です。

New XPS 15は当時店頭で触れる店が近くに見当たらなかったですし、Razer Blade 15は日本向けには英語キーボード版を販売していない(ひどすぎる)ので、必然海外からの個人輸入になる関係から実機を事前に触ることができませんでした。
# エイヤで買って打鍵相性の悪いキーボードや操作にストレスを感じるポインティングデバイスだったら流石に嫌すぎるので、そこは冒険する勇気がありませんでした

なお、X1 ExtremeはM.2 2280のスロットが2つあるため、BTOでは1TBを購入し、別途もう一枚買って2TB構成にしています。


ThinkPad X1 Extremeの背面M.2スロット。普通のM.2 Type 2280が刺せます。ユーザーがメンテできるって素晴らしい。

2018/12/03追記

結局どんなスペックにしたの?という声が聞こえてきたので補足すると、メモリ32GB、4kタッチパネルディスプレイモデルになります。メモリ割当は今の所以下で落ち着いています。

* ホストWindows: 12GB
* 業務Windows: 8GB
* 業務Linux: 12GB

ディスプレイは4kモデルを選ぶと自動的にタッチパネルモデルになり、非光沢は選択できません。発色はかなり良く、昔のThinkPad特有のあのやる気のないくすんだ液晶ではなく、Macと比べてもそれほど遜色ないように見えました(僕の目が節穴という説もありますが、Adobe RGB対応を謳ってるのでそこまでひどくないはずです)。

移行先PCの構成

移行後PCの構成ですが、下図のような設計にしました。

主な要点を解説すると・・・

  • 業務作業環境はHyper-Vの業務Windows環境及び業務Linux内に全て閉じ込める
  • ホストOSは業務関連じゃない個人的な作業やあれこれに使う
  • 開発用プログラムの実行環境(Rails/PHP/JavaScript等)は全て業務Linuxに置き、Sambaで業務Windows環境に公開する(Hyper-V内のプライベートネットワークなので、外部には公開されない)
  • 通常業務はリモートデスクトップクライアント経由の業務Windows環境で生活する

という感じです。

業務環境(Windows / Linux)は全部VMに入れる

業務系を全てHyper-Vに入れたのは、バックアップと復元の容易さを重視したためです。
よくDropboxやGoogle Driveに共有すればバックアップは終わりという文脈を見ますが、OSの環境変数や設定、レジストリ書き込みを必要とするソフトウェアなどはファイルバックアップだけでは環境が保存されません(専用のソフトを使えばできますが)。
そして、ファイルバックアップしかない場合、ファイルの復元ができても「開発環境」の復元には数日かかってしまいます

VMレベルでのバックアップであれば設定ごとバックアップできるので、新しく買ってきたマシンのHyper-Vさえ有効にすれば、あとはVMファイルを復元するだけで直ちに作業可能になります。
MacのときにはTimeMachineを使っていたので、それの代替ですね。

なお、ホストOSとは別にゲストOSである業務Windowsのライセンスも必要になります。ホストOSはHyper-Vを使う関係でPro化必須です。

業務開発環境をLinux VMにする理由

Dockerをなんの面倒もなく使いたいし、面倒な環境依存に巻き込まれたくないからに尽きます。
前記しましたが、Docker for Windowsは主にVolume共有あたりの挙動が怪しく(特にPermission周り)、体感ですがたまにFactory Resetせざるを得なくなることがしばしばありました。
Docker for Macはファイルアクセスが遅い以外は同じUNIX系OSということもあってか実用レベルなのですが、Docker for Windowsはまだちょっと怖いかなと感じています。
※個人趣味開発なら良いのですが、業務開発では環境クラッシュにより無駄な時間を取られたくない

また、Gitではファイルパーミッションも差分情報として扱いますが、このあたりをきちんと扱いたい場合もWindowsだと不便なので、Linux環境はどちらにしても必要になるでしょう。

業務作業環境をWindows VMにする理由

昔より良くなったとはいえ、Linux VMのデスクトップにVNCやRDPで接続して作業するもっさり感に耐えられないというのが主です。
また、純粋に実装作業しかしないということであればLinux環境でも構わないのですが、OfficeやAdobe系のファイルを開いたりと、Linuxの完全互換版がないソフトウェアはどうしてもあるため、様々な案件に関わることの多い現状ではWindowsの方が都合がよいなあというところ。

なお、Windows環境にして極めて良くなったのはOffice環境で、ExcelがMacに比べて極限にまともに使えるようになりました。起動も早くてクラッシュもしないExcelはすばらしい :)

移行に必要なものたち

Mac -> Windows環境に移行するにあたり、別途購入・整備・注意しないといけないものをまとめてみました。

ハード面

ハード周りでいくつか気になったのは以下でした。

  • マウス: Macで言うクラムシェルモード(PC本体を閉じて外部ディスプレイのみ使う)で使う場合には、当たり前だけどマウスが必要。一応AppleのBootCamp用ドライバをごにょごにょすればWireless Trackpadなどを動かすことはできるようだが、恐らくライセンス違反(BootCampドライバはMacハードにWindowsを入れるためのドライバなので、Apple以外のハードに入れるのは多分ライセンス的に駄目だと思います)
  • キーボード: 僕は自宅、会社ともにKinesis Advantageを使っていたので、キーマップを多少好みに調整するだけで済んだが、Mac専用キーボードを使っていた人はWindowsキーボードが欲しくなるかもしれない
  • モバイルバッテリー: MacBookシリーズは30WのUSB PDバッテリーから充電できたが、X1 Extreme(その他多くのWindowsノートPC)は45W出力できないと充電できない。USB PD対応のモバイルバッテリーの多くは大容量を謳っていても30Wのものがほとんどなので、45W出力のものを買い直す羽目になった
    • 選択肢はあまりないですが、dodocoolのやつはちゃんと充電できました。重い&でかいですが・・・
  • 各種Thundrbolt3 / USB-Cの拡張デバイスたち: Mac用に買い揃えた拡張デバイスたちはUSBやHDMIが直接刺さるX1 Extremeでは不要になったが、試しに挿してみたら多くのものはそのまま使うことができた。ただし、Macで4k出力できたDockや拡張アダプタは軒並み相性が悪いのか4k出力できなかったので、外部ディスプレイ出力周りは端末相性が強そう
  • Apple Thunderbolt Display: Thunderbolt変換アダプタを通して刺すことで一応画面は映るが、ドライバの相性が悪いのか高確率でOSがフリーズするため使えなくなると思ったほうが良さそう
  • 追加のThinkPad 135W ACアダプタ: USB PDでも充電はできるが、負荷をかけてぶん回していると充電がかなり遅くなる。移動が多い自分には純正135W ACアダプタが必要だった。自宅用、会社用、持ち歩き用で合計3つ必要になった(追加で2つ購入)

ソフトウェア面

ソフトウェア周りについてはそれほど投資し直さずとも揃いました。マルチプラットフォームに理解のある世の中になったのはすばらしい。

  • VMとして使うWindowsのライセンス: ホストOSはPC本体付属のライセンスで良いが、Hyper-Vで動作させるクライアントWindowsのライセンスは別途必要
  • 個別に買わなくても良かったもの
    • OfficeはOffice 365であれば購入不要
    • Adobe CCも同上
    • Jetbrains IDE(InteliJ IDEA、DataGrip等)も同上
    • Sublime Text 3も同上

環境構築における試行錯誤

環境構築にあたり、いくつか試行錯誤した点をまとめます。

Hyper-VへのVMインストール・設定周りでの注意

「Hyper-Vクイック作成」という簡単インストール機能でUbuntuがインストールできますが、JP版が欲しい場合はおとなしくISOを落としてきてインストールするのが良いと思います。
Linux側のGUIを使わざるを得ないケースがある場合、日本語入力ができないと不便&日本語用の設定をあとから入れるのは地味に面倒なので注意です。

また、Hyper-Vの動的メモリ機能はデフォルト設定だと最大RAM値がかなり大きな値になっているのですが、大した作業もしてないのに動的メモリ設定の最大RAM値に近い値までメモリを使い切るケースがありました。
そのため、最大RAM値は割当RAM値と同じくらいにしておくのが無難だと思います。

また、Linux環境にはHyper-V向けのLIS(Linux Integration Services for Hyper-V and Azure)をインストールすることで、CPUその他デバイス周りの効率化が行われるようなので、入れておきましょう。
※VMWare系におけるVMWare Tools、VirtualBoxにおけるGuest Additionsに相当するものという認識です

ホストOS -> 業務Windows VMへの接続はHyper-Vの拡張セッションではなくRDPで

ホストOSで動かすHyper-VマネージャにはクライアントOSのデスクトップ閲覧をするための画面接続機能がついています。
これには基本セッションと拡張セッションがあり、以下のようになっています。

  • 基本セッション: 恐らく内部的に仮想ディスプレイドライバを通したもの。クライアントOS側がどんな状態でも表示できるが、UIがもっさりして重い
  • 拡張セッション: 恐らく内部的にRDP(ネットワークごしのリモートデスクトップ用のプロトコル)を通して画面共有したもの。クライアントOS側に対応設定が必要だが、UIが軽い

拡張セッションはそこそこキビキビ動きますし、これで問題ないように思えるのですが、致命的な欠点としてホストOSからのデバイス共有が行えません
このままだと困るのが遠隔会議で、カメラデバイスをクライアントOS側の業務Windowsで利用できないため遠隔会議周りだけはホストOSで使うことになってしまい具合が悪いです。

これを解決するには、Hyper-V拡張セッションではなく、クライアントWindowsでリモートデスクトップ接続を有効にし、ホストOSからリモートデスクトップクライアントで接続します。
リモートデスクトップクライアントの設定には接続元マシンのデバイスを共有する設定があるので、ここからカメラデバイスの共有をONにすれば、クライアントWindowsでも本体カメラを利用できます。

Linux環境のデスクトップも非常用に準備したほうが無難

これはまだ良い落とし所が見つかっていない話なのですが、Linux環境のファイル領域をWindowsにSambaでマウントし、Windows側でInteliJ IDEAを使う場合、プライベートネットワーク越しのファイルアクセスとなるためファイルアクセス系がとても重くなります
特に致命的なのはGit周りの挙動で、permission周りなのかなんなのか、IDEA経由のGitサポートがうまく動いてくれません
Jetbrains IDEの持つSmart Checkoutなどの超絶便利機能が使えないのではとてもつらいので、そういった場合には苦し紛れですがLinux側にインストールしたIDEAを起動し、そちらでGit周りの操作だけ行うようにしています。

LinuxデスクトップへのアクセスはHyper-Vマネージャからデスクトップにアクセスするのでも良いのですが、それだとクライアントWindows側のアプリケーションと並べて動的にサイズ変更が出来なかったり、Linuxデスクトップ自体のサイズを動的変更できないため外付けディスプレイを抜き差ししてホスト側の画面解像度が変化するような環境では大きすぎたり小さすぎたりになって不便です。

結局試行錯誤の末落ち着いたのは、クライアントWindowsにVcXsrvというX Serverソフトをインストールし、クライアントLinuxからX転送でLinux側のIDEA画面を共有するという形でした。
正直イケてないと感じているのですが、とりあえず他にスマートな回避策が見つかるまではこれで我慢するか、という感じです。つらい


※左がWindows、右がX転送したLinux版IDEA

Macで使ってたあのソフトの代替は?

Mac時代によく使ってたツールの代替についてまとめます。まだ試行錯誤中ですがよく使うものを中心に。

  • SSHターミナルクライアント: RLogin
    • Mac時代はiTerm 2を使っていました。
    • 選定条件はタブ機能がある、普通にターミナルクライアントとして使える、そこそこにメンテされている、あたりです
    • Windows環境構築界隈を見ているとConEmuが人気のようなのですが、ConEmuから起動したMSYS2のBashからSSHして使っていると、画面リサイズ時にcursesを使っているようなリッチな画面書き換えがうまく扱えないのか画面がぶっ壊れまくり使い物になりませんでした。
    • そもそも開発環境はクライアントLinuxに寄せてあるので、RLoginで常に一度クライアントLinuxにログインしてから全てのシェル作業を行うことにしたら解決しました。
    • 弊社babaに教えてもらいました。感謝!

  • 画面(部分)スクリーンショット: Snipping Tool(Windowsプリインストール)
    • Mac時代はOS標準ショートカットを使っていました
    • 選定条件はファイル保存とクリップボード保存の両方に対応しており、かつショートカット一発で呼び出せること
    • もう新しいWindowsからはなくなると言われているSnipping Toolですが、必要最低限の機能があって便利なので未だに使っています。
    • Windows + Shift + Sもいいのですが、ファイルに保存する時に一度ペイント(これもなくなるらしい・・・)などに貼り付けないといけないのが地味に不便です。MacならCommand + Shift + 4で部分スクリーンショット&デスクトップ保存、Command + Shift + Control + 4で部分スクリーンショットのクリップボード保存という使い分けができたので、これが便利だったんですけどね。

  • リソース使用状況監視: thilmera 7
    • Mac時代はiStat Menusを使っていました
    • 選定条件はうざすぎない程度にそこそこ見た目が良いこと、かつ暴走プロセスや過大なネットワーク通信状況が見つけられること。
    • そんなにこだわりはなかったのですが、タスクマネージャよりはパッと見の見通しの良く、そこそこ網羅的にメトリクスが見れるツールということで使っています。
    • 地味にHyper-V管理のVMのCPU使用率を出してくれるのは、VMが暴走したときなんかに気づけるので便利かなーと思っています。

  • 図の作成: draw.io(一部不満あり)
    • Mac時代はワイヤーフレームや画面設計、インフラ・システム設計図作成にOmniGraffleを使っていました
    • 選定条件はレイヤ対応、あんまり気を使わなくてもそこそこ縦横が揃えられる、Stencilのような簡単に呼び出せるアイコン機能(AWS Iconなど)の充実
    • 基本的な図の作成については必要十分。ただ、開くブラウザ環境・OSによってはNoteとして書いた文章がはみ出たりなどの問題はある
    • 一点とても困っているのが大きな画像を貼り付けると「Image too big」というエラーで貼れない点で、Webページのスクリーンショットを貼り付けて上から指摘事項を書き込むような使い方をしていた自分にとっては割と致命的だったりします。とはいえいまさらVisioを有料で買うのもなあ・・・という感じ。PowerPointはレイヤ機能がないので使う気は(ないです)
    • この辺はまだ試行錯誤しそうです

まとめ

そんなわけで、長々と最近の試行錯誤の経歴を書いてみました。念の為以前のMacも準備はしてありますが、今の所Macがないとできない作業というのはないです。
何より会議室に移動するたびにHDMI出力用のしっぽを持ち歩かなくて良くなったのは忘れ物率が下がってありがたいです。Appleは最近開発者向けに魅力的な製品を出してくれないので、ささやかな反抗をしてみたい人はこの記事を見て参考にしてみていただければと思います。

見て作って学ぶ、PDFファイルの基本構造

$
0
0

こんにちは。見習いエンジニアのwestです。

PDFファイルって、皆さん使いますか?
仕様書、説明書、論文、電子書籍など…
おそらく避けては通れないファイルフォーマットだと思います。

そんな身近なPDFですが、内部の構造はどのようになっているのか?そもそも中身って見られるのか?
案外知らないものです。私も知りませんでした。

今回はそんなPDFの構造を、実践を交えて簡単にご紹介します。
PDFの基本的な構造を知っておくと、物知りになれますし、PDFを処理するソフトを作るときなどに役立つはずです。
踏み込むとかなりディープになってしまうので、あくまで基本構造の理解に必要な内容のみピックアップします。

目次

  • PDFファイルの基本的な構造
    • PDFファイルを構成する4セクション
    • PDFファイルの本体 = オブジェクトのグラフ
  • PDFファイルの中身をテキストエディタ+フリーソフトで見てみる
  • PDFファイルをテキストエディタ+フリーソフトで自作してみる

PDFファイルの基本的な構造

PDFファイルを構成する4セクション

PDFファイルは、大きく分けて4つのセクションから成り立ちます。
任意のPDFファイルをメモ帳などのテキストエディタで開くと、一部文字化けしますがこの構造を確認できます。
PDFファイルの上から順に、1~4のセクションが書かれています。

1. ヘッダ / File Header

1行目にPDFのバージョンが指定されています。
2行目はバイナリーデータで、PDFファイルがバイナリファイルとして認識されるために記述します。
テキストエディタでは文字化けして表示されます。

%PDF-1.6
%����

2. 本体 / File Body

その名の通り、ファイルの本体です。
オブジェクトという基礎単位の並びで構成されています。
ページコンテンツやグラフィックスコンテンツなどが、それぞれオブジェクトとして記述されています。

1 0 obj
<<
/Kids [2 0 R]
/Count 1
/Type /Pages
>>
endobj
2 0 obj
<<
/Parent 1 0 R
/Resources 3 0 R
/MediaBox [0 0 612 792]
/Contents [4 0 R]
/Type /Page
>>
endobj
(以下略)

3. 相互参照テーブル / Corss-Reference Table

ファイル内の各オブジェクトの位置を一覧化したものです。
この相互参照テーブルがあるおかげで、PDFファイルではランダムアクセス※が可能です。

※ランダムアクセス
先頭から順にアクセスするのでなく、すぐに目的のページや位置にアクセスすること。
例えばPDFファイルの15ページ目を読みに行くとき、1~14ページを全て読み込んでから15ページ目を読み込むのでなく、すぐに15ページ目のみを読みに行ける。
無駄な読み込み処理が省かれるため、処理が速くなる。

xref
0 6
0000000000 65535 f
0000000015 00000 n
0000000074 00000 n
0000000182 00000 n
0000000281 00000 n
0000000399 00000 n

4. トレーラ / File Trailer

特殊なオブジェクトを読み取るためのものです。
相互参照テーブルの開始位置や、ファイル内に格納されたメタデータ※の位置を保持します。
ファイルの最終行を示す%%EOFもここに記載されます。

※メタデータ
ファイルの情報が書かれているデータ。
タイトル、作成者、作成日時、変更日時などが記載されている。

trailer
<<
/Root 5 0 R
/Size 6
>>
startxref
449
%%EOF

PDFファイルの本体 = オブジェクトのグラフ

PDFファイルは、オブジェクトという基礎単位からなる有向グラフで形作られています。
ここで言うグラフとは、円グラフや棒グラフではなく、グラフ理論で出てくるようなグラフです。
PDFファイルの場合、ノードがオブジェクト、リンクが間接参照に相当します。

オブジェクト

基本的なオブジェクトには、以下の5種類があります。

  • 整数・実数
  • 文字列
  • 名前
  • ブーリアン値
  • nullオブジェクト

また、以下3つの複合オブジェクトもあります。

  • 配列:他のオブジェクトを複数格納した、順序付きコレクション
  • 辞書:名前とオブジェクトの対応付けをする、順序なしコレクション
  • ストリーム:バイナリデータとともにデータの長さや圧縮パラメータなどを格納した辞書のセット

間接参照

間接参照によって、あるオブジェクトから他のオブジェクトへのリンクを作成できます。
例えば6 0 Rと書くと、オブジェクト6への間接参照を示します。
6はオブジェクト番号、0は世代番号(大抵の場合0、説明割愛)、Rは間接参照を意味するキーワードです。

これを踏まえて、改めてPDFファイルの本体セクション全体を見てみましょう。

1 0 obj
<<
/Kids [2 0 R]
/Count 1
/Type /Pages
>>
endobj
2 0 obj
<<
/Parent 1 0 R
/Resources 3 0 R
/MediaBox [0 0 612 792]
/Contents [4 0 R]
/Type /Page
>>
endobj
3 0 obj
<<
/Font
<<
/F0
<<
/BaseFont /Times-Italic
/Subtype /Type1
/Type /Font
>>
>>
>>
endobj
4 0 obj
<<
/Length 65
>>
stream
1. 0. 0. 1. 50. 700. cm
BT
/F0 36. Tf
(Hello, World!) Tj
ET
endstream
endobj
5 0 obj
<<
/Pages 1 0 R
/Type /Catalog
>>
endobj

例えば、オブジェクト1:1 0 obj の部分に、/Kids [2 0 R]と書かれています。
このことから、オブジェクト1からオブジェクト2への参照があると分かります。
今回の場合、参照先オブジェクト2はKids(子オブジェクト)、オブジェクト1はParent(親オブジェクト)です。

他のオブジェクトについても、同じように構造をたどって行けるはずです。
このPDFファイルをグラフで図示すると、下図のようになります。(用語はあまり気にしないでください)

PDFファイルの中身をテキストエディタ+フリーソフトで見てみる

基本的な構造がわかったところで、実際にPDFファイルをテキストエディタで見てみましょう。
適当なPDFファイルをVisual Studio Codeで開いてみます。

…つらい。

文字化けが激しいですが、これはストリームオブジェクトが圧縮されているためです。
ストリームには、大きなサイズのバイトデータを格納できて、大抵そのバイトデータは圧縮されています。
現にストリーム以外の、1行目のPDFバージョンやobjなどは読めますよね。

このストリームを読むには、気合い…ではなくフリーソフトを活用しましょう。

PDFtkという、コマンドラインからPDFを編集できる高機能なフリーソフトを使います。
ダウンロードページでは”Windows 8まで利用可”となっていますが、Windows10でも利用できました。

PDFtkをインストールして、コマンドプロンプトでこちらのコマンドを実行すると、圧縮データが展開されて読めるようになります。

pdftk 元のファイル.pdf output 書き出すファイル.pdf uncompress

早速先ほどのファイルにこのコマンドを実行すると、

ストリームが展開されたファイルができました!

ちなみに、PDF Stream Dumperというフリーソフトを使うと、より簡単に中身を確認できます。
こちらはGUIツールで、対象PDFファイルを開くだけで中身(オブジェクト同士の関連、圧縮されたストリームの展開など)をわかりやすく表示してくれます。

ただ残念なのは、PDF Stream DumperはWindows7までにしか対応していないことです。
実際にWindows10で試してみましたが、インストールに失敗しました。

PDFファイルをテキストエディタ+フリーソフトで自作してみる

ここまで、既にあるPDFファイルの中身を見てきましたが、自分でもPDFファイルを作ることができます。
試しに”Hello, World!”が記載されている、ごく簡単なPDFファイルを作ってみましょう。

まずメモ帳などのテキストエディタで、以下のように書いてみましょう。
前述の4セクション(ヘッダ、本体、相互参照テーブル、トレーラ)が含まれていることが分かると思います。
書けたら、ファイル名”helloworld-source.pdf”、文字コード”UTF-8″で保存します。

%PDF-1.6
1 0 obj
<<
/Type /Pages
/Count 1
/Kids [2 0 R]
>>
endobj
2 0 obj
<<
/Type /Page
/MediaBox [0 0 612 792]
/Resources 3 0 R
/Parent 1 0 R
/Contents [4 0 R]
>>
endobj
3 0 obj
<<
/Font
<<
/F0
<<
/Type /Font
/BaseFont /Times-Italic
/Subtype /Type1
>>
>>
>>
endobj
4 0 obj
<<
>>
stream
1. 0. 0. 1. 50. 700. cm
BT
/F0 36. Tf
(Hello, World!) Tj
ET
endstream
endobj
5 0 obj
<<
/Type /Catalog
/Pages 1 0 R
>>
endobj xref
0 6
trailer
<<
/Size 6
/Root 5 0 R
>>
startxref
0
%%EOF

大まかな構造はできていますが、実はまだこれでは不十分です。
Adobe Reader等の寛容なPDFリーダーではこのファイルを開けてしまうのですが、他のビューワーでの挙動は保証されておらず、完全なPDFではありません。

PDFファイルをテキストエディタで見ると、ヘッダー2行目に文字化けしているバイナリーデータがありましたね。
ファイルがバイナリファイルとして認識されるために、このデータを付加する必要があります。
他にも、ストリームの長さなどの情報も必要です。

これらを自力で補うのは難しいので、足りない情報を補完するために、前述のPDFtkを使います。
コマンドプロンプトで

pdftk helloworld-source.pdf output helloworld.pdf

を実行すると、PDFtkにより情報が補完されたhelloworld.pdfが生成されます。

helloworld.pdfをPDFビューアーで開くと…

できました!これで完成です。

まとめ

PDFは、多機能ゆえに少々ややこしいファイルフォーマットです。

しかし、基本的なファイル構造:

  • 4セクション(ヘッダ、本体、相互参照テーブル、トレーラ)で成り立っていること
  • オブジェクトを間接参照で結んだグラフで形作られていること

を頭の片隅に置いて、便利ツールを活用すれば、大まかに中身を理解することができます。

PDFtk等のフリーソフトも活用しながら、PDFファイルと仲良くしましょう。

参考文献

関連記事

[Rails] MiniMagickでPDFのページ数を取得するときはフォントエラーに注意!


Windowsにも開発環境が欲しい

$
0
0

最近のMicrosoftさん好きです。
好きな企業は課金して応援ということで、買ってしまいました、Windows PCを。
そしてこの記事は、Windows PCに開発環境を作ろうと試行錯誤の記録です。
まだまだ仕事で使う環境をWindows PCに移行できるまでにはなっていない、Macで開発しています……

思いついた選択肢

  1. Hyper-VでLinuxのVMをたてて全てVMで完結させる
  2. WindowsにRubyなどなど全てをインストールしてWindowsだけで完結させる
  3. WSLのUbuntuにGUIのアプリケーションを含む全てをインストールしてWSLで完結させる
  4. RubyなどはWSL、エディタなどのGUIアプリケーションはWindowsにインストールのように分担させる

試してみた(?)記録

⚓1. VMで完結

良い点

  • 本番環境とほぼ同じ構成なのでトラブルが少ない(はず)
  • ネット上に情報が多い

不満点

  • デスクトップの操作がややモッサリする。
  • ホストとのファイル共有に不安あり。(ネットワーク周りに弱いのでsambaにも苦手意識)

感想

他の選択肢がすべてダメだった場合はこれ。
同じ構成で使っている人が多いのでアドバイスがもらえて良い。(動作がもっさりする点もハードウェアアクセラレーションをONにすれば良いとか?)

⚓2. Windowsで完結

良い点

  • 一番シンプルな構成。(に見える)

不満点

  • トラブルが起きた時に解決できる気がしない

感想

この構成はまだあまり手をつけていない。
意外とすんなりイケるものなのだろうか?

⚓3. WSLで完結

良い点

  • ほぼ(?)普通のUbuntuとして使える。
  • Windowsとのファイル共有も最初からできる。

不満点

  • IOが遅い。
  • WSL特有のクセがある。
  • GUIアプリケーションに不満あり。
    • X Window Systemは今まで馴染みがない。
    • 動作はモッサリする。
    • 文字がぼやけたり表示がイマイチ。
    • JISキーボードとは相性が悪い?(打てない文字や反応しないショートカットがある)

感想

いろいろおしい気はするが、常用できる環境にするにはまだまだ設定等が足りない気がする。

⚓4. WSLとWindowsで分担

良い点

  • GUIアプリケーションの動作が軽快
  • VMを起動しない分負荷が軽い(?)

不満点

  • WSLのクセが怖い。
  • やはりIOが遅い。
  • serviceを起動させる手間が気になる。

感想

今はこの構成。
一番気になるのは bundle install yarn run dev 等のコマンド実行が遅い点、自動テストも数が多いと待てないくらい遅いかもしれない。

systemd等のinitプロセスが動いていないので、serviceを手動でいちいち起動しているのも気になる。

entrypoint.sh?え?

不満はあるが我慢できるかなぁ?というレベルですが、ここに落ち着いたのはWSLが使えるからです。

WSLには夢がある、WSLがもっと進化すればきっと理想の開発環境が!
すぐには無理そうなので、年末年始のお休みはVMに環境を作る作業に充てられそうです。

まとめ

Macはいろいろ考えずに開発環境が作れるという点では最高なのでは?
欲しいと思えるMacBookが出たらMacに戻ってしまいそうです。

Mac: Parallels Desktop for MacでUbuntu Server LTS環境を構築する

$
0
0

こんにちは、hachi8833です。Mac向けのVMアプリであるParallels DesktopのLite版を試してみて、それまで使っていたVirtualBoxよりもよいと思えたので乗り換えました。以下は社内勉強会で発表した内容を元にしています。

  • Parallels Desktop Lite: バージョン1.3.3(無料)
  • Parallels Desktop for Mac Home Edition: バージョン14.1.0(有料)

Parallels内でCLIのみのLinuxを使っていると、ものによってはMacネイティブのbash環境よりも体感レベルで速いのではないかと思えるほどでした。もっとも自分のMac bash環境の.bashrcが汚れているから遅いという可能性も否定できませんので別途測定しようと思います。とはいえ、シェル環境をきれいにするよいチャンスなので、ParallelsベースのUbuntu CLI環境に移行することにしました。

Linux VMやWindows VMを使わないとしても、Internet ExplorerやEdgeブラウザのテスト用VMは無料のLite版でも即使えるので、ブラウザのテストのためだけに導入するのもよいと思います。現時点では以下のテスト用VMが使えます(今後変わる可能性があります)。

  • Edge on Windows 10
  • IE 11 on Windows 8.1
  • IE 11 on Windows 7
  • IE 10 on Windows 7
  • IE 9 on Windows 7
  • IE 8 on Windows 7

Parallels Desktop LiteとUbuntuをインストールする

まずはどのUbuntuをインストールするかですが、以下を参考にUbuntuのServer LTSをインストールすることにしました。

参考: Dockerベースイメージの特徴と比較・選び方 - Qiita

以下からUbuntu Server 18.04.1 LTSのisoイメージをダウンロードしておきます。

参考: Download Ubuntu Server | Download | Ubuntu

Parallels Desktop Liteのインストールは簡単です。App StoreでParallels Desktop Liteをインストールし、起動して後は言われたとおりにやれば完了。

インストールアシスタントの左下にある「開く…」をクリックし、先ほどダウンロードしておいたisoイメージを選択します。とりあえず試したい方は、その上にある「無料システム」から選んで実行するのが楽だと思います。

なお、ディスク容量がいっぱいになると「ネットワーク接続が失われました」という紛らわしいメッセージが出て失敗します。

参考: UbuntuのGUIを殺す

無料システムでインストールしたUbuntuからGUIを削除したい場合は以下が参考になります。今回は最初からCLIのみのUbuntuをインストールしたのでこの作業は不要でした。

参考: Ubuntu 16.04 LTS Desktop から GUI 環境を削除する - heyheytower

ssh接続を設定する

ParallelsのCLIコンソールで作業するのはiTerm2の機能を利用できず不便なので、早速sshを使えるようにします。
とりあえず、Parallels Desktopで動かすUbuntuにparaubuという名前を付けることにしました。以下この名前を用います。

paraubuのコンソールでifconfigを実行し、enp0s5というインターフェイスに表示されるIPアドレスをメモして、Mac側のetc/hostsに以下のように追加します。IPは各自異なりますのでご注意ください。

10.xxx.xx.x paraubu

ssh鍵設定

ホスト名が使えるようになったら、Mac側でscp ~/.ssh/id_rsa.pub ユーザー名@paraubu:~/.ssh/authorized_keysを実行して、Mac側に既にあるssh設定をparaubuに押し込みます。
ssh鍵がまだない場合は以下を参考にして作成してください。

参考: SSHの鍵認証設定 - Qiita

これで、Mac側でssh paraubuと打つだけでパスワード不要でログインできるようになります。

sshログインメッセージを殺す

sshログインメッセージが長ったらしくて邪魔なので、以下を参考に無効にします。

参考: How to disable ssh motd welcome message on Ubuntu Linux - nixCraft

Parallels Toolsをインストールする

Parallels Toolsは、Parallels上のLinuxやWindows環境と、ホスト側のMacとの間を取り持ってくれます。たとえば、MacのHomeにある自分のホームディレクトリなどをマウントできるようになります。

先の「無料システム」でインストールした場合はGUIからインストールできますが、今回はGUIがないので、以下を参考にインストールしました。

参考: Linux 用の Parallels Tools

マウントするディレクトリはホスト側のParallelsの「構成>オプション>共有」で設定します。

主な設定

Parallels DesktopのVM設定項目はVirtualBoxよりも絞り込まれていて、マニアックさには欠ける分、悩むポイントが少ないのがありがたい点です。
共有設定を好みに合わせて変更する以外は、デフォルト設定のままでも十分いけると思います。ネットワークもデフォルトの「共有ネットワーク」で事足ります。

Parallels Desktopは独自のハイパーバイザを持っており、最近のmacOSに搭載されているハイパーバイザと切り替えることもできます。私はデフォルトの独自ハイパーバイザのままにしています(切り替えにはVMの停止が必要)。

VMのディスクファイルは自動的に容量を拡張するタイプです。そのままだとTimeMachineバックアップに時間がかかりそうなので、Ubuntu VMの「構成 > ハードウェア > ハードディスク > プロパティ」で「ディスクイメージを2GBのファイルに分割する」をオンにしてみました。

使ってみて

VirtualBoxのときは諸事もっさりしている印象でしたが、Parallelsは軽快に使える印象です。

Lite版の場合、アプリ切り替えのときにいつもParallels Desktopアプリのアイコンが表示されるのがちょっと邪魔くさいかなと思いました。

有料のHome Editionにアップグレードすると、「構成>起動と終了」で「常にバックグラウンドで待機」を選択すれば、Parallels Desktopアプリを終了してもVMが常駐してくれるので、とてもすっきりしました。

ここまで試した結果、VirtualBoxよりよいと思えたのでParallels Desktop for MacのHome Editionを購入しました。ちょうど2018年の12/09までVectorで6480円で安売りしていました。

Home Editionは、Windowsを起動できる、CPU割り当て数を変更できるなどの違いがあります。Windowsを動かさなくてよいのであれば、Lite版で十分でしょう。

ただしVagrantのホストとして使ったり、Docker for MacのDockerMachineとして使うには、上位のBusiness版またはPro版が必要です。

Parallelsに残念な点があるとすれば、Parallels製品の細かい名称がこれまでときどき変更されていて若干紛らわしいのと、ググって見つかる公式ドキュメントが新旧入り交じっていて少々わかりにくいことぐらいです。

ParallelsとAppleのHypervisorの関係については以下の記事に詳しく載っています。

参考: Parallels、High Sierraから導入されたSKELに対し「Parallels Desktop for Mac」で利用されているシステム拡張を説明。 | AAPL Ch.

おまけ: VirtualBoxのWindows VMをインポートする

これはまったく簡単で、インストールアシスタント左下の「開く」からVirtualBoxのWindows VMファイルを選択するだけで、ストンと変換&インストールできました。Parallelsがインポートにかなり力を入れているのがわかります。

Parallels Desktop上で動くWindowsは、体感レベルですが非常に軽快で、VirtualBoxのときのような鈍重さが嘘のようです。その分CPUパワーをしっかり奪っているので、バックグラウンドのWindowsを「トラベルモード」にするなどしておかないと、Mac側のChromeが目に見えて遅くなります。

Macのアプリ切り替え(⌘+Tabキー)を行うと、Windowsの中で起動しているアプリまで表示されるのにはちょっと驚きました。以下では、Windows内で起動している秀丸エディタがMacのアプリ一覧に表示されています。赤い縦線が2本表示されていることで、Parallels DesktopがサポートしているWindowsアプリであることが示されています。ChromeをWindowsにインストールすると、アプリ切り替え時にMac版とWin版の両方のアイコンが表示されるのでちょっとウザいかもしれません。

「Coherenceモード」にすると、Windowsのアプリウィンドウが、Macの1つのアプリのように扱われるようになり、⌘-Tabキーで切り替わるようになります。しかも、たとえばMacでxlsxファイルをダブルクリックするとWindows内で開かれるのですが(これだけで驚き)、それもMacのアプリであるかのように単独ウィンドウで表示されるようになります。これは見事です。

CoherenceモードだとWindowsのデスクトップが隠される形になって不便なこともあるので、設定がひととおり終わるまではオフの方がよいかもしれません。

なお、インストール後のWindows Updateの大漁節には泣かされました😢

関連記事

HomebrewからDockerにMySQL環境を移行する

JScriptでXMLを操作するスクリプトをNode.js+xmldomに移植する

$
0
0

はじめまして。Glx64xと申します。

突然ですが、JScript+MSXMLって便利ですよね!
XMLをちょっといじりたいとき、Windows標準機能だけでJavaScriptの文法でお手軽にDOM操作ができるのは非常にありがたいです。
Wineが入っていれば、Wineにもcscript.exeとjscript.dll(SpiderMonkeyベースらしい)が同梱されているため、Windows以外の環境でも割と動いちゃいます。

しかし、そんなJScriptも今や古い技術。
UTF-8のような文字コードは扱いにくいのが現状です。
また、もしこれをサーバー上で使う場合、WindowsサーバーならまだしもLinuxサーバー上でWineを動かすのは抵抗があります。

そこで、今回は簡単なスクリプトを例に、JScriptで作成したスクリプトをNode.js+xmldomに移植してみたいと思います。

なぜxmldom?

おおむねW3C標準ベースで、使い方が調べやすいと思ったからです。

xmldomの導入

Node.js及びnpmの導入方法は割愛します。

npm install xmldom

また、Shift_JISなど、UTF-8以外の文字コードを扱う場合、iconv-liteもあると便利です。

npm install iconv-lite

サンプルコード

今回はサンプルのXMLとして、Inkscapeで作成したものをテキストエディタでShift_JISに変換した以下のSVGを用意しました。(SVGの中身はXMLです。)
(TechRachoにはSVGを張ることができないため、pngに変換してあります。)

JScriptを使って画像中の「こんにちは」という文字を「こんばんは」に書き換え、該当する要素のIDを表示するスクリプトを以下に示します。

移植前(JScript)のコード

"use strict";

var dom = new ActiveXObject("MSXML2.DOMDocument");
dom.load("sample_sjis.svg");

if (dom.parseError.errorCode === 0) {
    var tspans = dom.documentElement.getElementsByTagName("tspan");

    for (var i = 0; i < tspans.length; i++) {
        if (tspans[i].text === "こんにちは") {
            WScript.Echo(tspans[i].getAttribute("id"));
            tspans[i].text = "こんばんは";
        }
    }
    dom.save("output.svg");
} else {
    // Error
}

実行結果

tspan5133

移植

では、このコードをNode.js+xmldomに移植していきましょう。
まず変更した箇所だけを見ていきます。

ファイルの読み込み

JScript

var dom = new ActiveXObject("MSXML2.DOMDocument");
dom.load("sample_sjis.svg");

Node.js+xmldom

// パッケージ/モジュールの読み込み
var fs = require("fs");
var DOMParser = require("xmldom").DOMParser;
var iconv = require("iconv-lite");

// ファイルの読み込み
var file = fs.readFileSync("sample_sjis.svg");
var text = iconv.decode(file, "Shift_JIS");

// 読み込んだファイルをDOMParserにかける
var dom = new DOMParser().parseFromString(text, "application/xml");

一気に長くなりましたが、長くなるのは基本最初のモジュールやファイルの読み込みと最後のファイル書き込みだけですのでご安心ください。

JScriptではDOMDocumentにloadメソッドが生えていますが、Node.js+xmldomの場合fs.readFileSyncを使ってファイルを読み込む感じですね。

iconv-liteについては、対象のXMLファイルがUTF-8なら必要ありません。

エラー判定

JScript

if (dom.parseError.errorCode === 0) {

Node.js+xmldom

if (dom.documentElement !== null) {

MDNの説明だとDOMParserはエラーのときエラードキュメントを返すようですが、xmldomのDOMParserからはnullが返ってくるようです。

テキストノードの取得/設定と標準出力

JScript

if (tspans[i].text === "こんにちは") {
    WScript.Echo(tspans[i].getAttribute("id"));
    tspans[i].text = "こんばんは";
}

Node.js+xmldom

if (tspans[i].textContent === "こんにちは") {
    console.log(tspans[i].getAttribute("id"));
    tspans[i].textContent = "こんばんは";
}

JScriptでは要素.text、xmldomでは要素.textContentでテキストノードにアクセスできます。

また、標準出力はJScriptではWScript.Echo(cscript.exeで実行している場合)ですが、Node.jsではconsole.logです。

Node.jsのほうはブラウザとおなじですね。

ファイル書き出し

JScript

dom.save("output.svg");

Node.js+xmldom

fs.writeFileSync("output.svg",
                 iconv.encode(dom, "Shift_JIS"),
                 {encoding: null});

JScriptではDOMDocumentにsaveメソッドが生えていますが、Node.js+xmldomの場合fs.writeFileSyncに出力するオブジェクトを渡してあげる感じです。

移植後(Node.js+xmldom)のコード全体

"use strict";

var fs = require("fs");
var DOMParser = require("xmldom").DOMParser;
var iconv = require("iconv-lite");

var file = fs.readFileSync("sample_sjis.svg");
var text = iconv.decode(file, "Shift_JIS");

var dom = new DOMParser().parseFromString(text, "application/xml");

if (dom.documentElement !== null) {
    var tspans = dom.documentElement.getElementsByTagName("tspan");

    for (var i = 0; i < tspans.length; i++) {
        if (tspans[i].textContent === "こんにちは") {
            console.log(tspans[i].getAttribute("id"));
            tspans[i].textContent = "こんばんは";
        }
    }
    fs.writeFileSync("output.svg",
                     iconv.encode(dom, "Shift_JIS"),
                     {encoding: null});
} else {
    // Error
}

実行結果

tspan5133

まとめ

基本的にxmldomについては、公式からもリンクが貼られているとおりMDNを参照すると大体の情報は見つかりそうです。
JScriptもNode.js+xmldomも、XMLを扱うときには便利なツールとなっています。
今回の記事で扱ったように移植は簡単なので、とりあえずどちらかで書いて、不都合が生じたら書き直すというのもありだと思います。

Windows7→Windows10で激重になったPCをSSD換装で延命した

$
0
0

BPSの福岡拠点として一緒にお仕事をさせていただいています、株式会社ウイングドアのウメバヤシです。

今年に入ってWindows7のサポートが切れたので、自宅にあった6年くらい前のノートPCを激重覚悟でWindows10にアップグレードしました。
すると案の定重くて使い物になりませんでした。。笑

PC自体は壊れてなかったので(HDDの回転音がちょっと怪しかったですが🤔)もったいないな〜と思い、余っていたSSDがあったので、換装してなんとか延命させようと頑張ってみたのでその過程を書いていきます。
(PCが手元になく、キャプチャが載せられなくてすみません)

環境

今まで

  • OS : Windows7 Professional 32bit
  • CPU : Celeron
  • メモリ : 2GB
  • HDD : 500GB

換装後

  • OS : Windows10 Pro 32bit
  • CPU : Celeron
  • メモリ : 4GB
  • SSD : 128GB

とりあえずメモリ増設

そもそもメモリが2GBしかなかったので、かなり重くなるだろうなと予測はしていました😅
タスクマネージャーで見ても常にメモリぱんぱん状態で、ネットもまともに見られません。

1,500円くらいでメモリを購入して増設。幸い、もともと2GBが1枚ささっているだけで、スロットが1つ空いていたので、購入したメモリは2GB1枚で済みました。

32bitなのでメモリは4GBがMAXです。3GBちょっと認識されました。

SSDクリーン

SSDはすでにいろいろ使い倒していて、他のOSが入っていたので、そのままだとWindowsでフォーマットできませんでした。なので一旦初期化します。
WindowsのSSD初期化は「diskpart」コマンドを使用しました。

SSDを外付けケースに入れてPCに接続後、管理者権限でコマンドプロンプトを起動して下記コマンドを実行。

// Diskpart起動
> diskpart

// ディスクのリストアップ
DISKPART> list disk

// 初期化するディスクの選択。nはディスクの番号を入力します(初期化するSSD)
DISKPART> select disk n

// 初期化(確認などなくすぐに初期化が実行されるので注意)
DISKPART> clean

SSDフォーマット

SSDの初期化が済んだらフォーマットします。

Windowsメニューを右クリックして、表示されるメニューから「ディスクの管理」を選択。
先ほど初期化したSSDがフォーマットできるようになっています。
フォーマットする際のパーティション形式は「MBR」と「GPT」とありますが、2TB以下なら「MBR」で問題ないと思います。

今回換装するPCはOSが32bitで、そもそも「GPT」をサポートしてなかったので、問答無用で「MBR」を選択。

HDDクローン

ここでこの作業のメイン、HDDのクローンをしていきます。

いろいろ方法はあると思いますが、今回はフリーで割と評判の良さそうな「EaseUS Todo Backup Free」というソフトを使用しました。
公式サイトでもダウンロードできますが、今回はWindowsユーザーならみんな大好き「窓の杜」からダウンロードしました。

使い方は結構簡単で、左のメニューから「クローン」を選択してクローン元とクローン先のディスクを選択するだけでクローンできます。

有料版ではそのほかにも機能があるみたいですが、クローンするだけなら無料版で十分でした。

ここで問題発生

今回使用するSSDの容量は128GBで、よくみるとPCのHDDの使用領域がすでに128GB超えていました。
ほぼネットしか見ないPCなのに何がこんなに容量食ってるんだ。。。

ぱっとみてもどこで食っているのか分からず。そんな時は下記ソフトがおすすめです。

ディスクドライブの容量を可視化してくれます。ポータブル版なのでUSBなどで持ち運べてとっても便利。

実行する時は管理者権限で実行してスキャンします。
スキャンにちょっと時間かかりますが、辛抱して待ちます。

スキャン完了後、ひと目で昔取ったiPhoneのバックアップファイルが原因だと判明。(200GBくらい食ってました。。)
iPhoneのバックアップファイルはサイズがかなり大きいので、PCでバックアップを取っている方は、ディスク容量を結構圧迫していると思います。

もういらないので、バックアップファイルをおもむろに削除。

改めて「EaseUS Todo Backup」でクローン

クローンに小一時間かかかるので放置。

クローン完了

無事1発でクローンが成功したので、ノートPCを分解してHDDをSSDに換装。
PCの分解方法は「型番 + 分解」とかで調べれば割と出てきます。
(当然メーカーのサポートは受けられなくなるので自己責任で)

起動!!

ドキドキしながらPCの電源を入れます。
BIOSの設定とかしないといけないかな〜と思いきや、そのまますんなり起動!
触ってみると、以前の激重が信じられないくらいサクサク快適になりました!
これであと何年かは頑張ってくれそうです。

起動して黒い画面が出る場合は、BIOSの設定で起動ディスクを変更すればいいと思います。

感想

臨終が間近に迫ったPCをメモリ増設とSSD換装で延命することができました。
ちょっとハードの知識があって、流れがわかれば割と簡単にできるので、ネット見るくらいの用途のPCならこの方法で復活させられそうです。
一昔前からパソコンショップなどでも、SSD換装のサービスが始まりだしたので、ショップに持っていけば何万円かでやってくれるところもあります。

今回のPCはドライバ関係が公式でWindows10に対応しているものがなかったのですが、とりあえず問題なく動いていたのでまあ良しとしました😊




株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

Windows 10 Home 対応の Docker Desktop for Windows を一足早く試してみました

$
0
0

こんにちは、 ebi です。
私物 PC で Windows 10 Home に Insider Preview ビルドを入れて、 Docker Desktop を使えるようにしてみたので軽く紹介しておきます。

サラッと前置き

Docker Desktop for Windows は Hyper-V の利用を前提としており、これまでは Professional エディション以上が必要でした。
ところが新しく提供される WSL2 では、動作のために WSL2 向けの Hyper-V の機能サブセットが Home エディションでも開放され(参考記事)、これを利用することで Docker Desktop も Home で利用できるようになるという話が出てきました。

実際のところ、この対応自体は半年前からお知らせが出ていて、いよいよ WSL2 の機能開放が一般に配布される Windows10 の次期バージョン 2004 が間近で改めてリリースされているのでしょうか?よく分かってない 🤔

とにかく先日の Docker Desktop for Windows Home is here! の案内を皮切りに、今月になって試している方も増えているようです。

①Windows 10 Insider Preview ビルドのインストール

公式の案内 に従っていくだけ。
もちろん、バージョン 2004 の配布以降にこの記事を参照する方には必要ない手順になります。

  • Windows Insider Program を開始する。
  • プレビュービルドを受け取る頻度は「スロー」を選択しました
  • Windows アップデート更新プログラムの確認してからの、ダウンロード、インストール、実際のアップデートまでかなり長いかもしれませんが数回に分けて放置して待ちます。
  • バージョン情報を確認すると、OS ビルドが 19040 以上の表示になってます。これで準備は大丈夫そうです

②WSL2 を有効化します

  • まずは「Windows の機能の有効化または無効化」設定から、 WSL を有効化するのですが、「Windows Subysytstem for Linux」 が見当たらない……と思ったら「Linux 用 Windows サブシステム」と表示されてました
    ネット上の記事を見ると、「Windows Subysytstem for Linux」で表示されている例が多かったのでここが一番の難関です。あとは余裕です。
    (管理者権限でコマンド実行する方法も見かけます。そちらでも大丈夫なはずです。)
  • 有効化したら一度再起動が必要です。
  • この時点では wsl コマンドで実行するディストリビューションが何も入ってないのでインストールを薦められます。案内通り、 Microsoft Store を起動して、 Ubuntu のディストリビューションを入れて動かせるはずです。 wsl2 の利用自体がこの辺の Linux システムを動かすことがセットになっているので、 Ubuntu 等を入れるところまでがセットになっている記事が多いと思います。
    ひとまず Docker Desktop を使いたいだけの場合は無視して大丈夫そうだったので無視します。
C:\Users\ebi>wsl -l -v
Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore

③Docker Desktop for Windows をインストールします

  • ここから ダウンロードします。記事執筆時点では、 Edge を選びます。
  • インストーラを実行して、またまた再起動を挟みます。
  • 起動後、エラーの通知ポップアップが右下に出てました。記載通りの URL にアクセスして指示に従います。
Docker.Core.Backend.BackendException:
Failed to deploy distro docker-desktop to C:\Users\ebi\AppData\Local\Docker\wsl\distro: exit code: -1

中略……

  stdout(unicode): WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
  • (不要かも)気をとりなおして、再度 Docker Desktop のデスクトップアイコンを実行すると、今度は正常動作したような通知メッセージが右下に表示されました。
  • wsl でディストリビューションを確認すると、 docker-desktop が追加されています!
    VERSION が 2 と表示されているのが WSL2 を使っている、と言うことのようです。
C:\Users\ebi>wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop         Running         2
  docker-desktop-data    Running         2
  • hello world できたし多分大丈夫大丈夫
C:\Users\ebi>docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
  • ちなみに WSL2 を適用する一環で Hyper-V が適用されることで、 VirtualBox を利用する Docker ToolBox で入れた docker-machine は使えなくなったのですが……
C:\Users\ebi>docker-machine start default
Starting "default"...
(default) Check network to re-create if needed...
Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type headless failed:
VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:03.219324 Power up failed (vrc=VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT, rc=E_FAIL (0X80004005))

VirtualBox も Hyper-V 環境での利用に対応始めている動きはあり、 最新の 6.1.14 にアップデートすることでそれらしく動くようにはなりました。
(どう考えてもコンフリクトして悪影響しかなさそうなので、 Docker ToolBox をもう使うことはないでしょうが。移行を考えている方は一応 この辺が参考になるかもです
これは業務 PC でも怖がらずに Docker Desktop と VirtualBox を共存させる道が見えているのか……?

おわりに

Windows 機での開発に関する話は度々、他の人も記事にしていますが、 WSL2 の登場や VirtualBox の Hyper-V への対応によって、新たな段階に進むのかもしれませんね……!!

落ち着いたら業務 PC でも Docker Desktop for Windows を導入して、改めて自分なりの開発環境構築を模索していければなぁと思います。
また何かの記事でしれっと Windows ならではの情報は発信していくかもです。よろしくお願いします。

おたより発掘

リモートワークをするためにやったこと

$
0
0

緊急事態宣言が出てしばらく経ちますが、皆様いかがお過ごしでしょうか。

僕は会社で仕事するのが好きで自宅作業はあまり得意ではないのですが、そうも言っていられないのでここしばらくはフルリモートです。少しでも仕事を進めるために、ここ最近で行った対策を記録していこうと思います。

ノートPCを買った

まずやったことは、サブとして使っているノートPCの新調です。当初部分リモートしながらビデオ会議も増えていたため、ノートPCは重要です。1年ほどSpectre x360 13を使っていたのですが、これをXPS 13 (9300)に買い替えました。

CPUが8565Uから1065G7になってメモリもDDR4 2400MHzからLPDDR4X 3733MHzに上がったものの、4Core CPU / 16GB RAM / 1TB SSD / UHDディスプレイという構成は同じため、あまり代わり映えしません。ただ、以下の理由で買い替えが必要と判断しました。

  • 色が微妙だった(アッシュブラックは好きじゃない)。フロストのXPSが格好良かった。
  • キーボード配列とタッチパッドが辛かった。
  • ビデオ会議で8565Uは性能不足で辛く、GPU性能が上がった1065G7なら少しはマシかと思った。

発売とほぼ同時に注文したXPS 13 (9300)で、今となっては32GBモデルも発売していますが、まだ黒しか無いようなので後悔はありません。

効果

  • 4K外部ディスプレイ出力しながらビデオ会議しても、プチフリがなくなり、だいぶ快適になりました。
  • フロストのカバーと白のパームレストが最高に綺麗で精神衛生上好ましいです。ただ、キーボードの白はなんというか普通でした。

デスクトップPCを買った

これまで自宅ではあまり仕事をせずPCパーツの価格を眺めるくらいしかしていなかったため、Sandy BridgeにL997で我慢していました。しかし、リモートワーク用のメインマシンとなると、そんな骨董品で仕事をするのは職務怠慢です。

会社ではCore i9-9900K、32GB RAM、1TB SSDのLinuxマシンをメインに使っていましたが、なるべく近い性能は欲しいものです。

自宅であまりうるさいマシンは嫌だったため、TDP65WということでRyzen 7 3700Xにしました。メモリは足りない気もしましたがとりあえず最低限で32GB、SSDは1TBの安いものを入れておきました。グラボは映ればいいので適当にAMDつながりでRX550です。

効果

  • 現実的なスペックのPCとして使えるようになりました。
  • シングルコア性能は若干物足りない気がしなくもないですが、コンパイル速度を除いて日常用途には快適です。
  • FluidMotionを試してみたかったのですが良い映像ソースを持っていないことに後で気づきました。

ディスプレイを買った

国産最後の最高峰ディスプレイL997は目に優しくて気に入っていましたが、流石に古くて狭すぎます。

会社ではEIZO EV3237 + L887を使っていますが、実家の四畳半の部屋に同じだけ置くのは少々窮屈です。それでもせめて4K1枚くらいは欲しいところ。本当はDELL U3219Qが欲しかったのですが、お金がないので価格重視でLG 32UL500 (32inch、4K、VA) を購入しました。たまたま余っていたエルゴトロンのアームがあったのでスタンドがしょぼいぶん安いこのモデルはお買い得です。

効果

  • VAは視野角が狭くてだいぶ気になりますが、端に単色を置かないなどウィンドウの配置を調整して強引に慣れました。
  • 多少目は疲れますが、VSCode等の黒画面ベースなら1日耐えられないほどではないです。

CPUファンとケースファンとCPUグリスを買った

自宅作業では空調の音が鳴らないため、騒音が集中力を妨げます。当初の構成ではCPU付属ファンを使っており、負荷をかけるとうるさくなって気が散っていました。

そこで、コスパと評判が良いScythe 虎徹 Mark IIと、性能が良さそうなNoctua NF-A12x25を2つ購入しました。また、当初どうも冷え方が物足りなかったので、後日追加でナノダイヤモンドグリスを買い足しました。

更に、普段止まっているグラボのファンが回ると非常にうるさいため、補助用に9cmファンを追加しました。

効果

  • 負荷をかけてもファンが静かなままになりました。
  • グラボの冷却効果は期待できませんでした。

オーディオインターフェースとマイクを買った

ビデオ会議では音質が命です。PC内蔵マイクでは、満足な会議は実現できません。

ヘッドホンの側圧が苦手で買っては誰かにあげている人なので、できればヘッドセットではなくスピーカーとマイクで会議をしたいところ。とはいえ、聞く方のオーディオについては多少わかるものの、マイクについては完全なる素人(※)で何もわかりませんでした。幸い社内や身近なところに音響設備やDTMのガチ勢が数名いたため、助言をいただきながら初心者向けの機材を購入しました。

※どのくらい素人かというと、XLR端子を差したことがなく、ミキサーといえば調理家電を思い浮かべ、オーディオIFの裏にある端子がRCAと勘違いしていてプリメインアンプにつながらないと慌てて変換ケーブルを買い足すくらいです。

専門家の助言をもらいながらミキサーやエフェクタを調べていき、素人が最高を目指して色々なエフェクタをかけまくったのですが、

結果事態が悪化したので、最低限のイコライザとコンプレッサーだけかけて運用するようにしました。

効果

  • Webカメラ内蔵マイクよりは良い音になった気がします。
  • 自分の声を録音して聞く苦行で心が削れました。
  • Voicemeeter Bananaの使い方を理解しました。
  • 手元にボリュームがあるので、BGMの音量調整がしやすくなりました(プリメインアンプのリモコンはすぐ電池が切れて使いづらい)。
  • DACとしては、96kHzで固定すると44.1kHzが再生できないためfoobar2000側でリサンプリングが必要なあたり、再生専用DACに劣る面もありました。

その後プロの声優の方の記事を見て、やはりプロは違うなと思いました。この記事が楽しく読める程度の知識がついたのもひとえにu-ichiさんのおかげです。この場を借りてお礼いたします。

スマホ固定用ブラケットを買った

ビデオ会議では画質も大切です。社会人として、髭を剃る・パジャマで参加しない・画質を確保するというのは最低限のマナーですよね。

知り合い経由で見ていると、皆さん一眼レフからHDMI入力してまともな環境を構築しているようです。それに倣おうとしたのですが、残念ながら手元にある一眼レフのAC電源アダプタがなく、バッテリだと連続使用時間が心もとないので諦めました(あとデスクの位置的に狭かった)。ということで、スマホのカメラもそこそこ高画質だろうとPC Watchさんの記事も見ながら、IVCamを入れました。

良い感じの位置に配置する方法を考えていたところ、車載アダプタがぴったりなことに気づいたので購入しました。

効果

  • ディスプレイの裏面に固定する方法では角度が取れませんでしたが、壁に固定すると完璧な位置に調整できました。
  • 設置が面倒な割に母親からもらったWebカメラと画質が大差ない気がしてきたので、お蔵入りしました。

スマホを買った

これまで使っていたZenFone 5は、一度画面を割って自分で交換したのですが、それ以来少しタッチパネルの動作が不安定です。これではいざというときに重要な連絡に支障を来す可能性があるため、買い替えました。

DSDV対応、イヤホンジャック搭載、安いもの、変なカスタムOSはパス、ということで中華を除外した結果、moto g8 plusを購入しました。

効果

  • 安定した操作環境が得られました。
  • ほぼ素のAndroidなので、ZenFoneから違和感なく移行できました。

SSDを買い足した

会社ではLinuxマシンでしたが、家ではWindowsマシンで、Linux VMを使っています。VMを使うとSSDがすぐに消費されていきます。SSDの残りが少ないと寿命を縮めている気がして落ち着きません。ということで2枚目のSSDを追加購入しました。

効果

  • 空きが5割を超えて、心が落ち着きました。
  • VMデータを移動するときにHyper-Vの操作を間違えて、OSインストールからやり直す羽目になりました。
  • 2つ目のM.2スロットとSATAが排他なことに気づいて、SATAのSSDが1つ認識しなくなりました。

椅子を買った

10年前に中古でもらって長らく使っていたよくわからない椅子はつかれるので、コンテッサセコンダを買いました。

会社エルゴヒューマンと同じではつまらないですし、アーロンチェアは家族が持っている(のとマンガ読むのにリクライニング固定は欲しかった)のでやめて、あとはブランドとデザインの憧れから選定。残念ながら既に緊急事態宣言で家具屋に見に行けなかったので、試せないのが怖いですがエイヤでポチりました。

効果

  • 多分腰に優しくなった気がします。
  • 既に滅びた肉体を復活させる効果があるわけではないので、運動不足の対策にはなりませんでした。
  • 同時に買ったチェアマットは少し小さいですがずれずに快適です。

スイッチングHUBを再起動した

リモートワークで回線速度は重要です。実家なのであまり勝手なことはできませんが、ひとまずフレッツ光ネクストのまま(auやNURO、クロスにするなどはなしで)追加コストのかからないところでIPoE接続にしています。なのにいつも95Mbpsしか出ないなと思っていたのですが、なぜかルーター/スイッチ間が100BASE-TXでリンクしていたため再起動したら無事1000BASE-Tになりました。

効果

  • 時間帯によりますが頻繁に300Mbps以上、最低でも60Mbps以上は出るようになりました。
  • 数十GB単位のリポジトリのcloneが早くなりました。

これらの対策をした成果

仕事と関係ない作業をする時間が増えました。ちゃんと仕事しようと思います。

今後検討している対策

  • キーボード(RealForce 91UBK)がうるさくてWeb会議相手に迷惑がかかるので、静音モデルが欲しい。
    • R2はレイアウトがだめなので91UG-Sが欲しいのですが売っていないorz
  • キーボードノイズ対策でRTX Voideを試すためGeForce RTXが欲しい。
    • Krispは試したのですが、たしかにノイズは完璧に消えるものの加工感が強すぎてだめでした。
  • ディスプレイを増強したい。
    • 他の人の作業環境を見ていると、やはりシングルディスプレイはケチりすぎたかもしれません。スピーカーを少しずらせば縦に1枚くらい増やせそう…
    • 特にビデオ会議中はもう1枚欲しくなります。
  • 10GbE環境を構築したい。
    • やはりマナーとしてやっておきたい。ただMicorATXのマザーなのでPCIeが空いていなくて実現は難しそうです。

WSL2だけで自作キーボードを楽しみたい

$
0
0

こんにちは。自作キーボード流行っていますね。(2018年12月のキーボード記事と同じ導入)
私もこの流れに乗ってキーボードを作りました。
QMK1でのファームウェア作成から書き込みまでをWSL2でやってみたのでそれを紹介したいと思います。

経緯

QMKのWindowsでの環境構築ではMSYSが必要とのことだったんですが、
qmk_firmwareのリポジトリを眺めていたところ、Docker Quick Startを発見しました。

末尾にWindowsでdocker使うの面倒なので非推奨 みたいなことが書かれていますが、
WSL2ならdockerがちゃんと動くので問題ないかなと思いWSL2でやってみることにしました。

書き込みについてはQMK_Toolboxを使おうと思っていたんですが、これもWSLでavrdudeを簡単に使う為の奴を1発見したので、
もう全部WSL2でいいんじゃないかな、と思いWSL2で全部やってみることにしました。

前提

  • キーボードは後述するあらかじめ作っておいたものを対象にします
    • マイコンはPro Micro2を、ファームウェアはQMKを使います
  • Winsows10 + WSL2 でやります
    • QMK CLIは使わず、dockerを使っていきます
      • dockerは入っている前提で進めます
    • WSL2と限定していますがWSL1でもほぼ同じことができます
      • dockerの為にWSL1を管理者権限で実行するのが面倒だったので今回はWSL2にしました

対象とするキーボード

もともとはキットを使わないキーボードの自作が目的だったので、別途作っておいた、
「Pro Microを使った3行3列の9キーキーボード」
を対象とします。

行のピン割り当ては{ D4, C6, D7 }、列のピン割り当ては{ E6, B4, B5 }としています。
名刺サイズ3なので 名前を meishi_bps とします。

記事の本題ではないのでこれ以上の情報は端折ります。
(でもモデリングと3Dプリンタでの調整と空中配線ちょっと頑張りましたというのは表明したいので画像は載せます。)

ファームウェア作成~ビルドまで

今回は~/qmkで作業することとして進めます。

qmk_firmwareをクローンし、ファームウェアのテンプレートを作成

対話形式でキーボード名、キーボードタイプ、作者名を聞かれるので、今回はmeishi_bpsavr(デフォルト)、miyasonとしました。

$ cd ~/qmk
$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
$ cd ~/qmk/qmk_firmware
$ ./util/new_keyboard.sh

Generating a new QMK keyboard directory

Keyboard Name: meishi_bps
Keyboard Type [avr]:
Your Name [*** ****]: miyason

Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2020... done
Replacing %KEYBOARD% with meishi_bps... done
Replacing %YOUR_NAME% with miyason... done

Created a new keyboard called meishi_bps.

To start working on things, cd into keyboards/meishi_bps,
or open the directory in your favourite text editor.

~/qmk/qmk_firmware/keyboards/meishi_bps に作成されたテンプレートをmeishi_bpsで動作するように編集

  • config.hの行の設定(MATRIX_ROWSMATRIX_ROW_PINS)と列の設定(MATRIX_COLSMATRIX_COL_PINS)を以下に変更
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/config.h */
#define MATRIX_ROWS 3
#define MATRIX_COLS 3

#define MATRIX_ROW_PINS { D4, C6, D7 }
#define MATRIX_COL_PINS { E6, B4, B5 }
  • meishi_bps.hのLAYOUTの設定を以下に変更
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/meishi_bps.h */
#define LAYOUT( \
    k00, k01, k02, \
    k10, k11, k12, \
    k20, k21, k22  \
) \
{ \
    { k00, k01, k02 }, \
    { k10, k11, k12 }, \
    { k20, k21, k22 }  \
}
  • keymap.cのkeymapsを以下に変更(とりあえずabcdefgと打てるようにしました)
/*(抜粋)~/qmk/qmk_firmware/keyboards/meishi_bps/keymaps/default/keymap.c */
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [0] = LAYOUT(
        KC_A,    KC_B,   KC_C,
        KC_D,    KC_E,   KC_F,
        KC_G,    KC_H,   KC_I
    ),
};

ビルド

この記事の根幹の一つなのに簡単すぎて一行。

$ ./docker_build.sh meishi_bps:default

以上で ~/qmk/qmk_firmware/meishi_bps_default.hexが出来上がっているはずです。これを書き込みます。

書き込み

準備

WSLでavrdudeを簡単に使う為の奴を流用させていただきます。
qmk_toolboxに入っているavrdude.exeとavrdude.confを利用する形に修正しました。

# avrdude.sh 
TOOLBOXDIR='/home/miyason/qmk/qmk_toolbox/'
MODECMD='/mnt/c/Windows/System32/mode.com'

COMPORT1=$(${MODECMD}|grep -o 'COM[0-9]*')
COMPORT2=""
while [ "$COMPORT2" = "" ];do
 sleep 0.5
 printf "."
 COMPORT2=$(${MODECMD}|grep -v $COMPORT1 |grep -o 'COM[0-9]*')
done
echo $COMPORT2
${TOOLBOXDIR}windows/QMK\ Toolbox/avrdude.exe -C ${TOOLBOXDIR}common/avrdude.conf -c avr109 -p m32u4 -P ${COMPORT2} -U flash:w:$*

WindowsコマンドとLinuxコマンドが合わさり最強に見える。

というわけで使っていきます。

引き続き~/qmkで作業することにし、
avrdude.exeの入手先としてqmk_toolboxをクローンし、avrdude.exeに実行権限を付与します。
修正したavrdude.shを~/qmkに配置し、実行権限を付与します。

$ cd ~/qmk
$ git clone https://github.com/qmk/qmk_toolbox.git
$ chmod +x ~/qmk/qmk_toolbox/windows/QMK\ Toolbox/avrdude.exe
$ vi ~/qmk/avrdude.sh # 上記入力
$ chmod +x ~/qmk/avrdude.sh

書き込み作業

qmk_firmwareに移動し、作ったhexファイルを対象としてavrdude.shを実行します。

$ cd ~/qmk/qmk_firmware
$ ../avrdude.sh meishi_bps_default.hex
# 待機状態になり、. が延々と表示される状態になる

ProMicroのRSTとGNDを手ごろな針金でちょんちょん触ってショートさせ4、ブートローダーモードに切り替えます。

※ブートローダーモードに入る為のショート回数は1回のものと2回のものがあるようです。販売元だったり製造元だったりで変わる様子。

ブートローダーモードになると自動で書き込みが始まります。以下のようになれば成功です。

.
.
.
COM3

Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
    Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.

Programmer supports the following devices:
    Device code: 0x44

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: reading input file "meishi_bps_default.hex"
avrdude.exe: input file meishi_bps_default.hex auto detected as Intel Hex
avrdude.exe: writing flash (22908 bytes):

Writing | ################################################## | 100% 2.83s

avrdude.exe: 22908 bytes of flash written
avrdude.exe: verifying flash memory against meishi_bps_default.hex:
avrdude.exe: load data flash data from input file meishi_bps_default.hex:
avrdude.exe: input file meishi_bps_default.hex auto detected as Intel Hex
avrdude.exe: input file meishi_bps_default.hex contains 22908 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.75s

avrdude.exe: verifying ...
avrdude.exe: 22908 bytes of flash verified

avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)

avrdude.exe done.  Thank you.

abcdefgしか入力できないキーボードの完成です。

感想

WSL2最高ですね。

参考



  1. 自作キーボードといえばこれってぐらい一般的に使われているファームウェアです。 
  2. ProMicro 回路図で検索するとキーボードの回路図が出るぐらい自作キーボードで一般的に使われているマイコンボードです。 
  3. もしまたmeishi展が開催されたら参加したいなぁ、という思いで名刺サイズかつ足無しの造形にしたんですが、PCBを作る時間がなかなか出てこない。 
  4. リセットスイッチぐらい実装しておけばよかった。 

electron-builder による Windows インストーラー (NSIS) 作成でやりたかったことの実現方法まとめ

$
0
0

少し前に electron-builder を使用して Windows インストーラー (NSIS) の作成をしたのですが、中々苦戦したのでその備忘録を兼ねて記事を書いてみます。

electron-userland/electron-builder - GitHub

この記事は electron-builder のバージョン 22.9.1 時点の話となります。
また、インストーラーを出力するまでのチュートリアル的な内容はこの記事では割愛させていただきます。

⚓ 実現したかった主な仕様一覧

今回は弊社の自社製品である超教科書の Windows インストーラーを作成しました。

実現したかったのは以下のような仕様です。
特に小難しかったり一般的ではない仕様は含んでいないつもりです。が、大分苦戦しました。

  • インストールされるアプリの exe のファイル名は「cho-textbook.exe」とする
  • インストーラーのメッセージや「プログラムと機能」などに表示される製品名は「超教科書」とする
  • Electron の app.getPath(‘userData’) で取得できる appData ディレクトリの名称は「cho-textbook」とする
    • 以降このディレクトリは userData ディレクトリ と表記します
  • インストール先ディレクトリを選択できるようにする
  • インストーラーのヘッダやサイドバーに独自の画像を表示する
  • インストール時にファイルのインストール以外に以下を行う
    • HKEY_CLASSES_ROOT 配下のレジストリを追加
    • スタートメニューとデスクトップショートカットの作成を行う
      • 表示名称は「超教科書」とする
  • アンインストール時にファイルのアンインストール以外に以下を行う
    • 追加したレジストリの削除
    • 追加したスタートメニューとデスクトップショートカットの削除
    • userData ディレクトリの削除を行う
      • できればダイアログでユーザーに削除確認を行いたい
  • アップデートインストール時は userData ディレクトリを引き継ぐ

⚓ electron-builder で作成した NSIS 形式のインストーラーの基本的な動作

細かい点を説明する前に NSIS 形式のインストーラーの基本的な動作を記載しておきます。

前述の実現したい仕様に沿い、この記事内では NSIS の設定oneClick を false、allowToChangeInstallationDirectory を true に設定し、インストール先ディレクトリを選択できる形にしているものとします。

⚓ インストール

インストーラーを起動すると以下のような画面が起動し、インストール処理が進みます。

インストーラー上での操作は、必要に応じてインストール先ディレクトリを選択し「インストール」→「完了」を押すだけです。

細かい注意点としては、インストールディレクトリの名称が初期表示と同じ(基本的には製品名)であればその通りのパスにインストールされますが、違う名称のディレクトリを指定した場合、そのパスのさらに下に製品名ディレクトリが作成され、その中にインストールされるようです。

perMachine の設定が false (デフォルト)の場合は追加でインストールモードの選択(マシン単位またはユーザー単位)画面が表示されます。

メッセージは製品名の部分以外はOSの言語ごとに用意された標準のものが表示され、icon の設定(または installerIconの設定)をすれば上記の画面のように設定したアイコンが表示されます。

デフォルト設定だと createDesktopShortcutcreateStartMenuShortcut が true のため、スタートメニューとデスクトップショートカットも作成されます。

インストールする js ファイルなどは Common Configuration にある app の設定先(アプリケーションの package.json を含むディレクトリ)の内容が元となります。

レジストリ操作などの追加処理をしたい場合は Custom NSIS script を作成し、customInstall に処理を実装します。

⚓ アンインストール

インストール先ディレクトリに保存されるアンインストーラーの exe を直接起動するか、Windows の「プログラムと機能」の画面からアンインストールを実行するとアンインストーラーが起動します。

インストール時同様に画面表示に沿って「アンインストール」→「完了」と押せばアンインストールが完了します。

インストールファイル以外にスタートメニュー、デスクトップショートカットなども自動で削除されますが、customInstall などで行った処理を元に戻す場合は同様に customUnInstall
などに処理を記述する必要があります。

標準だとインストールディレクトリが丸ごと削除されますが、customRemoveFiles マクロを記述すれば削除処理を自作することも可能です。

⚓ アップデートインストール

既にインストール済みの状態でインストーラーを起動すると、インストール時と同じ画面が表示されます。
操作内容は同じですが「インストール」を押すと自動で「アンインストール」→「インストール」という流れで処理が進みます。

アップデートインストール時にインストール先ディレクトリを変更した場合も、旧バージョンのアンインストーラーによってファイルが削除されたあと、新規ディレクトリにインストールが行われます。

ここで旧バージョンという言葉を使ってしまいましたが、標準ではバージョンチェックは行われません。
単純にアンインストール→インストールを行うだけとなります。

バージョンチェックを行いたい場合は VersionCompare などを使用して自分で処理を記載する必要があります。(今回未使用のため詳細調査はしていません)

⚓ 各仕様の実現方法

まず前提知識として、各種設定は Quick Setup Guide に記載の通りアプリケーションの package.json の標準フィールドと、Configuration で行います。

標準フィールドや Common Configuration の値を WindowsConfigurationNsisOptions で上書きできる設定項目もあります。

⚓ 製品名や出力されるファイル名、ディレクトリ名などを指定する方法

ひとまず Common ConfigurationproductName に「超教科書」を設定してみます。

すると、以下の部分にこの名称が適用されます。

  • インストールされるアプリの exe の名称
    • 正確には「超教科書.exe」となる
    • ついでにアンインストーラーの名称にも適用される
  • インストーラーの exe の名称
    • 正確には「超教科書 Setup 1.0.0.exe」のような形となる、1.0.0 の部分はバージョン
  • インストールされるアプリの exe のプロパティに表示される「ファイルの説明」「製品名」の値
    • package.json の標準フィールドである description を指定しても「ファイルの説明」は上書きできないようです
  • インストーラーの exe のプロパティに表示される「製品名」の値
  • userData ディレクトリの名称
  • インストーラーで表示されるメッセージに含まれる製品名部分
  • 「プログラムと機能」に表示される名称
  • スタートメニューとデスクトップショートカットの名称

今回は exe と userData ディレクトリの名称は「cho-textbook」としたいのでこれだけでは不十分です。

22.9.1 時点ではドキュメントに載ってない?気がしますが issue #204electron-packager と同様に package.json で productName が指定できるようになっているようなので、試しにこの値を「cho-textbook」にしてみたら以下の項目に適用されました。

  • userData ディレクトリの名称
  • スタートメニューとデスクトップショートカットの名称

userData ディレクトリは目的の値になりましたが、スタートメニューなどにも適用されてしまいました。
しかしこれは NsisOptionsshortcutName を「超教科書」にすれば解消します。

※2020/12/18 追記: ショートカットの名称が変わっていたのは後述する パッチファイル の影響でした、実験中に勘違いしてしまったようです

さて、ここまででアプリの exe の名称以外は目的の値になりました。しかし、この名称を変えるすべが見当たりません。
※インストーラーの exe の名称は NsisOptionsartifactName で指定できます

⚓ 試したことその1: afterSign でファイル名を上書き

まずは afterSign などでスクリプトを走らせ名称を強引に上書きしてしまえばいいのでは?と思い試してみました。

結果として名称自体は変更出来ました、しかしインストール完了画面で「超教科書を実行」をした際に起動に失敗してしまいました。
それ以外にも何か問題があるかも知れないし、この方法はダメそうです。

⚓ 試したことその2: electron-builder を修正する (Pull Request)

そこでさらに issue を漁ったところ同じことに悩んでいる人を発見しました。

そしてこの issue 内で参照されているコードを見る限り 22.9.1 時点では変更することが不可能と分かります。
しかも issue は解決されず終了しており、あとで再度同じ内容の issue が作られますが、放置されてまた終了しています。

ここに至り、じゃあもう自分で修正するしかないね、ということになり Common ConfigurationproductFilename という設定を追加する Pull Request を出してみました。
同じことで悩んでいる方や、内容に賛同していただける方は是非上記の Pull Request にリアクションをいただけると嬉しいです。

ただ2カ月に1回くらい?しか活動が活発にならないようで、他も含めて Pull Request が放置され気味のようです。

⚓ 試したことその3: electron-builder を修正する (patch-package)

この記事投稿時点ではまだ前述の Pull Request に進展はありません。

そのため今回は patch-package で修正を適用することにしました。
patch-package の使い方は検索すれば記事が結構見つかると思いますので割愛させていただきます。

今回修正したのは app-builder-lib モジュールなので、patches/app-builder-lib+22.9.1.patch というパッチファイルが出来上がりました。

パッチファイルの中身は以下のような内容です。

⚓ レジストリの登録

この辺りは他に説明している記事が結構あるので詳細は割愛させていただきます。

概要だけ書くと NsisOptionsinclude に指定した installer.nsh ファイルに customInstall マクロを記載し、その中で WriteRegStr を実行します。

注意点としては、今回実現したい仕様にある HKEY_CLASSES_ROOT 配下へのレジストリ登録はインストールモードをマシン単位にしないとうまくいかないということです。

そのため、今回は perMachine を true にしました。
この設定にすると、インストーラー起動時にUACの権限昇格確認が表示されるようになります。

また、上記で登録したレジストリをアンインストール時に削除する場合は同様に installer.nshcustomUnInstall マクロを記載し、その中で DeleteRegKey を実行します。

この customUnInstall の処理はアップデートインストール時のアンインストール処理でも起動します。

⚓ アンインストール時に userData ディレクトリも削除する

標準のアンインストール処理では userData ディレクトリまでは削除してくれません。

そのためここでも以下のように installer.nsh に以下のような記述を書く必要があります。

RMDir がディレクトリの削除処理となります。/REBOOTOK を付けると削除できなかったときに再起動を促してくれます。

その手前に SetShellVarContextcurrent を指定していますが、これをやらないと $APPDATA の内容が C:\ProgramData を指してしまいました。
(ここでは C:\Users\xxx\AppData\Roaming を指してほしい)

これはインストールモードをマシン単位にしていることが原因で、$APPDATA 使用前に current を設定してやることで Roaming の方を指してくれるようになります。

これでアンインストール時に userData ディレクトリが削除されるようになりました。

しかし、customUnInstall の処理はアップデートインストール時にも動いてしまいます。
つまりこの記述だけだとアップデートする度に、アプリ内で保存しているユーザー設定が消えてしまいます。

それでは困るので条件判定を追加してアップデートインストール時には削除しないようにする必要があります。

が、この解決にめちゃくちゃ手間取りました。ひとまず electron-builderNSIS のドキュメントを見ても何も書いてありません。
当初は各マクロの呼ばれ方でフラグ管理しようと思ったんですが、customUnInstall はアンインストーラーの exe 上で動くため customInit などで設定した値を参照できず無理でした。

いったん諦めようかとも思ったのですがこれも issue を漁っていたらいくつか似たような話を見つけ、最終的に以下のような形で判定できることが分かりました。

GetParameters はコマンドラインパラメーターを取得する機能で、アップデートインストール時はアンインストーラーの exe 起動時に --updated が渡されるのでそれで判定しています。

これでひとまずやりたいことはできました。
今回はこれに加え、アンインストール時にユーザーに削除確認のダイアログを出して userData ディレクトリを残す選択肢も用意してあげることにしました。

結果的に以下のようなコードになっています。

インストーラーが標準で多言語対応のため、一応2言語対応だけしてみましたが、ちょっとダサいですね・・・。
メッセージの多言語化はちゃんとやるなら別の方法を取った方が良さそうです。

⚓ インストーラーのヘッダやサイドバーに独自の画像を表示する

これは NsisOptionsinstallerHeaderinstallerSidebar を設定するだけだから簡単!と思ったらそうではなく・・・。 😢

確かに画像を表示するだけであればそれで完了です。

実際表示に成功しました。が、なんか横に伸びてる・・・。
各画像の推奨サイズは installerHeader150x57installerSidebar164x314px らしいのでその通り指定しているのですが・・・。

これも検索でなかなか情報が見つからず大分解決に手間取りましたが、NSIS の Forums でそれらしい情報が見つかりました。

これを見るとなんと「日中韓のフォントが使用される場合」に画像が引き延ばされておかしくなる、とのこと。
試しに英語版の Windows を VM で立ち上げて確認してみたら確かにキレイに表示されました。

じゃあ、どうすればいいんだ、と思って読み進めていたら MUI_HEADERIMAGE_BITMAP_NOSTRETCH という単語が出てきます。

調べると以下のように installer.nsh に追記すれば設定ができるようです。
今までと違いマクロの中ではなく、ファイルの先頭に記述するだけでOKです。

!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH

これを設定すると installerHeader に指定した画像が拡縮しなくなります。

同様に installerSidebar の画像は MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCHMUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH で指定できるようなのでこれも追加で設定します。

すると以下のようになりました。

画像自体はキレイに表示されるようになりましたが、、、これではダメですね。

そこでさらに調査を継続したところ先ほどの Forums の最後の方にリンクを見つけて飛んでみたところ AspectFitHeight という魅惑的なワードが登場しました。

これは!と思いさらに調査したところ以下のような指定ができることが分かりました。

!define MUI_HEADERIMAGE_BITMAP_STRETCH AspectFitHeight
!define MUI_WELCOMEFINISHPAGE_BITMAP_STRETCH AspectFitHeight
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_STRETCH AspectFitHeight

この設定で作ったインストーラーが以下になります。

ようやくそれらしくなりました。ただ、画像が大分荒く見えます。

その後色々試した結果、以下のことをしたら大分見た目がよくなりました。

  • 画像を推奨サイズの2倍にする
  • 以下の設定を installer.nsh に追記する。(この設定もファイルの先頭に記述しておくだけでOKです)
ManifestDPIAware true

※4kディスプレイで 125% 表示の環境で検証

ManifestDPIAware を設定することでついでにフォントもキレイに表示されるようになりました。

いくつかの機能で問題が出るかも知れないので true にした場合は異なるDPI環境でテストしてね、とありますが、今のところ問題は発見されていません。

electron-builder を使ってこの記事に記載した範囲のカスタマイズで作成したインストーラーでは特に問題なさそうです。

⚓ その他諸々の対応について

以上で最初に記載した仕様は一通り出来上がったのですが、それ以外にいくつかやったことがあるのでまとめてここに記載します。

⚓ アプリケーションディレクトリ(app の設定先)内の不要ファイルをインストール対象から除外したい

今回は xxx.map と git 用の .empty を省きたかったので以下のような設定を Common Configuration に追記しました。

"build": {
  "files": [
    "!**/*.map",
    "!**/.empty"
  ]
}

これでインストールされる asar ファイルなどから該当ファイルが除外されます。

この辺りの設定の記載の仕方は Application Contents に書いてあります。

⚓ インストールフォルダに追加の LICENSE ファイルを配置したい

これも以下のような設定を Common Configuration に追記することで達成できました。

"build": {
  "extraFiles": [
    {
      "from": "build/LICENSE.BPS.txt",
      "to": "LICENSE.BPS.txt"
    }
  ]
}

この設定を追加すると開発ディレクトリに置いておいた build/LICENSE.BPS.txt がインストールディレクトリ直下に LICENSE.BPS.txt という名称で配置されます。

設定方法の詳細は前述の Application Contents のページを参照ください。

⚓ インストーラーの exe のプロパティの説明欄も埋めたい

今まで記載してきた設定内容だけだとインストーラーの exe のプロパティの「ファイルの説明」は空になります。

package.json の標準フィールドである description を指定しても「ファイルの説明」は上書きできないようです

アプリの exe の説明のところで上記のような記載をしたのですが、実はこの description の値がインストーラーの exe の「ファイルの説明」に反映されるようです。

むしろ未指定だとビルド時に description is missed in the package.json というエラーメッセージが出ます。
何故ここだけ Configuration 側の指定ではないのか・・・。

今回はインストーラーの指定はできるだけ Configuration にまとめたかったので以下の設定で上書きするようにしました。

"build": {
  "extraMetadata": {
     "description": "超教科書 Setup"
  }
}

⚓ Windows における appId の値とは

公式ドキュメントの例やら巷の記事では com.electron.xxx みたいな指定が多いのですが、よく読むと Application User Model ID for Windows と書いてあります。

この Application User Model ID の説明 を読んでみると Each section should be pascal-cased. と書いてあります。

CompanyName.ProductName.SubProduct.VersionInformation みたいな感じですね。

内容を読むと今回のアプリでは特にこの辺りは気にしなくて良さそうでしたが、一応 Bps.Xxx の形としておきました。

一応他のアプリはどんな感じなんだろう?と思って PowerShell で get-StartApps コマンドを打って確認してみました。

、、、あんまりみんな守ってなさそうですね。一応 Microsoft 製アプリは大体守っているようです。

⚓ コードサイニング証明書の適用時にエラーが発生する

コードサイニング証明書は環境変数 CSC_LINKCSC_KEY_PASSWORD を設定してからビルドすることで適用できます。
※EVコードサイニング証明書の場合は追加の設定が必要

自分の環境では特に問題なく成功したのですが、他の開発者の環境で証明書適用時だけビルドエラーになる、という報告を受けました。

First attempt to code sign failed, another attempt will be made in 15 seconds: Exit code: 1. Command failed: C:\Users\xxx\AppData\Local\electron-builder\Cache\winCodeSign\winCodeSign-2.6.0\windows-10\x64\signtool.exe sign /tr http://timestamp.digicert.com /f C:\Users\xxx\xxx\bps-codesign.pfx
(以降省略)

エラーメッセージは上記のような形です。

このメッセージだけ見てもよく分からなかったので再確認してもらったところ、「ビルドが成功する時と失敗する時がある」とのこと。

これ以上はコードを読まないと分からなかったので、エラーメッセージから該当箇所らしき場所を探り出しました。

if (e.message.includes(“The file is being used by another process”) || e.message.includes(“The specified timestamp server either could not be reached”)) {

どうやらエラー時に上記メッセージが含まれている場合になるようです。

現状この現象はそこまで困っているわけではないのでこれ以上詳しくは調べていませんが、最初のメッセージにも含まれている http://timestamp.digicert.com へのアクセス辺りで問題が発生していそうな雰囲気です。

⚓ まとめ

今回は現状 electron アプリのインストーラー作成で一番優勢に見えた electron-builder を使ってみました。

感想としては機能は大分充実していて、使いやすさも悪くないという印象です。

ただ、この記事にもあるように細かいところには手が届かないところもあります。
そしてドキュメント化されていない仕様も結構あるのでカスタマイズを頑張りたい方は electron-builder のソースをある程度読む覚悟はした方が良いかも知れません。

NSIS 周りもカスタマイズをほとんどしなければ非常に簡単に使えますが、インストーラーの画面をカスタマイズしようとすると electron-builder 側の設定だけでは無理なことが多く NSIS のスクリプトを勉強する必要があります。

ただ NSIS 以外の形式も含め、他OS向けの出力も electron-builder だけでまとめてできますし、物凄く凝ったことをしないのであれば選択肢としてはかなり有力だと思います。


Windows 10でPDFのサムネイルプレビューを表示させる

$
0
0

またですよ。

現象: Windows 10 にしたらまたPDFのサムネイルプレビューが表示されなくなった。

nopreviewpdf

Windows 7 以前でPDFのサムネイルプレビューを表示させる方法を書くときに調べて対処したばかりなのに、また同じようなことしているとは。自分の記事を見て試してみたけどやっぱりWindow 7のFixは使えないっぽい。というわけでもっかい調べてみたら、Adobe Reader DC(無料版のやつ)の設定変えたらいけるっぽい。ググれば誰でも解決できるでしょうけれども、まあ一応少しでも誰かの役に立てればと。

解決: Adobe Reader DC の環境設定いじったらなおるぽい

1. Adobe Reader DC ダウンロード

最初から入ってくるんでしたっけ?僕は入ってなかったので一応。直接Adobe Reader DC ダウンロードページに飛びたい人はリンクをクリックしてください。

2. どれでもいいのでPDFを Adobe Reader DC で開く

3. 編集のメニューから「環境設定」を開く

4. 環境設定の中の「一般」を選択する

5. PDF サムネイルのプレビューがどうたらってのがあるのでチェックをオンにする

  • Windows Explorer で PDF サムネールのプレビューを有効にする

6. 特にOSもソフトも再起動することなくPDFのサムネイルのプレビューが表示される

こんな感じで。背景のファイルエクスプローラーをご覧ください。

そうそう、上の資料にあるとおり弊社(BPS株式会社)は引き続きエンジニアを募集してまーす。よかったらご検討くださいね。

The post Windows 10でPDFのサムネイルプレビューを表示させる first appeared on TechRacho.

Windowsで複数インターネット回線を切り換えながら使う方法

$
0
0

morimorihogeです。SGDQ21は良かったですね(その後スポンジボブをNetflixで観始めました)。ESA Summerも始まりましたしRTA in Japanも楽しみです。

諸般の事情からWindows環境でIPアドレスを切替ながら使いたいというユースケースに遭遇したのでまとめます。
具体的には、ノートPCに接続した

  • ノートPC内蔵のWi-Fi経由
  • USB経由のWiMAX回線

の二つのインターネット回線を物理的にPCに触らず、リモートRDP接続からWindowsの設定変更だけで任意に切り換えるという手順について書きます。

※本記事はWiFiとUSB接続WiMAXルーターの切り替えについて記載していますが、例えば自宅回線とVPN経由回線の経路を切り替えたい、といったケースでも応用が利くかと思います。ただ、そういった場合はVPN側のネットワークアドレスと自宅LANのネットワークアドレスが別のCIDRである必要があるなどの制限がでますので、適宜良い感じに読み替えてください。

背景など

元々は下図のような構成で、作業用デスクトップPCから動作確認用ノートPCにRDP接続して作業をしていました。
自宅内LANにWiFi接続したノートPCに繋ぎ、ノートPCはデスクトップPCと同じ経路でインターネットに出て行くごくごく一般的な構成です。

ある日、インフラ設定しているとちょいちょいある送信元IPアドレス制限的なアレを動作確認する必要に駆られ、手持ちのWiMAXルーターを使って別回線接続することにしました。
しかし、WiMAXルーターをノートPCにWiFi接続で繋ごうとすると、ノートPCのWiFiインターフェースは一つのため自宅内LAN側の接続が切れてしまい、RDP接続できなくなってしまいます。

というわけで、WiMAXルーターをUSB接続で繋ぎ、USB経由でWiMAX回線への接続経路を作ったのが下図です。

この環境下で以下のことをやりたいというのが今回のモチベーションになります。

  • ノートPCからインターネットへの経路A/BをVDSL回線経由・WiMAX回線経由を任意で切り換えたい
  • ノートPCは引き続き作業用デスクトップPCからRDP接続で利用したい。この接続は経路を切り換えても切断されないようにする
  • ノートPCの物理デバイスON/OFF、WiMAXルーターの抜き差しなど、実機に触らずに設定変更したい

実現方針

こういった複数回線でインターネット接続する構成をマルチホーム環境と呼び、一般的には冗長化や同時に複数回線を最大限に利用することによる回線効率の最大化などの話が出てきたりする分野なのですが、今回やりたいのは冗長性の確保ではなく単純に2回線を排他で切り換えて使えれば良いということで、単純にルーティングテーブルを更新することにします。

作業手順

まずはノートPCにWiMAXルーターをUSB接続した所から設定を始めていきます。

現行設定の確認

まずはノートPC環境のコマンドプロンプトから route print してみます。

大事な部分は赤枠で囲った部分になります。
以降の設定に進む前に確認しておきましょう。

  • ネットワーク宛先 0.0.0.0/0192.168.0.1(VDSL側) 向けのルーティングが設定されている
    • VDSL回線経由でインターネット接続するのに必要な設定です
  • ネットワーク宛先 0.0.0.0/0192.168.100.1(WiMAX側) 向けのルーティングが設定されている
    • WiMAXルーター経由でインターネット接続するのに必要な設定です
  • ネットワーク宛先 192.168.0.0/24 のルーティングテーブルが設定されている
    • この後の経路変更を行ってもデスクトップRDP接続が切断されないために必要な設定です。
    • この設定がない場合、自宅内LANが広告するDHCP設定に問題があるかもしれません。必要ならノートPC側で手動設定することも可能ですが、その場合DHCPによってさらに上書きされてしまう可能性もあります

また、この中で表示されている「メトリック」の値が重要です。後で出てくるので覚えておきましょう。

現在接続経路の確認

現在どの経路から接続しているのか確認してみましょう。接続元ホストを見て色々と情報を表示してくれる確認君+(Plus)にノートPC環境からアクセスして見てみます。

AU回線=WiMAX回線(UQ mobile)なので、今ノートPCのインターネット接続はWiMAXルーター経由になっていることが分かります。
これは、前節で挙げたルーティングテーブルにおいてデフォルトルート(0.0.0.0/0)を見たとき、最もメトリック値が小さいのがWiMAXルーター経路(メトリック値25)だったためです。

整理すると、Windows的には以下のようなロジックで経路を選択しています。

  • 要求された接続先IPに接続できるルーティングをルーティングテーブルから検索
    • インターネット向け接続(グローバルIP)向けの個別設定はないため、デフォルトルート(0.0.0.0/0)が選択される
    • デフォルトルート向け経路として、VDSL回線経由(メトリック値40)、WiMAXルーター(メトリック値25)の二つが検出される
  • ルーティング先が複数ヒットした場合、よりメトリック値が低い経路を優先する
    • WiMAXルーターの経路の方がメトリック値が小さいので、そちらを選択
2回線同時には使わないの?
なお、この段階では確認君+の画面を何度リロードしても常にWiMAXルーター経由での接続になります。
2回線あるんだから両方の回線を自動的に最大限使ってくれるんじゃないの?と思う人もいるかも知れませんが、そうはなりません
TCP/IPによるソケット通信は接続元・接続先のIP/ポートに対してセッションを開くため、複数回線を同時に最大限使うような通信がしたければ、そういった通信方法に対応したソフトウェアが必要になります。

ルーターレベルであればマルチセッション対応の製品などを使えばルーターから先の通信を複数回線同時利用するようなことはできますが、クライアントレベルでのマルチセッションは先に挙げたTCP/IPソケット問題などが絡むため、地味に難しいです(多分ソフトウェアルーターをローカルに作ってそこで負荷分散すればできそうですが、面倒そう)。

接続経路の切り換え

では、経路を切り換えてみましょう。

インターネット向けの経路(デフォルトルート)のメトリック値を変更すれば良いのですが、メトリック値はインターフェース単位(Windows用語だとネットワークアダプタ)で設定するようになっています。
今回はWiMAXルーター経路のメトリック値を変更して経路を切り換えてみます。

「ネットワークとインターネット」設定の「状態」「ネットワークの詳細設定」から「アダプターのオプションを変更する」を開きます。

出てきたインターフェース一覧からWiMAXルーター(今回使っているのはHUAWEI Speed Wi-Fi NEXT W06)を開きます。

「プロパティ」から「インターネット プロトコル バージョン4(TCP/IPv4)」をダブルクリックで開き・・・

「全般」タブから「詳細設定」を開いた先にある「IP設定」タブで「自動メトリック」のチェックを外し、インターフェイスメトリックの値を手入力します
ここで、VDSL回線側のインターフェイスのメトリック値が40だったので、39以下にすればWiMAX回線が優先、41以上にすればVDSL回線側が優先されるはずです。

ここではとりあえず大きい値として1000を入力して保存します。

保存できたら再度確認君+を見てみましょう。
無事に経路が切り替わったことが確認できると思います。

route print でも設定したメトリック値になっていることが確認できました(1000で設定したのに1001になってる理由はよくわかりませんが、何かWindows OS側での忖度があるのでしょう)。

接続経路を元に戻す

WiMAX経路に戻したい場合は同じようにWiMAXルーター側のネットワークアダプタのインターフェイスメトリック値を今度は1のようなVDSL回線側より小さい値にしてやります。
設定にやや時間がかかることもありますが、問題なく元に戻せるはずです。

というわけで、無事RDP接続が切断されない状態でノートPCに触らず経路切り換えを実現することができました!

メトリック値の決定方法
社内レビューに回していたところ、u-ichiからIPv4 ルートの自動メトリック機能の説明というドキュメントを教えてもらいました。
何も設定しないとWiFi側のVDSL回線よりもUSB接続のWiMAX回線に繋がったのは、WiMAXルーターデバイスが有線LAN相当で計算されたからのようですね。
インターネットへの接続速度を勝手に計測して判断してくれるようなものではないので、もし2回線繋いでる人は遅い方のインターフェースを使ってるかもしれませんので、このあたり知っておくと良いかもしれません。

うまくできないよーという人向けの確認どころ集

WiMAXルーターの機種や自宅内ネットワークの設定にも依存するため個別の完璧なトラブルシューティングは難しいのですが、僕が設定するにあたって注意した点を挙げておきます。

ノートPCのIPv6はOFFにしておく

ノートPCのWiFi、WiMAXルーターのインターフェース設定両方ともIPv6を無効化しておきます。

これは一般的にIPv6とIPv4接続両方の経路がある場合には、メトリック値に関わらずIPv6を優先する可能性が高いためで、その他にもデフォルトルート設定のあるインターフェースがある場合、接続がうまくいかない原因になっている可能性があると思います。

OSやアプリケーションの再起動をする

原因は不明なのですが、ごくまれに設定変更しても反映されない状況に陥るケースがあり、その際はWindowsの再起動を行うことで解決しました。
また、メトリック値の設定変更後、アプリケーション側のプロセスを再起動しないと通信が更新した経路に向かないこともありました。うまく行かない場合はまずはアプリケーション再起動、それでも駄目ならWindows再起動を試してみると良いかもしれません。

まとめ

椅子から一歩も動きたくないでござる!!!という引きこもり根性を実現するための「楽をするための努力」をまとめました。
そこまでしょっちゅう欲しいような設定作業でもないですが、VPN回線などを利用しているケースでも同様の設定が使えるかと思いますので、興味のある人はやってみてもらえればと思います。

The post Windowsで複数インターネット回線を切り換えながら使う方法 first appeared on TechRacho.

Windowsでネットワーク速度を制限する方法

$
0
0

はじめに

久しぶりに記事を書きます。yosuke2です。

早速ですが「Windowsでネットワーク速度を制限したい」と思うことはありませんか。
普通はなかなかないと思います。
しかし開発や保守をしているソフトウェアなどで通信に時間がかかる場合に問題が発生している可能性があり、問題を切り分けるために一時的に通信を遅くしたいということが稀にあります。
私はありました。

ということでやり方を見ていきましょう。

※本記事は2021/11/09時点での情報です。

やり方

今回紹介するやり方はWindowsがあればいいです。
新しくソフトウェアを入れたりする必要はありません。
Windowsに始めから備わっている設定を操作するだけでできてしまいます。

2004年の記事に若干文言は違うものの同じような設定項目を操作しているものがあったので相当前からあるようです。

参考: Windowsのネットワークインターフェースの通信モードを変更する ―デュプレックスモード(全二重/半二重モード)を手動で切り替える―:Tech TIPS - @IT

軽く調べた感じではWindows Homeだと設定項目が無くてWindows Proだとある、ということは無さげに見えました。
ちなみに私の手元で設定項目が確認できているのはWindows 10 Proです。

以下に手順を記載します。

※手元のWindowsがWindows10のためWindows10を前提に記載しますが、それ以外のバージョンの場合は適宜読み替えてください。上記の通り2004年からある設定で恐らくそう簡単に消えるような設定ではないと思われるので探せばあるのではないかと思います。

手順

  1. Windowsキーを押す
  2. 表示されたスタートメニューから設定アイコンをクリック
  3. 「ネットワークとインターネット」を選択

  4. 左側のメニューから「イーサネット」を選択

  5. 右側にある「アダプターのオプションを変更する」を選択

  6. 今インターネットに接続しているネットワークデバイスを右クリックし、「プロパティ」を選択

  7. 「構成(C)…」を選択

  8. 「詳細設定」タブを選択

  9. 「プロパティ(P):」の箇所をスクロールし、「速度とデュプレックス」を選択(英語の場合は「Speed & Duplex」)

  10. 右側に表示されている「値(V):」の箇所にあるドロップダウンリストを選択

  11. 好きな速度を選択する

以上です。

遅くした後にやりたいことをやったら「オートネゴシエーション」に戻すのを忘れないようにしましょう。
忘れてしまうと思い出すまでずっと「何だか遅いなぁ」と思いながらPCを使うことになってしまいます。

1.0Gbps以外は10Mbpsと100Mbps、そしてそれぞれの全二重通信と半二重通信と選択できる速度の種類が少ないのが欠点ですが、特にソフトウェアを入れたりせずに速度を制限できるのはメリットだと思います。

※最近は10MbpsがLinkしないハブなどもあるそうなので、設定を変更して上手く動作しなかったりする場合は使用している機器をチェックするといいかもしれません。

全二重通信と半二重通信とは

私も今回このネットワーク速度制限を行うに当たって初めて知った知識のため理解が浅く、間違いや正確ではない記述があるかもしれませんのでご容赦ください。

調べたところによると通信方式の違いであり、通信経路を2つ用意するか1つ用意するかという違いのようです。

全二重通信が経路を2つ用意しており、送信と受信を同時にできます。
半二重通信は経路が1つで済みますが、その代わり送信と受信を同時にできません。
これらのことから恐らく同じ10Mbpsでも半二重通信の方が遅い場合が多いのかもしれません。

その他候補に上がった選択肢

ヤマハルータ

私がWindowsでネットワーク速度を制限したいと思った時にGoogle検索をしてまず出てきたのはヤマハルータによるルータを使った制限方法でした。
ルータを購入しないといけないので正直ハードルが高く、見送りました。

ヤマハルータによる帯域制御↓

NetLimiter

次に出てきたのが「NetLimiter」というソフトウェアです。

公式サイト↓

基本的には有償ソフトウェアとなっており、試用期間が30日設けられていてその間なら無料で使えるそうです。
無料で使えるとはいえ制限期間付きなので今回は見送りました。

QoSポリシー

次に出てきたのがWindowsの標準機能である「QoSポリシー」というものを利用するやり方です。
ただし、制限できるのは送信のみです。上りだけで下りは制限できないそうです。
今回私がやりたかったのは下りの制限なのでこれも見送りました。

QoSポリシーに関するMicrosoftのドキュメント↓

TMeter

次に出てきたのが「TMeter」というソフトウェアです。

公式サイト↓

こちらの個人サイトで紹介されているのを発見して知りました。

無料だし上り下り共に制限できるし試用期間もないしでかなり理想的でした。
問題は上記個人サイトにも書かれている通りセキュリティへの懸念でした。

個人サイトにはロシア製故にセキュリティに注意と書かれており、ロシア製にそういった怪しい類のものが多いのかは私は詳しくないので知らないのですが、少なくともこの「TMeter」というソフトウェアの名前をGoogle検索した結果そこまで知名度が無さそうな微妙な検索結果だったため信頼性が十分とは思えず見送りました。

さいごに

「Windowsでネットワーク速度を制限したい」と思ってGoogle検索した時になかなか理想的な方法が見つからず、何かあるんじゃないかとネットワーク周りのプロパティを漁っていたら今回記載した方法を偶然見つけました。

制限できる速度の種類は少ないですしアプリ毎とかの制限ではないし同じように「Windowsでネットワーク速度を制限したい」と思っている人にとって理想的と言えるのかは分からないですが、私の場合はシンプルに「遅くしたい」というニーズだったため理想的でした。

検索してもなかなか見つからなかったという事実から需要は少ないのかもしれませんが、同じような人が今後素早く本記事に記載したやり方に辿り着けるようにと願います。

関連記事

Windowsで複数インターネット回線を切り換えながら使う方法

The post Windowsでネットワーク速度を制限する方法 first appeared on TechRacho.

Windows 10/11でWSL環境を移行する方法

$
0
0

morimorihogeです。ようやく寒くなってきましたね。

直近諸々の事情で2,3回ほどWindows10/11作業環境を再構築する機会があり、WSL環境の移行も行いましたのでその辺りの手順について忘れないうちにまとめておきます。
開発環境をWSL環境内に集約しておけばとても簡単に移行できるので、参考になれば。

なお、基本的な手順は以下の公式ドキュメントにも記載されています。WSL2環境を前提に書いていますが、基本的な手順はWSL1でも踏襲できると思われます。細部が異なるとは思いますがその点はご了承下さい。

wsl --exportでtarイメージを出力する

管理者モードでコマンドプロンプトやPowerShellを開き、

wsl --export #{WSL環境名} #{出力先ファイル名}

でtarファイルが出力されます。
※この際当該WSL環境が起動していると強制終了しますので、作業中の方は気をつけてください

この際、当該WSL環境内の全てのデータが出力されますので、出力先のストレージ容量には余裕を持っておく必要があります。
WSLイメージのサイズを事前に調べるには、概算で良ければWSL内でduコマンドを使う方法もありますし、より正確に知りたいなら当該WSL環境のVirtual Hard Diskイメージサイズを見るという方法もあります。

Microsoft Store等からインストールしたディストリビューションをそのまま使っているのであれば、%LOCALAPPDATA%\Packages(通常はC:\Users\%USER%\AppData\Local\Packages)のどこかに当該ディストリビューションのディレクトリがありますので、検索等で調べて見つけます。
その上で、その中のLocalStateディレクトリ内にある拡張子.vhdxのファイルがディストリビューションイメージになります。
※弊社babaに指摘をもらいましたが、VHDXファイルが作られるのはWSL2の仕様で、WSL1の場合はroofsディレクトリがあってその中にファイルが展開されているようです

参考までに、僕の環境ではUbuntu 20.04がC:\Users\%USER%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState、DebianがC:\Users\%USER%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalStateでした。

なお、後述するインポート時にこのディレクトリは指定することができますので、より自分にとって分かりやすい場所を指定することもできます。僕の場合はC:\wslを作ってそこにインポートして使っています。

なお、VHDXファイルに比較するとエクスポートtarファイルは若干ファイルサイズの差があるようですので、とても大きなイメージを出力したり、ストレージがカツカツの環境では注意する方がよいでしょう。
僕の環境で試した限りでは、VHDXファイルよりtarファイルの方が若干小さいサイズになりました。
※恐らくVHDXはHDDイメージなので、既に削除したファイルのブロックなども保持し続けているのではないかと思います。大きなファイルを作ったり消したりを繰り返している場合、より大きな差が出る可能性があるでしょう

wsl --importでイメージをインポートする

エクスポートが完了したら、tarファイルを移行先マシンに持っていってインポートします。

wsl --import #{インポートするディストリビューション名} #{インポート先のWindowsディレクトリ} #{インポートするtarファイルのパス}

ここで第二引数のインポート先のWindowsディレクトリを指定することになります。前述したとおり、Microsoft Storeからインストールするとやたら深いユーザーディレクトリに保存されますが、自分一人で使うPCであればC:\wslなどを作って管理する方が後々扱いやすいかもしれません。

インポートが完了すれば普通にwsl -d #{ディストリビューション名}でシェルを起動できます。

あとはお使いのターミナルクライアントのWSL起動設定を復元してやれば移行完了ですね。お疲れさまでした 👍

ディストリビューション起動時にユーザー名を聞かれる場合

Microsoft Store等からインストールして使っていただけの環境だと、これまでの手順でインポートしたWSL環境を起動した際にユーザー名を聞かれたりすることがあります。
恐らく移行元の方ではWSLコマンドの起動オプション辺りで指定されているのだと思いますので、移行先でもwsl起動時のオプションで-u #{ユーザー名}を指定するか、それも面倒ならディストリビューション内のwsl.confに以下を記述します。

# /etc/wsl.conf
[user]
default=USERNAME

これでユーザー名指定せずにディストリビューションを起動した際、USERNAMEのユーザーで自動ログインするようになります。

SSH鍵とかAWS configが移行されてないっぽいんだけど・・・

これはLinux環境側の設定に寄ります。主に僕がハマったケースではLinux環境からWindowsファイルシステムに向けたシンボリックリンクのリンク切れでした。
WindowsでもLinuxでも使うファイルを以下のようにシンボリックリンクを貼っている場合、移行先環境のWindows側のユーザーディレクトリパスが変わったりするとリンク切れが発生します。

lrwxrwxrwx  1 morimori morimori    23 Apr  3  2021 .aws -> /mnt/c/Users/USERNAME/.aws

僕の場合、.ssh.awsを上記のような感じでWindows環境とシェアしていたため、これらは個別にWindows側でファイルをコピーして移行することで解決しました。
WSL環境をある程度使い込んでくるとやりがちな点なので、もしハマった場合はご確認下さい。

まとめ

そんなわけで、WSL環境の移行方法をまとめてみました。
色々書きましたが、何ごともなければwsl --export / --importで終わりますのでとてもお手軽です。開発プロジェクトのソースコード等もWSL側に入れてあれば、そのまますぐに開発を再開することもできてとても優秀。
流石にWindows側のソフトウェアインストールは別途行う必要がありますが、最近はwinget
なんかもあるので、一般的なソフトウェアのインストールは楽にできるのではないでしょうか。

僕の場合はなんだかんだで1日もあればほぼ普段の開発をするのに問題ない環境が整いました。良い時代になりましたね。
世の中は物流や設備機器なんかが品薄で厳しいようなので、PCを新調するならコロナ特需が落ち着いた今のうちかもしれません。

それでは、皆様良い開発ライフを。

The post Windows 10/11でWSL環境を移行する方法 first appeared on TechRacho.

Viewing all 51 articles
Browse latest View live