/ 最近 .rdf 追記 設定 本棚

脳log[2018-12-06~]



2018年12月06日 (木) 読みかけてしばらく積んでいた『[新書] 宇野 弘蔵【資本論の経済学 (岩波新書 青版 B-67)】 岩波書店』を再開したのだけど、この本のおもしろさは、経済学をこれっぽっちも学ばなかった人間にとってのおもしろさは『[単行本] ジョン・ガートナー【世界の技術を支配する ベル研究所の興亡】 文藝春秋』と同じところにあって、自分を当たり前のように取り巻く社会のある部分が実は全然当たり前のものではなく、短期的なトレンドとしてより外側からより抽象的に捉えられるところにある、と思う。文字を追いかけても全然頭に入ってこないのだけども、そういう雰囲気だけ感じてる。


2018年12月05日 (水) 猫さんのフライングボディプレスを受ける人目線の映像が臨場感たっぷりですごい「うめき声がリアルすぎて」 - Togetter」■猫さんはつま先歩きなので普通に上を歩かれただけでも刺さるんですよ(踏んでいただけて幸せです)。


2018年12月04日 (火) [SakuraEditor] 通知メールを読まなくても、Issue/PR ページを閲覧しなくても、PR は送れるっ。■自己嫌悪にてしばらく隠遁します。■豆腐メンタル故に相手の反応が読めないやりとりのあとは時間に身を任せたりする。


2018年12月03日 (月) [Git] ブランチ名を入力するの面倒くさいなー補完したいなーと手段を検索したら、先に試みていた人の学びを後追いすることになった。「Gitのブランチ名を返すエイリアスを設定したら地味に捗った - Qiita」「Gitのブランチ名を返すエイリアスを設定しなくても地味に捗った - Qiita」■HEAD というのが現在のブランチへの参照なんだなたぶん。『[単行本] 濱野 純(Junio C Hamano)【入門Git】 秀和システム』には書いてあったと思うけど、だからといって git push -u <myRemote> HEAD という具体的使用例が出てくるわけじゃあない。


2018年12月01日 (土) [SakuraEditor] なんとなく1日以内のターンアラウンドを心がけていたけどそれを意識せず他人にも求めているという「害」が明らかになったので見直すことにする。自分を縛るから他人を縛り始めるのであって、俺は自由だ! もちろん相手によって使い分けるつもりはある。そうとは期待できない、そうする必要がない相手が一名同定できたというだけなのだから。■自分がアルファギークと呼ばれるに値する能力を持っているとは考えたことがないけど、だからこそ今日読み終えた『[単行本(ソフトカバー)] Camille Fournier【エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド】 オライリージャパン』で描写されるアルファギーク的な振る舞いが当てはまりすぎていてつらい。アルファギークから唯一の価値を引き算した残りってことなんだから。


2018年11月29日 (木) 著しく高いパケット単価 (#3523308) | 政府、携帯電話の料金プランや端末代金、期間拘束などに対し「提言」 | スラド」■本当にこれ。期間拘束がダメとか販売奨励金がダメとかの搦め手ではなく、総務省はこの本丸を崩さなければいけない。現在の速度だと一瞬で膨れあがるバイトあたりのパケット単価を許すから通信会社が濡れ手に粟で好き勝手する。時間当たりのパケットの重みはどんどん下がり続けてるのに価格の見直しがされない。定額制が前提だから消費者も抗議しない。総務省が攻めるしかない。通信料の算定基準を定めて根拠を提示させなければいけない。


2018年11月28日 (水) 朝 ぼく「頭痛い 仕事休むか 電話しよ」 上司「頭痛か ところでバファリンは飲んだ?」 : 暇人\(^o^)/速報 - ライブドアブログ」■まるで自分を見ているようだ。もちろん「ぼく」の側。このアドバイスは受け止めておこう「そういう時はもう飲みましたが良くなりませんて言うんだよ馬鹿め」。■そういう機転が働かないというのもあるし、一般人に殺人が手段として思い浮かばないように、嘘をついてごまかすという選択肢が浮かばないというのもある。面倒くさいでしょう。まっすぐぶつかってなるようになれが楽。優しい嘘をつき通す気概もない。


2018年11月27日 (火) 曖昧な書き方をしませんね。「われわれは、日産自動車にはもう一度「日本の日産自動車」に戻ってもらわねばならない。「技術の日産」をむざむざ他国に差し出すわけにはいかないのだ。」 今回の件がそのための1歩だろうという、完遂してほしいという期待が、自分にもある。もう外国メーカーだからという冷めた見かたからの変化だ。


2018年11月26日 (月) バッチファイルでファイルとフォルダの区別。if exist A\ echo A is a directory. でディレクトリが判別できるとあって、確かにそうだったのだけど、例外が見つかった。■テストした A が zip ファイルだったから書庫フォルダの特別扱いかと思ったがただのテキストファイルでも同じだった。ファイルを上位階層に移動しもってテストしていったら、ジャンクションを境に判別ができなくなっていた。■Y:\dirA\dirB というパスに T: を割り当てていると考えてほしい。dirB より下の階層ではフォルダ判別ができずに、ファイルパスの末尾に \ が付いていようが存在を確認できてしまった。■やめてくれよ……。気がついても考慮したくないよ……。


2018年11月23日 (金) Unicode に絵文字が収録されたとき、IME を使わない言語の人はどうやって入力するのかなって思ったけど、入力用の文字ではなく、解釈・変換して表示するための文字だったらしい。まあそうか。:+1:


2018年11月22日 (木) バッチを新しい環境で実行するのに cmd /C を頭に付けて必要なら引数を二重引用符でくくってって面倒くさい。|a.bat とは書けなかったけど call|a.bat とか echo>nul|a.bat なら呼び出し元に影響を与えない新しい環境でバッチを呼び出せた。普通に何も出力しない NOOP コマンドがあれば意図が明確なんだけどなあ。残念、rem|a.bat は無理だった。■あとバッチファイル衝撃の事実。入力を受け取って処理して出力するフィルタを書こうとしたら、標準入力に対して繰り返すコマンドが存在しなかった。for にそういう専用のオプションがあってしかるべきだと思う。これってバッチの用途のど真ん中にあると思うんだ。他のコマンドをパイプで繋ぐのはお手のものなのに、バッチファイルがそのコマンドの一翼を担うことができないのはなんで?

最終更新: 2019-04-12T22:46+0900

[Git] RestoreCommitterDate.ps1: 初めて書いた .ps1 スクリプト

タイムスタンプを保持してくれないために更新日時がチェックアウト日時になってしまう Git のために。

文法が手探りなので何時間もかかった。とりあえず覚えるべきは help *|gm.GetType()。セルフドキュメンテッドである。map は foreach {$_}、filter は where {$_}。式やコマンドをくくるのは $(...)。演算子は -band だったりするからリファレンスを見るしかない。リファレンスが手元にない。

いやあった。Windows SDK > Win32 and COM Development > Administration and Management > Windows PowerShell もしくは、スタートメニュー > すべてのプログラム > アクセサリ > Windows PowerShell > Windows PowerShell ISE を起動して F1。インストールはしたけど興味がないだけだった。

git ls-files | foreach { @{
	File = "$(pwd)\$_" -as [System.IO.FileInfo]
	Time = $(git log --pretty=format:%ci -n 1 -- "$_") -as [DateTime]
} } | where {
	$_.File
} | foreach { try {
	$_.File.LastWriteTime = $_.Time
} catch { Write-Error $_ } }

明らかに git log をパスでフィルタリングして最新の時刻を取り出す処理が遅い。SQL ではないけど構造的には N+1 問題。

ls-files の段階でコミットオブジェクトを取得してそれの時刻を取り出せないかと考えたが、--stage オプションで取り出せた ID を git show した結果はファイルの内容だけだった。

post-checkout フックに仕込むのは無理だなあ。


 @2018-12-21 N+1 問題を解決した新版

N+1 問題を抱えてるのは日本語で公開されているスクリプトであって、Perl と英語で書かれた「ExampleScripts - Git SCM Wiki」はたぶんそうではない。Perl は読めないけどたぶん。

このバージョンだとログの長さに比例した時間がかかるものの、サクラエディタのリポジトリ(ログ数3600)で "Roughly" バージョンのたかだか3倍の時間(6秒)で完了する。

<#
	.SYNOPSIS
	Git ワーキングツリーに含まれるファイルの更新日時に最終コミット日時を設定します。

	.DESCRIPTION
	Git でチェックアウトしたファイルの更新日時はチェックアウト日時になります。これはファイルのタイムスタンプを比較する場合に不都合なことがあり、代わりに最終コミット日時をタイムスタンプに設定します。

	Git リポジトリ内で実行します。すべての階層のファイルが対象になります。
#>
$TopDir = (git rev-parse --show-toplevel)
$waiting = @{}
(git ls-files --full-name "$TopDir") | foreach {
	$waiting[$_] = $NULL
}
(git log --format=format:?%ci --name-only) | foreach {
	if ($_ -eq "") {
	} elseif ($_[0] -eq "?") {
		$t = $_.Substring(1)
	} else {
		$f = [System.IO.FileInfo] "$TopDir\$_"

		# run once a file.
		$c = $waiting.Count
		$waiting.Remove($_)
		if ($waiting.Count -ne $c -and $f.Exists) { try {
			$t = [System.DateTime] $t
			$f.LastWriteTime = $t
		} catch {
			Write-Debug $_
		} }
	}
}
  • かつては Git 管理下にあったが現在はそうではないファイルを対象外にするために git ls-files を使っている。
  • git subtree によって追加されて以後変更されていないファイルのコミット日時が取れない。「Subtrees allow subprojects to be included within a subdirectory of the main project, optionally including the subproject’s entire history.

 @2019-03-09「-m オプションに対する考察

たぶん git log-m --first-parent を付けるのが一番期待するものになる。

最終更新: 2019-04-12T22:46+0900

[Git] RestoreCommitterDateRoughly.ps1

RestoreCommitterDate.ps1 が実行に1分から1分半かかるとしたら、この RestoreCommitterDateRoughly.ps1 は2、3秒で終わる。

"Roughly" が意味するところは、1か月分のログだけを遡ってワーキングツリーにあるファイルのタイムスタンプを設定するのであって、それ以上前に変更されたファイルは一律で1か月前のタイムスタンプが設定されること。

このスクリプトの目的はキャッシュしたビルド産物を再利用することで再コンパイルを省略することにあって、そのためにはファイルのタイムスタンプがチェックアウト日時であっては困る。Git はそうだ。AppVeyor は必ず git clone、git checkout からビルドを始めるから、チェックアウトしたソースファイルが必ず前回のビルド産物より新しくなってしまう。

変更がなくても1か月経てば再コンパイルされてしまうけど、まあ、リーズナブルなスパンでしょう。

<#
	.SYNOPSIS
	Git ワーキングツリーに含まれるファイルの更新日時に最終コミット日時を設定します。

	.DESCRIPTION
	Git でチェックアウトしたファイルの更新日時はチェックアウト日時になります。これはファイルのタイムスタンプを比較する場合に不都合な場合があり、代わりに最終コミット日時をタイムスタンプに設定します。

	Git リポジトリ内で実行します。すべての階層のファイルが対象になります。

	制限: ログを遡りすべてのファイルの最終コミット日時を取得することは1分以上かかることがあるため、このスクリプトでは1か月を上限としてログを遡ります。そのため最も古いタイムスタンプは実行日時を基準として前月同日の00:00:00になります。
#>
$TopDir = (git rev-parse --show-toplevel)
$Oldest = [DateTime]::Today.AddMonths(-1) # Of course, this is incorrect for the oldest timestamp. That's what "Roughly" means.

$waiting = @{}
(git ls-files --full-name "$TopDir") | foreach {
	$waiting[$_] = $NULL
}

@(
	(git log --format=format:?%ci --name-only --since="$($Oldest.ToString("yyyy-MM-dd HH:mm:ss"))")
	, "?$($Oldest.ToString("yyyy-MM-dd HH:mm:ss"))"
	, (git ls-files --full-name "$TopDir")
) | foreach { $_ | foreach {
	if ($_ -eq "") {
	} elseif ($_[0] -eq "?") {
		$t = $_.Substring(1)
	} else {
		$f = [System.IO.FileInfo] "$TopDir\$_"

		# run once a file.
		$c = $waiting.Count
		$waiting.Remove($_)
		if ($waiting.Count -ne $c -and $f.Exists) { try {
			$t = [System.DateTime] $t
			$f.LastWriteTime = $t
		} catch {
			Write-Debug $_
		} }
	}
} }

 @2019-03-09「-m オプションに対する考察

たぶん git log-m --first-parent を付けるのが一番期待するものになる。

何もなしもありっちゃあり。-m のみ付けるのはぴったりはまる状況がわからない。

-m オプションのみの場合に、双方のブランチから見た修正内容が2つのコミットとして出力されています。一方が長大なリストを出力しているのはブランチの側で master を追いかけて pull/merge/rebase した結果だと見られます。

というのはたぶん間違い。むしろ rebase しなかった結果、分岐から合流までのあいだに master が進んだその差分が現れている。

この間違いで論旨(「明らかに無視すべきものです。」)は変わらない。


2018年11月21日 (水) ぷりケツお献立メコン川さんのツイート: 「すんごい昔の会社の勉強会で後輩君が「Makefileには1行目に #!/usr/bin/make って付けて、chmod 777 Makefile して、./Makefike するのが普通です」とか言ってるのを聞いて、痙攣しながら椅子から転げ落ちた記憶が一番衝撃的だったww」■まじめな話。転げ落ちポイントを説明してくれないとわかんない。


2018年11月20日 (火)

最終更新: 2019-04-12T22:46+0900

[Git] 間違ってブランチを削除してしまった

コミット構成を変えるために複数のブランチを作成したりマージしたりなんだりしてから作業用のブランチを整理したら、再構成後のブランチまで一緒に削除してしまっていた! 1時間の作業成果!

.git/objects/*/* から一番新しいコミットオブジェクトをサルベージしてなんとかなった。サルベージっていうのは git checkout -b MyAnHour xxx(全部で40桁)xxx すること。

コミットの再構成は git rebase でもできるらしい。削除・入れ替え・併合は当然。edit オプションを使えばコミットの分割もできるとか。

そういえばまだ reflog って知らない。