Fatal error: Uncaught Error: Class 'SQLite3' not found in C:/*****/test.php
まず初めに php.ini の extension の必要そうな項目をコメントアウトします.
PHP7.4 の場合は,次の項目になるかと思います.
extension=pdo_sqlite extension=sqlite3
ここまでは今までもやってきた設定かと思います.
これらに加えて,Apache の設定ファイル(httpd.conf)の適当な場所(末尾など)に,次の項目を追加します.
LoadFile "C:/php(のある場所)/libsqlite3.dll"
これらの設定を保存したら,Apache を再起動して完了です.
次のPHPテストコードを試してみて,エラーが消えていることを確認してみましょう.
<?php // SQLite3 のテストコード $db = new SQLite3('./test.db'); $db->close(); ?>
以上の方法は,XAMPPを使用している場合も同様に適用できると思います.
SQLiteは開発時や小規模環境ではとても便利なので,どんどん使っていきたいですね.
今回,Windows10(2004)にてシステムイメージの作成ができない状態になってしまいました.表示されたエラーは次の通りです.
このコンピューターにバックアップ デバイスが見つかりませんでした。次のことが原因である可能性があります:
(0x81000036)
Windows バックアップを終了して、再試行してください。
これまでは普通にできていたのに….この症状は割と最近のWindows10のバージョンで出るようになったようで,原因はWindowsサンドボックスにあるようです.
ということで,「Windowsの機能の有効化または無効化」にてWindowsサンドボックスを無効化し,再起動します.すると他は全く変えていないのにシステムイメージの作成ができるようになったではありませんか.
Windowsの方向性としては,システムイメージの作成機能については今後あまり表立たせる様子はないようなので,改善はあまり見込めなさそうですね….
]]>シャットダウンやログオフ(ユーザの切り替え)のショートカットの作成はスリープよりも簡単です.デスクトップなどを右クリックして「新規作成」>「ショートカット」を選択,出てきたダイアログボックスの「項目の場所を入力してください」にそれぞれに次のように入力します.
シャットダウン:C:\Windows\System32\shutdown.exe /s /t 0
ログオフ(ユーザの切り替え):C:\Windows\System32\logoff.exe
入力したら「次へ」を押して,好きなショートカット名を入力,「完了」を押せば完成です.
別途アイコンを変更したい場合は,ショートカットを右クリックして「プロパティ」を開き,「アイコンの変更」を選択し,好きなアイコンを選択してください.
現在のWindowsの(広義的な)スリープについては,主に3種類存在します.
・スタンバイ(サスペンド,狭義のスリープ,S3):メモリ(主記憶メモリ)以外の電力の供給を停止する状態です.メモリの内容はそのままのため,即時にスリープ状態へ入ることができ,復帰も早いです.ただし,電源の供給が絶たれるとデータが消えてしまいます.
・休止状態(ハイバーネーション,S4):メモリの内容をHDDやSSDなどに保存し,完全に電源を切断します.メモリの内容を保存するため,休止状態に入るまで時間がかかり,復帰にも読み込みの時間が必要です.電源を完全に切るため電気を一切使いません.
・ハイブリットスリープ:上記2つの組み合わせで,スリープに入る際に休止状態のようにメモリの内容を保存し,メモリの内容はそのままにしておきます.このようにすることで,復帰は即時に行え,急に電源の供給が絶たれた場合でも内容の消失を避けることができます.
これらのうち,Windowsのスタートメニューからはこのうちのどれかまたは複数が選べるようになっております.
1.のように簡単にスリープのショートカットも作れないか,と思うことかと思います.実はないこともなく,1.と同じ手順で,
スリープ:C:\Windows\System32\rundll32.exe PowrProf.dll,SetSuspendState
と入力して設定することで作成できます.上記のモードのうちどれになるかというと,休止状態が有効になっている場合は休止状態,有効でない場合はスタンバイ状態となります.これについては,コマンドプロンプトを開きpowercfg /a
と入力して表示される中の利用可能な一覧の中に,「休止状態」とあれば休止状態が有効であると調べることができます.
では休止状態が有効な場合でもスタンバイ状態にしたい場合の手段はないかというと,残念ながら標準の方法ではなさそうでした.ということでアプリケーションを作成してみました.
SleepWindows
上のリンクからSleepWindows.exeをダウンロードし,1.の要領で
スタンバイ:(SleepWindowsを保存したフォルダ)\SleepWindows.exe /s
休止状態:(SleepWindowsを保存したフォルダ)\SleepWindows.exe /h
と入力すればショートカットが出来上がります.
1.や2.の手順でデスクトップにショートカットを作成し,右クリックして「プロパティ」を開き,「ショートカットキー」のところで例えば「A」と入力すると,Ctrl+Alt+Aと押すと呼び出せます.
以上の内容とほとんど同じですが,一応書くと,それぞれ次のように入力します.
シャットダウン:shutdown /s /t 0
ログオフ:logoff
スタンバイ:(SleepWindowsを保存したフォルダ)\SleepWindows /s
休止状態:(SleepWindowsを保存したフォルダ)\SleepWindows /h
なお,SleepWindows.exeをC:\Windows\System32
のフォルダの中に入れておけば,(SleepWindowsを保存したフォルダ)
の部分の入力を省略することができます.
Windows7まではスタートメニューに表示されていたものです.このフォルダにショートカットを入れるだけで設定できるので,個人で設定する場合はこのフォルダを使用するのが良いと思います.場所は
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
です.このアドレスをエクスプローラのアドレスバーなどに入力することで表示できます.また
shell:startup
でも同じフォルダを開くことができます.
こちらは,1.のユーザのスタートアップフォルダのすべてのユーザ版です.使い方は1.と同じですが,こちらにショートカットを設置すると,すべてのユーザが対象となります.場所は
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Startup
です.このアドレスをエクスプローラのアドレスバーなどに入力することで表示できます.また
shell:common startup
でも同じフォルダを開くことができます.
プログラムによっては,レジストリに登録されている場合もあります.場所は
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
です.ただし,64bit版Windowsで32bitプログラムを使用する際にはHKEY_CURRENT_USER\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
が使用されます.
なお,レジストリエディタはスタートメニューで “regedit” と入力して検索すれば出てきます.
プログラムによっては,レジストリに登録されている場合もあります.場所は
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
です.ただし,先ほどと同様に64bit版Windowsで32bitプログラムを使用する際にはHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
が使用されます.
このように,Windowsのスタートアップの設定は4(6)箇所もあり複雑となっております.スタートアッププログラムの一覧を見るだけであれば,タスクマネージャのスタートアップのタブを見るだけでよいですが,実際にどこで設定されているかを調べたり変更,削除したりするためには,以上の場所を全て調べる必要があるのでご注意ください.
]]>エラーが出る理由は単純で,パッケージリストが古いというだけでした.ですので
sudo apt update
と実行するだけで直ります.
試しに,終わった後に
sudo apt install apache2
などと実行すると,先ほどまでできなかったのがインストールできるようになっていると思います.Bash on Windowsは,これまでLinuxを扱っていなかった人でも手軽に試せるだけに,初心者がいきなりapt installに失敗すると少し嫌になってしまいそうですね….
]]>まずは,現在インストールされているPHP関連パッケージを確認します.
rpm -qa | grep php
すると
php-5.3.3-46.el6_7.1.x86_64 php-cli-5.3.3-46.el6_7.1.x86_64 php-common-5.3.3-46.el6_7.1.x86_64 php-mbstring-5.3.3-46.el6_7.1.x86_64 ...
といった感じで出てくると思います.バージョンの数字より前の部分がパッケージ名になります.パッケージ名は,後でインストール(アップグレード)の際に指定するのに使用します.
次に,インストールに必要なリポジトリを追加します.
CentOS6の場合は次の1行目と2行目を,CentOS7の場合は次の1行目と3行目を実行します.
sudo yum install epel-release sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
最後に,任意のバージョンのPHPをインストールします.ここではバージョン7.2をインストールする例を挙げます.
yum update --enablerepo=remi,remi-php72 php php-common php-cli php-mbstring
インストールしたいバージョンに合わせて,remi-php72 の部分を remi-php56(5.6の場合),remi-php70(7.0の場合)などに変えてください.
また,インストールするパッケージは,初めに確認したものを参考に追加してください.
以上でアップグレード作業は終了です.
php -v
を実行して,PHPのバージョンが変わったことを確認してみましょう.
あとはApacheの再起動をして終了です.
ちなみに,バージョンが変わると仕様が一部変化するので注意が必要です.例えば前のバージョンでは非推奨ながら使用できた関数が削除されるなどがあります.そのため,既存のプログラムが動作しなくなる場合があるので,必ず動作確認を行いましょう.言わずもがなですが,可能な限り本番環境へ移行する前に試験環境で試してからアップグレードするようにしましょう.
]]>しかしこれだけの記事数があればごくまれに,助詞を全然含まない記事があるかもしれません.そう思ったので,思い付きでちょっと調べてみたというだけの記事です.
といっても本当に調べるのは面倒なので,今回は助詞の中でも一文字の格助詞の中から,いかにもどこでも使われていそうな助詞「が」「は」「の」「に」「で」の5文字だけ調べてみたいと思います.さらに,本題が助詞を含まない記事と言っておきながらなんですが,単に助詞以外の用途で平仮名として使っただけのものと助詞として使ったものを区別するのも面倒なので,助詞以外の用途でも助詞とみなしちゃいます(暴論).こんなずぼらな設定で調べたと果たしていえるのか….
では早速Wikipediaの検索機能を用いて検索してみましょう.前置きが長くなりましたが,結果的に次のようになりました.
該当数 | 含まない数 | 含む割合 | |
の | 1,129,650 | 140 | 99.99% |
は | 1,128,455 | 1,335 | 99.88% |
に | 1,112,165 | 17,625 | 98.44% |
が | 1,029,150 | 100,640 | 91.09% |
で | 983,662 | 146,128 | 87.07% |
「で」が少ないのは想像しやすいかなと思いますが,「は」と同じぐらい健闘しそうだった「が」は意外と(?)弱かったですね.要因としては,助詞以外として使われている場合では,濁点を含む「が」はあまりなかったということでしょうか.「に」はこんなもんか,という感じ?「は」と「の」はやはり多いですね.「は」は記事の初めに「OOOは~」なんて使われる例が多いですからね.しかしそれでも1,000もの記事には「は」が使われていないようです.実際この「は」が含まない記事はどのようなものが多いかというと,項目を羅列しただけの「OOOの一覧」といった一覧記事が多いようで,納得です.「の」については,一覧記事で文を含まないような記事でも,英語の”of”の意味で使われるだけにかなり強いですね.「の」を含まない記事もやはり一覧記事が主となっているようです.これらの記事はかなり短い一覧記事ばかりかと思ってしまいますが,意外とそうではなくて,長い一覧記事や一覧記事ではない普通の短い記事があり,140「も」あるのかと個人的には思ってしまいます.
以上の結果から,ほとんどの記事には(助詞以外の用途であったとしても)「の」ないしは「は」が含まれていることがわかりました.じゃあ,この2つが含まれていない幻のような記事はあるのでしょうか?もちろん,リダイレクト用などの記事とは言えないものを除いてです.検索した結果,今日の段階ではなんと1記事だけ存在しました.それは
「競技ダンス選手一覧」
という記事でした.一覧記事ですが,それなりの長さがあるのにも関わらず,一度も「の」や「は」が出てこないのはまさに幻のような記事と言ってよいでしょう.
ということで,Wikipedia内で最も助詞を含まない記事は現在のところ「競技ダンス選手一覧」ということにしたいと思います.もっとも,助詞以外の用途でも助詞とみなしているので,言っていることがめちゃくちゃだということは自覚しておりますが….
]]>ところで,このGoogleアカウントを登録するときに使用できる文字列,すなわちGmailのアドレス(以下ユーザ名と呼びます)の登録には,使用できる文字列に制約があります.
公式に発表されている規則以外にもどうやら制限があるようです.
公式には,ユーザ名は6~30文字であり,英数字およびピリオドしか用いることができないことになっています.
また,当たり前ですが,既に登録されているユーザ名も使用できません.その場合,以下のようなエラーが表示されます.
このほか,禁止ワードが設定されているようで,例えば admin が禁止されています.
このほかに,以下のような単語が禁止ワードに設定されています.
これらの場合は,先ほどとは異なり次のようなエラーが表示されます.
しかも,これらの単語は,意味を成しているいないにかかわらず,含まれている時点で使用できないようです.
例えば,”0000admindayo” みたいな場合でも使用できません.
ちなみに,昔は”shit”という単語も禁止されていたようですが,日本人にはこの単語が含まれてしまう例が多い(例えば「山下」であれば “yamaSHITa” となる)せいか,現在は登録できるようです.
明言はされていないようですが,登録されていなくても登録できないユーザ名もあるのですね.
]]>海外の格安VPSというと,どうしても安定性などに疑問がわいてしまいますが,今回利用したTime4VPSは価格がわずか月100円ちょっとというだけでなく,サービス内容も満足できるものでした.
以下は,簡単な契約の方法と使用した感想を紹介します.使用した感想を先に見たい方はこちらをクリックしてください.
契約の仕方はとても簡単です.英語のページですが,難しい英語は必要ないように感じました.
はじめに,Time4VPSの公式ページに移動します.
その後,好きなプランを選択し,内容の確認や契約期間を選択し,次へ進みます.
いくつかプランがありますが,一番安いのは「Standard VPS」のXSプランです.今回私はこのプランで契約しました.為替レートにもよりますが,今回の私の場合は,24か月契約でPayPal為替手数料を加えて 3,286円でした.一月あたり140円を切る破格ですね.毎月自動販売機でジュースを一本買うと考えれば,いかに安いかが分かります.
なお,Standard VPS,Storage VPS,KVM Linux VPS,KVM Windows VPS の4種類のVPSコースがありますが,Standard VPSはおそらくOpenVZという仮想方式をとるもので,KVM VPSはKVMという仮想方式をとるものです.前者は準仮想化であり,後者が完全仮想化であると考えられるため,前者の場合一部に制約がかかったり,リソースの割り当てがKVMよりも不利になっています.品質を重視する場合や一部の機能を使いたい場合はKVMを選択する必要がありますが,格安目的であれば基本的にStandard VPSでよいでしょう.ただし,OSをLinuxではなく,Windows Serverにしたい場合は KVM Windows VPS一択となります.Storage VPSは簡単に言うとクラウドドライブ(One Drive,DropboxやGoogle Driveのようなもの)ですので,他とは用途が異なります.
契約期間については,1か月から24か月の間で選択できます.当然一番安いのは24か月契約ですが,24か月契約する前に,お試しで1か月だけ契約してから24か月契約するといった手段でもよいと思います.1か月契約でも十分安いですからね.
支払方法はPayPalが安全でおすすめです.あとは必要事項を入力し,支払いを完了させます.
なお,電話番号の入力欄には,携帯電話(SMSの使える番号)を入力する必要があります.
日本の場合は,例えば「090-CDEF-GHIJ」という電話番号の場合は「8190CDEFGHIJ」というように,日本の国番号81に続いて国内通話時の番号の先頭の0を除いた番号を入力します.
24か月も使えるのに,本当に3千円ちょっとしか請求されていないことが分かります.ちなみに,今回の場合はユーロ決済のところをPayPalの外貨両替を用いて日本円でPayPalから請求されますが,この場合手数料としてレートが3.5%増となっています.設定を変更することで,ユーロのままカードに請求することもでき,カードによっては3.5%よりも手数料が低いこともあるため,ユーロ建てで決済した方がお得になることもあります.
全ての手続きが完了した後は,登録したメールアドレスにメール,電話番号にSMSメッセージがとどくので,それぞれに記載されている認証番号をマイページ上で入力することですべての手続きが完了します.
手続きがすべて完了し,マイページを開くと次のような画面が表示され,VPSの設定が完了するのを待ちます.
しばらく待ってページを更新すると,VPSの準備が完了し,次のような画面になります.
あとは,InstallをクリックしてインストールしたいOSを選択すれば準備は完了です.
インストール後はそれぞれのOSに合わせて設定や更新,セキュリティ対策をお忘れなく.
さて,肝心の使用した感想を紹介します.
今回契約したStandard VPSのXPプランは,仮想CPUが1 Core,メモリが512 MB,保存領域が20 GB です.
保存容量はあまり多くないため,大量のデータを扱う場合はやや不足するかもしれません.
今回は CentOS 7 をインストールし,数週間ほどいじってみました.yum を用いた各種ソフトウェアのインストールやアップデートは特に不満を感じることなく動きました.Apacheを用いてHTTPサーバを動かした感想としても,特に何は感じませんでした.このように,ライトな使い方であれば,十分実用に耐えうるVPSだと感じました.特にVPSの初心者や,実験環境がほしい,予備環境がほしい場合には,安価な維持コストですので良いのではないでしょうか.
唯一難点を上げるとすれば,TeraTermなどでコンソールを扱う際に,多少の遅延が発生してしまうことです.
個人的には,十分我慢できる遅延でしたが,気になる人には気になってしまうと思います.
遅延の程度としては,3,4文字連続して入力すると,3,4文字目を入力したときにようやく1文字目が表示されるくらいです.画面を気にせずカタカタと入力していってもちゃんとサーバには届いているため,作業自体は問題なく進めることができます.画面に瞬時に表示されないのが気になるならば,難があるかもしれませんね.
なお,HTTPでページを表示するときは気にならない遅延だと思います.
これは,サーバがリトアニアにあり,Pingも数百ms程度であるため,物理的な距離の問題のためにどうしても避けられないことです.決してVPSが悪いわけではなく,物理的な距離の問題なので,気になる場合は日本国内のVPSを契約することをお勧めします.
とはいっても,軽く使用した感想として気になったのは物理的なサーバの距離によるコンソールの遅延だけなので,VPS自体の不満は特になく,日本国内のVPSでは信じられない価格で運用できます.もちろん,安いプランであれば表記スペック自体があまり高くないので,過度な期待はできませんが,とりあえずVPS環境がほしい,追加したいという人にはぜひおすすめしたいです.
興味を持った方は以下のリンクからどうぞ.
Time4VPS
Program received signal SIGSEGV:Segmentation fault - invalid memory reference
文法上は問題がないけれども,問題のあるプログラムであるときに発生するエラーSegmentation fault.どこがおかしいのかなあ,なんてプログラムを見直す前に,ちょっと立ち止まってみてください.落とし穴が待っているかもしれません.
実はこのエラー,プログラム自体には何の問題がなくても発生することがあります.
gfortranをインストールする際に,TDM-GCCを使った,というならば大当たりです.実は,TDM-GCCのgfortran(バージョン5.1)には不具合があり,openやwriteをすると
Program received signal SIGSEGV:Segmentation fault - invalid memory reference
が出てしまうという問題があります.その場合は,あきらめて違うgfortranをインストールしましょう.
現在も更新がされていて,Windows上に簡単にインストールできるのは,MinGW-w64だと思います.
MinGW-w64 – for 32 and 64 bit Windows
https://sourceforge.net/projects/mingw-w64/
上のページにアクセスし,「Download」を押して最新版のインストーラをダンロードしてインストールしてください.基本的には次へを押すだけです.途中で選択できる「Version」の項目は,なるべく一番数字の大きい最新バージョンにしておきましょう(2017年10月現在の最新版は7.2でした).
現時点では,MinGWはgfortranのあるディレクトリをPATHに追加しないため,スタートメニュのリンクからコマンドプロンプトを起動しないと,gfortranは使えません.必要に応じて,PATHに追加してしまってもよいかもしれません.
さて,先ほどまでSegmentation faultが出たプログラムでしたが,あら不思議.何もプログラムを変えていないのにすんなり動くようになっていませんか?これを知らずにいつまでもプログラムの誤りを探していたらと思うと,ぞっとしますね.
え,それでも動かないって?その場合は頑張ってプログラムを直してください.配列のインデックスが範囲外とかになっていたりしませんか.
]]>PATHが非常に長くなると,問題が生じることがあります.これは,もともと環境変数は2048文字以下であることが前提であったからです.現在では一応,それよりも長くても使える仕様となっていますが,一部では2048字以下であることが求められています.
今回は,長いPATHを,シンボリックリンクを用いて短くしようと思います.
長いPATHによって問題が生じる例として,例えば気象データの解析に用いるGrADSでは,
MAX_SIZE = 2048, needed size = XXXX Internal error: environment variable PATH is too long; change MAX_SIZE to at least XXXX and recompile or else shortten your PATH by XX characters
というエラーが表示され,起動することができません.
このような場合,何とかしてPATHを短くする必要がありますが,不要なものを削除するというのは簡単なものではありません.下手に削除してしまうと,最悪システムに不具合が生じてしまうため,明確に不要だとわかっているもの以外は安易に削除するべきではありません.
そんな場合は,シンボリックリンクを用いてPATHの文字列を短くするという方法があります.
シンボリックリンクとは,一種のショートカットのようなもので,違う場所にあるファイルやフォルダに,シンボリックリンクの名前を用いてアクセスすることができる機能です.Linuxではシンボリックリンクをよく目にしますが,Windowsではあまり目にしませんね.基本的には,Linuxにおけるシンボリックリンクと同じものと考えてかまいません.
PATHの中をみると,多くに”Program Files”ないしは”Program Files (x86)”という文字列が含まれていることが分かります.しかしこれ,いかんせんフォルダ名が長すぎるため,PATHを長くしている原因となっています.
そこで,これらのフォルダのシンボリックリンクを作成し,名前を短くします.
例えば,コマンドプロンプトを管理者権限で開いて,次のように入力することで “C:\Program Files” を C:\PF”,”C:\Program Files(x86)” を “C:\PFx86” としてアクセスすることができるようになります.
cd \ mklink /d PF "C:\Program Files" mklink /d PFx86 "C:\Program Files(x86)"
こうすることで,PATH 内の”C:\Program Files” を C:\PF”,”C:\Program Files(x86)” を “C:\PFx86” と書き直すことができ,1つにつき10字以上削減することができます.
しかし,Microsoftもなぜ “Program Files” とかいう長くて半角スペースを含む使いにくい名前にしたのかなあ....
※ 以上の内容は,内容をよく理解できる人のみが行うようにしてください.特に,PATHの編集の際は細心の注意を払ってください.最悪Windowsが動かなくなってしまいます.
]]>今回は,一時変数を用いる方法や排他的論理和を用いる方法,さらにはアセンブラを用いる方法を比較し,その実行速度を調べてみました.
一般的にプログラム中で2変数の値を交換するには,一時変数を用いて交換できます.
一時変数を用いた一般的な値の交換方法は,C言語では次のように書けます.
void swap_tmp(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; }
しかし一時変数を使わずとも,ビット演算子 ^(排他的論理和:XOR)を用いることでも
2変数の値を交換することができます.
これは,((a XOR b) XOR a) = a という関係式が成り立つことによります.
この XOR を用いた値の交換方法は,C言語では次のように書けます.
void swap_xor(int *a, int *b) { *b ^= *a; *a ^= *b; *b ^= *a; }
XOR を用いる方法では,この方法を知らないと何をしているのか理解しにくく,可読性の観点から言えば,明らかに一時変数を用いる方法の方がよさそうです.
ところで,C言語ではインラインアセンブラの機能を用いて,簡単にアセンブラを使用することができます.
アセンブラは,機械語と1対1で対応していますから,適切に使えばC言語の命令よりも少ないクロック数で実行でき,速度向上につなげることができます.
先ほどのC言語の XOR の方法を,アセンブラで書き直せば次のように書けます.
void swap_asm(int *a, int *b) { __asm { MOV EBX, a MOV EDX, b MOV EAX, [EBX] MOV ECX, [EDX] XOR ECX, EAX XOR EAX, ECX XOR ECX, EAX MOV [EBX], EAX MOV [EDX], ECX } }
さらに,アセンブラにはレジストリの値を交換する命令 XCHG があります.
XCHG を用いて書き直すと,先ほどのアセンブラの例は次のように書き直せます.
void swap_asm2(int *a, int *b) { __asm { MOV EBX, a MOV EDX, b MOV EAX, [EBX] MOV ECX, [EDX] XCHG EAX, ECX MOV [EBX], EAX MOV [EDX], ECX } }
さて同じC言語でこのようにざっとあげるだけでも,一般的な一時変数を使う方法,XOR を使う方法,アセンブラの XOR を使う方法,アセンブラの XCHG を使う方法と4種類もの方法が挙げられます.
ここで,これら4種の実行速度を比較してみましょう.試しに,私の環境(Windows 7,Visual Studio C++ 2008 x86,念のためコンパイラオプション /Od)で実行速度を計測してみました.計測プログラムは今までのプログラムを組み合わせ,次のようにしました.
#include <stdio.h> #include <Windows.h> #define CNT 400000000 // 繰り返す回数 #define V1 19841 // 初期値1 #define V2 987253 // 初期値2 void swap_xor(int *a, int *b); // CのXOR演算子を用いる void swap_tmp(int *a, int *b); // 一時変数を用いる void swap_asm(int *a, int *b); // アセンブラのXORを用いる void swap_asm2(int *a, int *b); // アセンブラのXCHGを用いる int getTime(void);
(※ 何故かこの環境では下の main 関数が syntaxhighlighter でうまく表示されないのですがどうしてでしょう….)
int main(void) {
int t0, t1, t2, t3, t4;
unsigned int i;
int a, b;
a = V1;
b = V2;
t0 = getTime();
for (i = 0; i < CNT; i++) swap_xor(&a, &b);
t1 = getTime();
for (i = 0; i < CNT; i++) swap_tmp(&a, &b);
t2 = getTime();
for (i = 0; i < CNT; i++) swap_asm(&a, &b);
t3 = getTime();
for (i = 0; i < CNT; i++) swap_asm2(&a, &b);
t4 = getTime();
printf("SWAP %d times\n", CNT);
printf("SWAP_XOR\t: %d\tms\n", t1 - t0);
printf("SWAP_TMP\t: %d\tms\n", t2 - t1);
printf("SWAP_ASM\t: %d\tms\n", t3 - t2);
printf("SWAP_ASM2\t: %d\tms\n", t4 - t3);
}
void swap_xor(int *a, int *b) { *b ^= *a; *a ^= *b; *b ^= *a; } void swap_tmp(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void swap_asm(int *a, int *b) { __asm { MOV EBX, a MOV EDX, b MOV EAX, [EBX] MOV ECX, [EDX] XOR ECX, EAX XOR EAX, ECX XOR ECX, EAX MOV [EBX], EAX MOV [EDX], ECX } } void swap_asm2(int *a, int *b) { __asm { MOV EBX, a MOV EDX, b MOV EAX, [EBX] MOV ECX, [EDX] XCHG EAX, ECX MOV [EBX], EAX MOV [EDX], ECX } } int getTime(void) { SYSTEMTIME t; GetLocalTime(&t); return ((t.wMinute * 60 + t.wSecond) * 1000) + t.wMilliseconds; }
実行してみると,私の環境では次のようになりました.
SWAP 400000000 times SWAP_XOR : 2420 ms SWAP_TMP : 1340 ms SWAP_ASM : 1241 ms SWAP_ASM2 : 1210 ms
はじめにアセンブラを用いない,純粋なC言語のみを用いた方法を比べてみると,XOR を用いる方法は,一時変数を用いる方法のおよそ倍の時間がかかってしまいました.
このことより,可読性の観点からも実行速度の観点からも,一時変数を用いる方法の方が優れていることがわかりました.
XOR の方法が遅い原因としては,一時変数の方法では代入を3回繰り返すだけなのに対し,XOR の方法では,ビット演算3回と代入を3回行っているからだと考えられます.
アセンブラの XOR の方法では,一時変数を用いる方法よりもやや実行速度が優れていました.流石アセンブラというべきでしょうか.
おそらく,一時変数の方法よりもメモリアクセスの回数が減っているからではないでしょうか(あまり確証は持てませんが).
アセンブラの XCHG を用いる方法では,アセンブラの XOR の方法よりもさらにやや早くなっています.
これは,XOR は 1 クロック命令で3回実行しているので 3 クロック,XCHG 命令は EAX レジスタを用いる場合 2 クロック命令であり,XOR の方法よりも 1 クロック短いことが影響しているのではないかと考えられます.
C言語のみでの XOR による方法では,変数を1つ節約できるものの,組み込み開発などの特殊な環境を除けば変数1つの大きさが問題となることは考えられにくく,実行速度や可読性の観点から言っても XOR による方法を用いる理由はほぼないと考えられます.
アセンブラを用いる方法では,確かにやや実行速度が改善されるものの,可読性が低下され,他の人が読むことになったとき,その人もアセンブラが使えるとは限らないので,よほどの高速化を望まない限りはあまり積極的に採用する理由はなさそうです.
結局,C言語で変数の値を交換(Swap)するには,無難に一時変数を用いるのがよいと思われます.
]]>ここからは、思ったよりも記事が長くなってしまったので、結論だけ気になる人はここをClickして結論まで飛びます。
その前にここで、今回の記事に出てくる言葉の定義と使用したデータを示しておく。
新課程とは2006年からの課程を指す(つまり国語I及びI・IIが統一され、現在の形式に)。
この期間は語句(問1)・読解(問2-5)・複数解答(問6、略して複答とする)の3つに分けた。
3つに分けた理由は、語句と読解では問題の作り方が違うだろうと考えたからだ。複答の部分は単純に選択肢の数が違うなどの形式上の違いがあるため、比較できないためだ。
2006年より前の旧課程は、1997年の旧々課程の直後までさかのぼった。
この期間は新課程と異なり、第6問が複答ではない年が中心である。
また、複答がある場合でも、選択肢が1-7の場合が多かった(新課程では1-6)。
「新課程本試験」とは、名前の通り新課程かつ本試験のものである。
「本試験」とは、新課程及び旧課程の国語I・IIの本試験のものである。
「本+追試験」とは、上記「本試験」のものに加え、旧課程国語I・IIの本試験、新課程並びに旧課程の国語I及び国語I・IIの追試験を用いた。
最後に、一部の年度については、手に入れることができなかったため統計に入っていないものもある。また、「本試験」と「本+追試験」の中には上記以外に1995, 1994年の本試験も用いた。
さてまずは何はともあれ集計結果のグラフを掲示しよう。
グラフが複数になるのが嫌だったので、あえて9種のデータを1つのグラフに載せてしまったため、見にくくなってしまった点はお詫びする。なお、複答問題のデータは入っていない。
全ての試験及び分類を合わせると(「本+追試験 語+読」薄紫)、確かに諸説言われているように2及び4が2割を超えている。しかし項目ごとに見ていくと、語句と読解のグラフでは結構な違いを示しており、必ずしも2及び4が有利とはいえなさそうだ。
まずは問1 語句についてみてみる。
全試験(「本+追試験 語句」薄桃)でみると、5が特出、2が普通以上、3が普通、4は少なく、1はわずか16%だった。本試験だけ(「本試験 語句」水)で見てみると、54123(23は同順)の順となって2が低いのが目立つ。新課程(「新課程本試験 語句」青)であれば、54312(54は同順)の順となり、これまた2が低い。
どうやら語句の場合は、いずれの場合においても5の可能性は高いようだ。また、本試験に限れば4も高く、2は最下位である。また、最近の本試験では1より3のほうが高くなってきているようだ。
よって、最近の傾向としては543がTOP3となるようだ。
但し一つ特筆することがある。新課程本試験で解答に1が登場している年が4年/8年ある。そしてこの4年全て、1は(1)の解答なのだ。つまり、1は(1)以外は低く、(1)は1の確率が非常に高いということだ。なので先ほどのを書き直すと、
(1)は1の可能性が高く、(2)(3)のTOP3は543ということになる。
次に問2-5(6) 読解についてみてみる。
読解といっても何種類かあるが、ここでそれについては気にしない。
全試験(「本+追試験 読解」薄緑)でみると、4が特出、2が21%、1がおよそ20%、3は少なく、5は16.5%であった。本試験だけ(「本試験 読解」橙)でみると、4が25%を超えて26%、1と2が20%、そして34と続く。新課程(「新課程本試験 読解」紅)でみると、1が何と3割超え、続いて42、5は15%、3に至っては10%を切っている。
読解では、全ての試験で見ると4が多いが、最近ではその勢いに陰りを見せてきているようだ。それに代わって1が恐ろしいほどの勢力を見せている。あとは2が安定した強さを見せている。35はいずれにおいても低い。
また、新課程本試験においては、2006-2013年の全てにおいて必ず1が1回以上使われている。4は6/8である。2が使われている年では2が2回使われている年度も多い。わずか8年のデータしかないが、3は3年おきごとに使われており、この周期の通りであれば2014年に3は使われないことになる。
よって最近の傾向としては、142がTOP3であろうか。ただ、「新課程本試験 読解」には異常ともいえるほどの偏り(特に1の高さと3の低さ)が気になるため、逆に今後は1が低くなり3が台頭してくる可能性も否めない偏り方ではあるため気を付ける必要があるかもしれない。
語句と読解を合わせたデータに関しては、おそらく問題の作り方が違うため、この考察にあまり意味はないと思うので飛ばす。というか語句と読解の平均みたいな結果に決まっているわけだ。
次に、新課程における問6 複答問題について考察しておこう。
このグラフを見ると、本+追試験でみれば、順に324516と、3を頂点とした山のような形になっている。しかし本試験と追試験では傾向が違うように見える。今回は本試験のみ考察しよう。
本試験の複答問題ではこれまで8年の間に何と一度も1と6が使われたことがない。これは驚くべきことだろう。一番多く使われているのは2で、34が同順で5が一番少ない。しかしこれらにあまり差はない。
複答問題に関しても、読解問題同様、標本数が少ないとはいえ、16が全く使われておらず、偏りが大きい。従来通りであれば2345のどれかを選ぶのが良いだろう。あえて2個選ぶとすれば、追試験の結果も考慮して23だろうか(2012年と2006年はこの組み合わせ)。
これに関しても、格差是正のために16が答えとなる可能性が否めなく、注意が必要だろう。
ちなみに、23が正答だったのは、新課程本試験で2年/8年であった。
最後に、全体的な分布の仕方について考察する。
複答問題については、番号の若い順に書いた場合とする。
新課程本試験においては、2つ以上同じのが連続したのは4年6回/8年であった。そのうち2007年では2が3回続いた。最新3年には連続箇所は見られなかった。新課程の追試験では、4年7回/8年で、こちらは最新3年のものにも連続箇所が見られた。
2012年は確かに国語全体を通してみても連続箇所はないが、2013年には2か所存在することや、連続箇所をわざわざ避けようとしてくるとは思いにくいので、2014年は最近3年間に連続箇所がないことから、小説内に1か所以上連続箇所が発生する可能性が高いかもしれない。
以上、簡単ではあったが第2問 小説について考察してみた。
2014年の小説について結論をまとめると、
問1 語句 では(1)のTOPは1、(2)(3)のTOP3は543である。
問2-5 読解 ではTOPは142である。
問6 複数解答問題 では2345の可能性が高く、あえて順位をつければ23である。
また、小説問題内に1か所ほど連続箇所が発生する可能性がある。
ということになった。
問題でどうしてもわからないときや時間が無くなってしまった時には、これを参考にしてみてはいかがだろうか。
但し、こんな考察は、所詮はわずかな分布の違いを見て判断しているだけなので、自分で考えてこれだろうと思ったらその答えを選ぶことをお勧めする。これを利用したところで当てずっぽうには変わりはないのだ。
最後に、この記事を参考にした結果、本番の試験で悪い点数を取ったからといって、筆者は責任を取らないので、信じるか信じないかはあなた次第である。
WordPressのダッシュボード>更新から更新したいプラグインを選択し、更新していた。すると画面には次のような表示が出た。
エラーの場所を拡大すると、こんな感じだ。
要するに、SI CAPTCHA Anti-Spamというプラグインの更新に失敗してしまった。エラー内容には「古いプラグインを削除できませんでした」と書かれている。
更新に失敗しても今まで通り動いてくれているかと思いきや、プラグインの一覧画面を開いてみて確認してみたが、このプラグインは消えていた。
ここで僕は「一覧から消えているからもう一度プラグインをインストールしなおせば直るだろう」と安易に考えていたので、プラグインを検索し、インストールのボタンを押してみた。すると次のようが画面が出てしまった。
インストールに失敗した理由を見てみると、「目的のフォルダはすでに存在しています」と書かれている。どうやらインストールした痕跡のあるプラグインは素直にインストールさせてはくれないらしい。
プラグインの一覧には名前が出ていないし、再インストールもできないとなると、もうWordPress上の画面から自動インストールはできなさそうなので、仕方がなく手動インストールを行うことにした。やってみると意外にもすぐに終わった。プラグインの手動インストールの手順はこうだ。
pluginsフォルダ内にファイルを入れると、特に設定する必要なく、自動的にWordPressはプラグインを認識し、プラグイン一覧に表示される。あとはここからプラグインの有効化を押してプラグインを有効にしてあげよう。
WordPressのプラグインの手動インストールはこのように非常に簡単なので、自動更新や自動インストールに失敗したときのほか、普段から手動インストールを行ってもよいかもしれない。
]]>1. そもそも1000mgを1gとすることが誇大表示なのだろうか。
僕は現在大学にいる。その上理学部だ。だから単位の換算は日常茶飯事におこなう(1年生なのであまり偉そうなことは言えないが)。だから1000mgと1gが等価だとあまりにも当たり前すぎるように認識したのはそれ故になのだろうか。確かにμ, n, p, f(順にMicro, Nano, Pico, Femto)やT, P, E, Z(順にTera, Peta, Exa, Zetta)などは日常ではあまり耳にしないし、耳にしてもとても小さいあるいは大きいということを示しているという程度の認知で不便しない。しかし今回使われているm(milli)はどうなのであろうか。gという単位でなくとも、たとえば牛乳は1Lという表記もあれば1000mLという表記もある。清涼飲料に関しても、1.5Lという表記もあれば1500mLという表記もある。長さ1mmというのも日常では聞く。直接1m=1000mmというのを知らなくても、1m=100cm, 1cm=10mmという程度は常識だろう。そのことを知っていれば1mの100分の1である1cmよりも小さいから1mmは1mの100分の1よりずっと小さいということくらいわかっているだろう。これらを踏まえれば、milliが1000分の1を表すということは常識と言って差し支えないだろうし、例え知らなくともとても小さいことは分かっていると思う。そのことから考えて、1000milliというのを見たときに単位として小さいものが使われているということを認識できていないというのはいかがなものか。それは日頃の不注意に入るだろう。μgやngを用いて表示するのは誇大表示だといえるかもしれない。しかしこれほど認知できる可能性の高いmを使ったmgをもって誇大表示というのは言い過ぎであると思う。もっとも、このことを認識できていなかった人がこの本を読んだとすればその本の真偽にかかわらず本に完全に影響されてしまって終わるだけであろう。
2. Taurineは薬だ。
料理などで砂糖を使うとき、その量はmgではなくgという単位を使うであろう(大匙や小匙を使うというのはおいておく)。この場合、mgという表示を用いればそれは適切とは言えないだろう。ほかの食品類で考えてみても、食品類の重さを表す時は大抵はgやkgだろう。我々が普段それらを使うときはそのようなScaleで使用するからそれは当然の結果だといえる。ところでこの問題「Taurine1000mg」という表示は栄養Drink類のものだろう。これらは普通の清涼飲料等と同じような感覚で冷蔵庫に保管し、飲むことができるため、ついつい一般食品類と同じような感覚に陥ってしまうかもしれない。しかしそれは大きな間違いである。Taurineは(合成品に限るが)日本では医薬品扱いされている。栄養Drinkが例え医薬部外品だとしても薬の一種であることに変わりはない。そのため、Taurineの量に関しても、食品類のScaleで考えるのではなく、薬のScaleから考えるのが妥当だろう。世の中には様々な薬があるが、それらの成分表示を見ると、gという単位は大きすぎるのでほとんど使われていないことに気が付く。つまり、薬の世界ではむしろgという単位を使うほうが珍しいといえる。その延長上で考えれば、1000mgというのは確かにgで表しても差し支えない値ではあるが、mgで表示してもそこまで不自然な値ではないため、薬の世界の標準に則ったmgを用いていることは全く驚くべきことではないと思う。むしろ自然なことなのではないだろうか。そもそも食品類の成分表示を見ても、熱量、蛋白質、脂質などはg表示が多いが、その他の成分に関してはmgまたはそれよりも小さい単位で書かれていることも全く珍しいことではない。Taurileも栄養Drinkの1成分であるわけだから、この観点からも不自然なことではないだろう。
3. そもそもTaurine1000mgって体にとって少ない量なのか?
そもそもの問題として、Taurineが1000mgというのは大したことのない量なのであろうか。2.でも話した通り、薬の表記はmgやそれよりも小さい表記で書かれていることが多い。それは薬の世界ではその程度の小さい量で体に十分な効果をもたらすからだ。Taurineも同様に、多量に摂取しなくとも効果のあるものなのではないだろうか。残念ながら僕は理学部であり、薬に関することに関しては全然知らない。そこで簡単に調べてみたところ、Taurineは体中に体重の0.1%ほどの量(体重60kgで60g)が含まれているようだ(出典 : タウリン(1) 食と健康Express、静岡県立大学食品栄養科学部教授 横越 英彦、http://sfns.u-shizuoka-ken.ac.jp/express/newspaper/taurine01.html 2013/11/30閲覧)。また、東京化学同人『生化学辞典』によればTaurineは人間の場合1日あたりおよそ200mg尿排泄物として排泄されるようだ。飲料として摂取したTaurine1000mgはもちろん全てが吸収されるわけではなく実際には一部しか吸収されないであろう。しかしそうであったとしても、もともと体中に60g(60 000mg)しか含まれておらず、1日のうちに200mgが体中で作られ、排泄されることを考えれば、1000mgというのはむしろ多いように思う。逆に1g等と表示して少ないように思わせたならば、少ないから何本でも飲んでもよいだろうと思い込み、1日に何本も飲む人が現れるかもしれない。薬に限らずなんでもそうだが、過ぎたるは及ばざるがごとしであり、多ければよいというものではない。僕自身がTaurineに関する知識が殆どないため断定はできないものの、Taurine1000mgは決して少なくない量であり、むしろ多いくらいだと感じた。
僕自身別に食品表示の専門家でもなければTaurineの専門家でもない。だから本当のところこの表示が適切か不適切なんていうのは分からない。しかしながら、以上のことを踏まえて僕自身はTaurine1000mgの表示に対しては誇大表示だとは思わないし、適切な表示であると感じる。ましてやどや顔で「Taurine1000mgって実はたったの1gなんだよ!詐欺だよね!」なんて言い歩きたいとは全く思わない。皆さんはこの表示に対してどう感じるだろう。
最後に一つ注意してほしいのが、僕はこの本の帯を見かけただけであり、本文に関しては全く読んでいない。帯の内容とは違い、素晴らしい内容が書かれているかもしれない。そもそも本の帯って著者が自分で書いているのだろうか。出版社が勝手に適当につけていそうな感じもする。そんなわけで決して『食い逃げされてもバイトは雇うな 禁じられた数字』という本に対して批判しているわけではない。あくまであまりにも軽すぎる本の帯に対してだ。ちなみに僕自身はこの本の帯を見て絶対にこの本は読まないと決めたため、本の中身に関してはおそらく一生知ることはないだろう。ああそれと一つと言っておきながらもう一つ付け加えておくが、何度も言っている通りこれらに関しての専門知識は全く有していないのでこの本文は誤りだらけかもしれないため、真偽に関しては自身で調べて考えてほしい。
]]>しかしそれゆえにServerの負担も高くて制限も結構されていたりするのですよね。
TwiterのAPI自体はAppli登録をしなくても、
http://twitter.com/statuses/user_timeline/(UserName).xml
というような感じで誰でも使える上にXMLやJSON、RSS等に対応したとても便利な仕様なのですよね。
しかしこれはAppli登録をしていない場合は1時間のうちに150回使うと400BatRequestを返すようになりしばらく使用できなくなります。
Appliであっても1時間に350回が限界だそうです。
ちなみにOAuth認証してつぶやく場合のAPIはこの150回制限のうちには引っかからないそうです。
ただし1日につぶやける最高は、APIからだけでなくすべての方法合わせて1000回までだそうです。
まあ普通はどう考えても1日に1000を超えることなんてないでしょうが…。むしろ逆にSpamとして制限されたりなんてね…。
]]>
これにより、多少時間のかかるComputerの起動を帰宅前にちょっと早く起動しておくなど、RemoteによるComputerの起動が実現でき、とても便利な機能です。
さて、これを実行するにはComputerの設定と、そのComputerに起動のためのMagicPacketを送ってやる必要があります。
今回はそのMagicPacketを送るProgramをPHPで書いてみたので紹介したいと思います。
今回はComputerの設定の仕方は省略したいと思います。
今回のProgramは関数になっていますので、以下のCodeをまずはCopy&Pasteしちゃってください。
function wakeOnLan($macAddr, $ipAddr) { // makeMagicPacket $magicPacket = ""; for ($i=0; $i<6; $i++) { $magicPacket.= chr(0xff); } $aryMacAddr = explode(":", $macAddr, 6); $buffer = pack("H*H*H*H*H*H*", $aryMacAddr[0], $aryMacAddr[1], $aryMacAddr[2], $aryMacAddr[3], $aryMacAddr[4], $aryMacAddr[5]); for ($i=0; $i<16; $i++) { $magicPacket.= $buffer; } // makeBroadCastAddr $aryIpAddr = explode(".", $ipAddr, 4); if ($aryIpAddr[0] < 127) { $aryIpAddr[1] = "255"; } if ($aryIpAddr[0] < 191) { $aryIpAddr[2] = "255"; } if ($aryIpAddr[0] < 223) { $aryIpAddr[3] = "255"; } $broadCastAddr = join(".", $aryIpAddr); // send $fp = fsockopen("udp://".$broadCastAddr, 2304, $errno, $errstr); if (!$fp) { print("ERROR: $errno - $errstr\n"); } else { fwrite($fp, $magicPacket); fwrite($fp, $magicPacket); fclose($fp); } }
使い方は簡単、関数wakeOnLanに起動したい対象のComputerのMAC AddressとIPAddressを指定するだけです。
ただし、おそらくRouter越えはしないと思うので、IPAddressは255.255.255.255を指定しておいても大丈夫です。
では使用例を示します。
wakeOnLan("FF:FF:FF:FF:FF:FF", "255.255.255.255");
この例ではMAC Addressが”FF:FF:FF:FF:FF:FF”のComputerを起動しています。
IPAddressは前述のとおり正しいIPAddrでも255.255.255.255でも通常は構いません。
とても簡単ですよね!
]]>
特に日付を計算する関数はPHPにはないのですべてUnix時間に変換して、
引き算をした後に60*60*24秒でわり、整数に丸めるという方法で出してみます。
では早速Codeを紹介します。
function remainDate($day) { return intval((strtotime($day) - strtotime(date('Y/m/d'))) / (60*60*24)); }
関数remainDateの引数には例えば’2012/08/31’のような感じで渡します。
試しに、今日は2012/08/30ですが、2012/08/31までの残り日数を求めてみましょう。
echo remainDate('2012/08/31');
これで、もちろん1と表示されます。
いろいろなProgramに応用ができそうですね。
]]>
ついつい買ってしまった特価品をご紹介したいと思います。
まずは普通のLAN Cable 7m。
価格がなんと100円!ちゃんとCat.5eで1000Base-Tにも対応しているのに7mがこんなに安いなんて…。
ついつい大量買いしようかと思いましたが流石に東京に来てまでするほどではないかと思い断念…。
次はお目にかかる機会が減りつつあるPS/2のCable。
価格は写真の通り50円。ちなみにこれは携帯電話の充電ができるというものらしいです。
しかしこんなものどうするのかって?まあもちろん携帯電話を充電したかったのではなく、PS/2の端子がほしかっただけです。(笑)
ちょっと作りたいものがあったのですよねー、まあそのうち製作品でも公開しようかと思います。
最後は今度こそ本物の携帯電話の充電器。
これはがらけーに直接指して使うPortableBattery内臓充電器です。
携帯電話はよく電池がなくなるのでこういうものは現代人には必須ですよねー。
Batteryの劣化も思ったよりもしている雰囲気はなく、普通に充電できました。
こういうのって5V出力だから携帯電話の充電以外にも実験用電源としたりしていろいろな使用用途があって便利なのですよねー。
まあこのほかにも安いものはたくさんありましたよ。
秋葉原は1日中いても飽きませんよねあの電気街は。
]]>
いやあ北海道人の僕には厚いのじめじめしているのでだぶるぱんちでしたよ、なつばてしていましたねー。
さてさて東京といえば秋葉原ですが、まあ今回は秋葉原の電気街の様子はおいておいて秋葉原土産を買ってきたので紹介しましょー。
まずは二次元の恋人というもの。
中身は書いてある通り、しょこらぱいで割と普通でした。味もまあまあといったところ。
割と無難なお土産かもしれません。
2つ目はつんでれろしあんくっきー(逆ばーじょん)。
こいつにはぎゃくと普通のろしあんるーれっとがありますが、少しからいくっきーが入っています。
見た目は驚くほど普通ではずれを食べてもはじめは大した辛くないのですがだんだん結構辛くなってきますね。
普通が2/12個のはずれで逆が10/12個のはずれが入っています。
3つ目は先日できたばかりの東京SkyTreeのぱい。
外見とも中身とも普通なものなので、変なお土産が嫌な人には普通におすすめです。(笑)
4つ目は萌土産の萌萌くっきー。
これは完全にまるごとあげてしまったので中身は残念ながら見れませんでしたが、これはなかなか痛いですね。(笑)
逆の意味で一番おすすめかもしれません。
今度はどろっぷ。
特に変な絵がかいてあることもなく、かつ秋葉原というのがわかるので、秋葉原に行ってきたということを示しながらも変な絵はちょっとという方にはおすすめですね。
ちなみに味はいちごみるく味です。
最後はすごくまともな東京大学Cookie。
まあ製造元も有名会社が引き受けていますので味もいいですね。
ちょっとあかでみっくにお土産をあげたい方はどうぞ。(笑)
皆さんの中にも東京行ってもお土産は何にしようと悩まれる方がおられると思います。
東京ばなななど一般的なものも良いですが、こんなちょっと変わったあまり見ないものをあげるのもよいかもしれませんよ。
ちなみに今回紹介したもののうち東京大学Cookie以外はすべて秋葉原のどんきほーてで買うことができます。
お土産どこで買えばよいかわからない場合は秋葉原のどんきほーてに行ってみてください。
ちなみに東京の当日の気温は33度でしたが帰ってきた日の札幌の気温は18-22度だったそうです。東京の冷房よりも低い温度ですよねこりゃ。(笑)
※秋葉原電気街の様子がないのは僕が夢中で品物を見ていたため殆ど写真を撮っていないからです。(笑)
]]>