PowerShellについて誤解していたこと
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/PowerShellでファイルのハッシュ値を確認する方法・Get-FileHash - Windowsと暮らす
ロマサガ3 リマスター版にGradleが使われていた
2019年11月11日にオリジナル版から実に24年の時を経て、ロマンシング サガ3のリマスター版が発売されました。今回は8つのプラットフォームで発売されました。私はiOS版を早速購入しました。
さて、タイトルを眺めていたら、右上に「ライセンス」とあったので、何気なくタップ。すると「ライセンス」のテキストが出てきて、
なんと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.Status
が 0
になるまで待ち合わせを行っています。wsh#exec
した後はコマンド実行が終わるまで時間がかかるかもしれないためです。ちなみにこの位置で標準出力のストリームを読み込んで置かないと、データ量が多いとふんずまるみたいです。
ポイント2
ここは、残りの標準出力のストリームを最後まで読み込んでいる部分です。
同じ処理を2箇所で書かていてカッコ悪いので、実用的なコードを書くときはちゃんと関数化などしましょう。
おわり。
参考サイト
Ruby4 - Rubyの真偽値
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 $
おしまい。
参考
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