[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 09/03 04:39 / Filesize : 313 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

PowerShell -Part 6



1 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:36:12.07 ID:LaQ04ZoE.net]
前スレ
PowerShell -Part 5
https://mevius.5ch.net/test/read.cgi/tech/1615994992/

次スレは>>980が立ててね!!

449 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 14:41:14.65 ID:OGG0CV73.net]
わざわざProcessStartInfo使うとかめんどくさいわ
Start-Processでいい

Start-Process -FilePath 'powershell.exe' -ArgumentList '-nop -c "$a = \"abc\"; $a | out-host"' -NoNewWindow -Wait

450 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 21:16:37.86 ID:d4+i07Ea.net]
ProcessStartInfoが面倒なのは同意。
Start-Processで済む時は使う事もあって
大体はUseShellExecute = $trueの時かな。

Start-Processを使わない一番の理由は-Redirect*がファイルパス指定な事。
出力を無加工でファイル出力したい事がまずないので使いづらい。
なんで-PassThruのProcessオブジェクトの出力制御変更のスイッチじゃないのか。
標準出力・エラーを同時に制御するとデッドロックしやすいからかな。
Start-Processがその辺うまい事制御してくれたらスクリプトでも使うんだけど。

451 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 21:55:59.58 ID:0vXUA52p.net]
コマンドラインパラメーターの処理はexeをビルドした処理系のスタートアップコードに依存するのだ
MSのC/C++やMingwとかで微妙に変わってくるのだガハハ
WindowsでC/C++/C#の場合argvとかではなくWin32APIのGetCommandLineで取得するのが一番正解に近い

452 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 22:06:03.52 ID:qWQ5DRIr.net]
"" や \" が必要な仕様は気持ち悪いって話をしてたつもりが…
ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ
about_Parsing の icacls を呼ぶ例もそのまま並べてる
そのままと異なる動きをさせたい時以外は、>>438>>440 も面倒すぎる

453 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 22:40:11.92 ID:GKrnmeJx.net]
引数のワイルドカードを展開するかしないかみたいなやつね

454 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 23:17:22.46 ID:d4+i07Ea.net]
MSもこの辺の気持ち悪さ・分かりづらさは分かってるみたいで
core v7とかだと環境変数かなんかで、パースルール変更できるんじゃなかったっけ。
Win10のv5.1しか使わないから知らんけど。

455 名前:デフォルトの名無しさん [2022/07/10(日) 00:25:59.02 ID:qiFT6lHF.net]
実行順がわかりにくい

456 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 00:55:31.74 ID:KsOikrPY.net]
何言いたいかがわかりにくい

457 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 01:17:57 ID:KsOikrPY.net]
>>443
> ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ
例えば
$a = "abc"; cmd /c "echo $a"
を実行したら「$a」と出力されて欲しくて
「abc」と出力されて欲しければ>>438,440ってこと?
好みが分かれるところかなー



458 名前:デフォルトの名無しさん [2022/07/10(日) 04:27:28.58 ID:qiFT6lHF.net]
UNIXのシェルスクリプトのマネにならないようにした結果がこれ

459 名前:デフォルトの名無しさん [2022/07/10(日) 04:30:45.24 ID:qiFT6lHF.net]
PowerShellは、記号に独自の意味を持たせているから、PowerShell職人を養成しないと使いこなせない。

460 名前:デフォルトの名無しさん mailto:sag [2022/07/10(日) 09:49:01.94 ID:os7PFybL.net]
PowerShell in ActionにはUNIXシェルを参考にしたっていろんな所に書いてあるけど
たとえば比較演算子とか

461 名前:デフォルトの名無しさん [2022/07/10(日) 10:20:51 ID:j6DdFbos.net]
powershellはPerlの匂いがする
俺が好きになった理由はここ

462 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 20:59:21.65 ID:KsOikrPY.net]
>>450
記号に独自の意味を持たせてる言語は多数あるのでは。
というか程度の差こそあれ殆どでは。
学習せず「使いこなせる」言語はないでしょ。

463 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 21:53:38.94 ID:bG/pnkmn.net]
powershellの記号が特殊とかはあまり思わないな
それより配列の扱いがトリッキーとかの方が職人の養成が必要と思う

464 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 22:11:42.01 ID:PiYySnCe.net]
ファイル名に[]が含まれてて苦労した人なのかなと思った

465 名前:デフォルトの名無しさん [2022/07/10(日) 22:53:56.17 ID:qiFT6lHF.net]
>>453
バッチファイルとの相性が最悪なのに気づかないとは情けないよ、あんた。

466 名前:デフォルトの名無しさん [2022/07/10(日) 22:55:51.37 ID:qiFT6lHF.net]
>>451
あらゆる言語を参考にして、いろいろ混ぜ込んで、奇妙奇天烈なものになってしまった。

467 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 23:58:19.25 ID:RTsqHO1/.net]
まあ最大の問題は、空白をトークンの区切り、改行を入力に終わりとしたことだな



468 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 00:03:16.90 ID:bX2QAhdS.net]
変数のスコープが他と違うPowershellには何も期待してない
グローバル変数を更新したつもりがローカル変数と見なされたりして使い難すぎる
グローバルデータを全部.NETのコンテナに逃がしてようやく使えるようになった

469 名前:デフォルトの名無しさん [2022/07/11(月) 00:04:59.61 ID:vt1vW9IA.net]
ファイルや文字列の操作の構文がヘンテコすぎる

470 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 01:41:49.71 ID:4UtqkfgJ.net]
超ヘンテコなJavaScriptだって一世を風靡したんだからPowershellだっていけるし(震え声

471 名前:デフォルトの名無しさん [2022/07/11(月) 03:32:17.37 ID:vt1vW9IA.net]
>>461
あんたPowerShellをほどんど知らないでしょ?

472 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 07:53:28.56 ID:3aArSxtS.net]
>>456
そんな話してなかったでしょ。会話になってないよ。

バッチ(コマンドプロンプト)上でワンライナー書くときに
記号の取り扱いに注意しなくていいメジャー言語は一つも知らない。

473 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 09:42:24.64 ID:zwDcIdQY.net]
>>463
個人的にはバッチは制限多過ぎだよね
今回の問題もPowershellというより旧cmm互換性のせいだし

474 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 10:44:52.35 ID:KonxbxUI.net]
あんた
あのこの
なんなのさ

475 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 11:27:13.34 ID:4o6o7MFx.net]
おらシェル子のこどほどんどしらねっちゃ

476 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 13:10:07.01 ID:ekYGS06D.net]
そもそもpsでスクリプト使うならバッチじゃなくてps1だろ

477 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 20:50:06.93 ID:M3Mn448S.net]
>>460
どこがどうヘンテコって思い込んでるんだ?



478 名前:デフォルトの名無しさん mailto:sage [2022/07/12(火) 00:36:46.01 ID:XdROtN2x.net]
Perlなんかもヘンテコって思ってれば筋は通る

479 名前:デフォルトの名無しさん mailto:sage [2022/07/14(木) 22:41:31.83 ID:ztzbKaJ8.net]
久々にvbsで書いたらめっちゃ素直でスラスラ書けるわ
Powershellはせめてレキシカルスコープで作り直してくれ
クラス使えって?

480 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 10:39:19.02 ID:y/m5s/RL.net]
VBSはクソだろ
https://twitter.com/Benshi_Orator/status/1546400388680945665
(deleted an unsolicited ad)

481 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 12:26:17.41 ID:nJv/8gNm.net]
>>470
psだってレキシカルスコープだよ
どういう動作を求めてるのかはしらんけど

482 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:13:05.28 ID:Wgy0KDme.net]
ダイナミックスコープだったような

483 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:20:06.85 ID:Wgy0KDme.net]
PowerShellの悲しい点は、関数とスクリプトブロックが動的にスコープされることです。
しかし、私が驚いたもう1つの点は、変数が内部スコープ内でコピーオンライトとして動作することです。
$array=@("g")

function foo() {
$array += "h" Write-Host $array
}

& { $array +="s" Write-Host $array }

foo Write-Host $array

出力は次のとおりです。
g s
g h
g
これにより、動的スコープの苦痛が少し軽減されます。
しかし、どうすればコピーオンライトを回避できますか?

484 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:22:56.94 ID:Wgy0KDme.net]
これの解決策
([ref]$array).Value += "h"

ちとうんこすぎるね

485 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 14:34:08.02 ID:ROJrTMPq.net]
コピーオンライトじゃなくてローカル変数が新しく定義されてるだけでは
動的スコープが嫌ならGetNewClosure()を呼べ

[PSv2]PowerShellでクロージャ&カリー化
https://winscript.jp/powershell/204
ScriptBlock.GetNewClosure Method
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.getnewclosure

486 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 16:26:41.50 ID:mFZqR7Di.net]
せめて問題を理解してからレスしろよ

この動的スコープとは何ですか?
ほとんどのプログラムは、理解しやすいため、レキシカルとも呼ばれる静的スコープを使用します。ソースコードを見ると、範囲内にあるものがわかります。Pythonの例では、スコープ内のxの唯一の値はxのグローバル値です。

対照的に、PowerShellは動的スコープを使用します。このモデルでは、スコープスタックに基づいて実行時に変数を検索します。関数を呼び出すたびに、新しいスコープを作成し、すべての値を親スコープからそのスコープにコピーします。PowerShellの例では、printXがsetAndprintXから呼び出されると、setAndprintXスコープで設定された$xの値を取得します。

なぜ動的スコープが必要なのですか?

字句スコープよりも動的スコープを選択する理由について、適切な説明を思い付くことができません。

「健康は病人だけが見ることができる王冠です」

487 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 17:59:02.69 ID:jPbc5odD.net]
function foo() {
$global:array += "h" Write-Host $array
}
& { $global:array +="s" Write-Host $array }
ってやるだけじゃねーの?
そもそもグローバル変数自体はそれ程使わん、ましてや関数やスクリプトブロックで更新なんてほぼやらん



488 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 21:33:28.03 ID:Keau4pUF.net]
>>477
PowerShell in ActionによるとダイナミックスコープはUNIXシェルを参考にしたらしい

489 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 23:56:32 ID:avBUMPl6.net]
using namespace System.Collections.Generic
$list = [List[string]] @('ggg');
'$list={0}' -f ($list -join ', ') | oh
function f {$list.Add('fff'); 'f={0}' -f ($list -join ', ') | oh;}
&{$list.Add('sb'); 'sb={0}' -f ($list -join ', ')|oh;}
f
'$list={0}' -f ($list -join ', ') | oh

$list=ggg
sb=ggg, sb
f=ggg, sb, fff
$list=ggg, sb, fff

490 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 13:19:21.19 ID:3YCfDQK3.net]
>>480
.NEtのListコンテナ使うと意図通り動くのはなんでなん
Powershellの配列の変数は値型とか?
この辺をちゃんと理解ておきたい

491 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 14:25:05.61 ID:QBrOblFw.net]
Listかどうかは関係ない 変数に新しい値を代入してるかどうか
>>474の $array += "h"は 新しく作った配列を $array に代入してるけど
>>480の $list はそんな事してないでしょ

492 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 14:36:33.24 ID:3YCfDQK3.net]
>>482
えーつまり$array += "h"は文字列への追加じゃなくて
やってることは$array = $array + "h"相当で新規に文字列のインスタンスとローカル変数が作成されるってことなの?
$arrayに対してのAdd相当は$global:的な装飾子以外にないの?

493 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:02:15.96 ID:m/XBj/Ao.net]
メインclerだけど、動的静的スコープの使い分けがclの武器と刷り込まれてた
評判悪いのか…
呼び出し側から振り分けられるのは便利では?出力先とか

494 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:49:49.15 ID:OVIs5jsH.net]
lispのようにメモリ上フラットにオブジェクトが住む思想(~pwshのfunction:プロバイダ)だと、動的スコープになるのが自然では
レキシカルな文脈が無いのだから

495 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:54:08.82 ID:yus9SEVI.net]
Powershellの配列は固定長だよ
追加はできない
+=演算子はその見た目のイメージ通り、新しい配列による再代入を伴う
これはスコープとは関係ない問題

496 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:57:07.03 ID:m/XBj/Ao.net]
ミュータブルかイミュータブルか、あと参照の話がごっちゃになってるよね

GetNewClosureはclのfunctionフォームと等価だね

497 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 16:10:18.66 ID:XIhDxiQx.net]
>>479
unixシェルもpwshもclもそうだけど、関数定義をズラズラっとダンプできて、それをちゃんと読み戻せる言語は原理的にレキシカルスコープでは有り得ない
(暗黙のうちにletやクロージャ生成を行う)ブロックぽい構文でレキシカルスコープを模倣することは可能だけど



498 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 17:23:13 ID:3YCfDQK3.net]
LISP族はletか何かで変数に対しての宣言を必ずするからダイナミックでも違和感ないでしょ
Powershellの違和感は暗黙的に変数の意味が代わるところじゃないかな

499 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 18:41:53.37 ID:zSvUsLU3.net]
コード適当に書いていってある程度の規模になった頃にそろそそ関数化でもすっか!
ってなった時に下手にグローバル変数更新してたりすると即はまるなコレ
しかも一見何が悪いのかさっぱり判らないという
Powershellコーティング十か条でも壁に貼っとかないとな

500 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 21:43:25.29 ID:dCc2dzlx.net]
about_Scopes
https://docs.microsoft.com/ja-jp/previous-versions/dd315289(v=technet.10)
PowerShell のスコープ完全に理解した
https://tech.blog.aerie.jp/entry/powershell-advent-calendar-2018-18

501 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 22:10:40.71 ID:CGK3IbQv.net]
いや下手にグローバル変数更新はできんだろ、参照だけ

502 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 22:11:26.62 ID:LMlAcWpL.net]
>>490
10ヶ条の最初に
・グローバル変数は使うな、ましてや更新する奴は死刑
って書いとけ

503 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 23:45:40.91 ID:zSvUsLU3.net]
>>491
MSの自動翻訳は的が外れてて知りたいことは何も書かれてない…
個人のurlの人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質
結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った
値渡しだけで済む書き方ができればなお良い

504 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 00:19:34.95 ID:+HoBYfWN.net]
結論出てよかったね

505 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 21:25:16.34 ID:0lMMqLG2.net]
スコープの話をしたいわけじゃなかったのなら最初からそう言ってほしかった

506 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 21:46:18.36 ID:RQQtBm3R.net]
文句付けたいけど根拠

507 名前:となる知識は無いから []
[ここ壊れてます]



508 名前:デフォルトの名無しさん mailto:sage [2022/07/20(水) 22:59:35.63 ID:DVSzMIGJ.net]
Pesterって使ってる?
使ってないとしたらUTどうしてる?

証跡としてコードカバレッジ出す目的に今も使ってるけどPowerShellの言語としてとか実行ホスト(exe)の機能ではなく
式単位にブレークポイント仕掛けて実現してるんだかで処理速度も普段よりかなり遅いし、あんまり便利って気がしない。
(うろ覚え)記述によってはうまくコードカバレッジに反映されない事もあった気がする。
そんとき忙しくて詳しく調査してらんなくてコードの方変えた気がする。
確かif文の条件内で変数に代入したりしてる場合だったかな。
while($null -ne ($line = $stream.ReadLine())){}みたいなのだったかな。

509 名前:デフォルトの名無しさん mailto:sage [2022/07/20(水) 23:06:57.28 ID:ZWOh364P.net]
PowerShellなんか想定した運用で動きゃいいでしょ
真面目にテスト書くようなものはC#で書きなさい

510 名前:デフォルトの名無しさん mailto:sage [2022/07/21(木) 22:42:00.80 ID:o92gVnUV.net]
以下のごく普通?のjsonがConvertFrom-Jsonだと意味不明なエラーで通らなかった
'{"":"あーあ" }' | ConvertFrom-Json
エラー出力
ConvertFrom-Json : Cannot process argument because the value of argument "name" is not valid. Change the value of the "name" argument and run the operation again.
At line:1 char:17
+ '{"":"あーあ" }' | ConvertFrom-Json
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [ConvertFrom-Json], PSArgumentException
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

511 名前:デフォルトの名無しさん mailto:sage [2022/07/21(木) 23:21:49.49 ID:hK8T/Nr3.net]
>>500
PowerShell Core ではバグとして修正されてるらしい
https://github.com/PowerShell/PowerShell/issues/1755

PowerShell Core は使ったことないが、Windows PowerShellが認めるJSONは独特なので外部とのデータ連携に使うには向いてない印象。
PowerShellからPowerShellへの受け渡しなら苦労は少ないけど、それならJSONで入出力する必要がないことが多い。

512 名前:デフォルトの名無しさん mailto:sage [2022/07/22(金) 00:05:10.76 ID:DccLQn0d.net]
名前なしの値ってjson採用してるアプリで普通に使われるんだよね
困ったわい

513 名前:デフォルトの名無しさん mailto:sage [2022/07/22(金) 01:13:11.32 ID:bxySyujx.net]
JavaScriptってプロパティ名で空文字列が使えるもんなあ
JavaScriptの仕様がファンキーすぎる気がしないでもない

514 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:10:35.01 ID:LaxYcXsV.net]
ハッシュテーブルの実装的には問題ないんだろうか?
どれとは言わんがある言語のハッシュテーブル実装用のハッシュ関数(種はランダム)に空文字列""通したら恒等的に0なんだが

515 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:11:49.39 ID:C81kwZF2.net]
バッチスレでPowerShell使いなよってアドバイスもらって
GetでJSON取得⇒JSON要素出力がこんなに簡単に出来るなんて感動した
curlコマンドとjqコマンド駆使してやってたのがアホみたいだった
でも構文とコマンドレット覚えるのは面倒

516 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:50:05.55 ID:ATmfTI/o.net]
種を要求するハッシュ関数ってよくあるんか?セキュリティ対策?
ずっと同じ値が帰ってくるならハッシュテーブル的には問題ないかと

517 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:16:25.64 ID:xJ8anoa4.net]
>>504 がなんか勘違いしてるんだろうと思う
種なんて聞いたことないし空文字列で 0 を返すのはよくある実装だと思う



518 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:35:46.87 ID:8xZeKJIl.net]
>>506
起動時環境ノイズから勝手に取ってくるのが普通かと

同じハッシュ値持つキーがあると、まあ実装によるがDoS攻撃のいい的
追加情報で判別にフォールバックしたり、テーブル作り直したり、非常に負荷がかかる
perl, python, pwshは少なくともそう

python -c print(hash(""))→0
python -c print(hash(" "))→ランダムなint64
pwsh -nop -c '"".GetHashCode()'→ランダムなint32
perlはスマホに入ってないのでまた

どちらも勝手に種植えてるね、Pythonは64bitにハッシュしてるから単純に強度が強いが、pwshが0でもランダムに見えるのに対し、常にf("")=0のpythonの実装はちょっと謎
fによって""と同じ値に写る文字列も毎回変わるので探すのも容易じゃないだろうけど、実際に規則性を見てしまうと他にも弱点ありそうな気がしてくる
事実としてpwshよりはwebで扱かれてるわけで、まあ大丈夫なんでしょう

519 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:38:19.25 ID:8xZeKJIl.net]
>>507
デバッグ用に手動で植える機能はあるはずだよ、マニュアルのどっか見たら書いてるはず、もちろん非推奨だけど

520 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:49:17.30 ID:8xZeKJIl.net]
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか

521 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:49:36.14 ID:8xZeKJIl.net]
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか

522 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:50:04.66 ID:8xZeKJIl.net]
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
tps://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか

523 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:50:41.34 ID:8xZeKJIl.net]
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
(そのまま貼れない)

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか

524 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:51:20.66 ID:8xZeKJIl.net]
連投ごめん

525 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:27:35.49 ID:xJ8anoa4.net]
とりあえずマニュアルをちゃんと読むことをお勧めしておく
https://docs.python.org/ja/3/library/functions.html?highlight=hash#hash

526 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:29:23.20 ID:rYm6iVSU.net]
で、件のjsの仕様だが、空文字でもよしなにハッシュしてくれるってことかいな?多分
空文字をキーとして使う事に関しては、言語固有のデータ型の概念も絡む
パスカル文字列でもc文字列でも、空文字列自体はいかなるバイト表現も持ち得ない
値がなけりゃ関数にも渡せない
文字数や終端の0埋めバイトごと渡せば値になるが、そこは思想の問題だろうね

527 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:36:12.72 ID:8xZeKJIl.net]
>>515
そこは言語リファレンスであって、リファレンス実装の(c)pythonとは(建前上)関係がない

インタプリタについてはこっち、hash関数のランダム化とどうしても植えたい人用
https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED



528 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:08:43.58 ID:xJ8anoa4.net]
ああすまん、最近の実装まで追いかけきれてなかったな
なるほど一つ賢くなったわ、ありがとう

529 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:10:01.71 ID:ZpfKnwiP.net]
実装のドキュメントもランダム化の有無に関わらず空文字列に0を返す事については触れてないな
まあ実装の詳細も詳細だし、保証する意味も無いから、気になるならソース読むしかない
気になるなら、この実装に問題無いんですか、と元気があるなら問い合わせる案件

530 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:30:36.76 ID:Sct47BON.net]
とりあえずPythonでhash("")==0なことはundocumentedなので依存するコードは書いちゃダメってことかな
偶々タイプが面倒だったのか、それでもよく見つけたな

一点だけ分かって現実に問題になるかはともかく、理想的なハッシュ関数の振る舞い(=完全にランダムに見える)として好ましくないのは確か

pwshのこういう面白ネタないかな、まあまだまだ開発中なので山ほどありそうなのがアレだけど

531 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:32:46.88 ID:8xZeKJIl.net]
undocumentedはMSのお家芸です

532 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:49:04.75 ID:FyEJHrzo.net]
面白そうなのでハッシュ衝突させてみた
d=dict()
d[0]="int 0"
d[""]="nullstr"
print(hash(0), hash(""), d)
0 0 {0: 'int 0', '': 'nullstr'}
たった2個ぶつけて死ぬ事はまあ無いが、いくらか試して中身は予想付いてきた
スレチごめん

533 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 23:59:51.61 ID:su1evgJ+.net]
面白そうなのでpwshでも
$h=@{0='int0'; ''='strnull'}
write (0).GetHashCode(), ''.GetHashCode(). $h[0, '']
→0 498565465 int0 strnull
cpythonと違い空文字列は0とは別物のようです
なおpython/pwshともに値の等しいintとfloat型をキーにしようとしたらエラー

([double][int]::MaxValue -eq [int]::MaxValue)
→True
キーにfloatを使うアホが居るかは不明だけど、[double]の範囲では全ての[int32]が表せるので今の実装の整合性に問題はない
さらに型を大きくするとfloatで表せる整数は歯抜けになってくるけどまあ

-0.0→-0.0
(-0.0).GetHashCode()→0
整数としての値ですね

$nan=[double]::NaN
$nancode=$nan.GetHashCode()
-214643572
$maxcode=[double]::MaxValue.GetHashCode()
214635072
$nancode + $maxcode→0ですね
ところでナンだか見慣れた数字が…
2gb, 4gb→2147483648 42949672

$nan -eq $nan→False
そう決めたからまあ、そうなんだけど
$nancode -eq $nancode→True
なんだかなー

534 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:20:32 ID:y/Pgitn8.net]
複数のNaNをキーにしたハッシュリテラル書くとInvalidOperation例外投げるな、Duplicate Keys 'NaN' are not allowed...らしい
アサインすると値が上書き

見方によってはハッシュテーブルというアルゴリズムの敗北と言えるかもしれん
困る機会も思いつかないのが幸い

535 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:31:26 ID:8WeqhqUG.net]
どのNaNとNaNも互いに値が等しくないからといって、キーがNaNまみれのハッシュ$nansが作れたとして
じゃあ$nans[NaN]はどの値を返せば正解なんだよ

536 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:51:33 ID:y/Pgitn8.net]
抽象データ構造としての連想配列なら、NaNがインデックスとして渡されたら探索すらせずに常に$nullを返せばいい
NaNと-eqなキーは$nansがNaNまみれであるかに関わらず存在し得ないんだから

ハッシュテーブルはあくまで"ほぼ-eq"を使った連想配列の実装
$nan=[double]::NaN;
$ht=@{$nan="abc"}; $h[$nan]
は"abc" を返すはず

537 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 01:22:01 ID:AWyQ+yiB.net]
そもそもnanは論理学と数学基礎論の公理、同一律を否定しているので、論理的思考を行っている限り無矛盾に理解することは原理的に不可能だぞ
考えるな、感じろ



538 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 13:14:46.86 ID:y/Pgitn8.net]
>>505
jqはフィルターとして便利なだけじゃなく、プログラミング言語として非常に面白いと思ってるので、学ぶ価値ありだと思うよ

移行前はcmd+vimで何でもやってたな
vimは安定してwinサポートしてたし、ユニコ以前から常に日本語パッチ供給されてて、強力なテキスト処理とある程度の構造化データ処理もできる入手性よいツールとして稀有だったはず
引数に直接スクリプト渡して非インタラクティブにバッチ処理できるからbatの中身はほぼvim/exスクリプトだった
多分2000年あたりでvim並みの機能かつ日本語サポートもしっかりしてるのはperlくらい

539 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 14:57:01.82 ID:HSo5zcUE.net]
コードエディタとしては愛用してるけど、vimをコマンドとして使う発想に時代を感じる

540 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 15:19:13.17 ID:HSo5zcUE.net]
こんな感じかね
vim -es "g/\W?\|\Wwhere/ s//Where-Object/p" -c wq $profile
こわいから-c wqはしないけど

findstrでパターンマッチ、for /f ... in (file.txt)で行毎にスキャンして置換したのをechoとかやってたな

541 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 15:43:37.36 ID:y/Pgitn8.net]
for /f "tokens=...delims=...skip=...eol=..."はプレーンな行毎のテーブルの処理には悪くない、明示的にフォーマットを指定してパースするので、むしろ分かりやすいまである

クオートやエスケープの解釈、ダメ文字などイレギュラーに全く対応出来なかったり、/フラグ毎にforの挙動が別コマンドと言えるほど違ったりで、融通が全く効かないのがアレというだけ
for /fで扱いやすいフォーマットで書いて読む閉じた世界に住んでるなら幸せ

542 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 16:33:20.60 ID:y/Pgitn8.net]
>>530
あーよく見たら$proflleか
フリーフォーマットをfor /fで走査は黒魔術になるな、行をどう分割するにしろ、変数展開時の文字列置換は分割単位毎だし、行内複数マッチの場合どうするのか考えるだけでぞっとする

vimに引数でコマンド渡すにはたとえ単一引数でも-cが必要、兄弟のsedやvi(m)のエイリアスexは専ら引数にコマンドを期待するので-e落として紛れはないけど、vi(m)はその名の通りvisualエディタだからはじめの引数にファイルを期待する

543 名前:デフォルトの名無しさん [2022/07/29(金) 21:36:58.16 ID:HWojhWX3.net]
最近仕事で触ることになって使い方習ったけど全然わからん

544 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 21:41:36.22 ID:wZddRh7F.net]
右も左も分からないなら、とりあえず良く使いそうなコマンドレットはエイリアスが事前に定義されてるので、galで出てくるのを順番に弄り回したりghするといいかも

545 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 23:32:09.97 ID:HWojhWX3.net]
基本文法を覚える前にVB.NETでモジュールメソッド作成して呼び出すやり方覚えたら動けばいいやでそっちばかり使ってしまってなかなか覚えられない

546 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 01:54:14.48 ID:G28B9gdh.net]
$OutputEncoding の初期値をUS-ASCIIからShift-JIS 932に変更したいのですが方法が分かりません
変更は
$OutputEncoding = [Console]::OutputEncoding
$OutputEncoding = [System.Text.Encoding]::GetEncoding(‘Shift_JIS’)
などで出来るようなのですが既定値を変えたいです

やりたい事はcmd上でripgrepをパイプで繋いだ際に文字化けしないようにしたいのですが
https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#pipe-non-ascii-windows
$OutputEncoding の既定値を変えられたとしてもcmd上でも効果があるのかは試してみないと分かりません
こちらの解決法が分かる方が居ましたら是非教えて欲しいです

547 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 10:05:14.78 ID:3Aj3EGjO.net]
プロファイルに記述、じゃだめ?
PS> notepad $PROFILE.CurrentUserAllHosts



548 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 17:28:13.33 ID:BFM47HY2.net]
>>537
ありがとうございます
$profileでやってみました。UTF-8でなら使えそうなのですが
$OutputEncoding をsjisにしたps上でもrgがUTF-8で吐いてるので無理みたいです
【.cmd】 バッチファイルスクリプト %13 【.bat】
https://mevius.5ch.net/test/read.cgi/tech/1542779527/496
参照先のようにUTF-8にすれば一応化けずに使えるのですがUTF-8だとコマンド類がascii以外機能しないものが多いのでバッチなどでは使いづらい
sjisで使えたら貧弱なfindstrに置き換えられ便利になると思ったのですが残念です

549 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 18:34:17.55 ID:3Aj3EGjO.net]
findstr置き換え目的でPowerShell持ち出すなら、Select-Stringとかの手もある。

rgの高速検索のメリットがPowerShellのオーバーヘッドを上回るなら、
例えば以下のような処理を関数なりスクリプトなりにしておくといいと思う。
スクリプト化しておけばcmdからもpowershell経由で使える。
#…けど、他のgrepコマンド導入した方が良さそうな気がする。

$path = "検索対象ファイルパス"
$pattern = "検索パターン"
$si = [Diagnostics.ProcessStartInfo]::new("rg.exe")
$si.Arguments = '"{0}" "{1}"' -f $pattern, $path
$si.UseShellExecute = $false
$si.RedirectStandardOutput = $true
$si.StandardOutputEncoding = [Text.Encoding]::UTF8
$proc = [Process]::Start($si)
$stdout = $proc.StandardOutput
while (! $stdout.EndOfStream) {
$stdout.ReadLine()
}






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<313KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef