C++11とC++98 & boostの切り替え

 現在、21世紀なので普段はC++11を基本的に使っているのだが、たまにC++98でないといけないケースは存在する。共用のサーバにC++11対応コンパイラが入っていない、などだ(なぜ入っていないかは謎である)。かといって石は何の変哲もないXeonだったりするので非常に謎が多い。C++11対応を望む声が小さいのかもしれない。

 ところで、std::arrayを使いたいという欲求はC++erにとっては非常に一般的なものだろう。しかしstd::arrayC++11だ。なので、boost::arrayを代わりに使うというケースがある。実際、これらの差は非常に軽微なので今までのところこれらが入れ替わったことによって問題が生じたことは(私のこれまでの短い経験では)ない。違うのはdata()メンバ関数とかだろうか。どうせならその辺りをちゃんと(実装例のソースを読んで)調べてみればよかった。

続きを読む

意味とニューラルネットワーク

 まず初めに、私はその手の技術や学問分野の専門家ではないし、体系立った学習も行っていないことを告白しておく。つまり以下の文章は素人の妄想だ。

 最近Google翻訳ニューラルネットが導入されたようで、いろいろな文章が翻訳にかけられては様々な人が意見を言い合っていた。そして「機械は意味を解釈していない」という批判が出ていた。「意味の理解」をぞんざいに扱ったままこのような話をするのは危険な気がするが、踏み込むと帰ってこれなくなるので、ここでは私と読者にある程度のコンセンサスがあるとしよう。するとニューラルネットによる翻訳は出力が非常に「文章らしい」が、確かに「意味」はわかっていないのだ。わかってほしいかどうかは別として。では我々は何なのか。ニューラルネットと我々と、どこに違いがあるのだろう。

続きを読む

問題2

この前の問題2が少し気になっていた。

交互に要素を取ることで、2つのリストを結合する関数を記述せよ。例えば [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]を返す。

というやつである。

というわけで、std::array<char, 3>std::array<int, 3>を受け取ってstd::tuple<char, int, char, int, char, int>を返す関数を書いた。

続きを読む

variadic template で reverse

今日、ふと思ってこのようなものを実装できないか考えてみた。

template<template<typename ... T> class target, typename ... T_args>
struct reverse
{
    typedef target</* reversed T_args... */> type;
};

例えば、

typename reverse<std::tuple, int, double, std::string>::type t =
    std::make_tuple("foo", 3.14, 42);

みたいなことができてほしい(今書いているコードでできる必要があったわけではないが……)。とっとと実装を見せろ、という人はこの記事の最後にコードの全体がある。

続きを読む

ソフトウェアエンジニアなら1時間以内に解けなければいけない5つの問題 in C++

 何気なく調べ物をしていると、全然関係なかったのだが「ソフトウェアエンジニアなら1時間以内に解けなければいけない5つの問題」なる記事が目に入った。流行ったのは去年の夏前頃のようだが、遅ればせながら参戦してみた。一番よく使っている言語、C++で。結論から言うとクリアできたのでソフトウェアエンジニアの必要条件は満たしているようだ。

続きを読む

何度目になるのだろう

 自分が考えたことを公開するための場を持つのは。始めた後少しの間は続くのだが、数ヶ月くらい経つと放置するようになってしまい、半年も経ってから見ると書いていた当時と感覚が変わってしまっていたりして、何となくそこに自分の作った何かを追加することが躊躇われるようになってしまう。

 しかし以前に書いたものでも、今も共感できる、というか、自分が書いたものだと感じられるものは残っているので、そういったもので当たり障りのないものは一部移植していきたい。

動作の主について

 何かしら危ない目に遭ったり、スポーツをしているときなど、思考が非常に素早く流れるように感じられることがある。いまさっき、台所で包丁を落としかけてその現象に遭遇した。しかし今回体験してみて、自分が「とても早くものを考えていた」ということを認識したのはことが済んでからだったという非常に当たり前のことを知った。そして恐ろしいことを思った。

 普段自分が何かを考えているということを知るのは、いつもそれが終わってからだ。自分が考えていることが言葉として頭に浮かんでくる、あるいは何か図式的なイメージを意識的に脳裏に浮かべるためには、自分が何を考えているかについて考えなければならない。少なくともそこに、知る・語る・イメージするための1過程があるだろう。こうして筆を執っている「私」、自覚的な「私」、「私」のそばにいる方の「私」は、常に考えの最先端から取り残されている。そしていつもさっさと決定を下し、体の動きを決めているのは、奥に引きこもっている私、無口で得体の知れない私、「私」とはどこか別のところに潜んでいる私のように思えた。

 昔から不思議だった。何かを考えるとき、常に言語を用いて考えを1つずつ先へ進めていくわけではなく、何か、曰く名状しがたいものを頭の中でこねくり回して(あろうことかこねくり回している間、「私」はどうやってこねくり回しているかすらもよくわかっていない)、ある時それは降って湧いてくる。そうして「私」は答えと確信を、またはあきらめと妥協点を、また或は憶測と試してみる価値のあるものを得る。意識のうち、他の部分の活動を言語化・図案化してモニタしている部分に渡されるのはいつも感情と思索の完成品だけで、「私」は自分の脳がどのようにそれを生み出したのか知る由もない。

 ずっと不思議だったのだ。本を読んでいたり、話している最中に、つまり言語を紡いでいる真っ只中なのに、ちょっと待てよと立ち止まり、考えを整理するあの瞬間、それまで言語の明かりを点していた私の頭蓋の中から明かりが消える。そして暗闇の中で何事かが起き……その間「私」は意識的に何も考えないようにしている時と、後で思い返す限りでは同じ状態になる……答えが出てくる。

 あの間、私は何をしているんだろう?

 初めてこのことを疑問に思ったのは恐らく小学生の頃だったと思う。当時は、考えているつもりで実は何もしていないのではないかと思って、考え事をしているとき頭の片隅で少しばかり焦っていた。沈思黙考している間、黙ってじっとしている私が何を考えているか他の人が見てもわからないのと同じくらいには、自分でも何をしているかわからないからだ。しかし最終的にいつも答えは出てくる(フラストレーションと諦めに終わることもある)。なので何かが起きているということになる。それがさっぱりわからない。「私」は自分で自分の思考の過程を全て追おうとしたこともある。つまり、何を前提にして、何を仮定し、何を導くか、全てのステップを意識的に行おうと思ったのだ。私の手綱を「私」が握ろうとしたのである。半ば当然ながら、それは失敗に終わった。突然ひらめくのを止めることはできないし、ひらめく過程を追うこともできず、またそのようにすると圧倒的に思考の効率が悪くなるのだった。

 「私」が認識している自分自身は、思っているよりも少ない部分なのかもしれない。もしあの暗闇の奥で蠢いている何かがある日入れ替えられたとして、「私」はそれに気づけるだろうか? 例えばある日頭を打って、何かを思いつくまでの時間や思いつく内容、溢れ出す感情が入れ替わったとしても、過去の自分と対照実験でもしない限り私はそれに気づけないだろう。「私」はいつも自分自身の傍観者だった。そして、自分の考えを再認識して初めて「自分」がわかるようになる以上、そこが一体化することはあり得ない。たとえ言語に翻訳しなくとも、図式をイメージしなくとも、自分の思索の過程をその最先端で自覚することはあり得ない。最先端で起こっていることは常に思索以外の何者でもないのであり、自覚の過程はそれとは異なるプロセスだからだ。

 「私」にはどうしようもない。「私」はあまり深く潜れないので、不気味に暗い水面の下に何があるのか、それはどの程度の大きさがあって、どのようにして推進されているのか、「私」がそこに影響を及ぼしているのかどうかなどは知りようがない。「私」はただ、水面に浮かぶ氷山の上にただじっとして、自分に見える景色を眺めながら、私に身を任せて、漂って行くだけだ。


2018/8/1 移行