B-Teck!

お仕事からゲームまで幅広く

【JavaScript】文字列の空白埋め、0埋め

以前Javaで同じようなことやってるけど、JavaScriptもメモしておく。
http://beatdjam.hatenablog.com/entry/2017/07/21/225053

function padding(str,num,pad){
    if(pad === void(0)) pad = 0;
    return (Array(num + 1).join(pad)+str).slice(num*-1);
}

console.log(padding("1",3,"x"));
// xx1
console.log(padding("1",2));
// 01

先頭の文字列除去はこれでいけそう
正規表現で行頭の指定文字の繰り返しを削除する。

function suppress( sup,str ) {
    return str.replace(new RegExp("^"+sup+"*"),"");
}
console.log(suppress(0,"002351"));
// 2351
console.log(suppress("x","xxyzabc"));
// yzabc

【プログラミング】技術情報をキャッチアップするために見ている巡回先

トレンドの技術やトピックを雰囲気だけでもキャッチアップできるように、
ほぼ毎日この辺のサイトをざっと眺めてる。
情報収集するようになってからある程度試行錯誤して一応現在の形に落ち着いてて、
目についたりよく見かけるような話題があれば別で深く掘り下げて調べたりしてる。

Qiita、はてなブックマーク以外はFeedlyに突っ込んで、
タイトルだけ見て気になったもの以外はスルーしてる。

Qiita ランキング

はてなブックマーク

企業のテックブログ

技術系記事

C#

Unity

JavaScript

【本】Javaデザインパターン徹底攻略を読んだ

ちょっと古い本だけど、教養としてデザパタは大事かなぁなんて思って読んでみた。
掲載されているサンプルが単純すぎること、
デザインパターンの説明が自分の理解と違っていたりして、
正直参考になった部分は少なかった。

本書の分類や記述を参考に改めて自分で調べ直すなどして、ある程度こういうのがこのパターンなんだなというモノを得れたので、
読んだ意味が無かったわけではないけれども。

ただ、末尾についたデザインパターンの図録や、
デザインパターンを厳密に適用するべきではないみたいなコラムはよかったなと思う。
デザインパターンの本にデザインパターンに従いすぎるなというコラムがあるのも面白いが、内容は

  • デザインパターンは適用すればプログラムを簡単にかけたり、拡張しやすくなったりするような銀の弾丸ではない。
  • 設計に合わせて取り入れることが肝要で、厳密に取り入れることも、正確に従った設計にすることも必要ない。
  • デザインパターンは概念的なものであるため、詳細な認識は各人で違うので、パターン名を共通言語とするべきではない。

といったような内容で、一通り学んでから読むとなるほどなという感じ。

正直、デザパタが生まれたのは94年だし、挙がっているパターンも抽象的で、くくってしまえば同じようなカテゴリになるものもある。
これらの設計を鵜呑みにしすぎず、より良い設計を考えていくのがいいのかなぁと思った。

【デザインパターン】デザインパターンの勉強中メモ 振る舞いに関するパターン

Chain of Responsibility パターン

あるリクエストの処理を行うオブジェクトを鎖状に繋ぎ、適切なオブジェクトに処理させるパターン。
リクエストを受け渡す先を動的に切り替えることで、処理自体も動的に入れ替えることができる。
それぞれのオブジェクトは自分自身と、リクエストを受け渡す先のみを知っていれば良い為変更を行いやすいが、
全体を俯瞰することは難しくなる。

Command パターン

行いたい処理やパラメータ自体をオブジェクト内に隠蔽し、利用側が呼び出して処理を実行するパターン。
実際の処理はCommandオブジェクトごとに定義されているので、動的な変更や処理の切り替えに対応しやすい。

Interpreter パターン

Compositeパターンを文法や構文解析の結果の処理を目的として実装したもの
一つの文法規則を一つのクラスで表すことで、規則の追加や変更が簡単に行える。

Iterator パターン

集合に、要素に順番にアクセスできるようなインターフェースを持たせるパターン。
集合オブジェクト自身にインターフェースを持たせているので、
利用側はメソッドを呼び出すだけで内部の要素に順番にアクセスできる。

Mediator パターン

オブジェクト同士の相互作用を仲介するためのハンドリング用オブジェクトを用意するパターン。
各オブジェクトが直接相互作用を与えあう場合、影響のある箇所や全体像が把握しづらく、
拡張しづらいプログラムになってしまうので、それを避けるためのパターン。

Memento パターン

オブジェクトの内部状態を保存しておき、
必要に応じて書き戻すことで元の状態に戻すことができるようにするためのパターン。
単純にオブジェクトをcloneするのではなく、必要な状態やパラメータのみを保持する。

Observer パターン

オブジェクトの状態に変化があったときに、それを他のオブジェクトに通知するためのパターン。
パターン名は観察者という意味だが観察される側が通知を行うという事を定義している。

State パターン

オブジェクトの状態自体をオブジェクトとして切り出し、個々の状態の動作を別々に扱えるようにするパターン。
オブジェクトに状態オブジェクトを付与することで、現在の状態に応じた振る舞いをすることができる。
Strategyに類似しているが、Stateは状態に応じて振る舞いやアウトプットが変わるパターンである。

Strategy パターン

一連のアルゴリズムを実装したオブジェクトを複数用意しておき、
状況に応じてアルゴリズムを切り替えられるようにするパターン。
Stateに類似しているが、Strategyは同じふるまいをするときに、実際に行う処理を切り替えるパターンである。

Template Method パターン

全てのクラスに共通する処理を抽象クラスに実装し、変更可能性のあるメソッドをインターフェースとするパターン。
実装されたサブクラスによって行われる処理が切り替わる。

Visitor パターン

データ構造を保持するクラスと処理を行うクラスを分離するパターン。
データ構造側はどのような処理を行うかを知らなくても処理を実行することができる。
処理を行うクラスは、データ構造内の探索方法と処理自体を知っていれば処理を実行することができる。

【JavaScript】指定した文字列を繰り返した新しい文字列を生成する

ES6が使える環境ならこれでOK。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

console.log("test".repeat(3));
// testtesttest

ES6が使えない環境なら、先述したMozillaのサイトのpolyfillを利用するか、
エラー等を考慮しないなら下記のような方法で実現できる。

const repeat=(str,num)=>{
  return Array(num+1).join(str);
}
console.log(repeat("test", 3));

repeat関数はちょっと面白いことをしていて、
指定の数の空要素を持った配列を生成して繰り返したい文字列でjoinすると、
空要素を繰り返したい文字列で結合したことになって結果的に繰り返し文字列が得られると言う処理。
すげー発想だと思う。

https://stackoverflow.com/questions/1877475/repeat-character-n-times/1877479#1877479

【歴史/雑学】その他ローマの暦に関連したTips

前2記事に書けなかったけど調べてて気になった話とかいくつか。

JuliusとAugustusをあとから挿入したため2ヶ月ずれたという俗説は誤り

当初はMartiusが年の始まりだったが、
途中でJanuariusが年の始まりの月になったため、
数字で月を表したQuintilis(September)以降は語源と対応する月数が2ヶ月ずれている。
あくまでJuliusとAugustusは名称が変わったのみ。

JupiterはZeusと同一視される神

ラテン語のJupiter(ユピテル)は、古ラテン語のJou-paterに由来しているという。
印欧祖語のDyēus-pətērから派生した言葉がJou-paterとなり、
Dyeusの部分が派生した部分がZeusと変化したと思われる。

グレゴリオ暦の制定の経緯

キリスト教の重要な祭典として復活祭が存在するが、
この祝祭日は規定に沿って移動する。
規定の内容は「春分の後の最初の満月からすぐの日曜日」となるため、
春分の日というのは大きな意味を持つ日付である。
ユリウス暦で元々制定されていた春分の日は3/25であったが、
正しくないということから3/11へ修正された。
しかし、そもそも1年に11分の誤差を持つという暦としての欠陥があったため、
正しく春分の日を設定するためには改暦が必要であるとの結論に至り、
グレゴリオ暦が制定された。

閏月・閏日

古代ローマでは、Februariusの月の23日には年末のお祭りとして、
Terminalia祭が行われていた。
この祭典は重要なものとして位置づけられていたため、
調整用の日付である閏月・閏日は祭典終了後に挿入されていた。
この慣習が現在も残っているため、うるう年の1日は2月に付加される。

【雑学/歴史】ローマ暦の月名の由来

前回に引き続きローマの暦の話題。
現在の英語等の月名にも引き継がれているローマ暦の月名が
どのような由来からつけられたかをまとめた。

Martius

Aprilis

  • 愛の女神Aphroditeを由来としている。

Maius

  • 豊穣の女神Maiaを由来としている。

Junius

  • 婚姻や母性の女神Junoより。
    Junoに祝福される婚姻としてJune Brideの習慣があるという説もある。

Quintilis(Julius)

  • ローマ暦の頃の名称のQuintilisは5番目の月という意味で、fiveと同根の言葉を由来としている。
  • 後にユリウス暦にてJuliusに名称を変更される。 Juliusという月名は、ユリウス・カエサルの名前に由来する説と、
    ローマ神話の主神Jupiterに由来する説がある。

Sextilis(Augustus)

  • ローマ暦の頃の名称Sextilisは6番目の月という意味で、sixと同根の言葉を由来としている。
  • 後にユリウス暦にてAugustusに名称を変更される。 Augustusは、皇帝アウグストゥスに由来する説と、アウグストゥス(究極の神)に由来する説がある。

September

  • Septemは7という意味で、sevenと同根の言葉を由来としている。

October

  • Octoは8という意味で、eightと同根の言葉を由来としている。

November

  • Novemは9という意味で、nineと同根の言葉を由来としている。

December

  • Decemは10という意味で、tenと同根の言葉を由来としている。

Januarius

  • 物事の終わりと始まりを表す神Janusを由来としている。 由来としている神が終わりと始まりを表しているため、
    後に年の始まりの月になったと言われる。

Februarius

  • 贖罪を司る神Februusと罪を清める儀式februaが由来。
  • サビニ戦争の慰霊のために行われた慰霊祭が儀式の元。 februs(酒を献上する)、februere(浄化する)などのラテン語から名付けられた。

Mercedinus

  • ヌマ暦で導入された閏月。
  • 賃金を意味するラテン語mercesに由来している。 労働者の賃金が年末のこの時期に支払われた事による。
  • この月は、紀元前46年にユリウス・カエサルユリウス暦を導入したときに削除された。