Corredor

ウェブ、プログラミングの勉強メモ。

Ruby でテキストファイルの読み書き基礎

Ruby でテキストファイルの読み書きをしてみる。

ファイルの読み込み

ファイルを読み込んで出力するコードはこんな感じ。

#!/usr/bin/ruby

# ファイルをオープンして1行ずつ表示しクローズ
file = File.open('./text.txt', 'r');

file.each do |line|
  puts(line);
end

file.close();

以下はファイルオープンから一括で中身を読み取る場合。この場合、file.close() を呼ばなくとも end の時点で自動的にクローズされる。

#!/usr/bin/ruby

File.open('./text.txt', 'r') do |file|
  puts(file.read());
end

File.open() の第2引数で指定している 'r' は読み込みモードの指定。以下のように、読み込みモードと外部エンコーディング (対象ファイル)・内部エンコーディング (本スクリプト) を細かく指定して読み込んだりもできる。

file = File.open('./text.txt', mode = 'r:utf-8:utf-8');

ファイル書き込み

ファイルに書き込む場合は、'r' ではなく 'w' (新規書き込み) や 'a' (追記) といったモードでファイルをオープンすれば良い。

'w' は新規ファイル生成し、書き込んでいく。既に対象ファイルが存在する場合は、既存の中身は全て削除される。

File.open('./dest.txt', 'w') do |file|
  file.puts('Hello World');
end

'a' は追記。既存ファイルの内容はそのままに、その末尾にテキストを追加していける。

File.open('dest.txt', 'a') do |file|
  file.puts('Hello World');
end

以上。簡単だがファイルの読み書きができた。

たのしいRuby 第6版 (Informatics&IDEA)

たのしいRuby 第6版 (Informatics&IDEA)

Mac でも Windows のタスクバーみたいにカレンダー付き時計を表示する「Day-O 2」

Windows のタスクバーにある時刻をクリックすると、月表示のカレンダーが開く。

f:id:neos21:20190515134733p:plain

一方 MacOS の標準時計にはそのような機能はない。

f:id:neos21:20190515134931p:plain

カレンダーを見るためだけにターミナルを開いて $ cal と打って確認するのも面倒な時がある。

そこで、Windows 同様、クリックするとカレンダーが表示できるメニューバーを配置するためのフリーソフト「Day-O 2」を紹介する。

Day-O 2 は以下のページよりダウンロードできる。

DL した Zip ファイルを解凍し、出てきた .app ファイルを Applications に移して起動する。

起動すると、メニューバーに Day-O 2 の日付表示が現れるが、恐らくは既存のアイコン群の一番左に配置されるかと思う。メニューバーのアイコンの並びは、Command キーを押しておいてからアイコンをドラッグすれば移動できるので、右端に移動しておこう。そして、標準の時刻表示は「システム環境設定」の「日付と時刻」より「メニューバーに日付と時刻を表示」のチェックを外すことで非表示にすれば、Day-O 2 が標準の時計の代わりになってくれる。

f:id:neos21:20190515134940p:plain


似たようなアプリは他にもいくつかあるようだ。

App Store よりダウンロードできる Mini Calendar は、デスクトップ上、ドックアイコン、メニューバーのどこにでも配置できるのだが、月日のゼロパディングや表示書式の細かな設定ができないので個人的にはちょっと微妙。気にならない人ならコチラでも良いかも。

f:id:neos21:20190515134949p:plainf:id:neos21:20190515135000p:plain


以上。コレで少し Mac の時刻確認が便利になった。

今すぐ使えるかんたん Mac 完全ガイドブック

今すぐ使えるかんたん Mac 完全ガイドブック

はじめてのマック 2019 (Mac Fan Special)

はじめてのマック 2019 (Mac Fan Special)

開いているページのタイトルと URL をクリップボードにコピーするブックマークレット

Twitter 投稿やメール送信用に、開いているページのタイトルと URL をコピーしたいことがあったので作った。

いきなりだがブックマークレットは以下のとおり。

javascript:((d,e)=>{e=d.createElement('textarea');e.textContent=d.title+' '+d.URL;d.body.appendChild(e);e.select();d.execCommand('copy');d.body.removeChild(e)})(document);

セルフ Uglify したもので、圧縮前のコードはこんな感じ。

((d, e) => {
  e = d.createElement('textarea');
  e.textContent = d.title + ' ' + d.URL;
  d.body.appendChild(e);
  e.select();
  d.execCommand('copy');
  d.body.removeChild(e);
})(document);

テキストエリアを作り、そこにコピーしたい文字列を書いておく。一度ページに埋め込んだら、テキストエリアを選択してコピーし、要素を削除して終わり。

document.execCommand('copy') は、コピーに成功すると true を返すので、戻り値をチェックして処理を変えたりしても良いだろう。

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで

スラスラ読める JavaScript ふりがなプログラミング (ふりがなプログラミングシリーズ)

スラスラ読める JavaScript ふりがなプログラミング (ふりがなプログラミングシリーズ)

Bash で一括リネームするアイデア

Bash でファイルを一括リネームしたく、やり方を調べていた。

今回リネームしたいファイル群は、

01 hoge.png
02 fuga.png
03 foo.png
04 bar.png

…と、こんな風に「連番 + テキスト」となっている画像ファイルで、「テキスト」部分を除去して連番のみのファイル名に変えたいと考えていた。

で、色々調べていて行き着いたのは、以下のようなやり方。

$ find . -name '*.png' | sed -e 's/\([0-9][0-9]\)\(.*\)/"\1\2" "\1.png"/' | xargs -n 2 mv

やっていることは以下のとおり。

  1. find で元のファイル名を取得する
  2. sed"01 hoge.png" "01.png" という文字列を作る
    • ココがミソ。正規表現の書き方はイマイチでも、とにかく "変更前ファイル名" "変更後ファイル名" という文字列を作れればいい
    • スペースを含むファイルを正しく解釈するよう、ダブルクォートで囲んでいる
  3. xargs-n オプションを使い、引数に2つの値を渡して mv を実行する
    • sed で整形した文字列と組み合わせると mv "01 hoge.png" "01.png" というコマンドになり、リネームができる

というワケ。

xargs を使って引数を2つ渡す、という発想がなかったのと、sed で「変更前」「変更後」を組み立てておいちゃえば良い、という考えに至らず。正規表現は時々に応じて適当に頑張るとして、構造としては分かりやすいと思う。

[改訂第3版]Linuxコマンドポケットリファレンス

[改訂第3版]Linuxコマンドポケットリファレンス