しばたテックブログ

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

Azure Cloud Shell(PowerShell)がLinuxコンテナになりました。

先週の話*1なのですが、以前、

blog.shibata.tech

でお伝えした様にWindows Serverコンテナで動作しているAzure Cloud Shell(PowerShell)がLinuxコンテナ上で動作する様になりました。

中の人のツイートがこちら。

PowerShell 6.0がデフォルトに

新しいAzure Cloud Shell(PowerShell)を起動すると下図の様になり、Linux(Ubuntu)上でPowerShell Core 6.0がデフォルトで起動する様になっています。

f:id:stknohg:20180709170144p:plain

ちなみに今回試すにあたりCloud Shellを作り直したのですが、最初の画面が

f:id:stknohg:20180709170156p:plain

の様に「PowerShell(Linux)」と変わっていました。

Azure Cloud Shell(Bash)との違い

Azure Cloud Shell(Bash)とAzure Cloud Shell(PowerShell)は同一OS上で動くことになったわけですが、おそらく、同一のコンテナイメージを使っています。

公式な情報は無くコンテナ内を調べてもズバリな情報を見つけることができなかったのですが、両コンテナで/var/log/dpkg.logが完全に一致しており、ここから間接的ではありますが同一イメージだと推測できます。
(さすがに別イメージならdpkg.logは一致しないでしょう...他にコンテナの同一性を調べる良い方法があれば教えて欲しいです...)

このためAzure Cloud Shell(Bash)とAzure Cloud Shell(PowerShell)の違いはログインシェルだけになります。

Azure Cloud Shell(PowerShell)のこれから?

Azure Cloud Shell(PowerShell)が今後どうなるかについては未だ公式なアナウンスはありません。

Azure Cloud Shell(Bash)でもPowerShell Coreは利用できますので、いまとなっては、Azure Cloud Shell(PowerShell)の存在意義は

「ログインシェルをPowerShellにしたい。」

位しか無い様に思えます。
PowerShellが大好きな私から見ても

「これいる?Bashでログインして pwsh って4文字打てば良いだけでは?」

というのが正直な気持ちです。

ここからは完全に私見ですが、現在Azureを管理するためのコマンドはAzure CLIAzure PowerShellの二系統あり、両者の使い分けのためにAzure Cloud Shell(Bash)とAzure Cloud Shell(PowerShell)は分かれたまま残り続けるのかなと思っています。

実際にどうなっていくかは今後の情報を追っていきたい感じです。

*1:ちょっとプライベートが忙しくブログを書き上げるのが遅くなってしまいました...

Microsoft MVPアワードを再受賞しました

TwitterやFacebookでは先に報告させて頂きましたが、本日Microsoft MVP(Cloud and Datacenter Management)を再受賞することができました。
今回で3回目の受賞となります。

去年の活動

去年はほぼPowerShell一本に絞ったアウトプットをしており、このブログを中心に以下の様な活動をしてました。

実生活に無理のない範囲でまあまあのアウトプットができたかなと思っています。
特にコード量としては僅かですがPowerShell本体に直接貢献できたのは自分でも良かったなぁと思っています。
ただ、コミュニティの運営スタッフとしてはあまり主体的な活動ができておらず周りの負担を高めてしまっていたと反省しています。

今年の予定

基本的にはこのペースで変わらず活動していきたいと思っています。

人前で話すのが苦手なのでこれまで登壇は控えめにしていたのですが、今年はもう少し頑張ってみても良いかな、と。
あとコミュニティの裏方としてもう少しちゃんと働きます...

技術領域としては引き続きPowerShell中心となるでしょうがもう少し他の技術もネタとして拾っていきたい気持ちがあります。
というのも、このブログがPowerShell中心になった理由として私自身がPowerShellを学ぶためというのがあったのですが、自分の中でのPowerShellに対する疑問も結構消化できてきており、今の気持ちとしては、次の2つの疑問点

  • PSObjectとは何か?
  • パイプライン文の挙動

に対して自分なりを答えを出すことができれば一区切りつけても良いかなと思っているためです。

どちらもPowerShellのコア中のコアな部分であり非常に難しい問題であるため簡単には答えは出ないでしょう。
ですのでただちにPowerShellの情報発信を止めるというわけではないのでご安心?ください。

具体的にPowerShell以外のどの技術を深掘りしていくかは決めていないのですが、本ブログの説明文にある様に気分でやっていこうと思います。

最後に

若干とりとめのない感じになってしまいましたが引き続き情報発信していきますのでよろしくお願いします。

はてなブログのエントリ一覧をPowerShellで取得する

小ネタです。

blog.shibata.tech

で少し触れたはてなブログのエントリ一覧を取得する方法を紹介します。

sitemap.xmlからエントリ一覧を取得する

はてなブログに限った話ではなく一般的な話として、SEO対策でクローラー向けにサイトのトップにsitemap.xmlを置いているサイトが多くあります。

はてなブログにもこのsitemap.xml*1が用意されており、以下のスクリプトでエントリの一覧を取得することができます。

$url = 'ブログのURL'
$res = Invoke-WebRequest -Uri ([IO.Path]::Combine($url, 'sitemap.xml'))
if ($res.StatusCode -ne 200) {
    return
}
# sitemapの場合
Write-Output ([xml]$res.Content).urlset.url.loc
# sitemap indexの場合
foreach ($loc in ([xml]$res.Content).sitemapindex.sitemap.loc) {
    $res2 = Invoke-WebRequest -Uri $loc
    if ($res2.StatusCode -ne 200) {
        continue
    }
    Write-Output ([xml]$res2.Content).urlset.url.loc
}

実行結果はこんな感じです。

f:id:stknohg:20180621231023p:plain

sitemap.xmlは単体でサイト内のリンクを記述している場合と、別のxmlファイルへのリンクを記述している場合があるので両者に対応しておく必要があります。
このスクリプトでは両方のケースの値を無理矢理取得しようとする単純な作りにしています。

はてなブログAtomPubを使ってエントリ一覧を取得する

はてなブログではAtom Publishing Protocol(AtomPub)によるAPIが提供されています。

このAPIを使うと、エントリの一覧や、タイトル、エントリ内容などにアクセスすることができます。
エントリの一覧を取得するには以下の様なスクリプトを実行すればOKです。

# 設定
# IDや認証情報ははてなブログの詳細設定から確認可能
$hatenaId = 'はてなID'
$blogId = 'ブログID'
$cred = Get-Credential -UserName $hatenaId

# エントリ取得(下書き含む)
$entries = & {
    function GetXmlContent ([string]$Uri, [PSCredential]$Credential) {
        $result = [PSCustomObject]@{
            Content = $null;
            NextUri = $null;
        }
        $ret = Invoke-WebRequest -Uri $Uri -Credential $Credential
        if ($ret.StatusCode -ne 200) {
            return $result
        }
        $xml = [xml]$ret.Content
        $result.Content = $xml.feed.entry
        $result.NextUri = $xml.feed.link | Where-Object rel -eq next | Select-Object -ExpandProperty href
        return $result
    }

    $result = GetXmlContent -Uri "https://blog.hatena.ne.jp/$hatenaId/$blogId/atom/entry" -Credential $cred
    Write-Output $result.Content
    while (-not [string]::IsNullOrEmpty($result.NextUri)) {
        $result = GetXmlContent -Uri $result.NextUri -Credential $cred
        Write-Output $result.Content
    }
}

# 適当に出力
$entries | ForEach-Object {
    [PSCustomObject]@{
        Title = $_.Title;
        Url = $_.link | Where-Object rel -eq alternate | Select-Object -ExpandProperty href;
        IsDraft = $_.control.draft -eq 'yes';
        #Content = $_.content.'#text';
    }
} | Format-List

実行結果はこんな感じです。

f:id:stknohg:20180621231406p:plain

このサンプルでは簡単のためにBasic認証を使用しています。
実際にスクリプトを利用する場合は自己の責任において認証方法を選択してください。

スクリプトの内容に特に目を見張るところはありませんが、ページネーションのために内部関数を用意したくらいが工夫したところでしょうか。

なお、出力形式はかなり適当なので適宜カスタマイズして利用するのがオススメです。

【補足】 Gist

当初、上記スクリプトはGistに上げていました。
補足としてリンクを記載しておきます。

*1:昔はsitemap_index.xmlだったらしい