タグ

ブックマーク / cpplover.blogspot.com (31)

  • macOSのM1とx86-64におけるベンチマーク比較の考察

    世間ではAppleの新しい製品に使われるARM64 CPUであるM1の話題でもちきりだ。ただし、日語を話す記者というのは極めて非科学的かつ無能であり、M1の現物を手にしても、末端のソフトウェアを動かして、体感で早いだの遅いだのと語るだけだ。そういう感想は居酒屋で酒を片手に漏らすべきであって、報道と呼ぶべきシロモノではない。 と思っていたら、Phoronixがやってくれた。M1とi7で動くmacOSでベンチマークをしている。 これを考察すると、M1のMac Miniは、一世代前のi7のMac Miniに比べて、メモリ性能とI/O性能が高く、演算性能は低いようだ。このことを考えると、M1の性能特性としては、動画のエンコードやソフトウェアレイトレーシングをするには不向きだが、その他の作業は遜色ないだろう。 問題は、仮想化とRosettaを組み合わせることができないという点だ。x86-64のユー

  • 本の虫: Ubuntuのカーネルをアップデートしたらカーネルパニックが起きた時の解決方法

    昨日、何気なくUbuntuのアップデートをしたら、カーネルが4.2.0-19-genericから4.2.0-21-genericにアップデートされた。いや、正確にはアップデートする途中でdpkgがエラーを出しているようだ。何やら脳裏に不安がよぎる。 リブートすると、"kernel panic not syncing unable to mount root fs on unkonown-block(0,0)"と表示されて止まってしまう。 仕方がないので、ブート時にShiftを押し続けてgrub2のメニューを出し、アップデート前のカーネルである4.2.0-19を選んでブートした。Ubuntuは、少なくとも一つ前のカーネルは残すので、カーネルをアップデートして、何らかの理由でそのカーネルに不具合がある時は、以前のカーネルを使うことができる。 さて、どうするのか。毎回これでは不便なのでとりあえず

  • HoloLensを体験したが10年早かった

    MicrosoftのHoloLensが日でも入手可能になったようだ。さっそく入手した人が身近にいたので体験させてもらったが、結論をいうと、10年早かった。 HoloLensは、一見するとバカバカしいまでに巨大で無骨なサングラスだ。そのレンズに投影することにより、あたかも空間上に物体があるかのように錯覚させることができる。空間上のある場所にウインドウや3Dモデルを設置すると、その場所に固定される。HoloLens装着者は空間に固定された表示物を好きな距離、好きな角度から見ているように錯覚する。 HoloLensがどのように空間を把握しているかというと、主に赤外線による深度センサーを用いて回りの深度を把握しているようだ。それにしても装着者の動きに追随する性能がすばらしく、ズレを一切感じさせない。 HoloLens風のコンピューターの性能が上がれば、通常のコンピューターの補助的に使うのはありで

  • D4492: Bjarne StroustrupによるC++17の考察の翻訳

    April 2015 : Standard C++ C++WG内部のMLで議論していた内容が、どこからか外部に流れて、様々なフォーラムで話題になっている。 “What will C++17 be?” -- Bjarne Stroustrup on C++17 goals : programming What will C++17 be? | Hacker News C++ Daddy Bjarne Stroustrup outlines directions for v17 • The Register Forums これを受けて、Bjarne Stroustrupは議論をまとめて標準化委員会の論文として公開することにしたが、それも時間がかかるので、ドラフトがC++財団にあがっている。 [PDF注意] D4492 C++17の考察 Bjarne Stroustrup このドラフトはLexe

  • InfoQのC++17についてBjarne Stroustrupへのインタビュー記事の翻訳

    Stroustrup: Thoughts on C++17 - An Interview C++の設計者にして最初の実装者であるBjarne Stroustrupは、C++17の設計と新機能の議論の起爆剤となるための、ドラフトを公開した。Stroustrupによれば、C++17は以下の3つの設計目標がある。 巨大な依存関係のあるソフトウェアのサポートの改良 並列実行に高級なモデルのサポートの提供 コア言語を簡単にする 上記の設計目標について、StroustrupはC++17に入る以下もしれない機能を列挙した。Stroustrupの好ましいと考える機能の例が以下だ。 モジュール、ローカル性とコンパイル時間の改良 契約、仕様の改良 型安全union、関数型プログラミング風のパターンマッチを土台にしたものになるだろう コンセプト レンジ 統一関数呼び出し記法、仕様とテンプレートライブラリ利用を簡

  • constexprで非定数式の状態を保持

    Non-constant constant-expressions in C++ なんと、C++のconstexpr関数を呼び出すたびに戻り値を変える方法があるという。つまり、以下のstatic_assertが引っかかるコードだ。 int main () { constexpr int a = f (); constexpr int b = f (); static_assert (a != b, "fail"); } なんと、constexpr関数は状態を保持できる計算能力を備えているというのだ。 fはconstexpr関数である。 読んでみたところ、要するにこうだ。 noexcept演算子はオペランドが定数式かどうかを判別するのに使える。 // exprが定数式であればtrue constexpr bool b = noexcept( expr ) ; 未定義の関数は定数式ではない。

  • libclangを使ったC++のセマンティックハイライトのVimプラグイン、color_coded

    https://github.com/jeaye/color_coded Color_Coded: Bringing LibClang Highlighting To Vim - Phoronix color_codedは、libclangを利用して、C/C++/Objective-Cの文法を考慮したセマンティックハイライトをしてくれる。単なるキーワードや正規表現指定によるハイライト以上に優れたハイライトが得られる。 なお、Ubuntu 14.10のvimで試そうとしたところ、Vimのバージョンが古いとして動かなかった。 ドワンゴ広告 この記事はドワンゴ勤務中に書かれた。 ドワンゴ社内にはEmacsユーザーよりもVimユーザーの方が多いと思われる。 ドワンゴは物のC++プログラマーを募集しています。 採用情報|株式会社ドワンゴ CC BY-ND 4.0: Creative Commons

  • 婚約者が作って欲しい料理:オムライス

    婚約者がオムライスを作って欲しいと言ったので、作ってみた。 オムライスを作るにあたって問題がある。私はケチャップが嫌いだということだ。ケチャップは安直な味がする。スパゲティにケチャップをかけるさもしい異端者になりたくはないものだ。私はケチャップと味覇を封印することを空飛ぶスパゲティモンスター様に誓っている。ラーメン。 色々と調べた結果、ケチャップではなく、ホールトマト缶で作ることに決めた。 作り方 鶏の胸肉を細かく刻んでオリーブオイルと塩とハーブ(コショウ、バジル、オレガノ)を入れたジップロックに入れておく。 タマネギ、人参、ピーマンをできるだけ細かくみじん切りする。 フライパンで肉と野菜を炒める。 ホールトマトを入れて、コンソメと塩とハーブをいれて煮込む。 ご飯を入れて炒める。 卵に牛乳を少しだけいれてよく混ぜる。 フライパンを熱して、多めにバターを入れて、溶き卵を入れる。火は10秒ほど

  • 結婚することになった

    突然だが、結婚をすることになった。年内に籍を入れることを考えている。あまりに唐突に決まったため、周囲からも人も、ノリで結婚することになったと言っている。 「契約結婚しましょう」 と女は言った。その言葉は江添に対して発せられたようではあるが、どうにも意図が曖昧である。女は江添に対して結婚を申し込んでいるようにも聞こえ、あるいは、江添は誰かと結婚をすべきであると言っているようにも聞こえる。前者の解釈が誤りである場合、江添は大変なうぬぼれをしたことになる。前者かどうかを確かめるには、ここでわざとらしいにやけ顔を作り、おどけた声で、「私と?」などと答えればよいだろう。たとえ解釈間違いであったとしても、うぬぼれやを気取った冗談で済む対応だ。 ここは筆者の住むシェアハウスのリビングであり、たまたま何人かの男女が集まって、軽く酒を飲みながら話をしている。となりでは、いかにも恋愛経験の豊富そうな大人の女

  • range-based forで固定回ループ

    の虫: Dwangoプログラミングコンテストの感想で固定回のループがあればいいと書いたが、range-based forにそういうイテレーターを与えてやればいいのではないかと気がついた。つまり、こういうことだ。 class counter_iterator { std::size_t i ; public : counter_iterator() : i(0) { } counter_iterator( std::size_t n ) : i(n) { } bool operator == ( const counter_iterator & rhs ) const { return i == rhs.i ; } bool operator != ( const counter_iterator & rhs ) const { return i != rhs.i ; } std::siz

  • メンバー関数へのポインターを返すメンバー関数へのポインターを返すメンバー関数

    class Foo;が存在したとして(1)Fooのメンバ関数ポインタ(2)を戻すメンバ関数のポインタが欲しいと思った(なお(1)で戻すメンバ関数もFooのメンバ関数ポインタを戻す)のだが、どうあがいても記述出来ないものだったりするのだろうか? ようするに、以下のようなことがしたいわけだ。 class Foo { public : // メンバー関数a void a() { } // メンバー関数aへのポインターを返すメンバー関数b ??? b() { return &Foo::a ; } // メンバー関数aへのポインターを返すメンバー関数bへのポインターを返すメンバー関数c ??? c() { return &Foo::b ; } } ここで、???の部分に戻り値の型を記述しなければならない。 もちろんこれは記述できる。ただしその記述は、C++の規格のバージョンにより難易度が異なる。 C

  • 最近のC++17事情

    C++1z、あるいはC++17とも呼ばれている次のC++規格の、最近の事情はどうなっているのか。すでにドラフトに取り入れられた機能もあるので、現在の最新の状況を見ていこう。もうすでに紹介したものも含まれているが、おさらいとしてみていく。また、ここで解説する新機能は、いずれもすでにドラフト入りしているが、正式に規格制定される際に変わる可能性がある。 N3928: メッセージなしstatic_assert C++11で入ったstatic_assertは、必ず文字列リテラルを書かなければならなかった。 static_assert( INT_MAX >= 2147483647, "This code assumes at least 32-bit int." ) ; static_assert( true == true, "You're compiler is fundamentally wro

  • C++11/14の採用が進んでいないのはだいたいRHELのせい

    C++11やC++14は、すでにGCCやClangの最新の安定版で実用的に使えるようになっているが、なかなか現場で広く使われるようにはなっていないように見える。これはなぜか。やはり教育者の不足か。参考書がないのか。それもあるかもしれないが、最大の理由がある。 RHELが悪い。 RHEL 6のGCCのバージョンは4.4である。これは。C++11をまともにサポートしていない。GCC 4.4当時といえば、まだC++11がC++0xと呼ばれていた時代で、一部機能を当時のドラフトに基づいて実験的実装をしていた。正式な規格とはだいぶ異なっているだろうし、不具合もたくさんあるものと思われる。 次のRHELのバージョンは7であるが、これにはGCC 4.8が入るものと思われる。しかし、すでにGCCの安定版は4.9だ。GCC 4.8もC++11実装に不具合が色々あってあまりお勧めできない。これがあと何年も使わ

  • C++11の時間ライブラリ: chrono

    <chrono>は、C++11で追加された時間ライブラリである。 単位時間を扱うためのduration、起点からの経過時間を扱うためのtime_point、現在の起点からの経過時間を取得するためのclockからなる。Cの標準ライブラリのtime_tとtime(), clock_gettime()を置き換えることが出来る。日付機能は含まれていない。 duration 時間について考える。一時間は60分である。1分は60秒である。1秒は1000ミリ秒である。 単位の異なる時間の値を相互に変換するのは、簡単な計算だ。 unsigned int min_to_sec( unsigned int min ) { return min * 60 ; } しかし、実引数minに渡される値の単位が分であることを保証する方法はない。間違えたとしても、コンパイルエラーにはならない。 chronoでは、時間単位

  • Dwangoプログラミングコンテストの感想

    2016年2月14日、dwangoプログラミングコンテスト2016が行われた。「ドワンゴからの挑戦状」というタイトルもつけられている。 今回の競技プログラミングの参加者は、1月24日に行われた予選を勝ち残った、2016年度新卒予定者から上位20名、一般から上位10名の者である。予選では、以下のような問題が出された。 Welcome to dwangoプログラミングコンテスト - dwangoプログラミングコンテスト | AtCoder この予選が終わった後で、筆者が予選問題を試みた結果が以下である。 の虫: ドワンゴのプログラミングコンテストをクリアできなかったお話 筆者は、C問題のゲーマーじゃんけんの期待値計算が分からなかったので、バカにでも書けるモンテカルロ法を使い、力技で解こうと試みたが、少数点6桁という圧倒的に高い精度が要求されているため、必要な精度が出ずに敗北した。後に聞くとこ

  • ドワンゴのプログラミングコンテストをクリアできなかったお話

    dwangoプログラミングコンテスト2016 ドワンゴが主催するプログラミングコンテストの予選が、24日に行われたそうだ。筆者はクリアできなかったが、簡単なものだけ解説する。格的な解説が読みたい人は、わざわざこの記事を読まずとも、以下で解説されているようだ。 「dwangoプログラミングコンテスト」予選問題解説 // Speaker Deck A: プレミアム会員 - dwangoプログラミングコンテスト | AtCoder ニコニコ動画には、プレミアム会員という制度があります。このプレミアム会員制度には月額一定の額を支払うことで加入できます。 ニワンゴくんは、この n ヶ月間連続してプレミアム会員です。 また、x ヶ月前に月の一定支払い額が 525 円から 540 円に変わったことを知っています。 つまり、この n ヶ月のうち最近の x ヶ月間は月額 540 円支払っていて、それ以外の

  • C++の正規表現ライブラリ: std::regex

    いまさらながら、C++の正規表現ライブラリを調べている。 C++の正規表現ライブラリ、std::regexは、boost::regexを土台に設計されている。boost::regexの正規表現の文法は、perlなのに対し、std::regexは、ECMAScriptである。この理由は、しっかりと正規表現の文法が定義されていて、外部規格として参照できる品質のものが、perlには存在しないためだ。std::regexはposixと拡張posixとawkとgrepとegrepの正規表現にも対応している。 記事では、ECMAScriptの正規表現を使う。また、参考のためのECMAScriptのコードも使う。 全体一致 文字列全体が正規表現に一致するかどうかを調べたいとする var re = /1234/ ; var text = "1234" ; var result = re.test( te

  • 各言語のARVv7とx86-64での実装のパフォーマンス比較

    LPATHBench/writeup.md at master · logicchains/LPATHBench 同じ箇所に二回訪れずに最も長い経路を見つけるコードで。各言語の実装を、ARMv7とx86-84においてベンチマークしてみた結果が公開されている。 記事に書いてあるように、これは、ARMv7とx86-64のプロセッサーのベンチマーク比較ではなく、各言語の実装が、ARMとx86-64でどれだけ効率的に実装されているのかを比較している。 たとえば、C++はARMにおいてはx86-64の74%のパフォーマンスを出している。しかし、ARM版OpenJDKはなんと29%の速度しか出ていない。OracleによるJava実装は、40%ぐらいのパフォーマンスを出している。 コードはとても短いが、パフォーマンス改善のためのpull requestがどんどんよせられたらしく、その結果が興味深い。Ja

  • C++1zに採択された新機能

    C++1zともC++17とも呼ばれているC++の次の規格には、まだ大きな機能は採択されていない。それでも、いくつかドラフト入りしている新機能はあるので、ここではその機能を紹介していく。 いつも通り、ここに書かれている内容はまだドラフト段階の機能であり、今後変更されたり、取り除かれたりする可能性もある。 N3928: メッセージ無しstatic_assert C++11で追加されたstatic_assertには、文法上、必ず文字列リテラルを記述しなければならなかった。 static_assert( expr, "Captain Obvious To the Rescue! expr is false.") ; この文字列リテラルは、実装が診断メッセージ(例えばコンパイラーのエラーメッセージ)に使うことができる。しかし、C++14までは、文字列リテラルが文法上必須で、必ず記述しなければならなか

  • Tarse Range-Based forがClangから取り除かれていた

    C++1zには、N3994: Tarse Range-based forが提案されていた。これは、Range-based forで型を書かずにすむようになる小粒な新機能だ。 任意のコンテナーを受け取って、その要素をすべて標準出力に出力する関数テンプレートを書くとする。これは以下のように書ける。 template < typename Container > void print( Container const & c ) { for ( typename Container::value_type & elem : c ) std::cout << elem << '\n' ; } いちいち型を書くのが面倒だ。これにはautoを使えばよい。 template < typename Container > void print( Container const & c ) { for (