マイペイすリボについて調べたときの話。
リボ払いについては腐るほど説明があるのに、なぜかマイペイすリボの説明がどこにもなくて、数日間さまよった経験がある。
結論を書くと、
「マイペイすリボ」とは、三井住友VISAカードにおける、「リボ払い」の商品名である。
つまり、
リボ払いのことを、三井住友VISAカード用語で、「マイペイすリボ」という
らしい。言うまでも無いが、完全に辞書的なものではなく、三井住友VISAカードならではの優遇はある。
とはいえ、随所で「マイペイすリボはおトク」等と言われているが、所詮はリボ払い。
年会費やポイントにつられて数千円をケチると、将来利息で数万円も持って行かれる危険がある。
「小銭拾って札束落とす」私は「おトク」という言葉を決して信用しない。釣り針がでかすぎるからだ。
resize()とreserve()の違い。
一言で言うと、end()の位置が違う。 あと、resizeするとその個数分のコンストラクタが走る。
end()の位置が違うので、push_backした時の挙動が異なる
vectorはnewのラッパーであるから、newの使い方から考えると分かりやすい。
resizeにせよreserveにせよ、その分のメモリを確保することに変わりはない。
これがうれしいときはreserve:
・push_backした時に「使用済みの要素の次の要素」に値が入る。リストの末尾に追加していくような感じになる。size()を見れば保存した項目の個数がわかる。
・少なくともreserveで指定した回数分のpush_backに関しては、再確保が発生しないことが保障される。
これがうれしいときはresize:
・size()が確保した要素数になるので、普通の配列と同じように使える。
余談
動作の違いから、resizeした後にpush_backすることは少ない。
また逆に、reserveしてから、size()以上の要素に対してoperator[]でアクセスしてはいけない。
これらのことをやっているコードは、バグである可能性がある(特に後者)
余談だが、こんなことをしてもいいかもしれない。
std::vector<char> v; v.reserve(100*100); //画像サイズは100*100が相場 printf("100*100 size:%d capacity %d\n",v.size(),v.capacity() ); v.resize(30*30); //実際には30*30に設定された printf("30*30 size:%d capacity %d\n",v.size(),v.capacity() ); v.resize(50*50); //わけあって50*50に変更した printf("50*50 size:%d capacity %d\n",v.size(),v.capacity() ); v.resize(200*200);//結局200*200も使ってしまった printf("200*200 size:%d capacity %d\n",v.size(),v.capacity() );
| 100*100 | size: | 0 | capacity | 10000 |
| 30*30 | size: | 900 | capacity | 10000 |
| 50*50 | size: | 2500 | capacity | 10000 |
| 200*200 | size: | 40000 | capacity | 40000 |
最初にある程度の大きさをreserveしてcapacityを広げておけば、後のresize時に再確保の可能性が減り、高速化が図れる(かも)。
あと、最初に書いたが、resizeした時はその分のコンストラクタが走る。
#include <vector> class CC{ public: CC(){ printf("construct...\n"); } }; int _tmain(int argc, _TCHAR* argv[]) { std::vector<CC> v; v.reserve(100); v.resize(5); getchar(); return 0; }
実行結果:resizeした5個分のコンストラクタが走っている
construct...
construct...
construct...
construct...
construct...
PlantFactory → Blender Cycles 用
使い方:
①Blenderで、PlantFactoryからfbxエクスポートした植物オブジェクトををShiftキーを押しながら一つ以上選択します。
②このスクリプトを走らせます
import bpy for obj in bpy.context.selected_objects: for mat in obj.data.materials: thisTree = mat.node_tree; thisTreeNodes = mat.node_tree.nodes for node in thisTreeNodes: if node.type == 'TEX_IMAGE': if 'alpha' in node.image.name: # ex. 'alpha map.016' alphaTex = node colorout = alphaTex.outputs['Color'] alphaout = alphaTex.outputs['Alpha'] if alphaout.is_linked: MixNode = alphaout.links[0].to_node MixColor1in = MixNode.inputs['Color1'] MixColor2in = MixNode.inputs['Color2'] thisTree.links.new( colorout , MixColor1in ) thisTree.links.new( alphaout , MixColor2in )
英語の勉強をしようとしていて、英語力アップ!的なサイトを沢山読んだ結果、そもそも単語や熟語の数が足りなければどうしようもないという知見を得た。
日本人の英語に対する感覚が概ね
1.試験に必要だから渋々やる
2.I love English!
3.アルファベット見ると吐き気がする
の三択なので、ちょうどいいサイトが少ないのだろうと勝手に思っている。
クラスをどう説明するか。クラスはデータ型を定義するためのものだが、ではそもそもデータ型とは何なのか、という説明が必要だと思い至った。
コンピュータの世界では、すべてが二進数で表される。文字だろうと絵だろうと音楽だろうと、全ては数値化されており、それは二進数で保存され、常に「ただの二進数の塊」として扱われている。しかも、「二進数」とかっこよく言うが、もっとよく見れば二進数とは、「ただの0と1がたくさん並んだもの」でしかない。
つまり、コンピュータ内では、全てが「ただの0と1の並びで表現されている」のである。この点において、一切の例外はない。
では、その「0と1がたくさん並んだもの」の例を見てみよう
0101
これは、ゼロイチゼロイチという、0と1の並びである。これを、「二進数で表現された整数」と考えれば、整数である以上、十進数に直すことも可能だという話になり、「十進数の5」と読むことも可能である。あるいは、「音が鳴っているかどうかの状態の推移」とし、「0を無音、1を有音」と読むと決めれば、0101は、「ピー・ピー」という音を表現しているともとれる。
全てが0と1の並びであるから、それをどう解釈するかがとても重要になってくるのである。
では、もう少し高度かつ実用的な例を挙げる。
11111101
これは、「素直に」二進数で表現した整数と考えると、253という数値になる。しかしもし、二の補数による負数だと考えれば、-3という数値になる。
これは「符号付整数です」という条件が与えられているなら、-3が正解で、「符号なし整数です」という条件が与えられているなら、253が正解ということである。どのように見るかによって、答えが変わってくるのだ。
もっとややこしい例を挙げてみる。
00111111100000000000000000000000
これは、1065353216という整数だろうか?何度も言うように、何を表現しているかがわからないと、そうだとも、違うともいえない。そこで条件を与える。「上記の0と1の並びは、浮動小数点で表現された数値である」。
そうすると、この001111...は、実は1.0という実数を表そうとして並べられたということがわかる。
※C言語の32bit浮動小数点は少し複雑だ。一番左側が0ならプラス、1ならマイナスの数であるとし、次の01を8個まとめて指数部とし、残り23個の01を仮数部としている。
以上の例から、「0と1の並びを見ただけでは、それが何を表現したデータなのか、皆目見当がつかない」ことが、わかっていただけたと思う。コンピュータで正常な計算をするには、
01の並んだ「データ」と共に、その01の並びを意図した通りに解釈する「ルール」の情報が、どうしても必要になるのである。
「データ型」とは、このルールのことなのだ。「01010101+00101111を計算して!」とコンピュータに頼んでも、「そうはいってもそれって整数?小数?符号は想定するの?そもそもそれ数として扱ってもいいの?」と、わからないことだらけで計算できない。そこで、
「符号なし整数01010101 + 符号なし整数00101111を計算して!」と、データを扱うルールと共に与えてやって初めて、「10000100」という計算ができるのである。
例えば、以下のプログラムを見てみる。
char A = 10;
これはまずAという変数名に、charという型情報が紐づけられる。今後Aという変数が出てきたら、それは8個の01で表現した整数であるとみなしなさいと、コンパイラに命令しているのである。以後、Aは整数として扱われることが保証され、万が一、浮動小数点演算などが入れば、「プログラマのおまえが整数として扱えと言ったのに、なんで浮動小数点演算をさせようとするんだ?正気か!?」と、コンパイラが警告を発するようになる。
つまり、新たなデータ型を作るとは、ある0と1の並びに対して、どう扱うか?というルールを、新たに作ることなのである。
では、実際にルール、つまりデータ型を作ってみる。作るといっても、計算して求める作業ではない。どういう風に計算するかという決め事を作ることなので、一般的に、「データ型を定義する」という表現のほうが好まれる。
ルールを作るためには、まず「何をしたいか」を明確にしなければならない。ここでは単純に、複素数を計算したいという目的を設定する。
複素数は、
3+4i
のように、二つの整数で表す。(実数にすると二進数での表現が複雑になるから)
これをどのように0と1で表現するかだ。まず、iや+といった記号を書くことはできない。0と1以外ないからだ。そうすると、並んだ順番で判断するのが最も妥当そうだ。
00110100
はて、これがなぜ3+4iになるのか。それは、
0011 0100
と、4桁ごとに区切り、左側を実数部、右側を虚数部と表す。そのように今、著者である私が決めたからだ。そして、「足し算を行うときは、実数部ごと、虚数部ごとに行い、4桁の区切りを跨がない」というルールも作っておく。01を解釈するルールを作ったからには、それに対して計算をするときのルールも必要になるのだ。
それでは、このルールで1+1iを0と1で表現してみよう
00010001
では、 (3+4i) + (1+i1)を計算してみよう
| 実数部 | 虚数部 |
| 0011 +0001 -------- 0100 |
0100 +0001 -------- 0101 |
従って、この答えは、
01000101ということになる
この複素数を表示するときは、
01000101 という0と1の塊を、右と左に分け、
● 0100を4桁の二進数整数とみなし「4」を表示し、
● +を表示し、
● 0101を4桁の二進数整数とみなし「5」を表示し、
● iを表示する
という手順になる。間違って、コンピュータに「符号なし整数01000101」を表示して!」と命令してしまうと、69という値が出力される。コンピュータは、人間が指示した通りの仕事をするのである。人間の意図は関係ない。
freeglut使おうと思ったがコンパイルではまったのでメモ。
というか、デバッグ版をコンパイルしないなら何も詰まることはない。強いていうならVisual Studioが本文中C:\dev\直下に作業ディレクトリを作りまくることだ。
2017/08/27時点で:
・CMake-3.9.1-win64-x64
・Visual Studio 2017
・freeglut 3.0.0
なお、特にこだわりがないなら下記DLページのPrepackaged Releasesの[Martin Payne's Windows binaries(MSVC and MinGW)]からダウンロードすればいいと思う。libもdllも32bit/64bit両方はいっているので何の問題もない。
1. まずDLページ[http://freeglut.sourceforge.net/index.php#download]へ行って、Stable Releaseの一番上 Freeglut 3.0.0 をダウンロードする
2. C:/dev/ にtar.gzを展開。ビルドディレクトリとインストールディレクトリを作る。おおむねこうなる:
C:\DEV
├─freeglut-3.0.0
│ ├─android
│ ├─progs
│ └─src
├─install_x64
├─install_x86
├─sln_x64
└─sln_x86
3 CMake-guiを起動。
3.1 ディレクトリ設定
Where is the source code: → C:/dev/freeglut-3.0.0
Where to build the binaries: → C:/dev/sln_x86
3.2 コンパイラ設定
Configure →
Specify the generator for this project: → Visual Studio 15 2017
下のオプションは、Use default native compilersで、Finish
3.3 設定変更
Configureが終わったら、Advancedだけチェックして、
3.3.1 CMAKE_INSTALL_PREFIX → C:/dev/install_x86
3.4 再度Configure
3.5 Generate
3.6 Open Project
4 Visual Studioが起動するので、
4.1 Debugでfreeglut_staticを右クリックし、プロパティ
4.2 構成プロパティ → C/C++ → コマンドライン と進み、以下を追加:
/Fd"freeglut_static.dir\Debug\freeglut_staticd.pdb"
4.3 ALL_BUILDを右クリックし、ビルド
4.4 INSTALLを右クリックし、ビルド
解説:
4.2を行わないと、4.4の時に、
--------------------------------------------
コマンド "setlocal
cmake.exe -DBUILD_TYPE=Debug -P cmake_install.cmake
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
:VCEnd" はコード 1 で終了しました。
プロジェクト "INSTALL.vcxproj" のビルドが終了しました -- 失敗。
--------------------------------------------
と怒られる。少し上を見ると、
27>-- Install configuration: "Debug"
27>-- Installing: C:/dev/install_x86/lib/freeglutd.lib
27>-- Installing: C:/dev/install_x86/bin/freeglutd.dll
27>-- Installing: C:/dev/install_x86/bin/freeglutd.pdb
27>-- Installing: C:/dev/install_x86/lib/freeglut_staticd.lib
27>CMake Error at cmake_install.cmake:74 (file):
27> file INSTALL cannot find "C:/dev/sln_x86/lib/Debug/freeglut_staticd.pdb".
と、なんかpdbがないと言われているので作るようにしてやっているのだが、そもそもpdbをはき出すこと自体があれなので、
CMakeの時点で、
3.3.2 INSTALL_PDB → チェックを外す
をしてConfigureすれば、この問題に遭遇しない。