SSブログ

本日のつぶやき: まとめ 2022/04/30

  • 【読了】『木曜日だった男 一つの悪夢 (光文社古典新訳文庫)』チェスタトン https://t.co/fkfQEp0ALS #booklog 04/29 20:31
  • ブラウン神父で有名なチェスタトンの作品。風変わりでファンタジックで謎な話。書籍紹介文にあったピクニック譚...『木曜日だった男 一つの悪夢 (光文社古典新訳文庫)』チェスタトン ☆3 https://t.co/5YoSjg3YTn #booklog 04/29 20:55
  • 【読了】『くすぶり中年の逆襲』錦鯉 https://t.co/OBtlNwgmzE #booklog 04/29 22:27
  • 2021年のM1グランプリで優勝した錦鯉の本。タイミング的に微妙だったから間違えがちだが,出版されたのは...『くすぶり中年の逆襲』錦鯉 ☆3 https://t.co/pvunhrlS2k #booklog 04/29 22:38

nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/29

  • #未来への10カウント 満島ひかりが可愛すぎる 04/28 21:52

nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/28

  • #悪女 そもそも前提がおかしい。スッポンに失礼だろ。 04/28 00:21
  • #悪女 脚本がクソ過ぎる。実際の企業のこと何も知らね〜んじゃね〜か? 世間知らず。 04/28 00:35

nice!(0)  コメント(0) 

C++20の新機能Rangesを使ってみたい!(2) [ソフトウェア/PC関係]

C++ Rangesの話の続き。であるが,Rangesの機能の話を続ける前に,試してみる環境の話をしたい。記事のタイトルも「Rangesを使ってみたい」だったわけで。プログラミング言語の機能なのだから,実際にプログラムを動かしながらやっていきたいところだ。

C++ Builderの記事でも書いたが昔は無料で試せるC++コンパイラなどまずなかったが,今や最先端の処理系を基本的に無料で試すことができる。ありがたい時代になったものだ。今世界的に代表的なC++コンパイラといえばMicrosoftのVisual C++,GNUのg++,そして様々な会社が関わって開発されているClangの3つといってよいだろう。各陣営(という言い方が適当かはわからないが)標準化に対するスタンスは微妙に違うようだが,新しい標準への対応や提案段階の機能の試験的実装などが早いのは確かである。なので,新しい機能を実際に試してみようと思ったら,まずこれら3つの処理系をチェックしてみると良い。しかもWindows環境では3つのどれも無料で使用可能である。VC++の場合は,個人利用や小規模な企業などライセンス条項の使用権に該当すればVisual StudioのCommunity Editionを無料で利用できる。無料バージョンとは言え,製品版のProffessional Editionと機能的にほぼ同等なので,C++を試してみる分には何ら不足はないはずだ。 g++とClangについては,基本的にはLinux環境向けに開発されているオープンソースのソフトウェアである。が現行のWindowsではどちらも利用可能になっている。その方法は2通りある。1つはcygwinというLinux互換ツール環境を使う方法で,もう一つはWSLというWindows上でLinuxを動作させる仕組みを使うことである(詳しい人にはDockerを使ったり,Hyper-Vのような仮想化環境を使うなどの選択肢もあるがここでは触れない)。どちらも標準インストールのWindowsには含まれていないので,自力でインストールする必要がある。インストール方法についてはInternet上にいくらでも解説しているサイトを見つけることができるのでここでは割愛する。

cygwinもWSLもインストールしただけではg++もClangもインストールされていない可能性があるので必要に応じて追加パッケージのインストールが必要となる。例えばcygwinでは標準ではg++がインストールされないので,cygwinのインストール時に使用したセットアップ・プログラムを再度起動して,パッケージ選択画面で,「View」を「Full」に変更してから「Search」欄に「g++」と入力して検索する。検索結果の中に「gcc-g++」というパッケージが見つかると思うので,マウスでダブル・クリックすると「New」列の表示が「skip」からバージョン番号に変わる。現時点では選択できるg++のバージョンはいくつかあるのだが特に理由がない限り最新バージョンを選んでおけばよいだろう。私の環境では11.2がインストールされている。Clangの場合はcygwinではあまり新しいバージョンのパッケージは用意されていなくて。私の環境では8.0.1となっている。これで良ければg++と同様のやり方でパッケージをインストールできる。

WSLの場合,Linuxのディストリビューションと同じものが動作すると考えて良いので,Linux用に開発されているソフトウェアは最新版が利用できると考えて良い。私の環境では好みでubuntuを使用しているので,ubuntuを例にとって説明する。WSL2で配布されているubuntuにはいくつかのバージョンが有り,少し前までは20.0.4が最新であった。このバージョンならwslコマンドでインストールできる。ただ,こいつは少し古いので,配布されているソフトウェア・パッケージのバージョンが最新ではない場合がある。もちろん,自分でソース・コードからビルドすれば最新バージョンを使うことは可能だが色々と面倒くさい場合がある。私の調べたところubuntu20.0.4でふつうにaptコマンドでインストールできるのはg++が9.3.0であった。しかしテスト版のパッケージを配布しているサイトを登録するとg++11をインストールできた。手順についてはこちらのサイトを参照されたい(英語だが,特に難しいことは書いてない。テスト版パッケージの利用は自己責任なので悪しからず。) Clangに至ってはubuntu 20.0.4のインストール直後にはパッケージすら見つからなかった。だが,以下のコマンドで,リストをアップデートしてから再度試したらたらインストールできた。バージョンは10.0であった。

user@hostname ~/cpp
$ sudo apt update

....(出力は省略)...

もっと新しいバージョンを使いたい場合は,Clangの公式サイトからpre-built版をダウンロードできる。ダウンロードしたアーカイブ・ファイルを展開しまるごと/usr/localにコピーすれば使えるようになる。現時点の最新版はバージョン14である。

user@hostname ~/cpp
$ tar xf clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz

user@hostname ~/cpp
$ cd clang*

user@hostname ~/cpp/clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04
$ sudo cp -R * /usr/local/

ubuntu 20.0.4のところで「少し前までは最新」と含みをもたせた書き方をしたが,実は今週になって22.0.4が利用可能になり,WSL2版も用意されたのだ。まだwslコマンドではインストールできないようだが,「ストア」アプリからはインストール可能になっている。最新版だけあって,g++も11.2,Clangも14.0をインストールできる。現状これを使うのが一番お手軽である。

とこれで有力な3大処理系が揃ったことになる。これはなんとも贅沢な環境だ。問題はRangesのサポート状況だが,こちらのページにC++の各改訂版の新機能の処理系別のサポート状況がまとめられている。Ranges は「c++ 20 library features」の表の中段くらいに「The One Ranges Proposal」として載っている。これによるとg++はバージョン10で一部サポート,Clangはバージョン13で一部サポート,VC++はバージョン19.29でサポート(*が付いてるが)となっており,どの処理系でもまだ完全サポートには至っていないことを窺わせる。最新の機能なので仕方ないとも言えるし,C++20に取り込まれたRangesがまだ不完全と言われていることも関係しているかも知れない。そんな訳で実際どのくらいまで使えるものかは,実験してみるしかない。次回はその辺りを書きたい。


nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/27

  • 【読了】『SCIS 科学犯罪捜査班~天才科学者・最上友紀子の挑戦~ (光文社文庫)』中村 啓 https://t.co/lyRScwkqIM #booklog 04/26 13:01
  • 日テレで放送が始まったばかりのドラマ「パンドラの果実」の原作だと言うので読んでみた。のだが,どうもクオリ...『SCIS 科学犯罪捜査班~天才科学者・最上友...』中村 啓 ☆2 https://t.co/kbOIfxUEKU #booklog 04/26 13:39
  • 『C++20の新機能Rangesを使ってみたい!』脈絡もとりとめもない独り言|https://t.co/thPjmwh7Q2 04/26 21:42

nice!(0)  コメント(0) 

C++20の新機能Rangesを使ってみたい! [ソフトウェア/PC関係]

先日,数十年ぶりに本業のプログラム開発でC++言語を使う機会を得た。この間はJavaやらPythonやらを使った開発仕事しかなかったのだ。今回は単発仕事とは言え,使用する言語仕様も自由にしてよいという制限の少ないものだったので,心置きなく新しい標準仕様(世間ではModern C++と呼ばれることが多いようだ)を使わせてもらった。とは言え新しい機能は私自身よく理解できていなかったものも多く,そういう意味では限定的ではあったが。しかも使用するライブラリがVC++の/stdc:c++17オプション(ISO C++17規格)でコンパイルできないものがあったせいで最新のものは使えなかったのだが。

C++の標準化に関わっている身としては最新規格の機能を全てちゃんと理解しておくべきなのだが,仕事でガッツリ使う機会がないとなかなか理解は深まらないものなのである。実際今回の仕事を通して理解が深まったものも多いし,ついでにちょっと学習意欲が高まったこともあり,以来いろいろ文献を読んだりしている。そんな中,今ちょっと興味が高まっているのはRangesである。これは文字通りC++で範囲を扱うための仕様で,2020年発行の規格改訂版C++20で新規に取り込まれたものだ。C++の標準化の進め方として,ある程度規模の大きい機能は,まずTechnical Specification(TS)という独立した仕様(といっても現行のC++の拡張仕様という形)にまとめて,単体で議論し,実際に使ってみてから,それを元にブラッシュアップしてC++本体仕様に取り込むという手順になっている。そんな訳でRangesが最初に提案されたのはだいぶ前でTSの時点で目にはしていたのだったがちゃんと読んでなかったということか,どうも内容を間違って認識していた事がわかった。お恥ずかしい限りだが,この際ちゃんと理解して使えるようにしておきたい。で,範囲を扱うというのは間違いではないのだが,単に範囲を扱うクラスを導入すると言うだけでなく,C++の標準ライブラリを巻き込んだ影響度の大きい仕様だったのだ。

ざっくり説明するとコンテナ・クラスとそれを扱うためのアルゴリズム・ライブラリの改訂ということになる。コンテナクラスというのはvector,list,map,setなど,複数の同じタイプのデータをまとめて管理・処理するためのクラスである。C++でアルゴリズムというとコンテナのインスタンスに含まれるデータを対象に何らかの処理を行うライブラリである。代表的なものにはソートがある。アルゴリズムがコンテナを処理するためには普通コンテナに含まれるデータに順次アクセスできる必要がある。しかしながらコンテナと呼ばれる各クラスはそれぞれ目的もデータの管理の仕方も別々であるし,必ずしも継承関係にないので,そのままでは全部別々のアクセスの仕方をする必要がある。つまりソート一つとっても,コンテナ・クラス別に用意しなければならなくなってしまう。これはあまりに非効率だ。ソートのアルゴリズムは共通なのにデータのアクセスの仕方が違うというだけで,アルゴリズムを実装したコードがコンテナ・クラスの数だけ重複して存在することになる。それでは,メンテナンスの観点でもよろしくない。これをどのように解決したかと言うとIterator(反復子)である。Iteratorは各コンテナ・クラスとは別のクラスであって,大雑把に言うとポインタである。典型的にはコンテナの中の1つのデータを指すポインタであって,*演算子を適用することでデータの値を読める。そして++演算子を適用することで次のデータを指すように変化する。そしてコンテナ内のデータの末端を表すもう一つのIteratorの値と同値になるまで++演算子の適用を繰り返すことでコンテナ内のすべてのデータを読めるようになっている。Iteratorは各コンテナクラス毎に,演算子オーバーロードを駆使して定義されるが全て同じインターフェースを継承しているのでIteratorに対応したアルゴリズムは,異なる種類のコンテナ・クラスを共通して扱えるというわけだ。このようにIteratorは先頭のデータを指すものと,末端を指すもの(通常は最後のデータの次を指す)の2つを組にして利用するようになっている。先頭と末端で囲まれたデータ,ということはこれは範囲にほかならない。Rangesが組み込まれる以前はIteratorのペアとして範囲を扱っていたのだ。例えば整数のvectorをソートすることを考えてみる。Ranges以前は次のようになっていた。

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector vec {10, 5, 3, 7, 1, 4};
	
	sort(vec.begin(),  vec.end());
	
	for(auto x : vec){
		cout << x << endl;
	}
	return 0;
}

begin関数はvectorクラスの先頭の要素を指すIteratorを返す関数,end関数は末尾を指すIteratorを返す関数である。そしてsort関数がIteratorのペアを引数にソートを実行するアルゴリズム関数である。これをコンパイルして実行すると次のように出力される。

user@hostname ~/cpp
$ g++ sort_ex.cpp -std=c++20 -o sort_ex

user@hostname ~/cpp
$ ./sort_ex
1
3
4
5
7
10

これはこれで,そういうものだと思えば納得なのだが,いちいちbeginとendを自分で呼び出してやるのは煩雑である。こんな決まりきったコードをプログラマに書かせないで済ませるのがオブジェクト指向の良いところだろう。シンプルにコンテナのインスタンスをポンと渡してやって済ませられないだろうか。Rangesはこの問題を解決してくれる。仕組みとしてはbeginとendの2つのIteratorを1つにまとめて扱うためのデータ型のようなものを導入しているのだが,endの部分が少し変更になっている。Ranges以前はbeginとendが必ず同じクラスのメンバーでないといけないという制限があったがそれがなくなり,単に番兵(sentinel)と呼ばれる,末端を判断するためにbeginと等値比較ができれば良いようになった。なんだかよくわからないかも知れないが,これはとりあえず自分でコンテナ・クラスを定義したりしない限り余り用がない。普通に使うならbeginとsentinelは表に出てくることはないからだ。先程のsortの例は,Rangesバージョンだと次のように書ける。

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector vec {10, 5, 3, 7, 1, 4};
	
	ranges::sort(vec);
	
	for(auto x : vec){
		cout << x << endl;
	}
	return 0;
}

違いはstd名前空間のsort関数ではなくstd::ranges名前空間のsort関数を使うことと,2つのIteratorの代わりにコンテナ・インスタンスそのものを引数に渡すところでだけある。これだけでもだいぶシンプルになったのが分かるだろう。このようにRangesではもともと存在していたアルゴリズム・ライブラリをRanges対応に置き換えたライブラリが提供されるのである。RangesがSTL(Standard Template Library) v2とも呼ばれているのはそうした理由からであろう。C++の最初のISO標準であるC++98から存在しているSTLがより近代的に改訂されたのである。とは言え,sort関数の引数が1つになったくらいではそれほど大した話ではないと思うだろう。実際Rangesの恩恵はそんなものではないのだ。そうしたことについてはまた次回。


nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/26

  • MSのVisualC++2022,C++20のrangesのコードがコンパイルできないみたいなんだけどどういうこと? viewを使おうとすると謎のエラーになる 04/25 13:55
  • 遂に!! 楽しみ😊| 「鎌倉殿の13人」“静御前”石橋静河 いよいよ来週初登場!“菅田義経”も首ったけの舞に期待 #SmartNews https://t.co/mXwzKbueIb 04/25 14:48
  • 【読了】『医者の本音 (SB新書)』中山 祐次郎 https://t.co/T7J6tXqjzu #booklog 04/25 19:32
  • 「泣くな研修医」シリーズの著者としても有名な中山祐次郎氏の本。病院の裏側などに興味のある私としては見過ご...『医者の本音 (SB新書)』中山 祐次郎 ☆3 https://t.co/IozQC0vJLq #booklog 04/25 19:49
  • これってガセ? どこにも売ってないんだけど…。| SOUNDPEATS、4,280円のIPX5防水ワイヤレスイヤホン - 発売記念で2,568円 #SmartNews https://t.co/TDm9cyAfVl 04/26 00:44
  • ようやくでてきた。何度もこのページはチェックしてたんだけど。27日まで。https://t.co/qtMf5z1k02 04/26 02:24

nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/25

  • タイソン・フューリー、大っ嫌いなんだけど、なかなか拮抗する強さの挑戦者は現れないなぁ。 04/24 10:10
  • 【読了】『ソクラテスの弁明 (光文社古典新訳文庫)』プラトン https://t.co/DDhjPLSe4c #booklog 04/24 14:05
  • この作品のタイトルは子供の頃から知っていた。おそらくどこかの文庫のキャンペーンのカタログに載っていたので...『ソクラテスの弁明 (光文社古典新訳文庫)』プラトン ☆3 https://t.co/ZDOSSGkb8I #booklog 04/24 14:29
  • 【読了】『読んだら忘れない読書術』樺沢 紫苑 https://t.co/CGPhBEl2be #booklog 04/25 00:16
  • 看板に偽りありの本。自慢ではないが読んだ本の内容を忘れてしまうのが得意技の私,なんとかしようと,読ん...『読んだら忘れない読書術』樺沢 紫苑 ☆2 https://t.co/7L3Tp5RMPo #booklog 04/25 01:20

nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/24

  • 【読了】『凍える島 (創元推理文庫)』近藤 史恵 https://t.co/JxOSILJ8OD #booklog 04/23 21:00
  • 風変わりなミステリーである。でもミステリーと言うには少々フェアではないスタイル。叙述トリックというのでは...『凍える島 (創元推理文庫)』近藤 史恵 ☆4 https://t.co/jesWuCaBA8 #booklog 04/23 21:46
  • /honto10周年記念読書一生分プレゼントキャンペーン\抽選で #読書一生分 に相当するhontoポイント『1,014,099ポイント』などが当たる!! 2022年5月31日まで応募はこちら🔽 https://t.co/R0YuPB4fVR 04/24 00:56
  • #VENUE101 #羊文学 NHKでパフォーマンスが放送されるなんて感無量。1999の再生数がそんなとんでもないことになってたとは知らなかった。ニュー・アルバムも素晴らしいし。どんどん注目されて欲しい。初めて観たのはもう5年も前の4月か 04/24 01:15

nice!(0)  コメント(0) 

本日のつぶやき: まとめ 2022/04/23

  • おおっ!! ついに出るのか待望の続刊!!! 楽しみ 。| よろずを引くもの お蔦さんの神楽坂日記 https://t.co/csJ0HTxfoi @amazonより 04/22 11:40
  • #インビジブル 言っちゃあ何だが,桐谷健太君は頭が悪そう過ぎて警察の幹部とか違和感がありまくる 04/22 23:49

nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。