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

或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。おバカなことが大好きです。

Windows-PowerShellのインタラクティブシェルについて

PowerShell

みるくたんに、良いプログラミング言語の条件を聞かれた。いくつか思いつくものがあって、教えてあげた。そのうち一つが意味不明だったらしい。

容易な実行環境であること

言いたかったのは、インタラクティブシェルを備えてるということ。

例えば、phpなんかだと、htmlにしかソースコードを書くことが出来なくて、実行結果を見るのは容易ではない。

インタラクティブシェルとは以下のようなもの。参考になればいいな。

PS>Write-Output $hoge #未定義の変数を使うよ

PS>$hoge = 1 #変数に1を代入するよ

PS>Write-Output $hoge #変数の値を出力するよ
1

PS>$hoge += 1 #変数に1加算するよ

PS>Write-Output $hoge #変数の値を出力するよ
2

PS>

ほぉら、実行しながら計算結果をすぐに得られるでしょ?これって重要。実行するまでに、いろいろとお手続きがある言語も多い。実行する頃にはなんでそんなコードを書いたかすら覚えていないこともある。一番最初の職場で、携帯電話の組込開発をやっていたんだけど、デバッグをするのにprint文を入れるわけ。ソースコードをちょこっといじって、コンパイルして、実機に焼いてというのに、1時間とか2時間かかるわけ。そして、ログを入れ間違っていたりして、またソースコードの修正からやり直しみたいな。どんなクソゲーだよ?

その点、インタラクティブシェルはいいねぇ。すぐにレスポンスが得られて快適。動かしながら学べる。これ、重要です。

みるくたん、わかったかな?!

いい加減MS-DOS使うのやめてWindowsPowerShell使おうよ-指定範囲の乱数を生成する

PowerShell

はじめに

乱数を使いたいことがよくある。

DOSでもPowerShellでも乱数を生成することが出来るのだが書き方が雲泥の差。
DOSのサンプルコードは
コマンドプロンプト/乱数を発生させる・任意の範囲の乱数を発生させる - Windowsと暮らすから拝借しました。

1-10までの乱数を発生させる

MS-DOSのサンプルコード

c:\Users\sakura>set /a R=%RANDOM%*11/32768
0
c:\Users\sakura>set /a R=%RANDOM%*11/32768
9
c:\Users\sakura>set /a R=%RANDOM%*11/32768
5
c:\Users\sakura>set /a R=%RANDOM%*11/32768
9
c:\Users\sakura>set /a R=%RANDOM%*11/32768
1

WindowsPowerShellのサンプルコード

PS>Get-Random 10
1

PS>Get-Random 10
1

PS>Get-Random 10
5

PS>Get-Random 10
3

PS>Get-Random 10
8

DOSで乱数生成のロジックなんて書いてられん!

いい加減MS-DOS使うのやめてWindowsPowerShell使おうよ-Forを使って指定回数ループ

PowerShell

指定回数分ループさせる処理はよく使う。

試しに1から10までループさせて値をそのまま出力させてみよう。

DOSだとこういう書き方になる。

@echo off
for /L %%i in (1,1,10) do (
	echo %%i
)

慣れればこれでもいいんだけど、書きづらい。

しかも、コマンドプロンプトからワンライナーで書けないようだ。

$for /L %%i in (1,1,10) do (echo %%i)
%%i の使い方が誤っています。

何か間違ってます?間違っているのか、そういう書き方は出来ない仕様なのかがわからない。

PowerShellだとこういう書き方になる。ついでに実行結果も付けておきます。

PS>ForEach ($number in 1..10 ) { $number }
1
2
3
4
5
6
7
8
9
10

Forループはよく使うので、書きやすく、使いやすくないとダメだよねというお話。

いい加減MS-DOS使うのやめてWindowsPowerShell使おうよ-pingが通った端末にだけ処理をする

PowerShell

Pingが返ってきた端末にだけ処理を行いたい。

PowerShellのコマンドレットで便利だなと思ったのが、Test-Connection。DOSだとPingに相当するのかな?コマンドって、接続出来ない端末をしていして実行したりするとエラーが出るものが少なくない。なので、ping通ったらという条件を付けて実行したいときはよくある。だが、DOSだとそのロジックを実装するのがものすごい面倒。

PowerShellのTest-Connectionは痒いところに手が届く機能だ。

こんな風にして使える。

テストコード

if(Test-Connection localhost -Quiet)
{
    Write-Output "Hello!"
}
else
{
    Write-Output "Good bye!"
}

実行結果

PS>C:\Users\oneshot\Documents\WindowsPowerShellテスト\test-rt.ps1
Hello!

めっちゃくちゃ便利じゃないですか?pingで帰ってきた文字列をシコシコ解析する必要もない。なんせ、Test-ConnectionにQuietオプションを付加すると、boolean値で返却してくれるんで。

PS>Test-Connection localhost -Quiet
True

PS>Test-Connection nothing -Quiet
False

ほぉらね。これはハマりますわ。

いい加減MS-DOS使うのやめてWindowsPowerShell使おうよ-Sleep

PowerShell

Sleepってよく使いますよね。

MS-DOSでSleepまがいのことをやる方法はいくつかあるが、面倒。以下のエントリが詳しかった。
Windowsのコマンドプロンプトでsleepする3つの方法 -- ぺけみさお

PowerShellではSleepは標準機能としてある。

秒Sleepのサンプルコード

"[Start]" + (Get-Date -Format "yyyy:MM:dd hh:mm:ss.fff")
Start-Sleep -Seconds 5
"[ End ]" + (Get-Date -Format "yyyy:MM:dd hh:mm:ss.fff")

実行結果

[Start]2016:07:22 07:24:24.524
[ End ]2016:07:22 07:24:29.524

ミリ秒Sleepのサンプルコード

"[Start]" + (Get-Date -Format "yyyy:MM:dd hh:mm:ss.fff")
Start-Sleep -Milliseconds 500
"[ End ]" + (Get-Date -Format "yyyy:MM:dd hh:mm:ss.fff")

実行結果

[Start]2016:07:22 07:25:25.118
[ End ]2016:07:22 07:25:25.618

まとめ

秒Sleep、ミリ秒Sleepが容易に書けて実行出来て精度も高いのは素晴らしい。
PowerShellっていいね!

部下の育て方について

マネジメント

toianna.hatenablog.com

マネジメントの本は役に立たないと思う。いまいち、言っている意味が理解出来ない。このエントリは、非常に参考になった。

自分自身、優れた上司に当たったことはないが、自力で仕事を覚えてきた自負はある。自分が上司の立場になったとき、自分の経験から、指導が無くても部下は育つと思うようになってしまった。正しい知識さえ提示すれば、いずれは覚えてくれると勘違いしていたかもしれない。その結果、伸びる奴は伸びるし、伸びない奴は伸びないというムラが多くなった。マネジメントって難しいね。

Windows10にアップデートした後のPCの動きがくそ重い。

PowerShell

PowerShellでプロセスの状態を見てみる。

PS>ps | Select-Object -first 10 | Sort-Object CPU -Descending

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName                                                                                                                                   
-------  ------    -----      ----- -----   ------     --  -- -----------                                                                                                                                   
   1538      63    97512     117240   426    21.59   6180   2 chrome                                                                                                                                        
    306      19   102700     128064   432    13.95   7332   2 chrome                                                                                                                                        
    326      13    26392      34476   224    11.84   3724   2 chrome                                                                                                                                        
    258      18   103440     128520   372    10.30   7820   2 chrome                                                                                                                                        
    216      10    23236      24076   185     0.34   3328   2 chrome                                                                                                                                        
    169       6     8320      11100   100     0.20   6092   0 audiodg                                                                                                                                       
    145       4     1044       5280    66     0.02   7664   2 chrome                                                                                                                                        
    196      11     2564       9784   110            2540   0 AppleMobileDeviceService                                                                                                                      
    103       4      880       4640    52            2556   0 armsvc                                                                                                                                        
    344       8      884       4588   104             416   0 csrss                                                                                                                                         

Google Chromeってこんなにいっぱいプロセス立ち上げるもんなの???

もちろん~ですけど、で話を始める人にイラッと来る。

日記

もちろんと言うからには、知ってて当然というニュアンスが含まれるのだろう。それにも関わらず、相手が何か確認をしてこようとしているってことは、知らないと思われているからではなかろうか。

ここで考えられるのは2つ。

  1. 本当に知っている場合⇒おそらく、釘を刺したんでしょうね。
  2. 本当は知らない場合⇒知ったかぶりしたんでしょうね。

個人的には後者のほうが多いんだけどね。

イラッと来る口癖ってありますよね?