scrap book

プログラミングとか

証券会社とか調べたこと

株取引メインのサイトだけど
口座開設の前に読む!証券会社と口座の選び方の基礎知識 | 俺たち株の初心者!
初心者が口座開設するならここがおすすめ!証券会社の選び方 | 俺たち株の初心者!
証券会社と銀行を連携させると、使い勝手がアップ!「資金の移動」や「資産管理」が簡単になるうえ、銀行金利や各種手数料がお得になることも!|ネット証券会社比較 |ザイ・オンライン

まとまっていない。
あくまで同じ”口座”で、お金を預けることは変わらなくて、
銀行:定期預金→元本保証で微増。
証券:株とかいろいろできる→増えたり減ったり。
っていう違いだと思う。たぶん。

資産運用とか調べたまとめ

放置して増やしたい()。忘れちゃいけないのは「まず節約」。

目次

資産運用の種類

資産運用比較.com~利回りやリスク、金利を徹底比較~
初心者が資産運用するのにおすすめの11種類の方法と比較。準備のやり方から徹底解説 - ノマド的節約術
関心範囲としては

  • ミドルリスク以下であること
  • 導入障壁が低いこと
  • 運用が手間でないこと(基本的に放置したい)

種類ごとの特徴

投資信託

通常の投資信託は自分で金融商品を選ぶ必要がある。

ロボアドバイザー

【2018年版】ロボアドバイザーを徹底比較!おすすめの特徴やメリット・デメリット、実績など | マネーの手帳
NISAはロボアドバイザーで利用できる?比較してどっちが良いのかも解説!

金融商品を提案してくれるのがロボアドバイザー。種類として「アドバイス型」と「運用一任型」がある。
アドバイス

  • 質問の答えに応じて、ポートフォリオを提案してくれる。あくまでもアドバイス
  • 具体的な投資信託ETFへの投資は自分自身で行なう必要がある。
  • NISAの口座を指定できる。

運用一任型

  • 目的や目標に合わせてポートフォリオを最適化しながら、ロボットが自動で資産運用を行なう。
  • 自動で行なわれる資産運用は対象としている金融商品や運用方法(アルゴリズム)など各ロボアドバイザーごとに違う。

ヘッジファンド

最近は流行ってないらしい。

不動産投資

THE不労所得。目指したい。けど圧倒的に難しそう。

株式投資

売買以外にも以下がメリット。長期保有ならあり。

制度

つみたてNISA

2018年1月から開始の「つみたてNISA」ってなに?これまでのNISAと何が違うの? - 節税や実務に役立つ専門家が監修するハウツー - 税理士ドットコム
「つみたてNISA」と従来の「NISA」、迷ったときはどちらを選ぶべき? 併用できない2つのNISAの違いと適切な「つみたてNISA」への移行のタイミングは?|つみたてNISA(積立NISA)おすすめ比較&徹底解説[2018年]|ザイ・オンライン
「つみたてNISA」の金融機関の選び方を解説!手数料、取扱商品の数、引き落とし方法で比較した投資初心者と経験者で異なる選び方のポイントとは?|つみたてNISA(積立NISA)おすすめ比較&徹底解説[2018年]|ザイ・オンライン

NISAとは、少額投資非課税制度のこと。所定の投資金額と運用期間の枠中なら非課税になる制度。

  • NISA:120万円/年 * 5年 = 総額 600万円
  • つみたてNISA:40万円/年 * 20年 = 総額800万円

メリット

  • 国が認定した商品なので安心
  • 資産運用が手軽にできる
  • 非課税期間が長い
  • 運用益がいつでも引き出せる

デメリット

  • 年間の投資額が少ない(NISAは120万/年)
  • NISAと併用できない

まとめ(NISA vs つみたてNISA)@感覚
異なる非課税枠の中で、どう運用したいか、という話。
つみたてNISAは長期で安定した運用。ローリスクローリターン。
NISAは(比較的)短期で挑戦的な運用。ミドルリスクミドルリターン。

iDeCo

「個人型確定拠出年金」制度。

メリット

  • 掛け金が全額所得控除になる。つまり節税になる。
  • 掛け金を投資信託などで運用していくこともできる。

デメリット

  • 60歳まで引き出すことができないお金になる。

まとめ(感触)
老後の心配と、他に回す先が無いとき用。
節税の一つとしての選択もアリ。所得を増やすなら投信、減らさないようにするならiDeCo

その他

節税手段も調べたいなぁ。


以上

格安simへの乗り換えまとめ

もともとの条件
  • 現在持っているスマホ(Xperia X Performance)を格安simで継続利用
  • 現在の回線(au)も別機種で継続利用
    • 今は電話番号は変えたくない
わかったこと1

auの機種を格安simで利用するために

現在の回線を別機種で利用するために

  • simフリースマホは特定周波数帯への対応有無に注意
    • 無いと遅くなる?(au固有の問題らしい)
料金シミュレーション
  • 現在:スーパーカケホ+データ定額5GB:\7000
  • 今の機種のまま
    • シンプル+auピタット(5GBの場合):\6000
  • ケータイに変えた場合

自前ヘキサダンプ関数

バイナリデータをバイナリエディタ風というかtcpdump風というかそんな感じに16進数で表示する関数。実装はC++11。やりたかったことはできた気がするけど気がしただけだった。ちょっと直す必要がある。あとソースコードが汚い。

ソースコード
#include <ctype.h>
#include <string>
#include <iomanip>
#include <sstream>
#include <iostream>

static std::string GetDumpedString(
        void* targetData, int targetDataSize,
        bool showHead = true, bool showChar = true)
{
    unsigned char* data = static_cast<unsigned char*>(targetData);

    std::stringstream ssDump;
    std::stringstream ssHead;
    std::stringstream ssLine;
    std::stringstream ssChar;

    ssLine.width( 2 );
    ssLine.fill( '0' );
    ssLine.flags( std::ios::hex | std::ios::uppercase );

    for( int i = 0; i < targetDataSize; i++ )
    {
        if( showHead && ( i % 16 == 0 ) )
        {
            ssHead << std::setw(8) << std::setfill('0')
                   << std::hex
                   << i << ": " << std::flush;

            ssLine << ssHead.str();
        }

        ssLine << (int)data[i] << ' ';

        ssChar << ((isprint(data[i]) != 0) ? (char)data[i] : '.');

        if( (i+1) % 16 == 0 )
        {
            if( showChar )
            {
                ssLine << "    " << ssChar.str();
            }
            ssLine << std::endl;
            ssDump << ssLine.str();

            ssHead.str("");
            ssHead.clear(std::stringstream::goodbit);
            ssLine.str("");
            ssLine.clear(std::stringstream::goodbit);
            ssChar.str("");
            ssChar.clear(std::stringstream::goodbit);
        }
    }
    if( ssLine.str().size() > 0 )
    {
        int spaceSize = 3*16 + (showHead ? 10 : 0) + (showChar ? 4 : 0) - ssLine.str().size();
        ssLine << std::string(spaceSize, ' ') << ssChar.str() << std::endl;
        ssDump << ssLine.str();
    }


    return ssDump.str();
}

int main(void)
{
    using namespace std;

    cout << "          00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" << endl;

    string str = "abcdefghijklmnopqrstuvwxyz"
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                 "01234567890";
    cout << GetDumpedString( (char*)str.data(), str.size() ) << endl;


    return 0;
}
結果
          00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70     abcdefghijklmnop
00000010: 71 72 73 74 75 76 77 78 79 7A 41 42 43 44 45 46     qrstuvwxyzABCDEF
00000020: 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56     GHIJKLMNOPQRSTUV
00000030: 57 58 59 5A 30 31 32 33 34 35 36 37 38 39 30        WXYZ01234567890

vector<string>をexecv()に渡す

掲題のコード。正直いまいち分かってない。

ソース
#include <unistd.h>
#include <vector>
#include <string>

using namespace std;

int main(void)
{
    vector<string> argList = { string("/bin/echo"), string("a"), string("b") };
    const char **argv = new const char*[argList.size()+1];


    for( size_t i = 0; i < argList.size(); i++ )
    {
        argv[i] = argList.at(i).c_str();
    }
    argv[argList.size()] = NULL;

    execv( argv[0], (char**)argv );

    delete argv;


    return 0;
}

boostでiniファイルを読み込んでmapに詰め込む

いつも地味に面倒なiniからの読み込みを簡単にするためにboost::property_treeでiniファイルを読み込んでmap<string,string>に詰め込むサンプル。

読み込むiniファイル(sample.ini)
[sectionA]
key1        = val1

[section B]
spaced key  = spaced value

[section C]         # comment
key1        = 1     # duped name
key2        = あ    ; japanee

# comment
; comment
ソース(おためし)

まずは試しに表示するソースコード。普通にget_value()すると'='以降すべて取得できてしまうので、特定の文字以降をコメントとして扱いたい場合はsplit()してtrim()してあげる必要があるみたい。

#include <iostream>
#include <string>
#include <vector>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <boost/algorithm/string.hpp>

void printIni2(const char* filepath)
{
    using boost::property_tree::ptree;
    ptree pt;

    read_ini( filepath, pt, std::locale("japanese") );

    std::vector<std::string> valStrList;
    for (auto& section : pt)
    {
        std::cout << '[' << section.first << "]" << std::endl;
        for (auto& key : section.second)
        {
            std::string valStr = key.second.get_value<std::string>();
            boost::split(valStrList, valStr, boost::is_any_of("#;"));

            std::cout << key.first << "=" << boost::algorithm::trim_copy(valStrList.at(0)) << std::endl;
        }
    }
}

void printIni(const char* filepath)
{
    using boost::property_tree::ptree;
    ptree pt;

    read_ini( filepath, pt, std::locale("japanese") );

    for (auto& section : pt)
    {
        // print part of "[section name]"
        std::cout << '[' << section.first << "]" << std::endl;

        // print part of "key = value"
        for (auto& key : section.second)
        {
            std::cout << key.first << "=" << key.second.get_value<std::string>() << std::endl;
        }
    }
}

int main(int argc, char* argv[])
{
    printIni("sample.ini");

    std::cout << "--------------------------------" << std::endl;
    printIni2("sample.ini");

    return 0;
}
結果
[sectionA]
key1=val1
[section B]
spaced key=spaced value
[section C]
key1=1     # duped name
key2=あ    ; japanee
--------------------------------
[sectionA]
key1=val1
[section B]
spaced key=spaced value
[section C]
key1=1
key2=あ
ソース(本題)

本題のソースコード

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>

void ini2map(const char* filepath, std::map<std::string, std::string>& iniMap)
{
    using boost::property_tree::ptree;
    ptree pt;

    read_ini( filepath, pt, std::locale("japanese") );

    std::vector<std::string> valStrList;
    for (auto& section : pt)
    {
        std::string sectionName = section.first;

        for (auto& key : section.second)
        {
            std::string valStr = key.second.get_value<std::string>();
            boost::split(valStrList, valStr, boost::is_any_of("#;"));

            std::string keyName = key.first;
            std::string val = boost::algorithm::trim_copy(valStrList.at(0));

            std::cout << keyName << "=" << val << std::endl;

            iniMap[sectionName+"."+keyName] = val;
        }
    }
}

int main(int argc, char* argv[])
{
    std::map<std::string, std::string> iniMap;
    ini2map("sample.ini", iniMap);
    std::cout << iniMap.size() << std::endl;

    // print
    for( auto kvp : iniMap )
    {
        std::cout << kvp.first << "=" << kvp.second << std::endl;
    }
    // get value as int
    std::cout << boost::lexical_cast<int>(iniMap.at("section C.key1")) << std::endl;
    // get value (failure)
    try
    {
        std::string valStr = iniMap.at(" undefined key ");
    }
    catch(std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    return 0;
}
結果
key1=val1
spaced key=spaced value
key1=1
key2=あ
4
section B.spaced key=spaced value
section C.key1=1
section C.key2=あ
sectionA.key1=val1
1
map::at
ソース(おまけ)

ぶっちゃけ以下のようなコードで取得できるだろうけど、プロパティツリーを意識しないようにしたかった。あとこの場合は行内コメントできない。

ptree pt;
read_ini("ini file", pt);
string strValue = pt.get<string>("[section].item");
int intValue = pt.get<int>("[section].item");


メモ:

  • forループの部分がこれで回るのはptreeが「map< string, map> >」みたいな入れ子構造になっているかららしい。
    • セクションがない項目は1階層目に入るので今回のコードだとうまく扱えない。
  • せっかくなのでread_iniのロケールにjapanese指定してみたけど、実は指定しなくてもSJISのファイル読めた。逆にjapanese指定してもutf-8のファイル読めた。この辺はよくわからない。
  • 環境:c++11 + boost 1.53


参考:

std::queue::pop()はデストラクタがあれば呼び出す

std::queue::pop()はデストラクタを呼び出す。しかしポインタ型を格納した場合は例外。
ポインタ型そのものがデストラクタを持っていないため、らしい。
逆に実体をpop()するとスコープ抜けたときとあわせて2回呼ばれることになる。

code.cpp

#include <queue>
#include <iostream>

using namespace std;

class animal {
    string kind;
public:
    animal(string kind) {
        this->kind = kind;
        cout << "animal ctor : " << kind << endl;
    }
    ~animal() {
        cout << "animal dtor : " << kind << endl;
    }
};

int main(void)
{
    queue<animal*> q;
    q.push( new animal("dog") );
    auto dog = q.front();
    q.pop();
    delete dog;


    queue<animal> q2;
    animal cat = animal("cat");
    q2.push( cat );
    q2.pop();
    // 1st dtor call by pop()

    cout << "popd" << endl;
    // 2nd dtor call by cat


    return 0;
}


result

dog ctor : pochi
dog dtor : pochi
cat ctor : tama
cat dtor : tama
popd
cat dtor : tama


参考