「ENUM」を含む日記 RSS

はてなキーワード: ENUMとは

2024-08-17

anond:20240817015407

依存関係は木で表現

ノードロック持たせる

ロックに条件持たせる

やりたいことはできてるように見えるが、うーんしんどい

# Entity Relation Diagram
# ```mermaid
# ---
# title: Rental Office example
# ---
# erDiagram
# OFFICE ||--|{ ROOM : x
# OFFICE {
# number office_id
# }
# ROOM {
# number office_id
# number room_id
# }
# ROOM ||--|{ SCHEDULE : x
# SCHEDULE {
# number room_id
# datetime start_at
# datetime end_at
# }
# OFFICE ||--|{ BUSINESS_HOUR : x
# BUSINESS_HOUR {
# number office_id
# enum week_of_day
# datetime start_at
# datetime end_at
# }
# ```

# Directed Acyclic Graph
#
# ```mermaid
# graph LR
# A[OFFICE] --> B[ROOM]
# B --> C[SCHEDULE]
# A[OFFICE] --> D[BUSINESS_HOUR]
# D --> C
# A --> C
# ```


# 基底クラス: EntityLock
class EntityLock
attr_accessor :entity_name, :entity_locked, :attribute_locks

def initialize(entity_name)
@entity_name = entity_name
@entity_locked = false # エンティティ全体のロック状態を保持
@attribute_locks = {} # IDに対するロック管理するハッシュ
end

def lock_entity
@entity_locked = true
puts "Entity '#{@entity_name}' is now locked."
end

def unlock_entity
@entity_locked = false
puts "Entity '#{@entity_name}' is now unlocked."
end

def lock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && !@attribute_locks[entity_id]
@attribute_locks[entity_id] = true
puts "#{@entity_name} with ID '#{entity_id}' is now locked."
end
end

def unlock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
@attribute_locks.delete(entity_id)
puts "#{@entity_name} with ID '#{entity_id}' is now unlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked

# 次に特定IDロックされているかチェック
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
return true
end

# ロックされていなければfalseを返す
false
end
end

# 子クラス: OfficeLock, RoomLock, ScheduleLock
class OfficeLock < EntityLock
def initialize
super("Office")
end
end

class RoomLock < EntityLock
def initialize
super("Room")
end
end

class ScheduleLock < EntityLock
def initialize
super("Schedule")
end
end

# 子クラス: BusinessHourLock
class BusinessHourLock < EntityLock
def initialize
super("BusinessHour")
@attribute_locks = [] # BusinessHour用のロック配列管理
end

def lock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks << [start_at, end_at]
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now locked."
end
end

def unlock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if @attribute_locks.include?([start_at, end_at])
@attribute_locks.delete([start_at, end_at])
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now unlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked

# 次に特定時間範囲ロックされているかチェック
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks.each do |(locked_start, locked_end)|
if locked_start <= start_at &amp;&amp; end_at <= locked_end
return true
end
end
end

# ロックされていなければfalseを返す
false
end
end

# TreeNodeクラス
class TreeNode
attr_accessor :name, :children, :parents, :lock

def initialize(name, lock)
@name = name
@children = []
@parents = [] # 複数の親ノードを保持する配列
@lock = lock # TreeNodeにロックを持たせる
end

def add_child(child_node)
child_node.parents << self # 子ノードにこのノードを親として追加
@children << child_node
end

def display(level = 0)
indent = " " * (level * 4)
puts "#{indent}#{@name}"
@children.each { |child| child.display(level + 1) }
end

def has_dependency
return false if @parents.empty?

@parents.each do |parent|
puts "#{@name} is dependent on #{parent.name}"
return true
end

@parents.any?(&amp;:has_dependency)
end

def locked?(attributes = {})
# 自身ロックされているか確認
return true if @lock.locked?(attributes)

# 親ノードロックされているか再帰的に確認
@parents.any? { |parent| parent.locked?(attributes) }
end
end

# 木構造の組み立て

# ロックオブジェクト作成
office_lock = OfficeLock.new
room_lock = RoomLock.new
schedule_lock = ScheduleLock.new
business_hour_lock = BusinessHourLock.new

# ノード作成
office_node = TreeNode.new("Office", office_lock)
room_node = TreeNode.new("Room", room_lock)
schedule_node = TreeNode.new("Schedule", schedule_lock)
business_hour_node = TreeNode.new("BusinessHour", business_hour_lock)

# ノード間の依存関係の設定
office_node.add_child(room_node) # Office -> Room
room_node.add_child(schedule_node) # Room -> Schedule
office_node.add_child(business_hour_node) # Office -> BusinessHour
business_hour_node.add_child(schedule_node) # BusinessHour -> Schedule

# 木構造の表示
office_node.display

# ロック確認
puts "Case 1. Office全体がロックされた場合"
puts "Is office_node locked? #{office_node.locked?({})}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # false
office_lock.lock_entity
puts "Is office_node locked? #{office_node.locked?({})}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # true
office_lock.unlock_entity

puts "Case 2. Room id:1 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.lock({ "room_id" => 1 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.unlock({ "room_id" => 1 })

puts "Case 3. BusinessHour start_at:0 end_at:5 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.lock({ "start_at" => 0, "end_at" => 5 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.unlock({ "start_at" => 0, "end_at" => 5 })

2024-04-26

anond:20240426121548

拡張子については、例えば Excel拡張子が変わったとき一括対応できる、とか?

あとは普通に".txt" で取り扱ってるファイルはどれだ、って時にその定数の参照箇所を見ればもれなく分かるとか、

取り扱うファイル種別を段階的に変えようってときも、どのファイルは変え終わっててどのファイルはまだ、とかも同じように分かる

あとはあれだ、どのスコープにおける分類なんだって話を明確にする事も出来るだろうな。

const EXT_TEXT = ".txt";

const LOG_FILE_EXT = EXT_TXT;

とか。

パラメータについては、複数選択肢から選ぶ奴は enumしろよ、とは思うが、

enum の前段として内部的な数値表現統一する意味はある

文字コードも大体同じような話か。

まぁ基本的には、拡張子にせよ文字コードにせよ、

ここに定義したもの以外は登場しないよ、という保証をする事は出来るわな。

"UTF-8"を使っている事は Grep かければわかるが、"UTF-8"以外使ってません、の方はそうはいかないし

2023-12-16

6年付き合った年上の彼女と別れた

自分には6年付き合った年上の彼女がいた。名前PHP学生の時からの付き合いで、自分にとっては初めての彼女だった。付き合った当初は全てが新鮮で、オブジェクト指向やSOLID原則大事なことは全て彼女から教えてもらった。(そう思われるかもしれないが、)時間が経って彼女の魅力が感じられなくなってしまったということはなくて、彼女は歳をとっても魅力的なままだった。むしろreodonlyプロパティEnum、null safe演算子など、新しい機能が導入されてますます綺麗になっていったように思う。最近ではジェネリクスさえ導入されたようだ。彼女は本当に努力家だ。


(褒められた話ではないが一応、彼女以外の女性を全く知らなかったわけではなく、TypeScriptという若い子と少し遊んでいたこともある。TypeScriptは昔からの知り合いのJavaScriptの妹で、大雑把な姉と違って几帳面で、少しオタク気質もある個性的な子だった。よく新しい型パズルを考案して楽しそうに話してくれたが、自分には正直よく分からなかった笑。)


そんな中でも基本的には6年間PHPとずっと一緒に過ごしてきた。前述の通り彼女に何か不満があったわけではない。ただ、彼女との将来に不安を覚えるようになってしまっていた。周囲に彼女と付き合っていることを話すと、「え、まだPHPと付き合ってたんだ?(昔は人気だったけど、最近はそうでもないよね)」みたいなことを、彼女のことをよく知らない人から言われたりもした。そこまで直接的ではなかったけれど。自分も、彼女以外の女性のことをほとんど知らずにずっと彼女と付き合っていて大丈夫なのかななんて思ってしまったりしていた。



結局自分PHPと別れて、新しい女性と付き合う決断をした。新しい彼女名前Go彼女若いのに自分の芯がしっかりしていて、みんなの憧れの格好良い女性といった人だった。そんな彼女と付き合いだして、最初は戸惑うことも多かった。


例えばこんな感じだ。

「え、Goって三項演算子とかデフォルト引数はないの?」

「ええそうよ。どっちもif文や可長変引数を使えば実装できるじゃない。私は興味ないわ」


また、今まで当たり前だと思っていたPHPの良さに気づくことも多い。PHPStanを使えば静的型付け言語と同じように型安全性担保できていたし、彼女Web FWには歴史が長いだけあって痒いところまで手が届く様々な機能が完備されていた。経験豊富こちらの要望をなんでも受け止めてくれるような包容力があったことに今更気づいた。


とはいえいつまでも昔の彼女を引きずっていてもしょうがない。Goにはこちらに積極的に合わせてくれるような包容力はないが、彼女なりの哲学を持っていてそれ故の美しさがあると思う。そして正直、まだ彼女10分の1も理解できていない。彼女が得意だという並行処理や、実行速度が求められるような処理も、自分はまだ実際に実装したことはない。でもこれからしっかり向き合って、Goのことをもっと理解して、実りのある交際にしていきたいと考えている。PHPと別れてGoと付き合う決断したのは自分なのだから

2023-09-27

オブジェクト指向で学ぶ人生

Microsoft本社入り口に貼ってあるらしいコード

時は金なりという意味か?

    public class Person {
        BasicInfo info;
        float stock;
        float Value;
        public string Name(bool isSpy){
            return isSpy ? info.Name : info.Name.ToSecondName();
        }
        public string Sex(bool isNormal){
            return isNormal == info.isMan ? "Man" : "Woman";
        }
        public float Earn(bool isExtra = false){
            float sexPad = info.isMan ? 1f : 0.5f;
            float racePad = info.isWhite ? 1f : 0.5f;
            var delta = DateTime.Now - info.Birth;
            int age = (int)(delta.TotalDays / 365);
            float result = Value * sexPad * racePad * age;
            if(isExtra){
                Value += result;
            }
            return result;
        }
        enum Race{
            White, Black, Yellow
        };
        class BasicInfo{
            public string Name;
            public int NationalId;
            public bool isWhite;
            public bool isMan;
            public DateTime Birth;
            public BasicInfo(string Name, int NationalId, Race race, bool isMan){
                this.Name = Name;
                this.NationalId = NationalId;
                this.isWhite = race == Race.White;
                this.isMan = isMan;
                Birth = DateTime.Now;
            }
        }

2021-10-07

typescriptenum

日本で(?)やたら批判されてるけどaws-sdkも使ってるんだよね

代替案もeslint無視した微妙なのばっかだしなんなんだろう

自分が頭悪いのかなんなのか

2021-08-25

anond:20210825205300

おう!外部キー制約を語るとは、RDB勉強しているのだな?いい心がけだ。増田は外部キー制約があると「どんなメリットがあるか知りたい」のだな?良し、答えてやろう!外部キー制約があると「変なデータが入らない」ということが開発者が『保証』できるのだ。うん、それで?って増田は思うだろう。それで、実例を挙げるけど、sex というカラムを create で作ったときに、そこに insert into で入る値が「男」「女」「その他」というデータに限りたいとき設計者にあったとする。そうすると、「 insert するのは『チンポ』でしょ?」みたいなアホを防げるだろ?もちろん、limit みたいな副クエリ実装しても構わない場合もある。型を指定して、boolean にしたい場合もある。だが、「入るのはこれだけだと思うが、後に追加で変更できる」としたら、嬉しい場合があるのじゃ。まぁ、究極的に OOP関数型言語、または(古い)命令形言語だと、enum みたいなものなんだよ。いや、だとしたら、enum でよくね?って思うのなら、リプライくれ。答えるから

2021-07-14

anond:20210714091139

よく分からん

要は、Enumソース内で書くか

JSON で外に保持するかのどちらかって

話でいいのか?

2020-09-27

anond:20200927035510

言語によると思う

javaなら普通にオブジェクトEnum継承したインスタンスになるからその分メモリ使うし、enum内部で結局String持ってる(コンパイラStringEnumの子クラスコンストラクタに渡す)からStringの方がリソース無駄にならない

インスタンス単一にする意味はあるから結局enumの方が好ましいだろうけど)

Cとかは実質intだからStringにするのは無駄だろうな

anond:20200927003907

enumをただの単一インスタンス確約されたキーオジェクトしか使ってないの見ると悲しくなるよね

そんな用途しか使わないならstaticで宣言したStringでいいじゃねぇかってなる

ストラテジーパターン的にinterface貼って使うならenumも便利だなと思うけど

anond:20200926123203

そこらにいる Webアプリ系のエンジニアなんて抽象化できない奴多すぎるからイキれるんだぞw

enum ゴリ押しのアホばっか。で、こんなんでドヤ顔で登壇してる奴もおるからさら蔓延るという悪循環w

2020-06-06

anond:20200606140035

三つ持ってるならintでもboolでもなくenumにする

2020-04-09

ねぇXちゃんさぁ。なんでこんな動的なオブジェクトをstaticにしてんの?

これさぁ、そこそこ重いけどさ、セッションごとに生成される一時的インスタンスで持ってるだけでも十分パフォーマンス的に問題ないよね?

なんでプロセス間でわざわざ共有してんの?

これってネットワーク接続管理してるオブジェクトだよね?

ネットワークリソースつったって利用者たかだか数百人でしょ?

その中でリソースを同時利用するってゆってもたかだか十数人でしょ?

プロセス内でこのオブジェクトを全共有することでリソースの削減なんてたかが知れてるよね?

それをわざわざプロセス内でこのオブジェクトを全共有ってマジ管理できるの?シンクロナイズドとか書いてっけどさぁ?削減できるリソースの量に比べて超危険すぎねぇ?

コミットログ見たけど、ぜんぜん性能問題とかと関係のない問題修正だったみたいだけど、なんでこんな危険コードになったわけ?

Xちゃんさ、そもそもコードが品雑なんだけど、これエンプラJava案件なのよ

なんでCの組み込みコードみたいにif文の鬼ネストとか、引数に空のList渡して破壊的に値を設定するような、読みづらいコード書いてるわけ?

Listくらい普通に返り値で返しなさいよ…

状態管理もif文の鬼ネストやめて専用クラスとかEnum使ってコマンドパターン対処しなさいよ

もしかして、Xちゃんオブジェクト指向にピンときていないのかな?

ちゃんはどっちかってーっとPHPパーなので、ゴリゴリオブジェクト指向はそりゃ専門じゃないよ

それでもさ、interfaceとか使って、各処理の実装を切り分けるとか、やりようはいくらでもあるじゃん

あと不要なnullチェックも多すぎです。コンストラクタ初期化保証されているfinalフィールド値がnullかどうかなんて確認しないでください

ユーザー入力DB入力環境リソースとか、外部の情報起源じゃない変数がnullとか、明らかなバグなんだから暗黙的なぬるぽクラッシュさせましょう

こんなバグが出荷に乗ることなんてありえません。わざわざ専用のエラー処理で専用の例外飛ばすとか無意味です。

いちいちなんか冗長で複雑なんですよねぇ。

ちゃんみたいな若造が、ベテランのXちゃんにこんなこといいたくないけどさ、

Xちゃんコード。どこか昭和匂いがするんだよねぇ。悪い意味で。

Xちゃん名誉のために言っておくと多分Cプログラミングうまいんじゃないかな?

そんなソース読んだこと無いから知らんけど

2018-08-14

anond:20180814163400

Enumにわけわからん値待たせてる。その値なんすか。意味わかんないんですけど。

からないことはちゃんと聞いて確認しないとダメでは?

ソースダサい

センスがないんだよね。

たぶん本人はかっこいいと思ってる。

name4User

とか。だっさ。

Enumにわけわからん値待たせてる。その値なんすか。意味わかんないんですけど。

言わずもがな本人も鬼ダサい

2018-08-10

anond:20180810151853

から、三値論理計算量だったりデータ量を落とすために利用するのにtrue/false/nullをDBに入れるのはアフォだろうと。そういうカラムはtinyintでやれ。enumでもええけど。

2017-10-21

何でもかんでも揃えようとしないでほしい

プログラマなんだけど、なんでも揃えようとしてる人がうざい

よくあるのが、JSON とかオブジェクト系の記述するところで、 「:」とか「=>」みたいなのの位置

揃えられると一見すると見やすいが、金額みたいに揃ったみやすさが必要ないところでされると面倒

10行並んでたら1つ変えたのが原因で10行とも変えないといけなかったりする

面倒だけどツール使えば揃えること自体は楽にできるからこれはまぁいい

だが、バージョン管理ソフトでの変更行数が無駄に増えるのでパット見たとき結構大きな変更してるように見えたりするからちょっとイヤ

さらgrep かけようにも空白数が不定だから正規表現にしないといけない

正規表現書くの面倒だしそもそも遅い

大規模プロジェクトだと待ち時間が大きく変わってくる

んだけど、まあここまでは別にいい

他でも十分ある宗派の違いだし、まだ理解できる

この揃えるとき

aaa      : {
    bbbb : 100
    ccccc: 200
},
dddd     : {
    e:   : 300
}

みたいに(フォントによっては揃ってなく見えるかも)、ネストが違うのに全部を揃えようとするの、ホントやめろ

わかりづらい

上の例みたいなシンプルだと困らないが複雑な構造になってるとかなり見づらい

せめて揃えるのは連続する行で同じ階層のものだけにしてほしい

上でいう aaa と dddd の行が10行程度離れていたら、ここを揃えても全くきれいに見えないし無駄

bbbb と ccccc みたいなときだけならまあ許せる



仏の顔も三度まで、

ここからは許せないレベルもの


(1) 文字数を合わせようとする

上で書いたみたいなのは文字数が違うから合わせるためにスペースを入れる必要がでる

しか文字数が揃ってたらそんな必要はなく見た目も綺麗だ

きれいなのはわかる、だが無理やり合わせようと単語を探し始めるとかありえない

5つ項目があって、4つが6文字単語で残りの1つが4文字だったとする

6文字にしたいからそれっぽい意味単語いか探そうとしてる

無駄な上に、本来のそれに適した単語じゃないのを無理やり使うのでわかりづらい

理解できない自己満足しか思えない

揃ってることはパット見綺麗でもプログラムみたいのだと、単語まで似てると気づかないミスが出て来る

beer と bear、 form と from、 fall と fail みたいな見た目が似てる単語と、見た目が全く違う単語比較ではミスの数が明らかに変わると思う

なのに、 enum みたいな選ぶタイプのもので、数文字違うだけの似た見た目の単語を探してきて選ぶとか、ミスを誘発しようとしてるのかと言いたい



(2) 単語の語尾とか

(1)のように大半が揃ってると残りも無理やりそうしたいということで、単語勝手に変化させたものがある

例えばだが、語尾が1つを除き全部 -ly になってたとする

そうすると残り一つに無理やり ly をつける

なんなの?イン踏みたいの?ラッパーなの??

経緯を知らない人が見たら意味不明単語である

そもそも名前みたいな固有名詞にすらそんなことしてるから意味不明にもほどがある



(3) 変化形無視

上の時点で英語を完全無視英語力のなさはわかっただろうが、さらにこういうのもある

過去形には ed複数形には s のようなルールには単語によっては特殊な形をするものがあるのはもちろん知ってると思う

それを完全無視変数名を定義するから見ててすごく気持ち悪い

プレフィックスis つけるみたいな単語の組み合わせ部分なら気にしないけど単語としておかしいから、自分で書くとき本来の形で書くとエラーでるからさらイライラする

例えばこういうこと

readed, catched, taked, companys, boxs, mans, childs, fishs, classs

見てるとムズムズする

英語得意でない自分ですら違和感を感じるのに、これに何も感じないとか英語力ひどすぎると思う

まあエラーメッセージdon't have ~ とすべきところを has not ~ とか書いてたくらいだからなぁ

これが部下とか下の立場の人なら 「使う前にググってみて。おかしかったら『もしかして、~~』みたいの出るから」と言って直させるけど、上だからどうしようもない

間違ってますよー、と遠回しに言ってみたことはあるものの、直す気は全くないようだし、それどころか無邪気に揃えてやったぜみたいなこと言ってドヤ顔してるからホントどうしようもない

2016-11-09

switch文が許されるのはenumを処理するときだけ

しかenumを使う場面というのは、

外部と通信するためのパラメータの一部だったりするが、

内部の都合で値が自動生成されるenumの仕組みはその外部の仕様と合わせるのに実に相性が悪い。

よってenumは使い物にならないし、swtichを使う場面もない。

レガシー文法である

2016-11-05

PHP7で堅牢コードを書くとかいう風潮

いやまあ、これ読んだんすよ。

でさ、もうね、こいつ馬鹿なん?w ってゆう。

 

PHP7で堅牢コードを書く - 例外処理、表明プログラミング契約による設計 / PHP Conference 2016 // Speaker Deck
https://speakerdeck.com/twada/php-conference-2016

 

PHPみたいなレガシーゴミ言語にしがみついて、

必死に型とかEnumとか再発明って・・・

草すぎてコーラが無くなってしまうんだw

 

せめてさあ、Javaでも使えば?

いやっつーかホントPHPでここまで涙ぐましい努力しても、

劣化Javaしかないのが悲しいよね。

 

ペチプァっ~って馬鹿しかおらんのか?

こういうゴミ屑が勘違いして、

とか喧伝して糞案件量産してると思うと、反吐が出るね。

PHPと一緒にさっさと死んでほしい。

おまえもそう思うよな?

 

草プァ~~~w

2016-07-25

gitにおけるコミットログ/メッセージ例文集100

私はコミットログの書き方に悩む英語の苦手な人間である。実際、似たような人は世の中に結構いるようで、頻出単語を集計したりまとめたものは既にあって役に立つのだけれど、これらはあくま単語の話であり、具体的な文を構成する過程でやっぱり困る部分がかなりあった。

要するに、どういう時にどういう文が使われているのか、ということを示した例文集が欲しいのであるググると他にも「例文集があればいいのに」みたいな声はあるくせして、しかし誰も作ろうとしない。何なんだお前ら。それじゃ私が楽できないじゃないか

仕方なく自分でまとめたので、増田に垂れ流しておく。

はじめに

ここで挙げているコミットログは全て実際のコミットログから転載である。当然ながら各コミットログ著作権はそれぞれの書き手にある。いずれも各英文でググれば出てくるし、フェアユース範囲なら許してくれるだろうと考え名前プロジェクト名は割愛したが、ここにお詫びと感謝を述べておきたい。

抽出条件だが、参考にできそうなコミットログを多く含んでいそうなリポジトリGitHubSTARの多い方からざっと目で見て適当に選び、それぞれ最新コミットから5000件抽出した(あわせて前処理として、コミットログ冒頭のタグ情報は消去した)。

結果として対象としたリポジトリは以下の通り。

atomのみ5400件抽出していたため、計25400件のコミットログベースである。このうち、以下の条件に合致するものは参考例にすべきでないとして一律排除した。

こうして残った8540件を眺めながら、適当に切り出したのがこの用例集である個人的に「うーんこの」と思った表現も、散見される場合は載せた。

ということで、以下用例を羅列していく。

用例集

オプションフラグメニューを追加した
ファイルを追加した
メソッド機能を追加した
実装を別のものへ切り替えた
  • Use args.resourcePath instead of args.devResourcePath
  • Use arrays instead of while loops
  • Use auto instead of repeating explicit class names
  • Use weak pointer instead of manual bookkeeping
  • Change all uses of 'CInt' to 'Int32' in the SDK overlay
  • Change Integer#year to return a Fixnum instead of a Float to improve consistency
新しく何かに対応した/機能上の制約を取り払った
何かを使うようにした
より好ましい実装に改良した
何かを出来ない/しないようにした
  • Don't bail reading a metadata instance if swift_isaMask isn't available
  • Don't exit until the parent asks for an instance
  • Don't include Parent pointer in Nominal/BoundGeneric TypeRef uniquing
  • Don't use MatchesExtension for matching filters
  • Don't use ES6 class for AutoUpdater windows class
  • Don't use MatchesExtension for matching filters
  • Avoid `distinct` if a subquery has already materialized
  • Avoid infinite recursion when bad values are passed to tz aware fields
オブジェクトの内容や挙動確認やすくした
Assertを追加した
不要コードを除去した
コードを移動した
名前修正した
さなバグタイポ修正した, 警告を潰した
バグや好ましくない挙動修正した
テストコメントドキュメントを追加した
テストを削除した
テストコメント修正した
ドキュメント修正した

表現傾向とまとめ

以上の用例をふまえ、今回の参考ログ8540件から先頭の単語を出現回数で並べると次のようになった。

Add1149
Fix1014
Update584
Remove566
Use382
Don't260
Make228
Move178
Change103
Rename85
Improve76
Avoid68
Allow65
Implement60
Handle58

コミットログの基本形はもちろん動詞 + 名詞である名詞固有名詞複数形、不可算名詞が多いが、単数形場合冠詞は a が使われるか、あるいは省略される。the はまず使われない。

何かを追加した、という表現では非常に広く Add が使われる。メソッドからテストドキュメントに至るまで大概これでまかなえる。

一方、何かを修正した、という表現では広く Fix が使われる。「何か」は typocrash といった単語からメソッド名まで幅広い名詞を取るが、動名詞はあまり取らないのと、that節は取らないのでその点は注意が必要である

Fix は「何かが正しく動くようにした」ことを示し、正しい動作内容が何かを説明しない。そこで正しい動作内容に言及したい場合Make sure が使われる(こちらはthat節が取れる)。ただし Fix よりもニュアンス的に重い表現と思われ、Fix を使わず Make sure ばかり使うのはちょっとキモいのではないかと思う(Ensure はさらに重い表現っぽい)。

また、Fixtypo 以外でのドキュメント修正に対して使われることは稀である。対して Update はドキュメントコメントテストに使われ、本体コード修正に対しては使われない。本体コード修正にあわせてテスト更新したなら Update が使われる。ただ、テスト機構それ自体バグ修正したなら Fix である

無駄な何かを単純に除去したなら Remove を使う。これまでのもの(A)からのもの(B)に切り替えたのであれば Use B instead of A か Change A to B が使われる。新たに何かを利用するようにしたのであれば Use を、利用を取りやめた場合Don't use を使うことが多い。

何かをしないようにしたなら Don't を、内部実装効率化なら Make A + 比較級/形容詞Improve が使われる。

中身の変更を伴わない単なる名前の変更なら Rename A to B、コード機能論理上の場所を移動させたなら Move A to B である

この辺はリファクタリングと呼ばれる行為と思うが、Refactor というぼんやりした動詞はあまり使われず、このように変更内容の種類に応じて動詞が使い分けられている。

余談

コミットログにはWhyを書くべきだ、というのを何かで見かけたので because とか since を使ったログがどの程度あるかを調べたが、8540件のうち22件だった。基本的に短く、シンプルに、一目で意味が取れるログが好まれる傾向がある。例えば get rid of とか2件しか使われておらず、圧倒的に remove である

一方で、シンプル単語だけど開始単語としては使われないものもある。例えば次のような単語である。Expand(9)、Extend(8)、Print(5)、Optimize(5)、Publish(4)、Append(4)、Modify(3)、Manage(2)、Revise(2)、Dump(2)、Insert(2)、Migrate(2)、Enhance(1)、Edit(1) 。いずれもカッコ内は8540件に対する冒頭での登場回数である。結局、より一般的平易な単語で表せたり、Refactor同様に抽象度が高すぎると使われないのだろう。

おわりに

8000件もログを見たおかげで、迷いなくコミットメッセージが思いつくようになったのが個人的には今回書いてて最大の収穫だった。たぶんカンニングペーパーを作る行為それ自体効率のいい学習になるという話と同じだと思う。

このまとめも100以上用例を転載してあるので、それを読むだけでも多少は効果があるんじゃないかと思う。同じようにコミットログ書きたくねぇなぁ英語わっかんねぇなぁと思っている人にとって、何か役に立つところがあれば幸いである。

2015-09-20

Windowsシステムディスク入れ替えで躓いた件の備忘録

ちょっとした事情からシステムディスク移設をしたところかなり躓いたので、備忘録的にメモ

時代に逆行して個人的な書き物をする場所を一切持ってないのでお借りします。

以下、Linuxなりの最低限の知識があり、バイトオーダーもわかり、細かいところは勝手に補間できる人向け。

目的

Windows 7システムディスクの入れ替え。

オフセット32256バイトを1048576バイトに調整する。

得てして非AFTからAFTという状況と思われる。

コピー元が壊れかけの時はやらないほうが吉。

手順には省略するがたぶんやらないといけないこと


手順

  1. c:\boot\BCDバックアップ(BCD.org等)
  2. clonezillaとLinux Live USB CreatorをDL
  3. clonezillaのUSB起動ディスク作成(「作成したファイルを隠す」、「LinuxLiveWindows上で起動可能にする」のチェックは外す)
  4. HDD接続し、NTFSフォーマット
  5. msinfo32.exeを実行し、オフセットが1048576になっていることを確認
  6. clonezillaのローカルパーティション→ローカルパーティションでクローニング、オプションは全部デフォルト
  7. HDDのみ接続し(念のためclonezillaのUSBも外す)、Windowsインストールディスクを起動
  8. 最初の画面で「次へ」を選択したらShift+F10でコマンドプロンプトを起動
  9. diskpartを起動、list disk → select disk n → list part → select part n → active し、exit
  10. bootrec /fixboot, bootrec /fixmbrを実行
  11. bcdedit /enum allを実行、随所でdeviceがunknownになっているはず
  12. bcdedit /set {bootmgr} device "partition=C:"等をunknownになっているぶんだけ行う。osdeviceやfiledeviceも。
  13. ほかはツールになにも弄られないようにしてシャットダウン
  14. この状態で起動しようと思ってもカーソル点滅から進まない。ここから先の情報(というか23.)は少なくとも日本語では見当たらなかった。
  15. clonezillaを再度起動
  16. lsblkで/lib/live/mount/mediumとなっているデバイスを調べる(仮に/dev/sdb1。ついでに新HDDシステムパーティションは/dev/sda1と仮定。)
  17. sudo mount -o remount,rw /dev/sdb1を実行(自信があれば/tmpとか使ってもいい。オススメしないけど。)
  18. /lib/live/mount/mediumに移動
  19. sudo dd if=/dev/sda1 of=./pbr.bin bs=512 count=1を実行(/dev/sdaだとMBRになってしまうので注意)
  20. pbr.binのバックアップを取る
  21. sudo vi -b pbr.binを実行
  22. :%!xxd でバイナリ編集できるようにする
  23. 1Cが"3F00"になっているはず。これがhidden sectorsすなわちオフセット。ここを"0008"に書き換える
  24. :%!xxd -rで元にもどし、:wqで保存終了
  25. sudo dd if=./pbr.bin of=/dev/sda1 bs=512 count=1を実行し書き戻し(/dev/sdaだと略)
  26. 祝起動

23.もそうだけど12.もどこにもなかった。(英語は面倒でしっかり読んでない)

2点でめっちゃ躓いたってお話

ログイン ユーザー登録
ようこそ ゲスト さん