しばたテックブログ

気分で書いている技術ブログです。

PowerShell Core 6.1.0~6.2.0で日本語が正しく表示されない現象について

事の発端はteratailのこちらの質問から。

teratail.com

Windows 10以前の日本語Windows環境にPowerShell Core 6.1.0をインストールするとコンソールの日本語表示がおかしくなるという現象です。

f:id:stknohg:20181113191609j:plain

【2019.03.29追記】PowerShell Core 6.2への影響

本日PowerShell Core 6.2がリリースされましたが、本件の原因であるPSReadlineがVer.2.0.0-bata.3のまま更新されていないので本エントリーの現象が引き続き発生するはずです。

影響のある環境

きちんと確認できたのは質問にあるWindows 8.1環境だけですが、おそらく、

  • Windows 7
  • Windows Server 2008 R2 ~ Windows Server 2012 R2

でも同じ現象が発生するハズです。

原因

直接の原因はPowerShell Core 6.1.0に同梱されているPSReadlineです。

PowerShell Core 6.1.0から同梱されるPSReadlineのバージョンが1.2→2.0.0-bata.3に上がり、PSReadline 2.0.0-bata.1~2.0.0-bata.3においてはコンソールのコードページをUTF-8(65001)に強制するコードが入ってており、Windows 10以前の古いOSでは日本語の描画がおかしくなってしまいます。

f:id:stknohg:20181113192103j:plain

問題がPowerShell本体ではなくPSReadline側にあるので、Windows PowerShellにPSReadline 2.0.0をインストールしても同様の現象が発生してしまいます。

f:id:stknohg:20181113193107j:plain

(Windows PowerShellにPSReadline 2.0.0をインストールする手順は割愛)

対処方法

この問題に対する対処方法は2つあります。

1. PSReadline 1.2を使用する

PSReadline 2.0.0が問題なのでひとつ前のバージョンを利用する様にすれば現象を回避することができます。

次のコマンドでPSReadline 1.2を追加インストールしてからPowerShell Coreを再起動するとPSReadline 1.2を先にロードする様になりこの問題を回避できます。

# PSReadline 1.2を追加インストール後、コンソールを再起動
Install-Module PSReadLine -Scope CurrentUser -RequiredVersion 1.2 -Force -SkipPublisherCheck

f:id:stknohg:20181113193829j:plain

2. 最新ビルドのPSReadline 2.0.0を使用する

PSReadlineの最新ビルドではコードページの強制に対して以下の修正が入っています。

github.com

この修正自体は別件に対する対応と思われるのですが、コードページの変更を強制しなくなるため本件の対応としても有用です。

ただし、この修正が適用されたPSReadlineはまだリリースされていません。
(おそらくPSReadline 2.0.0-beta.4に含まれるでしょう...)
このため手っ取り早い方法としてはPSReadineの最新ビルドをインストールしてやるのが良いでしょう。

以下にざっくりとですが手順を記載しておきます。

  1. AppVeyor上の最新ビルドから最新のビルド(Zipファイル)をダウンロードします。
    f:id:stknohg:20181113200234j:plain

  2. Zipファイルを展開し、展開した内容を[マイドキュメント]\PowerShell\Modules\PSReadLine\2.0.0に保存します。
    f:id:stknohg:20181113200729j:plain
    (上図の構成になる様にしてください)

これで最新のPSReadlineがロードされ問題を回避することができます。

f:id:stknohg:20181113201010j:plain

Azure PowerShellのAzモジュールについて

ちょっと公開が遅れましたが札幌 Azure もくもく会 4で調べた内容になります。

sapporoazuremok2.connpass.com

はじめに

以前のエントリで軽く触れたAzure PowerShellのAzモジュールですが、公式にアナウンスが発表されました。

blog.shibata.tech

クロスプラットフォームなAzモジュール

公式のアナウンスはコチラになります。

azure.microsoft.com

また、GitHub上で最新のアナウンス(https://aka.ms/azps-announce)もされていますのでこちらもご覧ください。

Azモジュールの機能

公式に以下の内容が表明されています。

  • Azモジュールは従来のAzureRMとAzureRM.Netcoreモジュールを置き換えるものである
  • AzモジュールはWindows PowerShell 5.1およびPowerShell Coreで動作する
  • (AzureRMに代わり)AzモジュールがAzureの最新機能に追従する
  • AzモジュールはCloud Shellで提供される*1
  • コマンドレットの名称を短く標準化し、全てのコマンドレットは"Az"プリフィックスを使用する
  • モジュール名を短く標準化し、各サービス向けのモジュールに共通して"Az"を付ける
  • AzモジュールではAzureRMとの互換性を確保する機能を提供する(Enable/Disable-AzureRmAlias)

以前にお知らせした内容と大して変わっていませんが、Windows PowerShell/PowerShell Core両方で動作するクロスプラットフォームなモジュールに切り替わり、同時に名称の標準化を図ったことが分かります。

対象プラットフォーム

Azモジュールは以下のプラットフォームで利用可能です。

  • PowerShell 5.1 (Windows 7以降で.Net Framework 4.7.2以降がインストールされたOS)
  • PowerShell Core 6.0 ~ 6.1 (全プラットフォーム)

リリースタイムライン

本エントリ公開時点では以下のスケジュールが予定されています。

年月 内容
2018年08月 初期リリース(Ver.0.1.0)
2018年11月(予定) AzureRMと同等の機能を提供
2018年12月(予定) AzureRMの新機能追加を最後にする

ざっくり今年中にAzをAzureRMと同等にして来年からはAzに切り替えていく見込みの様です。

こまかい進捗状況についてはGitHubのマイルストーンを見るのが良いでしょう。

利用方法

ざっくりと利用方法について説明します。
名前付けが変わったとはいえ従来のAzureRMとAzureRM.Netcoreモジュールの後継であるため基本的な使い方はこれまで通り変わりません。

インストール

現状PowerShell Galleryからインストール可能です。

www.powershellgallery.com

# PowerShell Galleryからモジュールをインストール
Install-Module -Name Az -Scope CurrentUser

Azure Cloud Shellでは初期状態でインストール済みのため何もせずに利用可能です。

また、具体的に明言されませんでしたが、MSIインストーラーは現在のところ提供されていないので今後も提供されないものと予想されます。

コマンドレット名の切り替え

前項でコマンドレット名が短くなるとお伝えしましたが、従来のモジュールとの互換性を確保するためにエイリアスを使用することができます。

Enable-AzureRmAliasで従来のコマンドレット名をエイリアスとして利用可能になり、Disable-AzureRmAliasでエイリアスを削除することができます。
エイリアスを有効にするモジュールを制限したい場合は-Moduleパラメーターを、設定を永続化したい場合は-Scopeパラメーターを使用することも可能です。

例えば、

Enable-AzureRmAlias -Scope CurrentUser

とした場合はプロファイルに以下の記述が追加され全てのモジュールに対する設定変更が永続化されます。

# 以下の記述がプロファイルに追記される

#Begin Azure PowerShell alias import
Import-Module Az.Profile -ErrorAction SilentlyContinue -ErrorVariable importError
if ($importerror.Count -eq 0) { 
    Enable-AzureRmAlias -Module Az.Aks, Az.AnalysisServices, Az.ApiManagement, Az.ApplicationInsights, Az.Automation, Az.Backup, Az.Batch, Az.Billing, Az.Cdn, Az.CognitiveServices, Az.Compute, Az.Compute.ManagedService, Az.Consumption, Az.ContainerInstance, Az.ContainerRegistry, Az.DataFactories, Az.DataFactoryV2, Az.DataLakeAnalytics, Az.DataLakeStore, Az.DataMigration, Az.DeviceProvisioningServices, Az.DevSpaces, Az.Dns, Az.EventGrid, Az.EventHub, Az.FrontDoor, Az.HDInsight, Az.Insights, Az.IotHub, Az.KeyVault, Az.LogicApp, Az.MachineLearning, Az.MachineLearningCompute, Az.ManagedServiceIdentity, Az.ManagementPartner, Az.Maps, Az.MarketplaceOrdering, Az.Media, Az.Network, Az.NotificationHubs, Az.OperationalInsights, Az.PolicyInsights, Az.PowerBIEmbedded, Az.Profile, Az.RecoveryServices, Az.RedisCache, Az.Relay, Az.Reservations, Az.ResourceGraph, Az.Resources, Az.Scheduler, Az.Search, Az.Security, Az.ServiceBus, Az.ServiceFabric, Az.SignalR, Az.Sql, Az.Storage, Az.StorageSync, Az.StreamAnalytics, Az.Subscription, Az.Tags, Az.TrafficManager, Az.UsageAggregates, Az.Websites -ErrorAction SilentlyContinue; 
}
#End Azure PowerShell alias import

逆に

Disable-AzureRmAlias -Scope CurrentUser

とすればプロファイルからこの記述が削除されます。

その他の操作

その他の操作は従来のモジュールと基本的に同じです。
例えばサインインであればConnect-AzureRmAccountConnect-AzAccountに変わるだけです。

# サインイン : Connect-AzureRmAccount -> Connect-AzAccount に変更
Connect-AzAccount

*1:すでに提供済み

本ブログのカスタマイズメモ

以前から書こうと思いつつもなかなか手が動かなかったネタです。

本ブログのデザインははてなブログのテーマストアにあるテーマをベースに幾つかのカスタマイズを加えています。
自分が加えたカスタマイズの備忘録と参考にしたサイトの紹介を兼ねてこのエントリを残しておきます。

メインテーマ

f:id:stknohg:20181016193053p:plain

ブログのメインとなるテーマはCONTENTSを使用しています。

シンプルな2カラムでレスポンシブ対応していたのが採用した理由です。

このテーマをベースにしてアクセントカラーをWindows PowerShellで使われているNoble Blue(#012456)に変更しています。
また、タブレット(iPad)を横向きにしたときでも1カラムになる様にデザインが切り替わる横幅を変更しています。

コードブロック

f:id:stknohg:20181016193113p:plain

コードブロックの配色はQiitaを参考にしています。

純粋にこの配色が気に入ったのと、利用者の多いQiitaと近い色合いである方がユーザーフレンドリーかな?*1と思ったのが採用の理由です。
(余談ですがVisual Studio CodeにQiita theme for VSCodeを適用して普段使いするくらい気に入っています)

とはいえQiitaとはてなブログでは色指定可能な要素が異なるため、まったく同一というわけではなく、よく見ると結構違いがあります。

言語名の表示

susisu.hatenablog.com

上記ブログの内容を参考にしてコードブロックに言語名を出しています。
本ブログでは左上に出す様にしています。

「一年以上経過しています」のお知らせ

sprint-life.hatenablog.com

上記ブログの内容を参考にして1年以上前のエントリに警告が出る様にしています。

f:id:stknohg:20181016193129p:plain

タグクラウド

blog.shibayan.jp

しばやん先生のブログを参考にサイドバーのカテゴリをタグクラウドにしています。

f:id:stknohg:20181016193139p:plain

最後に

ざっとこんな感じです。
いずれブログのデザインを変えるかもしれませんが、いまのところはこんな感じでやっています。

正直HTML周りは全然ダメなのですが先人たちの知恵のおかげで気に入ったデザインを実現できており感謝の気持ちでいっぱいです。

*1:そうでもないか?