新年の抱負は初詣をする日本だけの習慣ではない。米国でも"New Year's resolutions"として大晦日や元旦に決意をする習慣がある。調査会社YouGovAmericaとThe Economistの調査によると、2割強の米国人が新年の決意をしているようだ。どんなことを決意したのだろう?

この調査は2021年12月中旬、約1500人の米国居住者を対象にオンラインで実施している。それによると、23%が新年の決意をすると回答。特に30歳以下では40%が行うと述べた。30歳から44歳は25%、45歳から64歳は18%、65歳以上は14%と低くなっており、若いほど目標を持とうと思っていることがうかがえる結果となった。

では決意の内容はどのようなものか?

最も多かったのが「健康な生活を送る」で、23%がこれを選んでいる。続いて「自己の改善や幸せ」(21%)、「減量」(20%)で上位3を占めた。健康や精神に関心が向いているようだ。続いて、「キャリアや仕事上の目標達成」(16%)と「経済的な目標達成」(13%)が続く。このほか「運動」(7%)、「禁煙」(5%)、「飲酒を減らす」(2%)など、具体的な目標もある。健康志向は男女ともに高かったようだが、女性の方が「健康な生活を送る」を挙げた比率は多かったという。

新年の決意を達成できるかどうかについては、楽観している人が多いようだ。5人中4人が目標を守る自信があると回答している。背景として、2022年は2021年よりも良い年になると思っている人が多いことがありそうだ。2021年よりも悪くなると見ている人は14%、そして、新年の決意をしている人は2022年は2021年よりも良くなると考えている比率が54%と、全体の38%を上回っていることがわかった。57%が「2022年は良くなる」と回答、「悪くなる」はわずか7%という。

BBCのコラム「Are New Year's resolutions powerful or pointless?」では、多くの人が新年の決意を守れないのに、なぜ決意を立てるのかを取り上げている。

年末年始の休暇でリラックスした後、邪念を取り払って新しい目標を立てようという気持ちが働いていると分析するのは、Anna Katharina Schaffner氏、英ケント大学で文化歴史学の教授を務める。ペンシルバニア大学ウォートン・スクールで心理学教授を務めるKaty Milkman氏は、人は自分の一生を章としてみる傾向があると述べる。「(年が変わるなど)時間的に区切りとなることがあると、新しいスタートという感覚が得られると何か特別なことをやろうとする」とのこと。過去の失敗から心理的に距離をおくことができ、「古い自分」からよりよい自分になれる気がするそうだ。そう考えると、1月1日にその年の決意をすることは、自然なことなのかもしれない。

2021年師走にかけて筆者環境のプロセスで面倒な手間が増加した。ソースコードを実行して確認する業務が生じるが、従来はソースコードが改行込みで出力されていたのでそのまま、コピー&ペーストでコードの実行確認が可能であった。しかし、突然に改行無しのワンライナーで出力される環境になってしまった。例えば以下のようにワンライナーコードになる。

// Fizz, Buzzのノードを作る --- (*1)CREATE (:FizzBuzzGroup { name: "Fizz" }),(:FizzBuzzGroup { name: "Buzz" });// 1から100までの値を追加 --- (*2)FOREACH (i IN RANGE(1,100) | CREATE (a:FizzBuzz{v:i}));// isFizz, isBuzzの関係を追加--- (*3)MATCH (i:FizzBuzz),(g:FizzBuzzGroup{name:"Fizz"})  WHERE i.v %3 = 0  CREATE (g)-[:isFizz]->(i);MATCH(i:FizzBuzz),(g:FizzBuzzGroup{name:"Buzz"})  WHERE i.v % 5 = 0  CREATE(g)-[:isBuzz]->(i);

コードは改行が反映されていないと実行できない場合が多い。手打ちの入力では、倍どころでは効かない時間がかかってしまう。そこで秀丸の置換で改行してみた。コード末尾の「;」の後に改行が必要であるので「;」で検索し改行込みの「;\n」で置換する。テキストエディタ秀丸は正規表現にも柔軟に対応しているので便利だ。

// Fizz, Buzzのノードを作る --- (*1)CREATE (:FizzBuzzGroup { name: "Fizz" }),(:FizzBuzzGroup { name: "Buzz" });
// 1から100までの値を追加 --- (*2)FOREACH (i IN RANGE(1,100) | CREATE (a:FizzBuzz{v:i}));
// isFizz, isBuzzの関係を追加 --- (*3)MATCH(i:FizzBuzz),(g:FizzBuzzGroup{name:"Fizz"})  WHERE i.v % 3 = 0  CREATE(g)-[:isFizz]->(i);
MATCH (i:FizzBuzz),(g:FizzBuzzGroup{name:"Buzz"})  WHERE i.v % 5 = 0  CREATE (g)-[:isBuzz]->(i);

まだ足りない。コメントの(*1)(*2)(*3)の直後、インデントのスペース×2の前で改行する必要がある。スペースは先ほど同様にスペース2個をそのまま入力し検索、「 \n」(スペーススペース\n)の置換で行けるのだが前者はすぐには思いつかない。メタ文字のエスケープが一見複雑そうに見える。秀丸エディタの置換ではなく検索の正規表現、文字列を強調にチェックを入れて確認しながらマッチする正規表現を探し出す。

[0-9]では数字全てにマッチする。

  • 秀丸エディタの「検索」メニューに[0-9]を入力。「すべて検索ー色付け」を選択

    秀丸エディタの「検索」メニューに[0-9]を入力。「すべて検索ー色付け」を選択

アスタリスクの後の数字をマッチするにはエスケープを加え\*[0-9]、後ろの)を含ませるためエスケープを加える\*[0-9]+\)

  • \*[0-9]+\)にして後ろの)も含ませる

    アスタリスクの後の数字をマッチさせる\*[0-9]

  • アスタリスクの後の数字をマッチさせる\*[0-9]

    \*[0-9]+\)にして後ろの)も含ませる

数字の異なるコメント部分にマッチしたものを置換する方法・・・・探し出すのに少々苦労したが"タグ付き正規表現"で可能だった。()で全体をくくり(\*[0-9]+\))、置換文字に\1\nを指定して全置換すると

  • コメント部の*1 *2 *3とそれぞれ異なるマッチ箇所にそれぞれに応じた置換が必要になるのでタグ付き正規表現。()でくくり、\1のあとに改行を入れる

    コメント部の*1 *2 *3とそれぞれ異なるマッチ箇所にそれぞれに応じた置換が必要になるのでタグ付き正規表現。()でくくり、\1のあとに改行を入れる

1回の置換でマッチ部分が置き換わる。

// Fizz, Buzzのノードを作る --- (*1)
  CREATE (:FizzBuzzGroup { name: "Fizz" }),(:FizzBuzzGroup { name: "Buzz" });
// 1から100までの値を追加 --- (*2)
  FOREACH (i IN RANGE(1,100) | CREATE (a:FizzBuzz{v:i}));
// isFizz, isBuzzの関係を追加 --- (*3)
  MATCH(i:FizzBuzz),(g:FizzBuzzGroup{name:"Fizz"})
  WHERE i.v % 3 = 0
  CREATE(g)-[:isFizz]->(i);
MATCH (i:FizzBuzz),(g:FizzBuzzGroup{name:"Buzz"})
  WHERE i.v % 5 = 0
  CREATE (g)-[:isBuzz]->(i);

祈りが通じたのかワンライナー出力は解消されたが、原因のフィードバックが無いため再び同じことが起こる可能性はあるだろう。言語ごとに異なってくる置換表現をリスト化してストックしておいたほうが良さそうだ。しかしながら、正規表現はテキストエディタでコード以外の文章も扱えるため業務効率化に寄与するジャンルであるなぁと、楽観的に新たな学習目標にと思うのであった。