No Programming, No Life

プログラミング関連の話題や雑記

PowerShellについて誤解していたこと

f:id:fumokmm:20191115084638p:plain

PowerShell使ってますか?当記事ではPowerShellについて誤解していたことを書きたいと思います。

目次

PowerShellとの再会

最近、お仕事でWindows系サーバーの移行などやることになったのですが、その際に今までよりもWindowsと仲良くしないといけなくなりました。そんな中で再会したのがPowerShellです。

PowerShellコマンドプロンプトの後継として結構昔からあって、存在は勿論知っていたんですが、Windowsは長らくbatファイルしか扱えないし、大したこともできないんだわ、は~Bashが使いたいなぁ~と、それこそ食わず嫌いのように過ごしてきました。しかし、今回のお仕事で軽くPowerShellスクリプトを組むことになりそうで、PowerShellに遅ればせながら入門する形となったわけです。

PowerShellの何が良いか

一言で言うなら、バッチ(bat)で出来ないあれやこれやが簡単にできることです。例えば、Windows PCしかない環境でファイルのハッシュ値を知りたいな♪ となった場合、どうしますか?お好みのスクリプト言語をインストールしますか?場合によってはインストール禁止の現場もありますよね。そんな時、PowerShellなら簡単に実現できるんです(以下)

PS C:\temp> Get-FileHash .\test.txt

Algorithm Hash Path
--------- ---- ----
SHA256 43940E53EB7D524938CE68BE5446BB68BBB87095125878D33979A83637DC261A C:\temp\test.txt


PS C:\temp> Get-FileHash -Algorithm MD5 .\test.txt

Algorithm Hash Path
--------- ---- ----
MD5 7AD3ADF4EB7E0E46BE649DB2752F3CF0 C:\temp\test.txt

PowerShellスクリプト

PowerShellスクリプトとして保存しておいて(拡張子は.ps1)使うとさらに便利です。なぜなら、変数が使えたり、if-elseやswitch、foreachなどの構文も使えたりするからです。また、PowerShell ISEという専用のIDEも標準でWindowsに付属しており、これを使ってスクリプトコードの編集、コーディング中はコード補完もあるし、スクリプトの実行やデバッグ実行なども出来たりするのです。結構すごいなと思います。

なぜバッチファイルは不便なままなのか

Windows10になってもバッチ(bat)の言語仕様は強化されないしずっと昔のまま使いづらいなぁ…と思っていましたが、PowerShellはその間もずっとバージョンアップが続けられてきていたようでした。つまりバッチはもうシェルとしては打ち止めで、これからのシェルとしてはPowerShellに全力を注ぎますよと、そんなマイクロソフトの意気込みが感じられます。

PowerShellが初見さんに敬遠される理由

私も含めですが、あまりWindowsユーザに広く浸透しているとは思えないPowerShell、そんなPowerShellが初見さんに敬遠される理由の一つに、コマンドが長くて打つのが面倒!新しく覚えるのが面倒!というのがあると思います。

たとえばディレクトリを変更するコマンド(いわゆるcd)は・・・

PS C:\> Set-Location "C:\temp"
PS C:\temp>                  

ただし、ここらへんはトレードオフな気がします。古きを捨て新しいものを作るには勇気や思い切りがいるものです。そういった意味でPowerShellの取った方針は英断だったと私は思います。短い変数名や関数名が好まれて使われるC言語から、意味が明確になるなら長いクラス名やメソッド名を歓迎するオブジェクト指向の世界へシフトしたような感覚です。 ちなみに、PowerShellにはalias機能があって、良く使う慣習的なコマンドはデフォルトでaliasが割り当てられています。たとえばcdとかdirとかlsとか。ただしこれもやり過ぎには注意が必要なのではないでしょうか。何でもLinuxコマンドに倣うのではなくて、alias機能は過去の慣習への互換性のために使うのがよいと思います。上記のSet-Locationなどはそれこそcdで良いかなと。

おわりに

まぁそんなわけで、バッチ(bat)ファイルの黒魔術に絡めとられて現場でお困りの皆さんがおられましたら、ちょっと手を止めて、黒いウインドウを閉じて、少し群青色がかったウインドウを開いてみるのはいかがでしょうか。

参考

PowerShell - Wikipedia

PowerShell/PowerShellでファイルのハッシュ値を確認する方法・Get-FileHash - Windowsと暮らす

ロマサガ3 リマスター版にGradleが使われていた

2019年11月11日にオリジナル版から実に24年の時を経て、ロマンシング サガ3のリマスター版が発売されました。今回は8つのプラットフォームで発売されました。私はiOS版を早速購入しました。

f:id:fumokmm:20191113213353p:image

さて、タイトルを眺めていたら、右上に「ライセンス」とあったので、何気なくタップ。すると「ライセンス」のテキストが出てきて、

f:id:fumokmm:20191113202324p:image

なんとGradleが入ってる!

なんというか、当時スーファミ版が開発されていた時には勿論使われていなかった技術でしょうし、というか存在すらしていなかった技術でしょうが、それが今改めて開発するときには使われるというのは、何か感慨深いものがあります。

それから、自分が普段から使っているのと同じビルドシステムを使ってこういった巨大なゲームプログラムも開発されるんだなぁという点にがとても興味深い。万物はクォークから出来ている、ってのと同じようなインパクトが私にはありました。(ロマサガ3もGradleでビルドされている)

世界は広いようで狭いですね。

 

VBAのマクロで外部コマンドを呼び出すサンプル

はじめに

諸事情があり、Excelのマクロから外部コマンドを呼び出す必要がありました。その際書いたスクリプトのメモです。

動作環境

Win10 × Excel2016でしか動作確認しています。

サンプルコード

Dim wsh As Object
Dim exec As Object
Dim command As String
Dim result As String

Set wsh = CreateObject("WScript.Shell")
command = "〜〜〜"
Set exec = wsh.exec("%ComSpec% /c " & command)

Dim line As String
' ★★★ポイント1★★★
Do While exec.Status = 0
    If Not exec.StdOut.AtEndOfStream Then
        line = exec.StdOut.ReadLine ' 標準出力の1行読み込み
        ' 〜〜〜(処理)〜〜〜
        Do Events
    End If
Loop

' ★★★ポイント2★★★
Do Until exec.StdOut.AtEndOfStream
    line = exec.StdOut.ReadLine ' 標準出力の1行読み込み
    ' 〜〜〜(処理)〜〜〜
    Do Events
Loop

Set exec = Nothing
Set wsh = Nothing

ポイント1

exec.Status0 になるまで待ち合わせを行っています。wsh#exec した後はコマンド実行が終わるまで時間がかかるかもしれないためです。ちなみにこの位置で標準出力のストリームを読み込んで置かないと、データ量が多いとふんずまるみたいです。

ポイント2

ここは、残りの標準出力のストリームを最後まで読み込んでいる部分です。

同じ処理を2箇所で書かていてカッコ悪いので、実用的なコードを書くときはちゃんと関数化などしましょう。

おわり。

参考サイト

https://m.srad.jp/~IR.0-4/journal/572274

Rubyのチュートリアルっぽい記事の一覧

Rubyチュートリアルっぽい記事の一覧はこちら

Ruby1 - プログラミング言語Rubyの概要 - No Programming, No Life

Ruby2 - Rubyの基礎文法 - No Programming, No Life

Ruby3 - Rubyの基礎文法 - 条件分岐 - No Programming, No Life

Ruby4 - Rubyの真偽値 - No Programming, No Life

Ruby4 - Rubyの真偽値

Rubyで「真」を表すのは何ですか?

以外のすべての値です。ちなみに true です。

じゃあ、Rubyで「偽」を表すのは何ですか?

falsenil です。 Rubyではこの2つ以外はすべて なので、0 (整数のゼロ) や、'' (空文字) も となります。気をつけて下さい。

関連記事

Rubyのチュートリアルっぽい記事の一覧 - No Programming, No Life

Rubyが令和に対応したみたいです

Ruby v2.6.3でdateライブラリが令和に対応したみたいです。

$ irb
irb(main):001:0> require 'date'
=> true
irb(main):002:0> Date.new(2019, 5, 1).jisx0301
=> "R01.05.01"
irb(main):003:0> Date.new(2019, 4, 30).jisx0301
=> "H31.04.30"
irb(main):004:0> exit
$

おしまい。

参考

Ruby 2.6.3 リリース

Python1 - PythonでHello World

当記事はPythonの文法 | Think Twiceにマージしました。


Q1.この記事は何ですか?

Pythonのハローワールドです。動作確認はv3.7.3にて行っています。

Q2. PythonでのHelloWorldのコード例を教えて下さい

hello1.py

print("Hello, World")
print("Hello, ")
print("World")

print関数で文字列を出力。

出力結果

$ python hello1.py 
Hello, World
Hello, 
World

Q3. あれ?2つめのHelloWorldは改行されてしまっていますね?

はい、普通に呼び出すと、改行コード付きで出力されます。 改行コードなしにするには、end="" を付けます。

hello2.py

print("Hello, ", end="") # end="" とすると改行しないみたい
print("World")

出力結果

$ python hello2.py 
Hello, World

Q4. # はもしかして行コメントですか?

はい、#以降が行コメントになります。

# これはコメント
print('Hello') # これもコメント

ちなみに、複数行コメントもあります。複数行コメントは以下のようにクォーテーションを3つで囲んだ形になります。

'''
この行はコメント
この行はコメント
'''

あとで詳しく出てきますが、Pythonはインデントでブロックを表現する言語なので、複数行コメントの場合は、インデントに注意して下さい。(同じブロックにいないとエラーになります)

hello3.py

for x in {1, 2, 3}:
  print("text")
  '''
  forのブロック内でのコメントは
  同じインデントを付けて書く必要がある
  '''
  print(x)

'''
この行もコメント(forのブロックの外)
この行もコメント(forのブロックの外)
'''

出力結果

$ python hello3.py 
text
1
text
2
text
3

参考

python3で改行なしprintをする。 - てきとーなブログ

Pythonでのコメントアウトの書き方 | UX MILK