Object.entriesの戻り値の型を厳密にするためにNegated typesが欲しい

Object.entries() - JavaScript | MDNObject.entries は、オブジェクトに含まれる key と value の組み合わせを配列にして返してくれる関数で、 Javascript でコードを書いてるとお世話になることも多いと思います。 しかし、これを Typescript で使おうとす…

git 管理している dotfiles をインストールするスクリプトを書いてみた

gintenlabo.hatenablog.comの続き。 課題だったインストールスクリプトを書いてみました。 #!/usr/bin/env bash # file: install-script.bash set -ueo pipefail cd "$(dirname "$0")" CMDNAME=$(basename "$0") print_usage() { cat - << EOF usage: ${CMDN…

WSL Ubuntu に Oh my zsh と asdf をインストールしつつ、 .zshrc とかを git で管理するようにする

社内 Advent Calendar 向けに書いた記事ですが、社内のみに公開しておくのも勿体ないので全体公開するついでに blog にもリンク張っておきます。 gist.github.comまた、筆者が使っている dotfiles の GitHub repository も共有しておきます: github.commast…

TypeScript で Haskell の comparing を実装してみた

https://hackage.haskell.org/package/base-4.19.0.0/docs/Data-Ord.html#v:comparingたぶん既出(調べるの面倒で調べていない 実装: function compareAsc<T>(x: T, y: T): number { return x < y ? -1 : y < x ? 1 : 0; } function compareDesc<T>(x: T, y: T): </t></t>…

TypeScript で API 呼び出し結果をキャッシュするクラスを作ってみた

実装: class CachedAsyncStore<T, Key = string> { private promiseMap: Map<Key, Promise<T>> = new Map(); private fn: (key: Key) => Promise<T>; constructor(fn: (key: Key) => Promise<T>) { this.fn = fn; } get(key: Key): Promise<T> { const { promiseMap } = this; const cachedPromise = p</t></t></t></key,></t,>…

GCPのログエクスプローラで単語単位でエラーメッセージを検索したい場合は正規表現で \b を使えばいい

タイトル通り。 仕事でGCPを使う機会があり、ログを調べる際にログエクスプローラで単語単位の検索をしようと思ったが、その方法を検索しても一発では出てこなかったので、調べた結果を記す。結論から言ってしまうと、 textPayload =~ "\bword\b"で問題ない…

M:tG職工スタンダード第1回世界大会優勝レポ

つよい機械兵団の進軍の発売を目前に控えた今日この頃、皆様はどうお過ごしだろうか。 今回は 3/26(日) に池袋で行われた職工スタンダードの大会で幸運にも優勝することができたため、デッキ選択や当日のマッチアップ、握ったデッキについて解説したいと思う…

初心者にもオススメ! モダン 奇襲隊レッド デッキ解説

つよいプレイヤーズコンベンション横浜2023のモダンオープンを目前に控え、握るデッキを模索していた ある日のこと、 twitter にて以下のような tweet を たまたま 見かけた。同じ役割が2種類あればデッキになるとはよく言ったもので何もできずに負けた pic.…

NEO環境末期におけるスタンURデルバーの現状解説

前回: https://gintenlabo.hatenablog.com/entry/2022/02/21/041542 基本的な解説: https://gintenlabo.hatenablog.com/entry/2022/02/09/215915M:tGの新弾、ニューカペナの街角のフルスポイラーが発表され、今週末にはプレリリースが控える今日このごろ、…

スタンURデルバーの神河:輝ける世界でのアップデート案

Magic: the Gathering の新エキスパンション、神河:輝ける世界(以下ネオ神河)が発売され、紙の大会でも使えるようになった。そこで今回は、先日紹介したスタンダード青赤デルバー https://gintenlabo.hatenablog.com/entry/2022/02/09/215915 について、 …

スタンURデルバー解説

時の流れるのは速いもので、神河:輝ける世界の M:tG Arena への実装が今週末に迫ってきた。 そこで今回は、イニストラード:真夜中の狩り期およびイニストラード:真紅の契り期のスタンダードで筆者が使っていた(使っている)青赤デルバーについての記事を…

《表現の反復》の隠された効果について

Magic: the Gathering の公式から、1月25日付で禁止改訂がある旨が発表された。【お知らせ】1月25日付にて、パウパー以外のフォーマットでも禁止制限告知が予定されています。こちらについては発表をお待ちください。 #mtgjp https://t.co/ZyislyLTQ0— マジ…

if(cond) と if(cond == true) は同じ意味ではない

C++

if(cond) のコンパイルは通るが、 if(cond == true) と書くとコンパイルが通らない例がある。 struct bool_ { bool value; constexpr explicit operator bool() const noexcept { return value; } }; int main() { bool_ x{true}; if (x == true) { // do so…

データメンバを見ると循環参照してないのに shared_ptr のせいで循環参照になるケース

C++

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

std::make_shared から private コンストラクタを呼び出す

std::make_shared で private コンストラクタを呼ぶには,関数内クラスと継承を利用すれば良い. class hoge { hoge(); // private ctor public: static std::shared_ptr<hoge> create() { // return std::make_shared<hoge>(); // こう書きたいが,コンパイルエラー // </hoge></hoge>…

「 Copy して Swap 」 対 「 Copy して Move 代入」

例外安全なコピー代入演算子を定義しようとしたとき, C++11 では Copy して Swap する方法 Copy して Move 代入する方法 の二通りが存在するので,それぞれのメリットとデメリットを比べてみた. Copy して Swap 昨日の記事で説明した方法. struct Hoge { …

代入演算子のエレガントな定義方法と,その不満点

ユーザ定義されたクラスに対して 代入演算子を定義する場合, コンパイラの生成するデフォルトの代入演算子では,例外安全の強い保証を満たせない場合がある. struct Hoge { std::vector<int> x, y; Hoge() = default; Hoge(std::vector<int> x_, std::vector<int> y_) : x</int></int></int>…

C++11 時代のクラス設計に関する提案

先日,ついに C++11 の主要な機能を一通り実装した GCC-4.8.1 がリリースされた. もう一方の主要な C++ コンパイラである Clang++ でも C++11 の機能は既に全て実装されており, 来る 6/05 に最新版の Clang-3.3 がリリースされ, C++11 対応が完了する見通…

Jubatus の開発に加わりました

6月から無職を辞めて派遣社員になりました. 勤務する会社(派遣先)は,武蔵野にある NTT ソフトウェアイノベーションセンタで, 機械学習の分散処理フレームワーク Jubatus の開発チームの一員として働かせて頂きます. やる仕事は,当面は C++ の知識を…

GCC-4.8.1 がリリースされた

GCC の最新版, GCC-4.8.1 がリリースされました. http://gcc.gnu.org/ml/gcc/2013-05/msg00306.html http://gcc.gnu.org/gcc-4.8/ GCC-4.8.1 は, GCC-4.8.0 のバグフィックス版であり,多くのバグが潰されている他, 新たに rvalue references for *this …

C++14 のラムダ式 完全解説 中編

この記事では,前編に引き続き, C++14 のラムダ式について説明していく. 前編では,ラムダ式に対する大雑把な説明と,ラムダ式の持つ型推論機能を紹介した. この記事では,ラムダ式の最も重要な機能の一つである,変数のキャプチャについて説明したい. …

GCC-4.8.1 の Release Candidate が公開された

GCC の最新版, GCC-4.8.1 の Release Candidate が公開されました. http://gcc.gnu.org/ml/gcc/2013-05/msg00171.html http://gcc.gnu.org/ml/gcc/2013-05/msg00172.html ダウンロードは ftp://gcc.gnu.org/pub/gcc/snapshots/4.8.1-RC-20130517 から行え…

C++14 のラムダ式 完全解説 前編

C++14 の Committee Draft が公開された. C++14 は基本的には C++11 のマイナーバージョンアップであるが,バグフィックスのみを行っている訳ではなく, C++11 の時点で微妙に使いにくかった機能,特にラムダ式については,大きな機能追加が行われている. …

C++14 に追加された機能(の一部)に対する私的レビュー コア言語編

C++14に入ることが決まったものの一覧(みたいなもの) を読んで気になった C++14 での変更のうち,コア言語の中から気になったものを挙げてみる. ただし, 動的配列 多相ラムダ 変数テンプレート 等に関しては, http://cpplover.blogspot.jp/2013/04/bristo…

野良C++erの今更な退職エントリ,または私は如何にしてリモートの仕事を辞めて無職になったか

関連エントリ: http://d.hatena.ne.jp/gintenlabo/20130125/1359083832 http://d.hatena.ne.jp/gintenlabo/20130126/1359203652 Twitter で僕をフォローしてる人は知ってるかもしれませんが,4月から無職に戻りました. なにぶん突然の事だったので,冷静…

Restricted Implicit Cast

related to: http://d.hatena.ne.jp/gintenlabo/20130416/1366130964 以下のような C++ コードを考える: // http://ideone.com/s3I4n6 #include <iostream> int main() { auto x = 0; double const& ref = x; x = 23; std::cout << x << std::endl; std::cout << ref <</iostream>…

最近 Twitter 規制されることが多い

っていうか今 規制されたんですが. あーうー. 最近 Twitter やりすぎなので,何らかの形で自粛するべきではないかと思ってる. テンションを上げるにはそこそこ便利なので,全面禁止は無理だろうが. 連投制限のあるクライアントを (作る|利用する),とか…

暗黙変換の結果によって生まれた一時オブジェクトに気をつけて

次に示される関数 implicit_cast について考える. #include <type_traits> #include <utility> template<class To, class From, typename std::enable_if< std::is_convertible<From, To>::value >::type* = nullptr > To implicit_cast(From && x) { return std::forward<From>(x); } この関数は,引数として渡された値を,型 To に暗黙変換して返すものであり,例えば</from></class></utility></type_traits>…

make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない

std::make_shared は基本的には効率的だけど弱点もあるよ,って話. struct Huge { int data[1024][1024]; }; #include <memory> #include <vector> int main() { std::vector<std::weak_ptr<Huge>> vec; for( int i = 0; i < 100000; ++i ) { auto p = std::make_shared<Huge>(p); vec.push_back(p); p</huge></std::weak_ptr<huge></vector></memory>…

いい加減 僕は T t(x); と auto t = T(x); の違いを blog にまとめるべきかもしれない

と http://cpplover.blogspot.jp/2013/04/isexplicitlyconvertible.html のコメント書いてて思ったので,書く. まず些細な違いとして, auto は右辺の値の const や参照を消し飛ばす*1,という点が挙げられる. using T = int const; // Alias declarations…