Firebase Dynamic Linksの代替手段を自作する / Create your own Firebase Dynamic Links alternative

Part 1 of this series about my toy renderer covers the most fundamental design decisions. Over the years, I have written many renderers and for a long time their complexity kept growing. This time, I took the opposite route. I wanted to maximize the fraction of code that implements crucial functionality rather than wasting my time on bloaty infrastructure. The code that I wrote (excluding shaders)
#include <stdio.h> void fizzbuzz(int n) { int next; int i = 1; do { printf(i % 15 ? i % 5 ? i % 3 ? "%d\n" : "Fizz\n" : "Buzz\n" : "FizzBuzz\n", i); if (i++ >= n) next = 0; } while (next); } int main(void) { printf((char[]){""}); // この位置にprintfが無いとなぜか動かない fizzbuzz(100); } gcc 10.1.0 を使用し、コンパイラが感知したミスには警告を出力してくれる様 -Wall -Wextra を指定し、最適化指示なしでコンパイル、動作させたところ動作するが Wandboxで実行 main() の中の何も出力していない printf(
ほぼ使うことはないだろうけど、かなりの知見だったので覚書。 ラムダ式を関数ポインタ型へ変換する これは割と一般的な知識だと思うんですが、『キャプチャしていない』ラムダ式は関数ポインタ型へとキャストする事が出来ます。 using func_t = int(*)(int); // 関数ポインタ型として受け取る事が出来る func_t twice = [](int n){ return n + n; }; + 単項演算子で明示的に関数ポインタ型に変換する さて、これを踏まえて次のように『関数ポインタ型を型推論する』ような関数にラムダ式を渡したいとします。 // テンプレートで戻り値型や引数型を推論するよ template<typename R, typename A> void func(R(*f)(A)){ } // error: no matching function for call t
競技プログラマ、どうせ #define しか使わなくないか if の初期化文 if 文の中に初期化文を書けるようになります。 たとえば、よくある DP の例を挙げます。 if (dp[next] > dp[cur] + cost) { dp[next] = dp[cur] + cost; ... } これは次のように書けるようになります。 if (int tmp = dp[cur] + cost; dp[next] > tmp) { dp[next] = tmp; ... } うーーん、chmin を書いた方が楽かな(せめて #define じゃなくて関数テンプレートを使ってほしい) tmp が if の外に漏れないので変なバグを防げたり、同じ式を書かないで済むのはうれしそう。 ja.cppreference.com 構造化束縛 pair や tuple からまとめて初期化できます。 たと
メモリ破壊を起こすソースコード まず、メモリ破壊を起こすサンプルとしてバッファオーバーフローを起こすoverflow.cを準備します。 overflow.c #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main(void) { uint8_t *ptr = NULL; // 64byte分のメモリ領域を取得 ptr = (uint8_t *)malloc(64); if (NULL == ptr) { fprintf(stderr, "out-of-memory\n"); exit(EXIT_FAILURE); } // メモリ破壊箇所 // メモリ領域を1byteはみ出した位置に適当なデータを挿入 ptr[64] = 0x5a; free(ptr); return 0; }
Electric Fenceのインストール† Electric Fenceは以下のパッケージになります。 x86_64版 ElectricFence.x86_64 : メモリ割り当ての侵略を検出するデバッガ i386版 ElectricFence.i386 : メモリ割り当ての侵略を検出するデバッガ ともに以下のコマンドでインストールすることができます。 rootユーザでインストールしてください。 yum -y install ElectricFence ↑
AtCoder の言語アップデート で、C++17 対応コンパイラが使えるようになりました。やったー! この記事では、競技プログラミングに役立つ C++17 の新しい標準ライブラリ・言語機能を 16 個紹介します。 サンプルコードは、AtCoder の GCC 9.2.1 システムで動作を確認しています。 C++17 標準ライブラリ機能 1. 値を範囲内に収める std::clamp(x, min, max) 値 x を、min 以上、max 以下に収めてくれる関数です。 これまで std::max(std::min(x, max), min) と書いてたのが 1 つの関数で済みます。 #include <bits/stdc++.h> int main() { // 値を 0 以上 100 以下に収める std::cout << std::clamp(50, 0, 100) << '\n'
どうも、CADDiでC++エンジニアとして働いております、いなむのみたまと申すものです。雇用されてからずっと、3次元CADの解析というR&D的なことをやっています。 教職をやめてエンジニアとしてCADDiに転職してから1年半ほど経ちました。今回はCADDiの技術的な変遷をお話しようと思う。 どうでもいいけどnoteがくそ使いにくい。二度と使いたくない。 基礎知識CADDiは板金・金属加工の発注をお受し、製造管理、お届けまで行うサービスです。 エンジニア向けのページがありますので技術的なことの現状はここを見るとわかります。 実は、CADDiには「3次元データでの自動お見積り」というものがあります。自動見積りは大きく分けて2段階あり、一つが形状解析から工程を割り出す部分、もう一つが工程から見積り金額を割り出す部分です。私は前者の3次元データの形状解析を実装しています。 割と最近(2019年8月
もう10年以上も前になりますけども,近場の漁港によく連れて行ってもらって魚釣りしていました. ちょうどアジは西日本の日本海側が本場ということもあって,僕の地元では岸壁に立ってサビキをすると小アジがたくさん釣れました. さて,google-glogと言えばgoogle謹製のログライブラリ. Google Japan Blog: C++ のプログラムのデバッグを楽にする方法にて概要が紹介されていて,ドキュメントには簡単なチュートリアルがあります.基本的には使い方に難しいところは何も無いです. お魚さん的には学部卒論のときから使っててもはや手放せないんですが,作業が切羽詰ってくるとあんまり律儀にログを出す余裕がなくなってきますw そんな時でもただ一ついつでも使ってたのが,「落ちた時にスタックトレースを吐く機能」です. ということで今回はそれに絞って紹介.まとまった記事を書くには今時間的余裕がない
この記事はCompetitive Programming (2) Advent Calendar 2019 - Adventarの4日目の記事です。 私がC++で競技プログラミングをやり始めた際によく分からなかったものの筆頭がイテレータでした。便利でv.begin(), v.end()のようなお決まりの書き方はできても、少し普段と違うことをしようとすると混乱しがちです。 このようなものは手元で図を描いて整理できるようになる、つまり視覚的に理解できることがとても大事だと思います。そこでイテレータについて「こういう風に理解すると図示しやすくなるかもよ」という視覚的な理解を提示したいと思います。 競技プログラミングでよく使う処理を中心に扱っていきますが、それ以外でC++を書く人にとっても理解の助けになる…かもしれません。 std::vectorのイテレータ まずは一番分かりやすいものからいきます
C++1zから、関数の戻り値をユーザーに無視しないでほしい場合に指定する[[nodiscard]]属性が導入されます。 この属性は、エラーが起きた状態でエラーを無視して正常として処理を続けないでほしいような状況で使用します。 struct error_info { … }; // 関数f()の戻り値は必ず使用すること [[nodiscard]] error_info f(); int main() { f(); // 戻り値を捨てている。(コンパイル時に警告が出力されることになるだろう) } エラー以外で使用する状況としては、以下のようなものが考えられます: 自分自身を書き換えるのではなく、新しいオブジェクトを作って返すような関数 たとえば string replace(string origin, string old, string new); のような文字列の置換をする関数において、
C++標準ライブラリにおけるnodiscard属性の使われ方についてメモ。 2024-05-21追記:2024年3月会合でP3201 LEWGポリシーが採択*1され、C++標準ライブラリではnodiscard属性を用いないと決定した。あくまでライブラリ仕様規定から削除されるだけであり、各C++処理系の判断でnodiscard属性は利用されうる。C++23現在はnodiscard指定される関数からも削除される可能性が高い。 2024-07-05追記:2024年6月会合で提案文書P2422R1が採択され、C++2c(C++26)標準ライブラリの仕様としては全ての関数からnodiscard属性が削除される。 関数戻り値の誤った破棄を警告する目的でC++17言語仕様に導入された。標準ライブラリではC++2a(C++20)からの利用となる。2018年8月現在、下記関数がnodiscard属性付与対象
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く