かすみん日記

暇なときに何か喋ります

なぜxargsが必要か【シェルスクリプト】

間違い探し

まずは hello という内容のファイル a.txt を作成しておく。

% echo hello > a.txt
% cat a.txt
hello

ここで、ファイル名 a.txt をパイプで与えて、結果的に cat a.txt を実行するようにしたいとする。

以下のようにコマンドを実行した。

% echo a.txt | cat
a.txt

あれれ、a.txt の中身の hello じゃなくて、単に文字列 a.txt が表示されてしまったぞ。

パイプの左側のコマンドの標準出力を、パイプの右側のコマンドに標準入力として与えているはずだが、なぜ。

答え合わせ

パイプで左から右に渡している「もの」は、標準出力を「箱(ファイルのようなもの?)」に入れたものになっている。

つまり、出力である「文字列」を「箱」に入れて、「箱」ごとパイプの右へ渡している感じだろうか。

一方、普段 cat a.txt などのようにしてコマンドラインで与えている引数は、「文字列の入った箱(ファイル)」ではなく、単なる「文字列」である。

パイプの左側の標準出力を「文字列」としてそのまま右側に渡したいのであれば、それを「箱」から出してあげなければならない。

そして、それをしてくれるコマンドが xargs である。

つまり、下記のように修正すれば良い。

% echo a.txt | xargs cat
hello

こうすると、ちゃんと a.txt の中身を cat コマンドで表示できた。

具体例と説明?

と言われても、いまいちわからん。結局何が違うのか。

xargs があるのとないので、出力がどう違うか、いくつか見てみる。

まず準備。

% echo hello > a.txt

% ls
a.txt

% cat a.txt
hello

いくつかサンプル。

% echo a.txt | cat 
a.txt

% echo a.txt | xargs cat
hello

% echo a.txt | echo     


% echo a.txt | xargs echo
a.txt

% cat a.txt | cat
hello

% cat a.txt | xargs cat
cat: hello: No such file or directory

% cat a.txt | echo     


% cat a.txt | xargs echo
hello

echo a.txt | cat -> a.txt

まず echo a.txt | cat では、a.txt という「文字列が入った箱」が引数として cat に渡される。

これは、a.txt という内容のファイルを cat に渡しているのと同じ意味である。

つまり、 a.txt が出力されることになる。

echo a.txt | xargs cat -> hello

echo a.txt | xargs cat では、a.txt という「文字列」が引数として cat に渡される。

これは、cat が引数として与えられた a.txt という名前のファイルの中身を表示するので、hello が表示される。

echo a.txt | echo -> ""

echo a.txt | echo を実行すると何も表示されない。

これは、a.txt という文字列が入った箱を echo に渡していることになっている。

echo は引数の「文字列」を表示するコマンドなので、「箱」を渡しても何も起きない。つまり、何も表示されない。

echo a.txt | xargs echo -> a.txt

echo a.txt | xargs echo では a.txt が表示される。

これは、「箱」から出した a.txt という「文字列」が echo に渡されるので、a.txt が表示される。

cat a.txt | cat -> hello

cat a.txt | cat を実行すると、a.txt の中身である hello が表示される。

パイプの左側の cat a.txthello が出力されるが、それをまた「箱」に入れ直してからパイプの右側の cat に渡す。

なので、右側で再び「箱」から中身を取り出して hello が表示される。

cat a.txt | xargs cat -> ERROR

cat a.txt | xargs cat では、エラーが表示される。

hello を「箱」に入っていない「文字列」としてパイプの右側の cat に渡すので、「hello というファイルなんてないぞ」と怒られる。

cat a.txt | echo -> ""

cat a.txt | echo を実行しても何も表示されない。

これも、パイプの右側の echo に「文字列」ではなく「箱」を渡しちゃってるので、表示するものがないためである。

cat a.txt | xargs echo -> hello

cat a.txt | xargs echo を実行すると hello が表示される。

パイプの左側の出力である hello を「箱」に入れずに「文字列」として右側の echo に渡しているので、hello は表示される。

おわりに

私もよくわからなくて困っていたら、xargs を付ければ良いとTwitterで教えてもらった。

なぜ xargs が必要なのかはわかったが、パイプのデフォルトで xargs を付けてくれればいいのにと思っている。

なぜパイプを通すときに、標準出力の「文字列」を「箱(ファイル? 配列?)」に入れる必要があるのだろうか。

あと便宜上「箱」と書いてきた「もの」の名前を知っている人がいたら教えて欲しいです。

man xargs のマニュアルとかでは「string」と「argument」という言葉が出ていたが、「string」はこの記事でいう「文字列を箱に入れたもの」に対応していて、データ構造的に配列っぽいものだと思うのだが、文字列と呼んでいいのかわからない。

そもそも「ファイル」が一体何者なのか知らない。

まあそんな感じですた。

【Ruby】warning: already initialized constant

jekyll server でなんか警告が出るようになっちゃったときの備忘録。

環境

% ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin20]

% rbenv -v
rbenv 1.1.2

% gem -v
3.0.3

% bundle -v
Bundler version 2.2.20

% jekyll -v
jekyll 4.2.0

症状

gem install したときに、なんかconflictしてるけど上書きしてもええか?と聞かれてyesと言ってしまったら、警告が出るようになってしまった;

% jekyll server
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils/version.rb:4: warning: already initialized constant FileUtils::VERSION
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:105: warning: previous definition of VERSION was here
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils.rb:1267: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:1284: warning: previous definition of S_IF_DOOR was here
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils.rb:1540: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:1577: warning: previous definition of DIRECTORY_TERM was here
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils.rb:1595: warning: already initialized constant FileUtils::OPT_TABLE
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:1635: warning: previous definition of OPT_TABLE was here
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils.rb:1649: warning: already initialized constant FileUtils::LOW_METHODS
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:1694: warning: previous definition of LOW_METHODS was here
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/2.6.0/fileutils.rb:1656: warning: already initialized constant FileUtils::METHODS
/Users/<name>/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/fileutils-1.5.0/lib/fileutils.rb:1701: warning: previous definition of METHODS was here
...

対応

該当gemをアンインストールすればいいらしい;

% gem uninstall fileutils
Successfully uninstalled fileutils-1.5.0

その後アップデート;

% gem update --default
Updating installed gems
Updating fileutils
Fetching fileutils-1.5.0.gem
Successfully installed fileutils-1.5.0
Done installing documentation for fileutils after 0 seconds
Done installing documentation for fileutils after 0 seconds
Updating mimemagic
Successfully installed mimemagic-0.4.3
Done installing documentation for mimemagic after 0 seconds
Done installing documentation for mimemagic after 0 seconds
Gems updated: fileutils mimemagic

他にもいくつかのgemで同様の警告が出ていたので、全てアンインストール;

gem uninstall logger
gem uninstall etc
gem uninstall strscan
gem uninstall forwardable

gem update --default

これでもう警告は出なくなった。

参考

stackoverflow.com

github.com

【iPad】Mendeley/Zoteroのモバイルアプリがサ終してたので代替

千年ぶりに論文読もうと思ったらMendeleyのiPadアプリがサ終してた。

みんなZoteroに移行したらしいけど、Zoteroもモバイルアプリ無いんだが?

PaperShipという非公式?アプリでMendeleyやZeteroにログインできるので、これで代替すればよさそう。

AppStore: https://apps.apple.com/jp/app/papership-mendeley-zotero/id631980748

やはり学問はオワコン。

おまけ

ちなみに、わたちのiPadおすすめPDF viewerは以下の通り:

  • PDF Expert
    • 無料版はDocuments
    • トリミング(余白除去)とダークモードが使える
    • 2ページ表示ができる
    • スクロール表示ができる
    • クラウドとの連携もスムーズ
  • PDF Viewer Pro by PSPDFKit
    • 無料
    • PDF Expertとほぼ同じだが、トリミング機能がない。
    • その代わりに、書き込みがこっちの方が少し便利。
  • Goodnotes 5
    • これはPDF viewerじゃなくて、独自ファイル形式のノートアプリ
    • PDFには書き込み機能があるがゴミカスなので、そもそもPDFに直接書き込むのは諦めた方がいい
    • viewerとしてはゴミだが、書き込みに関してはこのアプリが至高(相対的に)
    • ガッツリ書き込みたいPDFがあるなら、諦めてGoodnotesに読み込んでしまうのがベター

クロバットは情弱か金持ち。以上。

【Mac】SSDの空き容量を増やす

Macbookの空き容量が35GBまで減っていたので、何とかして空き容量を増やす努力をした。

そのときの備忘録。

f:id:geniusium:20210528212137p:plain
ストレージ内訳

目次

環境

再起動

まずは再起動してみる。キャッシュ的なものが消されるはず。

今回の私の場合、再起動するだけで空き容量が30GB増えた。

システム環境から

ツールバー左上のリンゴマークでクリックして「このMacについて」を開く。

「ストレージ」タブの「管理...」を開いて、要らないファイルを探す。

iOSファイル

iOS端末のバックアップファイル。かなりデカイ。

もう使ってない端末のものがあれば消すといい。

デベロッパ

xcodeキャッシュ とかいう9GBがあったので消した。

/Users/<user_name>/Library/

/Users/<user_name>/Library/Developer/CoreSimulator/Caches/

9.3GB

これ多分、上で消したxcodeのキャッシュ。

消そうと思ったら既になかったので、多分上で消したのがこれ。

/Users/<user_name>/Library/Caches

1.5GB

アプリの名前が付いたディレクトリたちがたくさん。

消そうと思ったら、パーミッションエラーで以下の3つだけ残った;

CloudKit/
com.apple.ap.adprivacyd/
com.apple.HomeKit/ 

また、しばらくすると以下のファイルが再生成された;

com.apple.nsservicescache.plist

他は全部消えた。

/private/var/folders/

/private/var/folders/9j/yknxhwbd6y98skgxjdm3yskm0000gn/C/

の中にデカいファイルがある。

C/com.apple.appstore/

/private/var/folders/9j/yknxhwbd6y98skgxjdm3yskm0000gn/C/com.apple.appstore/

57.8GB

.pkg ファイルと preflight.pfpkg というファイルが入ったフォルダがたくさんある。

pkg ファイルを起動してみると、どれもxcodeインストーラだった。

これが大きなファイルサイズを持っている。

他には、flyingIcon だけが入ったフォルダと、flyingIconpreflight.pfpkg の入ったフォルダがある。

以上のフォルダの名称はいずれもデタラメな数字・アルファベット・ハイフンのみから構成されている。

それ以外のものは以下の4つ;

.DS_Store 
com.apple.scriptmanager2.le.cache
manifest.plist
mds/

多分不要なので、全部消す。

C/com.apple.desktoppicture/

/private/var/folders/9j/yknxhwbd6y98skgxjdm3yskm0000gn/C/com.apple.desktoppicture/

3.1GB

.png ファイルがいっぱい入ってる。

多分、過去にデスクトップに設定した画像たちが入ってるんじゃないかと予想する。

多分、全部消してよし。

/System/Library

結論から言えば、ここディレクトリは触らない。

ただし、/System/Library/Caches/ はキャッシュファイルなので消してもいい。

今回は10MBしか溜まっていなかったケド。

/System/Library/dyld/

4.0GB

中にはファイル名に cache が含まれるファイルがいくつか入ってる。

しかし、どうやらこれは消さない方が良いらしい。

discussions.apple.com

なので、これは消さない。

/System/Library/AssetsV2

10.4GB

フォントが入ってるっぽい。消さない。

/System/Library/Speech

2.2GB

多分Siriの音声ファイル。消さない。

/System/Library/PrivateFrameworks

2.0GB

何なのかわからない。消さない。

/System/Library/Desktop Pictures

1.1GB

OS標準のデスクトップ画像。消さない。

他にもいっぱいディレクトリがあるが調べてない。消さない。

終わりに

結局、xcodeが悪さしてた感じ。

以上いろいろ消して、空き容量が 35GB から149 GB になった。

めでたしめでたし。

ちなみに

ちなみに、ファイルブラウズはOmniDiskSweeperというアプリを使うと便利。

ファイルサイズが表示されてソートもされるので消すべきファイルを探しやすい。

【CSS】画像がはみ出るときは中央に寄せる

ページの幅が小さくなったときに画像がはみ出る場合に、上左で合わせるのではなく中央に合わせる方法です。

下の埋め込みのResultだとページの幅を変えられないので、右上の「EDIT ON CODEPEN」をクリックして編集ページでウインドウ幅を変えてみてください。。

See the Pen centering overflow image by nakasu (@znuko) on CodePen.

画像をピッタリ納めたい場合は、表示領域の高さと画像自体の高さを揃えてください。

img タグではもう height は指定できないので、画像編集ソフトであらかじめ画像のサイズを調整しないとダメみたいです。

もっと賢い方法があったら教えてください。

追記

backgroud-image で設定する方法がありました。

テキストを重ねるのも簡単なので、こっちの方がいいかも。

See the Pen centering overflow background-image by nakasu (@znuko) on CodePen.

参考

teamtreehouse.com

www.sejuku.net

ニコ動のDL方法【2021】

特にツールを使わずともニコ動の動画をDLできるので、その方法を紹介します。

環境

  • 2021年5月時点でまだ有効
  • PCのブラウザで

方法

動画ページをブラウザで開き、動画部分を右クリック。

表示されるメニューから「視聴方法の切替(https > hls)」をクリック。

もう一度動画を右クリックし、今度は「視聴方法の切替(hls > https)」と表示されていることを確認。

メニューから「システムメッセージを開く」をクリックするとログが表示されるので、一番下までスクロール。

[2021/05/16 21:05:06] 動画の読み込みを開始しました。(https://○○)

と表示されているところのURLをコピーして、新規タブで開く。

すると、単なる動画だけのページが表示されるので、あとは動画を右クリックして表示されるメニューから動画を保存することができる。

おわりに

以上、ツールを用いずとも動画をDLする方法を示したが、まあ面倒なのでワンクリックでそれが実行できるようなブラウザの拡張ツールとかあったら教えてください。

良いネットライフを。

【Windows】マウスのスクロールの向きを反転させる

MacWindowsでは、標準のマウスのスクロールの向きが逆になっている。 Macの場合はシステム環境設定からボタン一つで好きな向きに変更できるが、Windowsはアホなのでシステム設定から簡単に変更する方法は用意されていない。

ワイはマカーだけど研究室のPCが窓でなんか気持ち悪かったので、窓でもmac標準に合わせるように変更する方法を調べたので書き留めておく。

以下では、レジストリエディタで頑張って設定する方法と、autohotkeyというツールを用いる方法の2つを紹介する。

環境

レジストリエディタで頑張って変更する方法

PC画面の左下にある窓(windowsボタン)を右クリックして、「デバイス マネージャー」を起動。

下のキャプチャのように、「マウスとそのほかのポインティングデバイス」を展開し「HID準拠マウス」をクリック。

f:id:geniusium:20210331154456p:plain

(3つあってどれ選べばいいかよくわからんけど、その辺はテキトーにやる)

すると、次のようなウィンドウが開くので、プロパティを「デバイス インスタンス パス」に変更して表示される値を覚えておく(あとで使うのでコピーしておく)。

f:id:geniusium:20210331154511p:plain

次に、 win + Rキーバインドで表示される検索窓に regedit と入力してエンター。

すると、レジスタエディタというものが開く。

ツールバー(「ファイル」「編集」「表示」などとあるところ)の下のパス入力欄に、下記文字列とそれに続けて先ほど覚えておいた値を入力する。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\

今回の私の場合では、さっきの「デバイス インスタンス パス」の値は以下のような感じであった;

HID\VID_046D&PID_C065\6&20CE9F44&0&0000

つまり、下記パスを開くことになる;

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\VID_046D&PID_C065\6&20CE9F44&0&0000

すると、下記キャプチャのようなところが展開される;

f:id:geniusium:20210331155104p:plain

さらに、左側のところから「Device Parameters」を開く;

f:id:geniusium:20210331155112p:plain

その後、右側のところの「FlipFlopWheel」をダブルクリックすると、次のようなウィンドウが開く;

f:id:geniusium:20210331155129p:plain

デフォルトでは「値のデータ」のところが 0 になっているはずだが、それを 1 に変更して「OK」をクリック。

以上の操作で、マウスのスクロールの向きが反転したはずである。(再起動が必要だったかもしれない)

AutoHotkeyを使う

AutoHotkeyというツールをインストールすれば、スクリプトを書くことで簡単にスクロール方向を反転できる。

下記の公式サイトからAutoHotkeyをインストール;

www.autohotkey.com

インストールできたら、メモ帳でもなんでもいいので何かエディタを開いて、下記のスクリプトをコピペする;

WheelUp::
Send {WheelDown}
Return

WheelDown::
Send {WheelUp}
Return

#x::ExitApp ; Win+X

ファイル名は、例えば inverseWheelDirection.ahk のようにして .ahk という拡張子で保存する。

後は先ほど作成したファイルをダブルクリックで起動すれば、マウスのスクロールの向きが反転しているはずである。

このスクリプトを終了するにはキーバインド win + X を入力すればいい。

この終了のキーバインドは上記スクリプトの最終行で指定しているので、各自好きなものに変更すれば良い。

ドキュメントは公式サイトにある。

以上、お疲れ様でした。

参考

ja.compbs.com