【完全に備忘録】scコマンドでwinrmサービスの状況を調べる

winrmサービスが開始されているのかや起動設定がどうなっているのかを確認したいことがときどきあるが、すぐ忘れてしまうのでメモ。
learn.microsoft.com

普段、powershellを使用しているが,powershellではscはset-contentのエイリアスなのでうまく動作しないということをネットで知り、cmdを打ってから作業。

PS >cmd
Microsoft Windows [Version 10.0.19044.2006]
(c) Microsoft Corporation. All rights reserved.

D:\tmp>sc query  winrm

SERVICE_NAME: winrm
        TYPE               : 30  WIN32
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

D:\tmp>sc qc winrm
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: winrm
        TYPE               : 20  WIN32_SHARE_PROCESS
        START_TYPE         : 2   AUTO_START  (DELAYED)
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\WINDOWS\System32\svchost.exe -k NetworkService -p
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Windows Remote Management (WS-Management)
        DEPENDENCIES       : RPCSS
                           : HTTP
        SERVICE_START_NAME : NT AUTHORITY\NetworkService

D:\tmp>exit
PS >stop-transcript
>||

netコマンドを使うと以下のような感じか。
>|ps1|
PS >net start | sls ws-management

   Windows Remote Management (WS-Management)

scコマンドとnetコマンドの違いについては以下を参照方。
(私には理解するための知識が欠けていますが・・・)
ryoichi0102.hatenablog.com

IISとは「World Wide Web 発行サービス」であるようだが、netコマンドとpowershellのwebsiteコマンドレットとではちょっと挙動が違ってた、クソどうでもいいことだが。

Microsoft Internet Information Services

net startで表示されるサービス名の中でIISのサービス名なのか見当がつかなかったので、
World Wide Web 発行サービス」を起動、停止を試してみた。
いつもはIISマネージャーかpowershellのget-website, start-website, stop-websiteコマンドレットを使っているが、
停止しているときはstateは通常'Stopped'となるが、netコマンドで停止させるとstateが空白となった。

PS >net stop 'World Wide Web 発行サービス'
World Wide Web 発行サービス サービスを停止中です.
World Wide Web 発行サービス サービスは正常に停止されました。

PS >get-website 'default web site'

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1               %SystemDrive%\inetpub\wwwroot  http *:80:
                                                                https *:443: sslFlags=0


PS >net start 'World Wide Web 発行サービス'
World Wide Web 発行サービス サービスを開始します.
World Wide Web 発行サービス サービスは正常に開始されました。

PS >get-website 'default web site'

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Started    %SystemDrive%\inetpub\wwwroot  http *:80:
                                                                https *:443: sslFlags=0


PS >stop-website 'default web site'
PS >get-website 'default web site'

Name             ID   State      Physical Path                  Bindings
----             --   -----      -------------                  --------
Default Web Site 1    Stopped    %SystemDrive%\inetpub\wwwroot  http *:80:
                                                                https *:443: sslFlags=0

まあ、「クソどうでもいい」ことだが。

Let's try Qiita API v2 via curl of powershell

powershellcurlでQiita APIを使ってみました。
何かしら参考になればと思い投稿します。
(Qiita側からすると規約違反になるのだろうか?markdown記法の知識がないのでQiitaには内容不明な投稿になってしまいました。)

PS >$url = 'https://qiita.com/api/v2/items?page=1&per_page=10'
PS >$r = curl -URI $url
PS >$r | get-member

   TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

Name              MemberType Definition
----              ---------- ----------
Dispose           Method     void Dispose(), void IDisposable.Dispose()
Equals            Method     bool Equals(System.Object obj)
GetHashCode       Method     int GetHashCode()
GetType           Method     type GetType()
ToString          Method     string ToString()
AllElements       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;}
BaseResponse      Property   System.Net.WebResponse BaseResponse {get;set;}
Content           Property   string Content {get;}
Forms             Property   Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;}
Headers           Property   System.Collections.Generic.Dictionary[string,string] Headers {get;}
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent        Property   string RawContent {get;set;}
RawContentLength  Property   long RawContentLength {get;}
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}
Scripts           Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}
StatusCode        Property   int StatusCode {get;}
StatusDescription Property   string StatusDescription {get;}

PS >$r
StatusCode        : 200
StatusDescription : OK
Content           : [{"rendered_body":"\u003cp data-sourcepos=\"1:1-5:19\"\u003e始めての投稿\u003cbr\u003e\n「良い記事を書くには」道のりが長そうだ。markdown
                    って何?\u003cbr\u003e\nPS \u0026gt;$url = '\u003ca href=\"https://qiita.com/api/v2/items?page...
RawContent        : HTTP/1.1 200 OK
                    Transfer-Encoding: chunked
                    Connection: keep-alive
                    X-Frame-Options: SAMEORIGIN
                    X-XSS-Protection: 1; mode=block
                    X-Content-Type-Options: nosniff
                    X-Download-Options: noopen
                    X-Permit...
Forms             : {}
Headers           : {[Transfer-Encoding, chunked], [Connection, keep-alive], [X-Frame-Options, SAMEORIGIN], [X-XSS-Protection, 1; mode=block]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 3008491

PS >$c = ($r.content | convertfrom-json )
PS >$i = 0
PS >foreach ( $a in $c ){ Write-Host "[${i}]"  ${a}.title; $i ++ }
[0] Let's try Qiita api v2 via curl of powershell
...

仕様に関しては以下のリンクを参照方。
APIを活用しようとするにせよ学習のコストが求められるのは仕方ないのだろうか?
qiita.com
タイトルを表示するスクリプトだと以下のようなものになるのだろうか。

$url = 'https://qiita.com/api/v2/items?page=1&per_page=10'
$r = curl -URI $url
$c = ($r.content | convertfrom-json )
$i = 0
foreach ( $a in $c ){
    Write-Host "[${i}]"  ${a}.title
    $i ++
}

近年話題のAIを活用する以前にAPIを活用できない自分にもどかしい。
要するにITを活用できないだけなのだが・・・でもITを活用するなんて結構難しいでぇ。
しかし活用するにしても何がしたいのだろうか?(独語)

PowerShellにcurlがあることを知らなかった

powershellにもcurlがあることを知り試してみた。
curlInvoke-WebRequestのAliasで以下のページを参考にした。
といってもURIオプションしか参考にしていないが・・・
docs.microsoft.com
以下のようなJSONデータを返す自前で用意したPHPのページへリクエストを出してみた。

[
{
"id":1,
"code":"001",
"title":"一流の言いかえ−「ふつうの人」を「品のいい人」に変える−",
"publisher":"光文社",
"year":"2022"
},
{
"id":2,
"code":"001",
"title":"老いの品格−品よく、賢く、おもしろく−(PHP新書 1310)",
"publisher":"PHP研究所",
"year":"2022"
},
{
"id":3,
"code":"001",
"title":"「させていただく」の使い方−日本語と敬語のゆくえ−(角川新書 K−381)",
"publisher":"KADOKAWA",
"year":"2022"
}
]
powershellcurlでリクエストしたときのtranscript
PS >get-command curl

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           curl -> Invoke-WebRequest


PS >$r = curl -URI http://localhost/php/sqlite3json_newbook.php

PS >$r.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    HtmlWebResponseObject                    Microsoft.PowerShell.Commands.WebResponseObject


PS >$r | get-member


   TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject

Name              MemberType Definition
----              ---------- ----------
Dispose           Method     void Dispose(), void IDisposable.Dispose()
Equals            Method     bool Equals(System.Object obj)
GetHashCode       Method     int GetHashCode()
GetType           Method     type GetType()
ToString          Method     string ToString()
AllElements       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;}
BaseResponse      Property   System.Net.WebResponse BaseResponse {get;set;}
Content           Property   string Content {get;}
Forms             Property   Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;}
Headers           Property   System.Collections.Generic.Dictionary[string,string] Headers {get;}
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent        Property   string RawContent {get;set;}
RawContentLength  Property   long RawContentLength {get;}
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}
Scripts           Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}
StatusCode        Property   int StatusCode {get;}
StatusDescription Property   string StatusDescription {get;}


PS >$r


StatusCode        : 200
StatusDescription : OK
Content           : [{"id":1,"code":"001","title":"一流の言いかえ−「ふつうの人」を「品のいい人」に変える−","publisher":"光文社","year":"2022"},{"id":2,"code":"001","title"
                    :"老いの品格−品よく、賢く、おもしろく−(PHP新書 1310)","publisher":"PHP研究所","year":"2022"},{"id":3...
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 522
                    Content-Type: application/json; charset=utf-8
                    Date: Mon, 12 Sep 2022 06:18:51 GMT
                    Server: Microsoft-IIS/10.0
                    X-Powered-By: PHP/8.0.11

                    [{"id":1,"code":"001",...
Forms             : {}
Headers           : {[Content-Length, 522], [Content-Type, application/json; charset=utf-8], [Date, Mon, 12 Sep 2022 06:18:51 GMT], [Server, Microsoft-IIS/10.0]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 522



PS >$c = ( $r.content | convertfrom-json )

PS >$c


id        : 1
code      : 001
title     : 一流の言いかえ−「ふつうの人」を「品のいい人」に変える−
publisher : 光文社
year      : 2022

id        : 2
code      : 001
title     : 老いの品格−品よく、賢く、おもしろく−(PHP新書 1310)
publisher : PHP研究所
year      : 2022

id        : 3
code      : 001
title     : 「させていただく」の使い方−日本語と敬語のゆくえ−(角川新書 K−381)
publisher : KADOKAWA
year      : 2022



PS >$psversiontable

Name                           Value
----                           -----
PSVersion                      5.1.19041.1682
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1682
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS >stop-transcript
PHPのページのコード
<?php
header("Content-Type: application/json; charset=utf-8");
$file = 'db/newbook.sqlite';
$db = new SQLite3($file);
$sql = "SELECT * FROM book order by id limit 3";
$result = $db->query($sql);

while($res = $result->fetchArray(SQLITE3_ASSOC)){
    $h[] = array('id'=>$res['id'],'code'=>$res['code'],'title'=>$res['title'],'publisher'=>$res['publisher'],'year'=>$res['year']);
}
$db = null;
$js =json_encode($h, JSON_UNESCAPED_UNICODE);
print_r($js);

『安いニッポン「価格」が示す停滞』中藤玲 (c)2021

港区の年平均所得1200万円はサンフランシスコでは「低所得」

港区の年平均所得1200万円はサンフランシスコでは「低所得」に分類されるらしい?
「低所得」に分類されたことも驚きだが港区の年平均所得1200万円ということの方が私にとっては驚きであった。
「じゃー、港区に引っ越ししようか!」と引っ越したところで所得が上がることはないのでやめておこう。
まあ、サンフランシスコも別世界だが港区も縁のない世界なので、そのような世界のことは気にしないでおこう!

賃金の停滞

「日本の賃金はこの30年間全く成長していない」(矢代尚宏)、日本だけが低賃金なのはなぜなのだろう?

ということが挙げられていた。

労働生産性ということに関して野村證券金融経済研究所の許斐潤(このみじゅん)所長がドイツに赴任したときの印象が面白い。実際にドイツに行ってみたところ、「ドイツ人は全然働かないように見えた」という。これではとても「生産性大国」とは思えないが、モノが日本より高いので金額ベースではドイツの方が生産性が高いということになるみたいだ。

許斐所長は「ヨーロッパで5倍の時間をかけて作った車も10倍の価格で売れば、金額の生産性は2倍になる。それこそがドイツの生産性の高さだった」と分析する。

物価が高いから生産性が高く賃金が高いのね?うーん、鶏と卵みたいな話で訳が分からなくなってしまう。
ただ、これは許斐氏がドイツに赴任した30年前の印象や分析である。今でも本質的には正しい指摘ではあると思うが「途上国化」しつつある国の視点から見てみよう。
高級車の組み立て工場における生産性は日本が約17時間でヨーロッパは37時間から111時間というので「組み立て」の工程では日本の方が生産性が高いと言えよう。
ただ、車は走る半導体と言われるほどなので擦り合わせ技術中心の生産からモジュール型生産へ移行してからは、電気自動車ではなおさら半導体やソフトウェアの生産性がカギを握るようになってきたので「組み立て」以外の工程での生産性に注意する必要があるのではないだろうか。
なので本当はテスラなどをベンチマークの対象にした方が分かりやすいのかもしれないが、本書では触れられていなかった。が、さすがにこの領域に踏み込む分析を期待するのは虫が良すぎる。

外国の高度人材の獲得でも苦戦

賃金の停滞する日本では企業も外国の高度人材の獲得でも苦戦しているようだ。

ある日本の著名スタートアップ幹部は、IIT(インド工科大学)人材を渇望する。
以前同社のインターンに参加したIIT出身者が、自社アプリの使い勝手を良くするプログラミングで抜群の実績を残したのだ。
「こんなにも違うものかと驚いた」
だが彼は年収1700万円を出したアマゾンに入社してしまった。

インド人技術者を大量採用できた企業も、単純な作業しか任せなかったため退職が相次ぐことになるなど定着させるのに問題を抱えているようだ。
メンバーシップ型雇用は外国人には異様に映るというから、ジョブ型に転換しないと定着は難しいのだろう。
ただ、形だけジョブ型にしても不透明な評価基準が残るとグローバルな転職市場では通用しないとの忠告もあるくらいだから、道のりはかなり険しそうだ。

『途上国化する日本』もそうだったが、本書を読み終えると暗い思いになってしまう。
まあ、個人としては置かれた状況の中で努力するしかないのかな。

www.itmedia.co.jp

buttonとsubmitは異なるタイプであることを知らなかったことを反省するメモ

Ajaxを試すために以下のようなコードを動かしてみた。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Learning Ajax</title>
</head>
<body>
<form>
  <label for="name">Name : </label>
  <input id="name" type="text" name="name" size=15 value="john doe"/>
  <input id="btn" type="submit" name="submit" value="send" />
</form>
<div id="result"></div>
<script src="hello_ajax_get.js" ></script>
</body>
</html>

このHTMLから以下のようなページが表示される。

Ajax Before

JavaScriptは以下の通り。
PHPのページからの応答結果をid="result"に流し込むことを意図している。

hello_ajax_get.js
document.addEventListener('DOMContentLoaded',function(){
    document.getElementById('btn').addEventListener('click',function(){
        var result = document.getElementById('result');
        var xhr = new XMLHttpRequest();
        
        xhr.addEventListener('loadstart',function(){
            result.textContent='Now Communicating ...';
        },false);
        xhr.addEventListener('load',function(){
            result.textContent=xhr.responseText;
        },false);
        xhr.addEventListener('error',function(){
            result.textContent='server error';
        },false);

        xhr.open('GET','hello_ajax_get.php?name=' + encodeURIComponent(document.getElementById('name').value),true);
        xhr.send(null);
    },false);
},false);

PHPのページは入力されたnameに'Hello ! Good luck'を付加して返すだけだが、何かを実行している感じを出すためにsleepを入れている。

hello_ajax_get.php
<?php
    header('Access-Control-Allow-Origin:*');
    sleep(3);
    print('Hello '.$_REQUEST['name'].'! Good luck !');

これらのコードではうまく動作しなかったが、なかなか原因がわからなかった。
javascriptに原因があると勝手に思い込み、泥沼に陥ってしまったが、結局、inputのtypeをsubmitからbuttonにすると意図したとおりに動作してくれた。

Ajax Executing
Ajax After

submitとbuttonの違いを意識したことがなかったが、submitは押された瞬間に送信するがbuttonは押されたときの処理を自分で記述しなければならないとのこと。今回のような場合は自分で処理を記述したいので、submitは不可となるのだろう。
なぜ、「どうせ同じようなものだろう!」と思い込んでしまったのか?分からない。

『賃労働の系譜学』今野晴貴~社会のヘゲモニーの変容

すき家でのワンオペ中での死亡事故の記憶がまだ新しいときに、すかいらーくグループのプレスリリースに「ハラスメントに関する報道について」というのを目にした。
(プレスリリース一覧 2022年07月22日)
https://corp.skylark.co.jp/Portals/0/images/news/press_release/2022/220722_%E3%83%8F%E3%83%A9%E3%82%B9%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%A0%B1%E9%81%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/20220722.pdf?_gl=1*beuicx*_ga*MTE5ODAwMDIxMS4xNjEyNzU1MTgy*_ga_0S46H09XTP*MTY2MDAyNzg4MS40Mi4wLjE2NjAwMjc4ODEuNjA.*_fplc*JTJCTkFYVmdsUTNRTGhkMjdhZk9ITVdiZmozMmglMkY0JTJGTmhka1JpVTFmeUVZamhlV0VTMzRFcEsyaDR5OXd3YnBaVmJiNlhyRGx4YWNKUm02RTRRaHphYmZKbTA1VXFDYVY0ZzIlMkJ4UzloYWdNNHRVNlRFZnBpbW91STdFJTJGczQ5QSUzRCUzRA..
「ハラスメント」とは、何があったのだろうと思い、ネットを検索したら雇用・労働政策研究者の今野晴貴氏の記事が見つかった。

「ジョナサン」店内で暴力事件 肋骨骨折も「勉強になったな」「また折られてえのか?」(今野晴貴) - 個人 - Yahoo!ニュース

『賃労働の系譜学』今野晴貴 ~社会のヘゲモニーの変容

「賃労働」と「系譜学」

本書の題名の「賃労働」はカール・マルクスから、「系譜学」はミッシェル・フーコーからの用語・概念だという。
公式の学問体系では労働の従属が蔓延し社会が破壊されつつある今日の日本社会の行き詰まりを説明することができないでいる。
だからこそ、系譜学の方法で既知の知識体系に収まらない問題提起が求められているという。
辣腕の社会活動家でありながら本書では学者肌な面を見せてくれる。

物象の人格化

「私たちはどう自分の労働力を売るのかばかりを考えて生きている。・・・その中で自身の価値観や欲望さえ変質していく事態は、「物象の人格化」と呼ばれる。」
物象(モノ、貨幣・商品)の関係が人間の関係を規制してしまう転倒した関係が成立している。
ミッシェル・フーコーの「系譜学」やら「物象の人格化」やら難解な用語が出てくるが、以下の説明でなんとなく分かるような気がした。

私はよく、労働問題に関する講演などで「経営者はなぜこんな酷いことができるのですか?」と問われることがある。その理由こそが物象の人格化である。
経営者や上司も、物象化した関係性の中で、自らのふるまいを選択せざるを得ないからだ。過労死を引き起こすような業務命令も、それが経営上妥当であれば選択せざるを得ない。
同業他社に長時間労働が蔓延していれば、ますますこの選択は議論の余地のないものとして受け止められていく。
こうしたことは、過酷労働の直接の加害者となった上司が、後に会社に標的にされ労働相談に訪れた場合に実感することができる。
加害者側に回った管理職たちも、最初は無理なノルマや命令を出すことに疑問を覚えていたが、やがてそれが「当たり前」だと感じるようになっていったと証言する。
そして、自らが標的になってようやくその問題に気づくのである。(p39)

産業空洞化により製造業から労働集約型のサービス産業に大きくシフトし、労働生産性の増大が見込めないため、利潤を獲得しようとすれば、労働者の低賃金・長時間労働が前提になる。
経営戦略であるとともに、ブラック企業問題は資本主義社会における構造的な問題であるという。
中には、まともな経営者もいるだろうが、業界にブラック企業があれば自然と淘汰圧がかかり、そのような経営者はやがて消えていくだろう。
企業として生き残りを図るのであればブラックなことに手を出さざるを得ない。
そんなグレシャムの法則が支配する状況なのだろうか?

パワハラ、ましてや暴行を伴う行為は決して許されるべきではないが、ただ非難するだけでなく「物象の人格化」という視点から現実を解釈、理解しようとする試みは参考になる。
日本社会に強烈な賃労働規範が存在し、全人格を企業による評価にさらし、自らの考え方や生活態度を会社にとって好ましいものへと自発的に適合させていく。
肋骨を骨折してもなお勤務を続ける心理はそんな状況の表れなのかもしれない。

若干の感想

本書は私にとって難解であった。だが、その難解さが漠として言葉に表現できないでいる。
新自由主義的なメンタリティーを持っているので賛同できない面もあって当然だが、理解できないというのはまた別だ。
労働組合運動が論じられている内容を理解できない。
所詮は他人事という本音が障害になっているところもあるだろう。
しかし、この難しさはいったい何なのだろう?
「おまえにはもっと学習が必要なんだよ!」「もっと勉強してから読め!」