雑記」カテゴリーアーカイブ

C言語の仕様書に従うならNULLは0もしくは(void *)0らしい

ちょっとtwitter上でNULLに関することをつぶやきましたが、ツッコミが帰ってきてしまったため気になって仕様書(C89およびC99のもの)を読み込んでみました。そしてすべての論理をつなげてみると次のような結論となりました。

整数値の0もしくはそれをvoid *にキャストしたものがNULLとして定義される、と。

 

仕様書にはどう書いてあったか、というと・・・

C89でもC99でも記述は同じなのでそれは置いておいて。まず、null pointerおよびそれに関わる用語の定義です。関わる部分だけざっくりと翻訳すると次のようになります。

  • 整数値の0、もしくはそれをvoid *にキャストして表したものをnull pointer constant(ヌルポインタ定数)と呼びます
  • null pointer constant(ヌルポインタ定数)をそれぞれのポインタに変換したものをnull pointerと呼びます
  • null pointerはほかのどのオブジェクトおよび関数とも一致しないことが保証されています
  • null pointerをほかのポインタ型に変換してもそれはその型でのnull pointerとなります
  • null pointer constant(ヌルポインタ定数)はstddef.hでNULLとして定義されます

というわけで、この部分からNULLの定義について読み取るなら、それは1行目と5行目をつなぎ合わせることになり、「NULLは整数値0もしくは(void *)0として定義する」という結論が得られるわけです。ただし、3行目の説明を読んでみると、「何も指さないことが保証されている」という参考書の説明とは微妙に食い違っているように見えるのですが…。細かいことをいうなら特定のメモリ空間をオブジェクトに含めるのかどうか?というところでしょうか。

 

いくつかのシステムにおける例外について

なお、以下はWikipediaの記述(+リンクされていた参考資料)から読み取っている項目ですが、いずれもかなり古いシステムにおいて

  • null pointerが指しているアドレスが0でないシステムもある
  • (void *)0をキャストしてアクセスすると特定の読み書きとして成立するシステムもある

とのことでした。前者は48bitアドレスというなかなか変わった方式のものですし、後者は仮想メモリやメモリ保護の概念がない時代のものですので、今の時代には全くそぐわないものですから無視してもよいかもしれません。

 

ちなみにif(!p){ }の是非について

これが「ポインタ変数pがnull pointerのとき」の意味になるのか?については、仕様書から読み取ると

  • !pという演算は0==pと同一となる
  • ポインタとnull pointer constant(ヌルポインタ定数)が比較される場合はポインタの型に合わせたnull pointerとの比較として扱われる
  • 0はnull pointer constant(ヌルポインタ定数)として扱われる

ため、if(!p){ } はちゃんと「ポインタ変数pがnull pointerのとき」の意味になるようです。

 

意外と細かい仕様があってびっくり

というわけで「C言語の仕様書に従っている限りはNULLは0だし、null pointerによるifの判定にも誤りはない」という結論になりました。仕様書を読んでみるといろいろな動作についてちゃんと定義が書いてあるので、これに従ったコンパイラを完全に作るのは確かに大変だな、という感想もあります。ただし、逆にNULLをポインタにキャストしてアクセスした場合常にメモリ保護例外などのエラーとなるとは限らない、というのは調べていてびっくりした点です。今のシステムではほぼあり得ないことですが、昔のメモリ空間がカツカツだったりする環境のためなのでしょうかね。

 

C++にはnull pointerを表す定数が追加されていることを初めて知った

しばらく技術書を細かく眺めていなかったので知らなかったのですが、nullptrが追加されていて、C++11以降ではこれがnull pointerとして扱われるようです。NULLは上記の定義より整数型としての値を持つことがあり、引数として整数型とポインタ型のオーバーロードがあった場合にNULLを指定すると誤って整数型を引数とする方が呼び出されてしまう、という問題が起こってしまいます。それを防ぐために明示的にnull pointerで呼び出していることを示すものということでした。そういえば昔この手の問題で悩まされたことがあったな~と懐かしみながら。

 

JOYSOUNDとDAMの採点を(2年ぶりに,個人的に)調べてみた

2年前から今年の4月まではいろいろと忙しかった期間で、さすがに一人でカラオケ、というのも微妙すぎていかなかったのですが、ちょっと調べてみたいな~ということで、2年ぶりくらいに調べてみました。ちなみに今は暇な期間ですので、簡単なプログラムやアプリ、スクリプトならば仕事ができる状態になっています。

 

DAMは採点の方式そのものが変わっていたのね

さすがに2年もたつと採点が変わってしまうとは、というやつです。おそらく2年前くらいの採点の方式に加算点ルールが見えやすくなって追加された、というところでしょうか。採点してみていままでの記録に追加してみようと思ったら、(2年前までの記録から見て)DAMの採点の平均点に対しておよそ6点増えているということが分かり、採点記録を今まで自分が作ってきた個人のデータに登録しようかどうか迷ってしまうくらいになっています。なお、加算点のおかげで、DAMの採点の平均点とJOYSOUNDの採点の平均点が大体同じになったかな、という感じです。インタフェイスについては記憶している限りはほぼ変わっていないのでそちらで困ることはないですが…。

まあ、採点の平均点が同じくらいになったのであればDAMとJOYSOUNDの点数が直接比較できるのでそれはそれでありがたい、というべきなのでしょうかね。私の場合は平均点が90点前後で歌唱力は(おそらく)平均すこし下レベルということを考えると、ほとんどの人がいつ頃かは知りませんが、この変更でよくなったのだと思います。

 

JOYSOUNDはインタフェイスが大きく変わった様子

近くでJOYSOUNDが使えるカラオケ店だとJOYSOUNDの最新版が使えないので世代が少し古いタイプだと思うのですが、採点のシステムがやっぱり変わっていたのが印象的でした。なんかDAMに近づけようとしたのかは分かりませんが、記憶に残っている限りからの変更点だと

  • 判定音階の処理が(おそらく内部データで)二小節ずつ表示するようになっている。あくまで内部データ準拠なので、曲本体において途中で拍子が変わる場合、楽譜によっては「拍子変更処理が入っている」か、「拍子変更を無視してずれを許容したデータになっている」かで、表示のされ方が異なる。また、曲のテンポが急激に下がる場合は、こちらも拍子を無視したデータになっている場合が多く、表示される小節の区切りが変わっていく。
  • 音階表示は一定範囲が一致していれば音階表示バーが点灯する方式(DAMの方式)になった。ただし、判別されている音階はキラキラが追従するので視覚的にはリアルタイムのものが確認できる。また、音階一致率も常に脇に表示されているので、DAMより一致率の判定状態が確認しやすい。
  • 通常の曲であれば音階表示が下側に出てくる。また、歌詞のフォントサイズも小さくなるので、見やすいような見にくいような。ただし、本人画像など背景が特殊でかつ採点可能の場合は音階表示が上側に行く(DAMと同じ表示)になる

というところでしょうか。個人的には2年前くらいの「音階表示が右側からどんどんスライドしてくる」表示よりは見やすいと思うのでそれはOKだと思います。ただ、二小節固定になっているために、(テンポが速く設定されている曲など)曲によっては音階表示されている時間が非常に短い曲もあり、音階を見ながら微妙な調整をする私には不満が少し。

 

ゲーム会社からの曲提供や動画提供が面白い

DAMには(たぶん)ない機能ですね。このタイプのものは必要になったらJOYSOUNDの中央サーバからデータをダウンロードするらしく、すぐに曲開始しなければならない場所の場合ダウンロード待ちがあることと、採点システムに対応していない場合がほとんど(つまりボーカルラインのデータがない)であることが残念ですが、それでも歌う曲数を増やしやすくしたり、歌っている間の盛り上がりを重視するならよい機能だと思います。これのおかげで個人的に歌いたかったゲームの曲がカラオケシステムで歌えるようになったことがうれしいく、機能を確認したあといろいろ歌ってみて満足しました。あと、この機能を変に利用して動画配信サイト代わりに使っているアニメ等もあるようですが、それは面白い試みだと思いました。

 

個人的に?通常の男性ボーカル曲より女性ボーカル曲の方が歌いやすい…

男性ボーカル曲の音階の方が安定せずふらついてしまい苦戦しています。どうも女性ボーカル曲の高い音階で練習して男性ボーカル曲での練習をしなかったことと、できるだけ高い音階で発声するようにして歌っていたので、その影響もあるのかもしれません。練習の成果といえるかも。

あと、「歌う部分がすべて自分の裏声のピッチに入っている場合、すべてを裏声で歌うと高得点を稼ぎやすい」もあるようで。私の場合はずっと裏声で歌い続けた方が音階が安定するようなんですよ…。一応ソプラノ領域まで裏声で出せますので。そのため、いくつかの曲でテストしていますが、それなりの点数まで出せますし。まあ、テストした曲の平均点もよいので単に歌いやすいだけなのかもしれませんが。

 

ということでいろいろと遊んでみた

あとは採点データをどうするか、かな。データを管理しているExcelのシートを新しくするのが正しいのだろうか…。

VPSでCentOS7サーバを構築する まとめ編

なんとかまとめまでたどり着きました…。ということで、今回は大規模なリンクを張っておきましょう。

 

サーバー構築の手順まとめ

以下のような手順になります。なお、手順にあるリンク先のページでは設定に関するヒントがあります。

  1. VPSの契約(自宅サーバの場合はマシンセットアップ)
  2. rootログインを行い、yumで一度最新までアップデートを行う
  3. 通常のログインユーザを作成してsudoによるroot昇格を設定する
  4. (必要であれば)SELinuxを設定する
  5. SSHの設定を行い、外部からの侵入されないようにする
  6. 不必要なサービスを停止する
  7. ディスククォータを設定する
  8. 最新のパッケージを導入するために、現在入っている不必要なパッケージをすべて削除する
  9. 最新のパッケージを導入するためのリポジトリを設定する
  10. アンチウィルスを導入する
  11. httpd(Apache)の導入
  12. Let’s Encryptを使った常時SSL化対応処理
  13. php-fpmの導入
  14. MariaDBの導入
  15. nginxの導入
  16. vsftpdの導入
  17. postfix、dovecotの導入
  18. 各サービスの動作チェック

 

やっぱりそれなりの知識は必要ですね

特に設定でエラーを起こした場合、何が間違いかどうかを調べるにはプログラムを作っているときに何が間違えているかを確認するテクニックと同じような物が必要なのでは、と思っています。今回はターミナルからの設定で何回もエラーを起こしたのが、どうもキー操作ミスで設定ファイルの一番先頭に間違えたアルファベットが入ってそれを読み込もうとしてエラーを起こす、というパターンです。作業の慣れが消えてしまっているのがわかってちょっとショック。また、設定項目を自分で書いている場合で、項目名のスペルを誤って認識している場合がありました。Apacheの設定で「SetHandler」という項目が出てきたので、にたスペルの文字を見たときにそれだ、と思い込んでいると実は「SetHeader」だった、とか…。

 

経験がない人はVPSだけではなく一度自分のマシンでやってみるとよいかも

昔とは異なり、2万円以上するCPU(具体的にはCorei3以上)であったり、メーカー製でもそのレベルのCPUがあれば仮想マシンを使うための機能くらいはついていますし、仮想マシンを作るためのプログラムも無料で手に入る(VirtualBoxなど)ので、自分の手元でやってみてどうなるか?は実験した上でVPSを契約してみるのがよいと思います。プログラミングでもそうですが、設定の説明ページだけを見てそれをコピーしていても何も成長はしません。自分の環境に合うように設定してみたときに何が起こるのか、体験してみないとわからないことが多いからです。その点、仮想マシンであれば間違えたときにすべてを吹っ飛ばすことが簡単にできますので、怖がる必要はほとんどないと思いますよ。VPS以上になれば外部サーバを使った中でもできることが通常のレンタルサーバに比べて格段に増えますからね。面倒さも同じくらい増えますが。

 

プログラミング教育でこういうのはどうにかなるのかな…。

こういう「何が間違いかを考えるためにあれこれ考える」という能力は今の社会では必要ですので、その意味でもプログラミング教育の意義はあるのかもしれません。実際にやってみると人による差が大きすぎて大変ですが。そういう教材についてちょっと研究してみたりしたので、その感想も踏まえて別の機会にblogの記事にしたいと思います。

 

プログラムの音色サイトの全面更新をしました

大体の作業が終わったので全面更新を報告したいと思います。

 

今回の全面更新とは?

結局何をやったか?というと…

サーバのOSレベルから更新作業を行いました。

このサイトを作ったときにVPSを契約してから…という場所まで戻るのですが、そのときに設定したのは(多分blogの記事を戻ればあるはずですが)CentOS6系統。さすがに今となってはかなり古いOSであることに加えてWordPressで動かすにはかなりの問題点が生じていました。それが各種Webプログラムのメジャーバージョンが簡単に上げられないということ。おかげでPHPは5.4系統を未だに使う羽目になっていてWordPress側でいろいろな警告がでるわ、バックエンドで動いているApacheのバージョンも2.2系統でこちらもいろいろとゆがみが出ているわ…という状態に。

というわけで、この2年間放置していたこともあり、全面更新を行い各種設定をやり直そうということで作業を行いました。

 

ちなみに、このサーバ自体が別物になっている

さすがに各システムの設定をすべて一発で間違えずに行うことはほぼ不可能ですし、ましてやCentOS6からのOS更新をしているのにダウンタイムを一切なしで乗り切るのは不可能ですので、今回は別のサーバを契約してそちらで環境構築を初期段階から行い、ほぼすべての設定が完了して見られる状態になったことを確認した上でDNSを切り替えるという手法で更新しています。なので、その間記事の更新などは一切できないのが弱点ですが、外から見ている人にはダウンタイムなしでつながっているように見える、ということをやっています。

なお、WordPressについては単にデータコピー&データベースの移動だけで済ませていますのでその意味でも見た目は全く変わりません。記事を書いている当人にも見た目の差は一切ない状態になっています。どうせならテーマを最新の物に変えるなどやった方がよいのかもしれませんが。

 

以降の記事はしばらくサーバ構築日記に

しばらくその手のの作業をしていなかった関係で新しくなっている部分がわからなかったり、一部設定で苦労したりということもありますので、これくらいのサイトをVPSで作るならどれくらいかかるのか?ということも紹介しながらしばらく記事を書いてみたいと思います。なお、サーバーを構築するのにかかった時間は実作業時間ベースならだいたい1日ほど、作業開始からいろいろな休憩やらほかの仕事やらをやっていながらの時間でいうなら3日ほどです。これを仕事にするにはちょっと微妙なところですが、そのあたりは解説サイトがいっぱいありますので探してみるといいかも。特にVPS関連はサービスが大分絞られてきたみたいで、前のようにまとめサイトを作る気にならない位の数しかありませんでした…。

 

伊勢神宮を参拝してきた

新年早々プログラムネタでもなく数学ネタでもなく教育ネタでもないただ単なる雑記です。しかも写真などもほぼ撮影していないのでただ単に参拝するところの紹介にしかなっていない記事です。

 

いろいろな場所にお社があるので考える必要あり

順序については「外宮」→「内宮」「御正宮」→「別宮」が習わしとされているようですので、御正宮の参道の近くにある別宮→少し離れたところにある別宮を考えると…

  1. 豊受大神宮(外宮)御正宮
  2. 豊受大神宮別宮(多賀宮、土宮、風宮)
  3. 豊受大神宮別宮(月夜見宮)
  4. 皇大神宮(内宮)御正宮
  5. 皇大神宮別宮(荒祭宮、風日祈宮)
  6. 皇大神宮別宮(月読宮、月読荒御魂宮、伊佐奈岐宮、伊佐奈弥宮)
  7. 皇大神宮別宮(倭姫宮)
  8. 皇大神宮別宮(伊雑宮、瀧原宮、瀧原竝宮)

という順序になる「かな~」というところです。曖昧な書き方になっているのは別宮が離れたところにある場合どのように参拝すると良いかが難しくなるからです。車の駐車場が簡単に確保できる日時なら良いのですが、そうではない場合、駐車してから車を動かさずに移動する必要があるため、歩いてそれほど距離がない月夜見宮ならまだいざ知らず、皇大神宮別宮は参道の近くにない神社ならそれなりの距離(例えば5→6なら1kmくらい)を歩く、もしくはバス移動となるのでちょっと厳しいのが弱点かな、と思います。

 

正月の規制で駐車&途中の移動をどうするかを考えるのが難しいことに

まずは外宮と内宮の移動がやっかいなんですね。外宮の駐車場なんてまともにあいている訳ではないですし、内宮の駐車場もさすがに厳しいところでした。一応パーク&バスライドが別の場所に設定されているのでそちらに止めてバス移動でもいいというのが今回はありがたかったところ。ただ、そうするとこのルートの場合パーク&バスライドの場合は直通なので3→4はOKですが、5→6→7の移動が一番厳しいことになるところです。ちなみに私はちゃんと歩きました。足がちょっとやばかったですが…。一応路線バスもあるのでそちらを使うことも考えて良いですが、その場合10分間隔くらいが目安なのでバスに乗り遅れると歩いた方が早いという結論に至ることも今回確認しました。路線バスでは交通系ICカードが使えるのでSuikaやICOCAあたりを用意しておけば小銭の心配もなく楽ですね。

 

そのほかの神社も参拝するとさらに大変に

例えば猿田彦神社とかですか。内宮からすぐの距離にあるので内宮を参拝した後で行く、というのもありだと思いますし、その他近場では二見浦の二見興玉神社に参拝してから外宮へ、という順番など突き詰めていくとなかなか大変な参拝になるよな~と言うところでした。

もう一つ大変だったことがお賽銭をどうするか、という問題です。別宮以外の社でも、となるとかなりの数になるので用意しておかないと簡単にそこをついてしまいます。補充したくても御札等、お土産等は大抵が100円単位なので人によっては微妙に感じることもありますし、こういう年末年始では細かいお賽銭を手に入れるために自動販売機で…と考えるパターンも多いようで周りの自動販売機は10円が釣り銭切れを起こす事態となっていましたし。いろいろと用意しておきましょう。

皆さんも初詣はどうでしょうか?