揮発性のメモ2

http://d.hatena.ne.jp/iww/

Linuxの起動日時を表示 2

/proc/stat に載ってる btime は、ちゃんと現在時刻を考慮する。


時計がまだ合っていないパソコンを起動したときの btime は、その不正確な時刻をもとに 起動日時を計算している。

btime 1478193392
$ date --date=@1478193392
Fri Nov  4 02:16:32 JST 2016


このあと、NTPなどで時計を合わせると、btime が現在時刻に合わせて表示される

btime 1596676638
$ date --date=@1596676638
Thu Aug  6 10:17:18 JST 2020

gitで、最新のファイルだけ全部cloneする

git clone -b master --single-branch --depth 1 --recursive --shallow-submodules https://gitlab.com/hogehoge/hogehoge.git
-b master ブランチ指定 (例ではmasterを指定)
--simgle-branch 指定したブランチだけclone
--depth 1 1階層(最新)だけclone
--recursive サブモジュールも再帰的にclone
--shallow-submodules サブモジュールのcloneも最新だけにする


Git - git-clone Documentation
git のクローンを最小量にする(サブモジュールを含めたshallow clone) - Qiita
Git - 特定のブランチをクローンする | git Tutorial
[Git] とにかく速く特定のブランチをgit cloneしたい場合のTips - Qiita


毎回ユーザ名とパスワードを聞かれないよう覚えさすには次の設定を ~/.gitconfig に足しておく

[credential]
#       helper = cache --timeout 36000
        helper = store --file /tmp/git-credentials
git config --global credential.helper store --file /tmp/git-credentials

Git - 認証情報の保存

とりあえず、電源を入れている間はパスワードを覚え続けてもらう設定にした。

PhpStormで、CTRLキーを押しながらファイルの複数選択ができなくなったとき

stackoverflow.com

This problem can be fixed by turning off "Open files with single click" in the Project tab > Gear icon.
It might be a bug; not sure.

https://youtrack.jetbrains.com/issue/WI-52883

そういうことかよ・・・
f:id:iww:20200727121734p:plain
SHIFTキーを押しながらの複数選択はできるので、実質バグだと思う

bashで、ヘルプと初期設定をひとつにまとめる

スクリプト書いてるとき、ヘルプと実体を合わせるのが面倒だし
コメントに書いたことをヘルプにも書き写すのがアホっぽくなったので
できるだけひとつにまとめる実験

実行するとこんな感じになる

$ ./sabun.sh -h

# 差分確認プログラム
# 接続先の / と ローカルディレクトリの差分一覧を表示
# 使い方: sabun.sh -b 192.168.31.5 -d backup202007

# 設定項目と初期値
# -u 接続ユーザ
SSHUSER=hogehoge
# -b 接続先 (必須)
SSHHOST=
# -d 比較対象ディレクトリ (必須)
BBBDIR=

$


ヘルプ表示関数 で、スクリプトの一部分をそのまま表示するようにしてみる

head -$((LINENO-3)) $BASH_SOURCE | tail +3
tailコマンドで先頭を指定行数分 読み飛ばす - 揮発性のメモ2
Man page of BASH

LINENO は、現在の行番号
BASH_SOURCE は、スクリプト自身のファイル名 ($0は使えないよ)

変数の初期設定や定義、使い方などをソースの頭にまとめて書き、
ヘルプオプションで ソースをそのまま 表示する

続きを読む

秀丸でフォルダがロックされっぱなしになる

秀丸でフォルダがロックされっぱなしになることがある。

  1. 秀丸をタブモードで起動
  2. フォルダを新規作成
  3. その中でテキストファイルを作成し秀丸で編集、保存
  4. テキストファイルのタブを閉じる(秀丸は起動したまま)
  5. フォルダを削除する ⇒ 「別のプログラムがこのフォルダーまたはファイルを開いているので、操作を完了できません。」


この不具合はバグではなく仕様とのこと。

[その他]→[動作環境]→[ファイル]で、「最初のフォルダ」をONにして、
c:\など、任意の場所を指定しておく

http://www.maruo.co.jp/turukame/3/x08018_.html

TeraTermのログファイルの設定

TeraTermでログを忘れずに自動保存したい

; ログ保存の自動開始
LogAutoStart=on
; ログディレクトリ  絶対パスまたは teratermディレクトリからの相対パス
LogDefaultPath=log
; ログファイル名    ホスト名_年月日_時分秒.log
LogDefaultName=&h_%Y%m%d_%H%M%S.log

; ログ保存ダイアログを非表示
LogHideDialog=on

; ログ内にタイムスタンプをつける
LogTimestamp=on
; ログ内のタイムスタンプのフォーマット
;   %Y-%m-%d %H:%M:%S.%N    ... 2017-06-04 21:12:40.123
;   %a %b %e %H:%M:%S.%N %Y ... Sun Jun  4 21:12:40.123 2017
LogTimestampFormat=%Y-%m-%d %H:%M:%S.%N

; ログの遅延書込み  デフォルトは on(遅延書込みをする)
; DeferredLogWriteMode=on

4.100 で上記設定が機能するのを確認した


参考
TeraTermのログのタイムスタンプのフォーマットの指定 - 揮発性のメモ2
TeraTermのログウィンドウを非表示にする - Qiita
https://ttssh2.osdn.jp/manual/4/ja/setup/teraterm-misc.html
ターミナルソフトTera Termガイドブックゆたかさんの技術書


ログ保存ダイアログを非表示にするのは、Teratermの窓をやたら開く人には大変重要な設定

mmapについて

Amazon | POSIX.4 Programmers Guide: Programming for the Real World | Gallmeister, Bill | Unix
この本がほしい

MAP_PRIVATE はファイルに反映されない

いじっている間はファイルに絶対反映されないけど、munmap()すれば反映される。 と思い込んでた。

Man page of MMAP
マニュアルをいくら読んでもわからなかったので随分悩んだ。
mmap - Wikipedia
でもWikipediaにはそのものずばり書いてある。

ファイルサイズは勝手に大きくならない

小さいファイルをmmap()して後ろの方になんか書いたら反映されて ファイルもついでに拡張されないかなー と期待してた。
なんならサイズが 0 のファイルでアクセスした日には バスエラーまで起こる。

サイズをページサイズに合わせる

アライメント(バイト境界)

    int size = 4097;
    int pagesize = sysconf(_SC_PAGESIZE); // ほぼほぼ 4096
    int alignedsize = ((size-1)/pagesize + 1) * pagesize; // この例なら 8192 になる

いちいち (size/pagesize + (size%pagesize!=0)) * pagesize とかやってたけど、この方が短くてかっこいい

サイズをページサイズに合わせなくても大丈夫

mmap() のときのlengthは ページサイズに勝手に切り上げて合わせるよ! とマニュアルに書いてあるけど、
munmap() にはページサイズに合わせなさい。 と書いてあるので、マジかよ面倒くさいと思っていた。
が、単に誤読で、ページサイズにあわせないといけないのはアドレスだった。

サイズの方は内部で勝手に切り上げてるっぽいので平気。 よって、ページサイズを使ってサイズ計算する必要は無くなった

linux/mmap.c at master · torvalds/linux · GitHub

int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list_head *uf, bool downgrade)
{
	unsigned long end;
	struct vm_area_struct *vma, *prev, *last;

	if ((offset_in_page(start)) || start > TASK_SIZE || len > TASK_SIZE-start) return -EINVAL;

	len = PAGE_ALIGN(len);
以下略