write関数で`\0`(null文字)を書き出して| cat -eすると^@が出てくる話

こんにちは,狐と初音ミクが大好きなぐーたら狐です.
今日は^@^Mというメモリにゴミとしてよく存在する者たちの意味と,その単純な確認方なんかのお話です.

^@ってなんや

C言語で用いるwrite関数を用いると,実はnull文字が書き出せます.詳しくは次の節のwrite関数で遊ぶを参照してください.
通常は標準出力してもnull文字は表示不可能文字なので表示されてくれませんが,| cat -eを実行の際につけることで,表示不可能文字を書き出してくれます. すると^@と出力されるのです.つまりnull文字がシステムの上で^@とも表記されているらしいことが分かります.
同様に,適当なポインタを指定して,メモリ空間を100文字くらい書き出してみたりすると^Mとか^Qとかが現れたりします.この^付きの表記って意味があったりするのかなぁと思って調べてみたら,実は意味があったことが分かりました.
この表記方法はキャレット記法と呼ばれる記法です.
^はctrlキーを意味します.Mはasciiコード上で10進数として77ですが,^はこのasciiコードから10進数で-64するという操作を意味します.つまり,^Mはasciiコードとして10進数で13を意味します.ここでascii コード表を見てみると13には 'CR'が充てられていることが分かります.これは改行コードの一種です.
同様に^@について考えてみると@はasciiコード上で10進数として64のため,'^@'はasciiコード上で0を指すとわかります.これはnull文字です.
このようにして,キャレット記法は,asciiコード上の表示不可能文字をshell上で入力するために用いられる記法になります.
よく無限ループに陥ったとき,Ctrl + Cを押しますよね?これはつまり^Cなわけですが,これのasciiコードは3であり,このコードはETX(テキスト終了)を意味します.
標準入力の終了はCtrl + Dですが,これは^Dはasciiコードで4であり,これはEOT(転送終了)を意味します.そういうものだと思っていた入力にもちゃんと意味があるんですね...

write関数で遊ぶ

まず,write関数について簡単に説明をします.
write関数はC言語において出力用の関数として用意されている標準関数の一つです.正確には,システムコールをラップしてる関数ですね.unistd.hヘッダーにおいて定義されています.
プロトタイプ宣言は次のようになります.

write(int fd, const void *buf, size_t count);

write関数はfdで指定されるファイルディスクリプタに対応するファイル(fd = 0,1,2の場合は特殊)に,bufで指定されたポインタを先頭とする文字列をcount分出力してくれます.
fd=0の時は標準入力,fd=1の時は標準出力,fd=2の時は標準error出力となっています.
このwrite関数はC言語でよく使われるprintfと違う部分として,null文字があろうとなかろうとcountで指定したバイト数分,文字を書き出してくれるという点があります.
なので,write関数を用いると以下のようなことができます.

#include <unistd.h>
#include <stdlib.h>

int main(){
    char *s;
    
    s = calloc(sizeof(char), 10);
    write(1, s, 10);
}

callocという関数は,第一引数と第二引数の掛け算byte分mallocして取った領域を全てnull埋めしてくれる関数です.
なのでこのコードでは,先頭から10文字分はnull文字が入っているようなメモリ領域をwriteで10文字分書き出すコードとなります.
gccコンパイルして,単にa.outを実行すると,たいていの場合には何も出力はされません.
これは,null文字が表示不可能文字だからです.
しかし,例えばここで./a.out | cat -eを実行してみましょう.catの-eオプションは渡された文字に表示不可能文字があっても出力するオプションです.その結果として以下のような結果を得ます.

>^@^@^@^@^@^@^@^@^@^@

つまり,null文字が詰まっている部分に10個^@が並んでいることが分かります.
これは,null文字が^@で表されていることの簡単な確認となるでしょう.
しかし,^Mのようなコードのasciiが13であることはどうやったら確認できるでしょうか?これも正直単純で以下のようにするといいでしょう.

#include <stdlib.h>

int main(){
    char s[1];
    
    s[0] = 13;
    write(1, s, 1);
}

上記のコードを書き,./a.out | cat -eで先ほどのように表示してみましょう.きっと標準出力として^Mを得るでしょう. ちなみに,./a.out | xxd -g 1とかするとさらに見やすくなるでしょう.xxdコマンドは以下のように出力を与えてくれるダンプ出力のコマンドです.-gオプションの後ろにつける数字に対応したバイト数でグルーピングしてくれます.

$ echo "abcdefghijklmnopqrstu" | xxd -g 1
0000000000: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop
0000000010: 71 72 73 74 75                                                      qrstu

これを使って,上のnull文字列とかを表示してやると,今度はasciiコードの確認ができます.
他にもodコマンドとか,hexdumpとかもメモリの書き出しには便利ですね.

量子プログラミング1

初めましての方は初めまして。

狐ฅ^•ﻌ•^ฅと初音ミクが大好きな大学生ぐーたらきつねと申します。
今日から量子プログラミングに関する記事を書いていこうと思います。今回はその1回目です。

はじめに

そもそも、量子プログラミングってなんなんですかね?
量子プログラミングという言葉はなんにでも量子をつけたらカッΣ(ノ∀・´)カクィィみたいな最近のあれな感じなものってわけではなく量子コンピュータ上での動作を従来のコンピュータ上でシュミレートするプログラミングのことらしいです。現在制作されている量子コンピュータ上で動くプログラムではありません。量子情報で学ぶような理論に沿ったシュミレーションを可能にするプログラミングって感じです。(本当か?)

この記事の概要としてはMicrosoftが開発したQ#という量子プログラミングが可能な言語の環境構築になります。*1
なお自分の開発環境は

です。

※注意

  • 筆者はプログラミングのガチ初心者です。(色々問題点等教えてください)
  • 2020年1月2日時点で成功したものになります。

Q#について

Q#というのはMicrosoftが開発した量子プログラミング用のプログラミング言語です。 WindowsMacOSLinuxで使用することが可能です。

英語版の公式サイトには以下のようなことが書いてあります。(以下抜粋意訳)

まあ、なんか凄そうですね。

さて、Q#の概要がわかってきたところで実際に使える環境を作っていきましょう。

環境構築

いくつか方法があるのですが、今回はdotnet command-line を用いたC#での開発が可能となるような環境構築を行っていきます。 なお、エディターはVS Codeを使っています。Q#の拡張機能VS Codeにはあるので便利だと思います。

参考としたのはMicrosoftの公式サイトとC97で入手した技術書『量子プログラミング入門』(カドラ著)*2です。

開発には * VS Code * .NET Core SKD がまず必要になります。

VS Code

僕が好んで使ってるエディターですが、公式サイトを見る限りに別にこれである必要はないと思います。

必要ならこちらからダウンロードしてください。

なおQ#の拡張はMicrosoft Quantum Development Kit for Visual Studio Codeをinstallしてください。下の写真のものです。 f:id:mikusandaisuki:20200104140057p:plain

.NET Core SKD

Q#の動作には.NET Core SKDが必要になります。.NETとは一言でいうと様々なアプリケーションの開発が可能な開発者向けのオープンソースプラットフォームのことです。詳細はこちらのサイトのムービーを見ると詳しくわかるかなと思います。(僕は今回までその存在を知りませんでしたが・・・)

ダウンロードはこちらから行ってください。 f:id:mikusandaisuki:20200104134633p:plain

このページの 『Download .NET Core SKD』をクリックです。 僕が今回使用しているのは.NET Core 3.1になります。*3

Q#

.NET Core SKDが無事ダウンロード出来たら今度はターミナルを開いてください。ターミナルに

$ dotnet tool install -g Microsoft.Quantum.IQSharp

と打ち込むことで、Q#のインストールができます。既にインストール済みでアップデートの必要があれば

$ dotnet tool update -g Microsoft.Quantum.IQSharp

で行ってください。

次にC#からQ#のを呼び出すためのテンプレートのインストールを行います。

先ほどと同様にターミナルに

$dotnet new -i Microsft.Quantum.ProjectTemplates

と打ち込めばOKです。

以上でQ#のインストールは終わりです。

インストールの確認

最後に環境構築がきちんとできているかの確認を行います。 GitHubのこちらのサイトからファイルを自分のPCの適当な場所にcloneしてください。

$cd Quantum-master/samples/getting-started/teleportation

でサンプルコードの置いてあるところに移動できます。移動したら

$dotnet run

でサンプルの実行が可能になります。

実行した結果以下のようになれば環境構築は成功です。 f:id:mikusandaisuki:20200104173129p:plain

次回以降からは実際にQ#を用いたプログラミングを行っていきたいと思います。

今回使ったサイトなど

  1. Learn how to install the Microsoft Quantum Development Kit (QDK) - Microsoft Quantum | Microsoft Docs
  2. 量子プログラミング入門(カドラ著)
  3. .NET | Free. Cross-platform. Open Source.
  4. GitHub - microsoft/Quantum: Microsoft Quantum Development Kit Samples

*1:なお、Q#はWindowsLinuxでも使用可能です。

*2:これについては後日ブログにします

*3:公式サイトを見る感じだと3.0以降である必要があるみたいなの過去にダウンロード済みの方もアップデートの必要があるかもしれません。

van der Waals 状態方程式と狐

はじめに

初めまして、狐ฅ^•ﻌ•^ฅと初音ミクが大好きな物工B3のぐーたらきつねと申します。

このブログは物工/計数 Advent Calendar 2019の14日目の記事です。

好き勝手書いてます。

 

なんか色々テーマを考えて二転三転して公表前にもやっぱテーマ変えたいなぁって思いつつ結局某演習でやらされたvan der waals状態方程式について書きました。

キーワードは『クラスター展開』と『van der Waals状態方程式』です。

 

物理難しいですね。最近の量子も統計も何も分からん(ヽ´ω`)トホホ・・

今回参考にした文献はEdward Mayer JosephとGoeppert Mayer Maria著のStatistical Mechanicsです。PDFがネットに落ちてます→こちら

日本語訳はないっぽいので少しくらい意味があるブログになったのでは?(てかなっててくれ)

間違ってるんじゃねって指摘大歓迎です(。´・ω・)。´_ _))ペコリ

というか実はまだ未完成です(許して)

12月19日完成しました。

最後で狐の布教もしてるので疲れた人は可愛い狐を眺めて帰ってください。

van der Waals状態方程式

はてブロのTeX記法分からんのでPDF埋め込みで許して( ゚д゚)ホスィ…




 

狐かわいい

勉強ばっかりじゃ疲れるので狐ฅ^•ﻌ•^ฅの布教をしようと思います。

キツネ写真館さんってTwitterアカウントがありまして、宮城蔵王キツネ村の狐さんたちの写真をあげてらっしゃるんですけど無限にかわいいのでみんなに見て欲しい(゚▽゚)(。_。)(゚▽゚)(。_。)ウンウン

ちなみにキツネ写真館さんはホームページもあってそこの写真も可愛いので是非見て

子狐って無限にかわいいですよね。

 

ちなみに僕の推しのキツネはこの子です。この子顔がめっちゃ猫っぽくて一発で顔覚えられるんですよね。

 

ちなみにキツネ写真館さんは今度のコミケC97の4日目に『西2せ01a』に出展されるので今回狐の良さを知った人はみんな買いに行こうね。

 

明日は計数のなるみやさんが書いてくださるのでみんな見ようね。 

PDFはちゃんと完成させます(そのうち)それでは。

 

PS:遅ればせながら最近プロメアにはまってるんですけど、プロメア最高ですね。