【Git】コミット済みファイルを管理対象から除外する方法

Gitは一度ファイルを追跡すると、.gitignoreに追加しても追跡は継続されます。 .gitignoreに追加する前にコミットしてしまった。 リモートリポジトリにすでに追跡されているファイルの追跡をやめたい。 このような既にGitの管理対象になっているファイルの追跡を止めるには以下のコマンドを実行します。 ファイルの場合 git rm --cached <ファイル> ディレクトリの場合 git rm -r --cached <ディレクトリ> 【参考】 Git - git-rm Documentation How do I make Git forget about a file that was tracked, but is now in .gitignore? - Stack Overflow Git: Stop Tracking File After Adding to .gitignore How to Stop Git Tracking a File | Alpha Efficiency.™ gitの管理対象から特定のファイル、ディレクトリを削除する #Git - Qiita

9月 14, 2022

【iTerm2】現在のディレクトリのまま新規タブを開く

iTerm2のデフォルトでは、ホームディレクトリで新規タブが開かれます。 これを、元のタブと同じディレクトリで新規タブを開くように設定します。 1. 実行環境 iTerm2:3.4.16 2. 設定方法 Preference > Profile > Working Directory > Reuse previous session’s directory 以上で設定は終了です。 2-1. 追加設定 Advanced Configuration > Edit… 新規タブのほかに、新規ウィンドウとパネル分割時のディレクトリ設定が可能

9月 12, 2022

【Ruby】Sinatraでメモアプリを作る(DB編)

この記事では、RubyのWebアプリケーションフレームワークであるSinatraを使って、シンプルなメモアプリを作成します。 データ保存先のDBにはPostgreSQLを使用します。 今回は、以下の記事で作成したメモアプリのデータ保存先をPostgreSQLに変更します。 【Ruby】Sinatraでメモアプリを作る(JSONファイル編) | あまブログ PostgreSQLのインストール方法は以下を参照ください。 【macOS】PostgreSQLの基本操作 | あまブログ 1. 実行環境 macOS:12.5 Ruby:3.1.0 Bundler:2.3.12 PostgreSQL:14.3 sinatra:2.2.2 webrick:1.7.0 sinatra-contrib:2.2.2 pg:1.4.3 2. 手順 2-1. pgのインストール RubyからPostgreSQLを使うために必要なgem、pgをインストールします。 Gemfileに以下を追加します。 + gem "pg" gem "sinatra" 以下のコマンドを実行してgemをインストールします。 $ bundle install 2-2. DB接続とテーブル定義 memo.rbでpgを使えるようにします。 - require 'json' + require 'pg' memo.rbの以下の部分を削除します。 FILE_PATH = 'public/memos.json' def get_memos(file_path) File.open(file_path) { |f| JSON.parse(f.read) } end def set_memos(file_path, memos) File.open(file_path, 'w') { |f| JSON.dump(memos, f) } end memo.rbに以下を追加します。 def conn @conn ||= PG.connect(dbname: 'postgres') end configure do result = conn.exec("SELECT * FROM information_schema.tables WHERE table_name = 'memos'") conn.exec('CREATE TABLE memos (id serial, title varchar(255), content text)') if result.values.empty? end PG.connectでDBに接続し、インスタンス変数@connに接続情報をキャッシュ configurationにはアプリ起動時に一度だけ行う処理を記述 PostgreSQLのシステムテーブルtablesからmemosテーブルの存在を確認 if result.values.empty?でmemosテーブルがなければテーブルを作成 2-3. メモ一覧の表示 memo.rbに以下を追加します。 ...

8月 19, 2022

【Ruby3.1】wcコマンドを作る

この記事では、RubyでLinuxのwcコマンドを実装する方法を解説します。 gemを使わずにRubyの標準ライブラリのみで実装します。 1. 実行環境 macOS:12.5 Ruby:3.1.0 2. 作成するwcコマンドの要件 オプションなし 標準入力とファイルの入力を受け取る -cオプション -lオプション -wオプション 単語の区切り文字は半角スペース、タブ、改行のみに対応 以下の機能は実装の対象外とします。 ノーブレークスペースを含むマルチバイト文字の対応 3. wcコマンドの仕様 macOS標準のwcコマンドの仕様は以下の通りです。(ソースコードはこちら) (今回の要件に必要な箇所のみ) 引数なし 標準入力を受け取る Ctrl + D(EOF)を受け取るまで入力を受け付ける 引数にファイルを指定 ファイルを受け取る 複数ファイルを指定した場合、出力の最終行に各ファイルの合計を表示 <合計の行数> <合計の単語数> <合計のバイト数> total オプションなし <行数> <単語数> <バイト数> <ファイル名>の順で表示 -cオプション バイト数を表示する -lオプション 行数を表示する(改行コードの数) -wオプション 単語数を表示する 半角スペース、タブ、改行で区切られた文字列の数(全角スペースはmacOS標準のwcコマンドも非対応) 4. ソースコード ver1:自作→レビュー反映 ver2:ver1→他の人のコードを反映 4-1. ver1 #!/usr/bin/env ruby # frozen_string_literal: true require 'optparse' def exec options = parse_options options = { c: true, l: true, w: true } if options.empty? paths = ARGV paths.empty? ? display_word_count_from_stdin(options) : display_word_count_from_files(paths, options) end def parse_options opt = OptionParser.new options = {} opt.on('-c') opt.on('-l') opt.on('-w') opt.parse!(ARGV, into: options) options end def display_word_count_from_stdin(options) lines = $stdin.readlines word_count_map = build_word_count_map(lines) display_word_count(word_count_map, options) end def build_word_count_map(lines, path = '') { number_of_lines: count_line(lines), number_of_words: count_word(lines), bytesize: count_bytesize(lines), path: path } end def count_line(lines) lines.size end def count_word(lines) lines.sum { |line| line.split(/[ \t\n]+/).size } end def count_bytesize(lines) lines.sum(&:bytesize) end def display_word_count(word_count_map, options) word_counts = [] word_counts << format_word_count(word_count_map[:number_of_lines]) if options[:l] word_counts << format_word_count(word_count_map[:number_of_words]) if options[:w] word_counts << format_word_count(word_count_map[:bytesize]) if options[:c] word_counts << " #{word_count_map[:path]}" unless word_count_map[:path].empty? puts word_counts.join end def format_word_count(word_count) word_count.to_s.rjust(8) end def display_word_count_from_files(paths, options) word_count_maps = build_word_count_maps(paths) word_count_maps.map { |word_count_map| display_word_count(word_count_map, options) } display_total_word_count(word_count_maps, options) if paths.size >= 2 end def build_word_count_maps(paths) paths.map do |path| lines = File.readlines(path) build_word_count_map(lines, path) end end def display_total_word_count(word_count_maps, options) total_word_count_map = build_total_word_count_map(word_count_maps) display_word_count(total_word_count_map, options) end def build_total_word_count_map(word_count_maps) { number_of_lines: word_count_maps.sum { |word_count_map| word_count_map[:number_of_lines] }, number_of_words: word_count_maps.sum { |word_count_map| word_count_map[:number_of_words] }, bytesize: word_count_maps.sum { |word_count_map| word_count_map[:bytesize] }, path: 'total' } end exec 4-2. ver2 #!/usr/bin/env ruby # frozen_string_literal: true require 'optparse' def exec options = parse_options options = { c: true, l: true, w: true } if options.empty? paths = ARGV counts = build_counts(paths: paths) counts.map { |count| display_count(count: count, options: options) } display_total_count(counts: counts, options: options) if paths.size >= 2 end def parse_options opt = OptionParser.new options = {} opt.on('-c') opt.on('-l') opt.on('-w') opt.parse!(ARGV, into: options) options end def build_counts(paths:) if paths.empty? [build_count(text: $stdin.read)] else paths.map do |path| build_count(text: File.read(path), path: path) end end end def build_count(text:, path: '') { line_count: text.count("\n"), word_count: text.split(/\s+/).size, bytesize: text.bytesize, path: path } end def display_count(count:, options:) formatted_counts = [] formatted_counts << format_count(count: count[:line_count]) if options[:l] formatted_counts << format_count(count: count[:word_count]) if options[:w] formatted_counts << format_count(count: count[:bytesize]) if options[:c] formatted_counts << " #{count[:path]}" unless count[:path].empty? puts formatted_counts.join end def format_count(count:) count.to_s.rjust(8) end def display_total_count(counts:, options:) total_count = build_total_count(counts: counts) display_count(count: total_count, options: options) end def build_total_count(counts:) { line_count: counts.sum { |count| count[:line_count] }, word_count: counts.sum { |count| count[:word_count] }, bytesize: counts.sum { |count| count[:bytesize] }, path: 'total' } end exec 【参考】 ...

8月 18, 2022

【Ruby】rbenvのよく使うコマンド一覧

この記事ではrbenvのよく使うコマンドを紹介していきます。 1. バージョン確認 1-1. 現在使用中のRubyのバージョンを表示 $ rbenv version 1-2. インストール済みのRubyのバージョンを表示 $ rbenv versions ~/.rbenv/versionsのRubyのバージョンを表示 2. インストール 2-1. インストール可能なRubyの最新安定版のバージョンを表示 $ rbenv install -l/--list 2-2. インストール可能なRubyの全バージョンを表示 $ rbenv install -L/--list-all 2-3. Rubyのインストール $ rbenv install <version> ~/.rbenv/versionsにインストールされる 2-4. Rubyのアンインストール $ rbenv uninstall <version> 3. バージョン指定 バージョンの優先順位 環境変数: RBENV_VERSION ローカル :rbenv local <version> グローバル:rbenv global <version> 3-1. デフォルトで使用するRubyのバージョンを指定 $ rbenv global <version> ~/.rbenv/versionが作成され、グローバルに設定したRubyのバージョンが書き込まれる 3-2. カレントディレクトリで使用するRubyのバージョンを指定 $ rbenv local <version> カレントディレクトリに.ruby-versionが作成され、ローカルに設定したRubyのバージョンが書き込まれる rbenv local --unsetで解除 3-3. シェル単位で使用するRubyのバージョンを指定 $ rbenv shell <version> 環境変数$RBENV_VERSIONに指定したRubyのバージョンがセットされる rbenv shell --unsetで解除 4. その他 4-1. rbenvのバージョンを表示 $ rbenv -v 4-2. rbenvとruby-buildのアップグレード $ brew upgrade rbenv ruby-build 上記はHomebrewのコマンド rbenv install -lでRubyの最新安定版のバージョンが表示されない時はrbenvとruby-buildの更新が必要かも 4-3. rbenvのヘルプを表示 $ rbenv -h 4-4. rbenvのコマンド詳細情報を表示 $ rbenv help <command> 【参考】 ...

8月 16, 2022

【Mac】VSCodeのショートカットキーまとめ

この記事ではMacユーザー向けに、Visual Studio Codeのキーボードショートカットの中から特に使用頻度の高いものを紹介していきます。 1. 一般 操作 ショートカット コマンドパレットを開く shift + ⌘ + P クイックオープン ⌘ + P 新規ウィンドウを開く shift + ⌘ + N ウィンドウを閉じる ⌘ + W ユーザー設定を開く ⌘ + , キーボードショートカットを開く ⌘ + K→⌘ + S 2. 基本的な編集 操作 ショートカット 行を下に移動/上に移動 option + ↓ / option + ↑ 行の下にコピー/上にコピー shift + option + ↓ / shift + option + ↑ 行の削除 shift + ⌘ + K 行を下に挿入/上に挿入 ⌘ + Enter / shift + ⌘ + Enter 一致する括弧にジャンプ shift + ⌘ + \ 行のインデント/アウトデント ⌘ + ] / ⌘ + [ コードを折りたたむ/展開する option + ⌘ + [ / option + ⌘ + ] 行コメントの切り替え ⌘ + / 補完機能をトリガー control + space ⌘ + I 3. マルチカーソルと選択 操作 ショートカット カーソルの挿入 option + クリック カーソルを下へ挿入/上へ挿入 option + ⌘ + ↓ / option + ⌘ + ↑ 現在の行を選択 ⌘ + L 選択中の文字列と一致する文字列を全て選択 shift + ⌘ + L 矩形選択 shift + option + マウスドラッグ shift + option + ⌘ + ↑ / ↓ / ← / → 4. 検索と置換 操作 ショートカット 検索 ⌘ + F 置換 option + ⌘ + F 検索結果の次に移動/前に移動 ⌘ + G / shift + ⌘ + G Enter / shift + Enter マッチした文字列を全て選択 option + Enter 5. ナビゲーション 操作 ショートカット 指定行へ移動 control + G 問題パネルを開く shift + ⌘ + M パネルの表示/非表示切り替え ⌘ + J 6. エディタの管理 操作 ショートカット エディタを閉じる ⌘ + W フォルダを閉じる ⌘ + K → F エディタを垂直分割 ⌘ + \ 7. ファイル管理 操作 ショートカット 新規ファイル ⌘ + N ファイルを開く ⌘ + O 保存 ⌘ + S 閉じたエディタを開く shift + ⌘ + T アクティブなファイルを新しいウィンドウに表示する ⌘ + K → O 最近開いた項目 control + R 8. 表示 操作 ショートカット エディタレイアウトの切り替え(水平/垂直) option + ⌘ + 0 サイドバーの表示/非表示の切り替え ⌘ + B 出力パネルの表示 shift + ⌘ + U Markdownプレビューをサイドに表示 ⌘ + K → V Markdownプレビューを新規ファイルとして表示 shift + ⌘ + V ターミナルを表示する control + ` 新しいターミナルを作成する control + shift + ` 9. その他 9-1. ユーザが作成したショートカットキーのみを表示する方法 キーボードショートカットエディターの検索欄に@source:userを入力する ...

8月 12, 2022

【Ruby】Sinatraでメモアプリを作る(JSONファイル編)

この記事では、RubyのWebアプリケーションフレームワークであるSinatraを使って、シンプルなメモアプリを作成します。 データの保存先にはDBを使わず、JSONファイルを使用します。 1. 実行環境 macOS:12.5 Ruby:3.1.0 Bundler:2.3.12 sinatra:2.2.2 webrick:1.7.0 sinatra-contrib:2.2.2 2. メモアプリの要件 以下のメモアプリを作成します。 機能 メモの作成 メモの編集 メモの削除 メモ一覧の表示 特定のメモの表示 3. 作成手順 以下の手順で進めていきます。 設計 実装 改良 3-1. 設計 まずはアプリケーションの設計を行います。 3-1-1. URI設計 RESTfulなURI設計として、今回は以下のURIを使用します。 Method Path Description GET /memos メモ一覧を表示 GET /memos/new メモ作成画面を表示 GET /memos/{memo_id}/edit メモ編集画面を表示 POST /memos メモを作成 GET /memos/{memo_id} 特定のメモを表示 PATCH /memos/{memo_id} 特定のメモを編集 DELETE /memos/{memo_id} 特定のメモを削除 3-1-2. ディレクトリ設計 ディレクトリ構成は以下のようになります。 memo-app/ - public/ - memos.json # データ保存先 - views/ - edit.erb # メモ編集画面 - index.erb # メモ一覧表示画面 - layout.erb # 各ビューの共通部分 - new.erb # メモ作成画面 - show.erb # 特定のメモ表示画面 - memo.rb # ルーティング定義 3-2. 実装 次にメインの機能の実装を行います。 ...

8月 8, 2022

【Ruby3.1】lsコマンドを作る

この記事では、RubyでLinuxのlsコマンドを実装する方法を解説します。 gemを使わずにRubyの標準ライブラリのみで実装します。 OOP版はこちら↓ 【Ruby3.1】lsコマンドを作る(OOP版) - あまブログ 1. 実行環境 macOS:12.5 Ruby:3.1.0 2. 作成するlsコマンドの要件 今回はlsコマンドの以下の機能を実装の対象とします。 オプションなしのlsコマンド 横に最大3列を維持して表示 ファイルの並び順は列ごとに辞書式順序にソートされる -aオプション -rオプション -lオプション ファイルの並び順 # OK 0 4 8 1 5 9 2 6 3 7 # NG 0 1 2 3 4 5 6 7 8 9 以下の機能は実装の対象外とします。 引数にファイルやディレクトリを指定可能にする mac拡張属性(@マーク)の表示 3. lsコマンドの仕様 macOS標準のlsコマンドの仕様は以下の通りです。(ソースコードはこちら) (今回の要件に必要な箇所のみ) 引数なし カレントディレクトリの内容を表示 -aオプション ファイル名が.で始まるファイルを含めて表示 -lオプション ディレクトリ内の各ファイルのブロック数の合計を1行目に表示(total <blocks>) 2行目以降に各ファイルをロングフォーマットで表示 -rオプション 逆順で表示 3-1. ロングフォーマットについて -lオプション指定時に表示される以下のような形式をロングフォーマットと呼びます。 dr-xr-xr-x 3 root wheel 4539 7 30 07:10 dev ロングフォーマットに含まれるファイルの情報(属性)は以下の7つです。 ファイルタイプとファイルモード ハードリンク数 所有者名 グループ名 ファイルサイズ タイムスタンプ ファイル名 3-1-1. ファイルタイプとファイルモード ファイルタイプとファイルモードを10桁のアルファベットで表示(drwxr-xr-x) 1桁目:ファイルタイプ 2桁目~10桁目:ファイルモード File::Stat#ftypeでファイルタイプを取得 File::Stat#modeでファイルモードを取得 lsコマンドの-lオプションで表示されるファイルタイプとファイルモードの詳細については以下の記事を参照ください。 ...

8月 4, 2022

【Ruby】File::Stat#modeが返すファイルモードの数値を記号表記に変換する

この記事では、RubyのFile::Stat#modeが返すファイルモードの数値と、記号表記(symbolic notation)の対応を解説します。 ファイルモードの記号表記については以下の記事を参照ください。 【ls -l】ファイルタイプとファイルモードの記号の意味 | あまブログ 1. File::Stat#modeが返す値 fs = File::Stat.new('sample.txt') p fs.mode #=> 33188 p fs.mode.to_s(8) #=> "100644" File::Stat#modeはファイルモードを10進数の数値で返します。(33188) これを意味のわかるものにするためには、8進表記の文字列に変換する必要があります。("100644") 2. 8進表記と記号表記の対応 ここからは8進表記の文字列と記号表記の対応を解説していきます。 先ほど出てきた100644を記号表記に変換すると以下のようになります。 8進表記 記号表記 100644 -rw-r--r-- この6桁の8進表記はそれぞれの桁ごとに以下の意味を持ちます。 1~2桁目:ファイルタイプ 3桁目:特殊権限 4桁目:所有者の権限 5桁目:グループの権限 6桁目:その他のユーザの権限 以降で8進表記の各桁と記号表記の対応について詳しく解説していきます。 1~2桁目:ファイルタイプ File::Stat#modeが返す6桁の8進表記の1~2桁目はファイルタイプを表します。 ファイルタイプの8進表記と記号表記の対応は以下のようになります。 8進表記 記号表記 ファイルタイプ 01 p 名前付きパイプ(FIFO) 02 c キャラクタデバイス(Character special file) 04 d ディレクトリ(Directory) 06 b ブロックデバイス(Block special file) 10 - 通常ファイル(Regular file) 12 l シンボリックリンク(Symbolic link) 14 s ソケット(Socket link) 3桁目:特殊権限 File::Stat#modeが返す6桁の8進表記の3桁目は特殊権限を表します。 ...

8月 4, 2022

【ls -l】ファイルタイプとファイルモードの記号の意味

この記事ではLinuxのlsコマンドの-lオプションで表示されるファイルタイプとファイルモードの記号の意味を解説します。 ls -lコマンドを実行すると、以下のようなファイルの詳細情報が表示されます。 $ ls -l -rw-r--r-- 1 uname staff 0 11 28 12:31 default.txt drwxr-xr-x 2 uname staff 64 11 28 11:55 default_dir 各行の先頭に表示される-rw-r--r--やdrwxr-xr-xのような10桁の記号は、そのファイルのファイルタイプとファイルモードを表します。 1桁目:ファイルタイプ 2桁目~10桁目:ファイルモード 以降では、ファイルタイプとファイルモードの記号の意味を解説していきます。 1. ファイルタイプ ls -lで表示される10桁の記号のうち1桁目はファイルタイプを表します。 ファイルタイプを表す記号の種類は以下の7つです。 記号 ファイルタイプ b ブロックデバイス(Block special file) c キャラクタデバイス(Character special file) d ディレクトリ(Directory) l シンボリックリンク(Symbolic link) s ソケット(Socket link) p 名前付きパイプ(FIFO) - 通常ファイル(Regular file) 2. ファイルモード ls -lで表示される10桁の記号のうち2桁目~10桁目はファイルモードを表します。 このファイルモードは以下の3文字×3組で表されます。 3文字(権限なし:-) r:読み込み w:書き込み x:実行 3組 所有者(owner) グループ(group) その他のユーザ(other) 例えばファイルモードがrwxr-xr-xの場合、所有者は読み込み・書き込み・実行の全てを許可(rwx)、グループは読み込み・実行を許可(r-x)、その他のユーザも読み込み・実行を許可(r-x)という意味になります。 2-1. 特殊権限(スティッキービット、SGID、SUID) ファイルモードを表す記号には前述のr,w,x,-以外に、特殊権限を表す記号があります。 ...

8月 3, 2022