2014年11月26日水曜日

株主優待初めて届いた

株主優待の権利確定が9月末、それで11月末に近い本日、株主優待を始めてもらった。
お金では還元しないで現物で還元するというのも、会社の方向性の意思表示である。優待が最善とは思わないが(実際配当でくれてもいいはずだし)配当する気がない分”個人に有利なように”配当してくれるというのは、それはそれで方向性であると思う。

株式を持つことは本来、会社を所有することである。わずかであるが株式を持つことで会社の決定に対する議決権を持っている。行使できるほど強くないけれども!と思うと、その会社に対する愛着をもてようというものである。

お金を得たいだけなら、会社の債券を買ったらよい。株価特有の「株価値上がり」がない代わりに、配当だけで得られるはずの金額よりずーっとおおきな利率で販売される。会社にとっては即座にお金を得られる代わりに、大きな利率というリスクをしょい、その分倒産・未払い・価値の減などの大きなリスクを購入者に負ってもらうという代物だから、、、。

ところでその株主優待会社名なんかも公開してよさそうなのに公開しないのは、あれだな、秘密主義ってやつだな

株式での利益についてちょっとおさらいしておくと

  • 株式での利益は、キャピタルゲイン(値上がり益)と、インカムゲイン(配当益)がある
  • 株主優待は、インカムゲインの一種。配当の形式が金銭ではないもの
    • 現物支給(自社商品、お歳暮形式)
    • 特製金券(株主優待券)
    • 社会貢献(寄付など)
  • インカムゲインのメインは期末配当、1株あたり何円,という形でつける
  • キャピタルゲインは、購入時株価から売却時株価の差額
株式で利益を得る方法は
  • 株を購入することで配当を得る。
    • 株価があまり変わらない銘柄だとこれが主か。
    • 利益額=売却までに得た配当
    • 損をする場合=売却時までの株価の減少 > 売却時までの配当合計額
  • 会社が”有名になる”ことで株を買おうとする人が増える=>株価上昇
    • いわゆる「人気投票」の側面
    • 誰もが高く売ろうとし、誰もが安く買おうとするために成立する
株価上昇は基本的に期待するものではない(中期~長期投資を考える場合)
  • 長く保有することで、その間に得られるであろう配当金を考える
  • 株価+配当金 = 将来の価格、と思うほうが考える上で楽
  • 株価が安いとは=>想定(将来)配当金が現在株価より”割合として”高い
    • 配当(=その源泉となる営業利益)が高そうなのに
      株価がそれに比して安い=>PER
株価上昇はほぼインフレとイーブンと考えるとなんか納得がいく
  • 物価が高くなる=>ものを高く売らざるを得なくなる
    =>会社の利益はその分増えないとおかしい
    =>配当も当然それに比して”額面が”増えないとおかしい
    =>同じ株価のままだと配当に対して株価が安い状態になる
    =>株価が”インフレの分だけ”高くなるはず
  • インフレが”理想的に”進めば、額面だけが増えて相対的な価値は変わらないはず
    =>株価の額面がその分変わっただけと考えても不自然ではない
じゃあなぜ短期的な急上昇が起こるのか?=>わからない。だからそういう株には手を”出せない”。ソシャゲ株上がりすぎでしょう、、、そんなに儲かり続ける保障はないのに。

2014年11月4日火曜日

PHPと16進数にまつわる思いがけない挙動

0x80000000 (32bit) はintでしょうか?いいえ、floatです。

それで比較していてはまったという思い出話。

PHPでバイナリを処理しようという、酔狂(?)な方は要注意ですぞ

なんでそんなことを使用かという話は話せないし面倒なのでほっといて

次のようなコードを書いていて問題は発生した。

$binaryString = "\x7F\xFF\xFF\xFF\x80\x00\x00\x00";
// 実際は別途取ってきたバイナリデータがあるとおもいねぇ!
$unpacked = unpack("NN", $binaryString);
assert($unpacked[1] === 0x7FFFFFFF);    // <- pass 
assert($unpacked[2] === 0x80000000);    // <- assertion error !!!!

原因は:定数と変数と”暗黙の変換”の問題。

あれー!同じだろこれー!と思って散々原因を探してわかったのは

  • そもそもPHPの”すべての”整数(integer)は32ビット「符号付」しかない
    • 符号無整数は存在しない
  • unpack関数では、符号無整数を「指定は出来るが」「実際変換後は符号付整数」になる
    • 上記 $unpacked[2] は、内部的には -2,147,483,648 となっている
  • 0x80000000 は「整数の範囲を超えるので」「小数に自動変換される」
    • var_dump で見てみると、(float) 2,147,483,648 になっている
  • なので、厳密な一致テストを行うと、まあ、あいまいな一致テストでも、FALSE になる

他の方もはまっているようなそうでもないような微妙な話題である。調べようにも、わかってみればああ、そうか、だが気づくまではどはまりするという話題でもある。

ちなみに回避法は:強制的なキャスト

上記例の変数をそのまま使うと
assert($unpacked[1] === (int)0x7FFFFFFF);  // <- pass
assert($unpacked[2] === (int)0x80000000);   // <- pass, OK!
とする。符号無なので,内部的には右辺 0x80000000 は負の値になっているが、比較さえしなければ特に問題はない。少なくとも私はしない。はず。