読者です 読者をやめる 読者になる 読者になる

素敵なおひげですね

PowerShellを中心に気分で書いているブログです。

Grav CMSを試してみる

PHP Grav

正直作業記録です。
あまり役に立つことは無いかもしれません。

はじめに

個人的にちょっとしたサイトを作りたくなり*1Markdownを扱えるフラットファイルCMSを探してみたところ、Grav CMSが良さそうだったので試してみることにしました。

getgrav.org

CMSには特段詳しくないでですが、今回Gravを選定した理由としては、

  • Markdownを扱える(必須)
  • フラットファイル型である(必須)
  • コードのシンタックスハイライトができるプラグインがある(必須)
  • 公開されているテーマのデザインが良い
    • 特にLearn2テーマが作りたいサイトにぴったりだったので

あたりになります。

今回はとりあえずローカル環境(Windows 10)で動かすところまでやってみます。

Grav CMSを試してみる

1. PHPのインストール

GravPHP製ですので、まずはPHPをインストールします。

現在のバージョン(Ver.1.1.17)ではPHP 5.5.9以上が必要です。
いまのところバージョンの縛りもありませんので、私は最新のPHP 7.1.2を使うことにします。

公式サイトからPHP 7.1.2をダウンロードし、適当なディレクトリに展開します。

今回はC:\PHP\7.1.2\に展開しました。
あとはこのディレクトリにPATHを通せばOKです。
私はPHPを常用しないので必要な時だけPATHを通すことにしました。 

# PHPのインストール
Invoke-WebRequest -Uri "http://windows.php.net/downloads/releases/php-7.1.2-Win32-VC14-x64.zip" -OutFile ".\php-7.1.2-Win32-VC14-x64.zip"
Expand-Archive ".\php-7.1.2-Win32-VC14-x64.zip" -DestinationPath "C:\PHP\7.1.2\"

# PHPは常用しないので利用時だけPATHを通すことにする
$env:PATH += ";C:\PHP\7.1.2\"

また、環境によってはVC14 Runtimeのインストールが必要になりますので、必要があればインストールしてください。

2. php.iniの設定

Gravでは以下の拡張機能を使用するため、php.iniの設定が必要です。

  • gd
  • mbstring
  • curl
  • openssl

今回はとりあえずphp.ini-developmentをコピーし、以下の箇所を修正しました。

; php.ini

; extension_dirのコメントを解除
extension_dir = "ext"
; 以下の拡張のコメントを解除し有効化
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_openssl.dll

3. Gravのインストールと起動

GravのインストールはZipをダウンロードして展開するだけです。
コア機能のGRAV COREと管理者用UIのついたGRAV CORE + ADMIN PLUGINの二種類選べますが、今回はGRAV COREにします。

# 別に手動で解凍しても構いませんが折角なので...
Invoke-WebRequest -Uri "https://getgrav.org/download/core/grav/1.1.17"-OutFile ".\grav-v1.1.17.zip"
Expand-Archive ".\grav-v1.1.17.zip" -DestinationPath ".\grav-v1.1.17"

今回はPHPビルトインウェブサーバーを使ってGravを起動します。
先ほどのZipを展開したフォルダに移動し

php -S localhost:[ポート番号] system/router.php

を実行すればOKです。

実行例)

cd ".\grav-v1.1.17\grav\"
php -S localhost:8000 system/router.php

実行結果はこんな感じ。

f:id:stknohg:20170219222423p:plain

この状態でhttp://localhost:8000/にアクセスすると以下の様になります。

f:id:stknohg:20170219222504p:plain

ちなみに設定にエラーがあると以下の様になり、エラーを教えてくれます。
(これはgd拡張を有効にするのを忘れていた際に出たエラーです)

f:id:stknohg:20170219222611p:plain

これでGravのインストールは完了です。

あとは\user\配下の各設定を修正すれば自分の好きなサイトを作ることが出来ます。
コンテンツを修正するだけなら\user\pages\配下のmarkdownを修正するだけでOKです。

4. プラグインのインストール

Gravではプラグインを追加することで必要な機能を追加することができます。

getgrav.org

私の作りたいサイトではコードのシンタックスハイライトが必須なので、この機能を提供してくれるPrism Highlighterプラグインをインストールします。

Gravをインストールしたフォルダの\bin\フォルダに管理用のCLIコマンドが用意されており、このコマンドを使うことでプラグインをインストールすることができます。

プラグインをインストールするコマンドの書式は以下となります。

bin/gpm install pluginname

今回はWindows環境なのでShebangが使えないのため都度phpコマンドから呼び出す必要があり、Prism Highlighterをインストールするには以下の様にします。

php .\bin\gpm install prism-highlight

ここまで書いておいてアレなのですが、Prism Highlighterはこのコマンドからのインストールに対応していないそうで、実際にこのコマンドを使うと処理自体は完了するのですが、作成されるフォルダ名が不正になってしまします。
このため、以下の様にフォルダをリネームする必要があります。

# プラグインのフォルダ名がおかしいので直す
mv .\user\plugins\prism-highlight\ .\user\plugins\prism

Prism Highlightergit cloneでインストールするのが正しいやり方だそうです。

# git cloneでPrism Highlighterをインストール
cd .\user\plugins\
git clone https://github.com/alvr/grav-prism-highlight.git prism

Prism Highlighterの細かい設定については割愛しますが、インストールした結果は以下の様になり良い感じにコードのハイライトが有効になっています。

f:id:stknohg:20170219224858j:plain

5. テーマをインストールする

最後にテーマをインストールします。
プラグイン同様テーマもコマンドからインストールします。

getgrav.org

Learn2テーマをインストールするには以下の様にします。
また、

php .\bin\gpm install learn2

テーマをインストールした後はsystem.yaml(\user\config\system.yamlのほう)を修正することでテーマを変更します。

pages->themeの設定をデフォルトのantimatterからlearn2に変えればOKです。

# system.yaml
pages:
  theme: learn2

これでテーマの変更は完了です。

learn2テーマは他のテーマとドキュメントの構造が異なるため、デフォルト設定であるdefault.mdファイルのままだと表示エラーになりますのでドキュメントの名称をchapter.mddocs.mdにして適宜対応してください。

こちらも細かい設定については割愛しますが適用した結果は以下の様になります。

f:id:stknohg:20170219225408j:plain

最後に

とりあえずこんな感じです。

今回はローカルの環境でとりあえず動かすところだけやりましたが、Gravの設定や運用環境への展開については公式ブログのチュートリアルを参考にするのが良さそうです。

getgrav.org

ちなみにAzureへの展開についてはしばやん先生のブログがとてもわかりやすく参考になります。

blog.shibayan.jp

*1:つくるサイトについては具体的な形になったらお知らせしたいですね…

PowerShellのSort-ObjectコマンドレットでIPアドレスのソートを行う

PowerShell シェル芸

小ネタです。

orebibou.com

こちらの記事を見てPowerShellでもやってみました。

サンプルデータ

元記事と同じデータ(test.txt)を使います。

192.168.0.102
192.168.0.8
192.168.0.97
192.168.0.68
192.168.0.99
192.168.0.66
192.168.0.24

普通のソート結果はこんな感じです。
単純な文字列のソートになるので元記事同様に欲しい形にはなりません。

f:id:stknohg:20170215220431p:plain

version-sort

こちらは、私は最初思いつかなかったのですが、牟田口先生があっさり書いてくれました。流石です。

cat .\test.txt | sort {[Version]$_}

結果はこちら。

f:id:stknohg:20170215220506p:plain

解説

PowerShellsort(Sort-Object)では-Propertyパラメーターでソートに使うプロパティを指定することができ、そのプロパティにスクリプトブロックによる式を指定することができます。

sort {[Version]$_}

の部分をより正確に書くと、

Sort-Object -Property { [Version]$_ }

となり、入力値の文字列$_(192.168.0.102など)をSystem.Versionクラスにキャストした結果でソートできる様になります。
これは、.NET Frameworkのバージョン指定が、[Major].[Minor].[Revision].[Build]とIPアドレスと同じ書式なため利用できる方法です。

各オクテットごとにソート

こちらは私が最初に思いついた方法です。
元記事同様に各オクテット順でソートします。

cat .\test.txt | sort (0..3|%{[ScriptBlock]::Create("[int]$`_.Split('.')[$_]")})

結果はこちら。

f:id:stknohg:20170215222853p:plain

解説

上記の

(0..3|%{[ScriptBlock]::Create("[int]$`_.Split('.')[$_]")})

の部分を展開すると、

{[int]$_.Split('.')[0]}, {[int]$_.Split('.')[1]}, {[int]$_.Split('.')[2]}, {[int]$_.Split('.')[3]}

となり、最終的なコマンドは

Sort-Object -Property ({[int]$_.Split('.')[0]}, {[int]$_.Split('.')[1]}, {[int]$_.Split('.')[2]}, {[int]$_.Split('.')[3]})

となります。
-Propertyでは入力値の文字列$_(192.168.0.102など)を.でスプリットした結果(各オクテット)を順にソート対象にしています。

2017/02/17追記 別解

元のデータが文字列なので、桁数が揃っていれば期待したソートをさせることが可能です。
なので別解として、

cat .\test.txt | sort { -join $_.Split('.').PadLeft(3)}

も可能です。

f:id:stknohg:20170217125211p:plain

この方法では入力文字列を、

192168  0102
192168  0  8
192168  0 97
192168  0 68
192168  0 99
192168  0 66
192168  0 24

の様に変換して桁数を揃えています。

最後に

とりあえずこんな感じです。
PowerShellのソートはかなり自由度が高く、何でもありな感じがしますね。

LinuxへのPowerShellのインストールが簡単になりました

PowerShell Linux Mac

先日PowerShell Blogで発表された内容について実際に試してみました。

blogs.msdn.microsoft.com

packages.microsoft.comリポジトリ

Ubuntu(apt)およびCentOS(yum)向けにMicrosoft独自のリポジトリhttps://packages.microsoft.comが提供され、このリポジトリからPowerShellをインストールおよびアップデートできる様になりました。

独自リポジトリなので最初はリポジトリの登録が必要になります。

1. Ubuntu 14.04でのインストール手順

はじめにapt-key addコマンドでリポジトリの公開鍵を追加し、/etc/apt/sources.list.d/ディレクトリに独自リポジトリの設定を追加します。
PowerShell Blogではその後apt-get updateしてたので本エントリでも記載しておきます。*1

# Bash
# リポジトリの公開鍵(GPGキー)の追加
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
# Microsoft Ubuntu repositoryの登録
curl https://packages.microsoft.com/config/ubuntu/14.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
# Update apt-get
sudo apt-get update

リポジトリを追加したらapt-get installPowerShellをインストールできます。

# Bash
sudo apt-get install -y powershell

ちなみにBash on Ubuntu on Windowsでもこの手順でインストール可能です。

2. Ubuntu 16.04でのインストール手順

リポジトリのURLが14.04と異なるだけで、ほかの手順は同一です。

# Bash
# リポジトリの公開鍵(GPGキー)の追加
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
# Microsoft Ubuntu repositoryの登録
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
# Update apt-get
sudo apt-get update

リポジトリを追加したらapt-get installPowerShellをインストールできます。

# Bash
sudo apt-get install -y powershell

3. CentOS 7でのインストール手順

CentOSの場合は/etc/yum.repos.d/ディレクトリに独自リポジトリの情報を追加するだけでOKです。*2

# Microsoft RedHat repositoryの登録
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo

あとはyum installPowerShellをインストールできます。

# Bash
sudo yum install -y powershell

リポジトリ情報

https://packages.microsoft.comの情報をざっと確認してみると以下の通りでした。
特別な設定はない普通のリポジトリの様です。

Ubuntu 14.04

$ cat /etc/apt/sources.list.d/microsoft.list

deb [arch=amd64] https://packages.microsoft.com/ubuntu/14.04/prod trusty main

Ubuntu 16.04

$ cat /etc/apt/sources.list.d/microsoft.list

deb [arch=amd64] https://packages.microsoft.com/ubuntu/16.04/prod xenial main

CentOS7

$ cat /etc/yum.repos.d/microsoft.repo

[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl=https://packages.microsoft.com/rhel/7/prod/
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc

【2017/02/08】ちょっと追記

https://packages.microsoft.comについて、自分の環境のChromeだとエラーが出てアクセスできなかったのですが、他のブラウザからだと普通にアクセスできますね…

リポジトリの中を見てみると、現時点で既にPowerShell以外にMicrosoft ODBC Driver for SQL Server on LinuxSQL Server tools on Linuxなどが登録されています。
また、UbuntuCentOS(RHEL)の他にSUSEリポジトリがあることも確認できます。

ちなみにCentOS上で取得可能なパッケージの一覧を抽出してみると以下の様になりました。

$ yum list | grep packages-microsoft-com-prod

msodbcsql.x86_64                           13.1.4.0-1                  packages-microsoft-com-prod
mssql-tools.x86_64                         14.0.3.0-1                  packages-microsoft-com-prod
powershell.x86_64                          6.0.0_alpha.15-1.el7.centos packages-microsoft-com-prod
unixODBC-utf16.x86_64                      2.3.1-1                     packages-microsoft-com-prod
unixODBC-utf16-devel.x86_64                2.3.1-1                     packages-microsoft-com-prod

PowerShell以外のソフトウェアについて

PowerShell Blogのコメント欄でも少し触れられていますが、このリポジトリPowerShell本体以外にOMIPowerShell OMI Provider のインストールも可能にしていく様です。

現時点ではPowerShell OMI Providerに以下のIssueが挙げられています。

github.com

今後他のソフトウェアでもIssueが追加され、リポジトリに随時登録されていくと思われます。

【おまけ】MacOSの場合

Macの場合、公式なリポジトリはありませんが、有志がHomebrew CaskPowerShellを登録してくれています。

github.com

Homebrewがインストールされていれば以下のコマンドでPowerShellをインストールすることができます。

# Bash
# Homebrew Caskからインストール
brew tap caskroom/cask
brew cask install powershell

*1:多分しなくても大丈夫なはず…

*2:PowerShell Blogの手順では一旦suしていましたがsudoで一気にやっても大丈夫です。