Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

Difference of Invoke-Expression and '&' in PowerShell

# Command Result
1 Invoke-Expression 'Get-Process' OK
2 & 'Get-Process' OK
3 Invoke-Expression 'Get-Process explorer' OK
4 & 'Get-Process explorer' NG

#4 causes the following error:

& : 用語 'Get-Process explorer' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認
識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試
行してください。
発生場所 行:1 文字:3
+ & 'Get-Process explorer'
+   ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-Process explorer:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

新幹線の「〇〇新聞ニュース」

新幹線のドアの下に流れてる「〇〇新聞ニュース」が、同じ内容を2度流すのは、

  • (A) 一度目に流れていた内容を途中から読んだ人でも、そのまま見続けていれば読めなかった内容が読めるから。
  • (B) 文字の流れが速すぎて、一度では読めないから。

(A)とばかり思ってたんだけど、(B)と感じる人は思ってるより多いのかも。だったら単純に文字が流れる速度を変えるよねぇ、と思うんだけど、実は二度流すことで(A)と(B)の両方を解決してる可能性もあるな。

普段着と寝間着の出番

- (A) (B) (C)
かしこまった席で着る服 よそいき よそいき よそいき
学校などの日常的な場で着る服 普段着 普段着 普段着
外出しない日中に着る服 普段着 寝間着 部屋着
寝るときに着る服 寝間着 寝間着 寝間着

この「部屋着」という文化がいつ、どこから来たのか謎なんだよなぁ。

あと「よそいき」も謎。学校行事で「子供は汚れてもいい服装で来てください」と言われても、それは「動きやすい服装で来てください」と同じ意味で、汚れちゃいけない服を子供に着せるというのは意味不明だった。それに、私の小学校の卒業式(1994年)では、いわゆる「よそいき」を着ている人は少数派だった。現在の卒業式の風景は、やはりスタジオアリスの作り上げた文化なのか?

rsyncでページキャッシュを汚さない方法

rsyncは大量のファイルを走査するため、普通に実行するとページキャッシュに乗ったファイルが追い出されてしまう。 Linuxの場合、nocacheコマンド*1を利用することでページキャッシュを汚さずにrsyncを実行できる。リモートでもrsyncが実行されるので、以下のように実行する必要がある。

nocache rsync -aiv --rsync-patch='nocache rsync' some-host:/src/ /dest/

参考: https://stackoverflow.com/questions/10105203/how-can-i-limit-the-cache-used-by-copying-so-there-is-still-memory-available-for

ただし、nocacheコマンドはDebianUbuntuであればaptで取ってこれるが、CentOSRHELリポジトリにはないみたい*2。 そのため、RHELrsyncでページキャッシュを汚さないためには、nocacheをソースで取ってきてmake installするしかない模様。

なお、rsync本体に対してページキャッシュを汚さないためのオプション --drop-cache が提案されたことがあるが、Linux-specificすぎるとのことでWONTFIXになっている*3。それに伴い、RHELリポジトリでもWONTFIXになっている(RHELrsyncのみパッチが当たっているとかいうことはない)*4

康煕字典体から常用漢字へ変換するコマンドレット

変換対照の文字は、文化庁 常用漢字表*1康煕字典体が示されているものを対照とした。常用漢字表のPDFの内容をテキストファイルへダンプし、以下のスクリプト常用漢字とカッコ書きの康煕字典体とのペアを抽出した*2

> Get-Content .\常用漢字表.txt | Where-Object { $_ -match '(?<Oyaji>.?)   ((?<Itaiji>.?))   ' } | Foreach-Object { ("{0}{1}" -F $Matches.Oyaji, $Matches.Itaiji) }

上記の結果をもとに、trコマンド相当のコマンドレット*3を使って変換処理を実装した。

function tr {
  Param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
    [string] $TargetString,
    [Parameter(Mandatory=$true)]
    [string] $FromString,
    [Parameter(Mandatory=$true)]
    [string] $ToString
  )
  begin {
    # [-split ""] splits a surrogate pair into two invalid characters,
    # so the code below is not suitable for this purpose
    # $FromStringArray = $FromString -split "";
    # $FromStringArray = $FromStringArray[1..($FromStringArray.length-2)];

    # Split string into character array
    $FromStringArray = @();
    $FromStringBytes = [Text.Encoding]::UTF32.GetBytes($FromString);
    for ($i=0; $i -lt $FromStringBytes.length; $i+=4) {
         $FromStringArray += [Text.Encoding]::UTF32.GetString($FromStringBytes, $i, 4);
    }

    $ToStringArray = @();
    $ToStringBytes = [Text.Encoding]::UTF32.GetBytes($ToString);
    for ($i=0; $i -lt $ToStringBytes.length; $i+=4) {
         $ToStringArray += [Text.Encoding]::UTF32.GetString($ToStringBytes, $i, 4);
    }
  }
  process {
    for ($i=0; $i -lt $FromStringArray.Length -and $i -lt $ToStringArray.Length; $i++) {
        $TargetString = $TargetString.Replace($FromStringArray[$i],$ToStringArray[$i]);
    }
    $TargetString
  }
}

function ConvertFrom-Kokijitentai {
  Param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
    [string] $TargetString
  )
  begin {
    $FromString = "亞惡壓圍醫爲壹逸隱榮營衞驛謁圓鹽緣艷應歐毆櫻奧橫溫穩假價禍畫會悔海繪壞懷慨槪擴殼覺學嶽樂喝渴褐罐卷陷勸寬漢關歡觀氣祈既歸器僞戲犧舊據擧虛峽挾狹鄕響曉勤謹區驅勳薰徑莖惠揭溪經螢輕繼鷄藝擊缺硏縣儉劍險圈檢獻權顯驗嚴廣效恆黃鑛號國黑穀碎濟齋殺雜參棧蠶慘贊殘絲祉視齒兒辭濕實寫社者煮釋壽收臭從澁獸縱祝肅處暑署緖諸敍將祥稱涉燒證奬條狀乘淨剩疊繩壤孃讓釀觸囑神眞寢愼盡圖粹醉穗隨髓樞數瀨聲齊靜竊攝節專淺戰踐錢潛纖禪祖雙壯爭莊搜插巢曾瘦裝僧層總騷增憎藏贈臟卽屬續墮對體帶滯臺瀧擇澤擔單膽嘆團斷彈遲癡蟲晝鑄著廳徵聽懲敕鎭塚遞鐵點轉傳都燈當黨盜稻鬭德獨讀突屆難貳惱腦霸拜廢賣梅麥發髮拔繁晚蠻卑祕碑濱賓頻敏甁侮福拂佛倂竝塀餠邊變辨瓣辯勉步寶豐襃墨飜每萬滿免麵默彌譯藥與豫餘譽搖樣謠來賴亂覽欄龍隆虜兩獵綠淚壘類禮勵戾靈齡曆歷戀練鍊爐勞郞朗廊樓錄灣"
    $ToString =   "亜悪圧囲医為壱逸隠栄営衛駅謁円塩縁艶応欧殴桜奥横温穏仮価禍画会悔海絵壊懐慨概拡殻覚学岳楽喝渇褐缶巻陥勧寛漢関歓観気祈既帰器偽戯犠旧拠挙虚峡挟狭郷響暁勤謹区駆勲薫径茎恵掲渓経蛍軽継鶏芸撃欠研県倹剣険圏検献権顕験厳広効恒黄鉱号国黒穀砕済斎殺雑参桟蚕惨賛残糸祉視歯児辞湿実写社者煮釈寿収臭従渋獣縦祝粛処暑署緒諸叙将祥称渉焼証奨条状乗浄剰畳縄壌嬢譲醸触嘱神真寝慎尽図粋酔穂随髄枢数瀬声斉静窃摂節専浅戦践銭潜繊禅祖双壮争荘捜挿巣曽痩装僧層総騒増憎蔵贈臓即属続堕対体帯滞台滝択沢担単胆嘆団断弾遅痴虫昼鋳著庁徴聴懲勅鎮塚逓鉄点転伝都灯当党盗稲闘徳独読突届難弐悩脳覇拝廃売梅麦発髪抜繁晩蛮卑秘碑浜賓頻敏瓶侮福払仏併並塀餅辺変弁弁弁勉歩宝豊褒墨翻毎万満免麺黙弥訳薬与予余誉揺様謡来頼乱覧欄竜隆虜両猟緑涙塁類礼励戻霊齢暦歴恋練錬炉労郎朗廊楼録湾"
  }
  process {
    tr -TargetString $TargetString -FromString $FromString -ToString $ToString
  }
}
PS C:\> ConvertFrom-Kokijitentai "慶應義塾大學"
慶応義塾大学
PS C:\> ConvertFrom-Kokijitentai "智辯和歌山"
智弁和歌山
PS C:\> ConvertFrom-Kokijitentai "寶焼酎"
宝焼酎

*1:http://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/pdf/joyokanjihyo_20101130.pdf

*2:「餠」「辨」「瓣」「辯」の4字は上手く抽出できなかったので手作業で追加した

*3:http://satob.hatenablog.com/entry/2019/06/18/013811