ゆるいブログ

毎日おもったことや、やったことをただただ書いていくブログです

フリーランスがどうとか。普通に勉強中

フリーランスがどうとか

www.nikkei.com

この記事でフリーランスの月額65万は高い?安い?と盛り上がっていました。

会社員を辞めるつもりはないのですが、同じ能力でフリーランスの方が有利なら何か悔しいなあ、ということで調べてみました。

あまり時間をかけたくないのでかなりざっくりとした評価です。

  • 正社員の給与所得控除額よりも経費が多いなら基本的に税額は安くなるはず
  • 雇用保険や厚生年金、退職金といった面では正社員の方が有利ではあるが、多めに見積っても月額10万くらいと思われる

ということで雇用が永続的に続くという前提なら月額65万のフリーランスは650万の正社員よりも良さそうです。

人材市場における価値上昇・低下の影響を正社員よりも直接受けるので、そちらの方が問題が大きそうですね。40代~50前半くらいまで人材価値を維持・向上できるならまあ悪くはないんじゃないでしょうか。

人月120万くらいなら特に問題なく勝ち逃げできそうです。120万だと消費税がかかるはずなので、消費税引後110万=年収1320くらいにだと考えて、厚生年金の割引分も考慮すると年収1100万くらいで、まあリスクを考慮して有名大企業の正社員であっても割に合うかなという感じです。それでも社会的な信用の無さを考えるとちょっと割に合わないのかも……

まあ、基本的には報酬云々よりは自由な生き方をしたい人のための選択肢な気がします。

ところで、フリーランスエンジニアになることを煽っている前職の知人がいるのですが、社内では問題児として有名だったのに、フリーエンジニアとしてはサロンを作って信者を集めて上手いことやっているみたいなので、やっぱりそういうことが出来る人には正社員よりも遥かに割が良いのだろうなあ、と思います。まあ前職(大きなWeb系企業)も輝かしいキャリアの一つとして語られているのは釈然とはしないけども。

How to Win a Data Science Competition: DataLeakageの勉強中

データに何の手掛りもない状況からKaggleのスコアボードにアップロードした時の点数を元に手掛りを掴むというものですが、正攻法ではないのであまり時間をかけて学んでもなあ、という気がしています。

とはいえこういった技術もKaggleで勝つために必要なのはわかりました。

3週目に移動し、MSE、RMSE、MAEの勉強をしています。とはいっても至極単純なので大して勉強することはない。

MAEは外れ値に強いという特徴があって、あえて外れ値を考慮に入れるべきならばMSEを、そうでなければMAEを使う方が望ましいようです。

C++って言語として難しすぎると思うんですよ

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)

Modern C++ Design―ジェネリック・プログラミングおよびデザイン・パターンを利用するための究極のテンプレート活用術 (C++ In‐Depth Series)

 

 Modern C++ Designを読んでいます。

一応軽く全体を読んだ後で「一章:ポリシーを基にしたクラスデザイン」および「二章:テクニック」を読んだのですが、まだ実用できる気がしません。

LL系言語の本(RubyPythonPHP)とか簡単なのに何でC++はこんなに難しいのか。JavaとかScalaは時々難しめの本がありますけどね。

一章 ポリシーを基にしたクラスデザイン

一章では多重継承を避け、ポリシークラスをテンプレートパラメータとする方法が書かれているのですが、こんなコード現場で見たことねーよ、と言いたい。

多重継承が綺麗にハマるケースは少なく、大抵は複数のクラスを合成したことで抽象化の漏れが起きるので、多重継承ではなくコンポジットを使おうっていうのが一般的だと思います。

この本では多重継承の利点をみとめた上で、特定の型の時に構造を特殊化できるようにテンプレートを使ったポリシークラスの導入をします。

A というクラスが B と C の多重継承をしている、というケースについてそうではなくAというクラスがB<A>とC<A>というポリシークラスを多重継承しているんだ、という形にすることができます。

template

<

    class T,

    template<class> class CheckingPolicy,

    template<class> class ThreadingModel

>

class SmartPtr

     : public CheckingPolicy<T>

     , public ThreadingModel<SmartPtr>

{

...

}

のように多重継承するクラスをテンプレートパラメータとし、

typedef SmartPtr<Widget, EnforceNotNull, SingleThreaded> SafeWidgetPtr

のように、typedefでポリシークラスのコンビネーションを型定義することにより、単純に多重継承するよりも整理された構造になります。 

ポリシークラスは静的な構造を持たせる必要があるため、デストラクタを定義すべきではない、というようなTipsも書いてあります。

ポリシーを外部から注入できるというのが一番大きな利点のように見えます。

綺麗に決まればかっこいいけど、上級者向けですよねえ。

二章 テクニック

この本を読むために必要な基礎的なテクニックが書かれています。

基礎なのにむずい。

コンパイル時のアサーション

テンプレートクラスではコンパイルアサーションが作れるよ、という話。

テンプレートの部分的な特殊化

テンプレートパラメータが複数あった時に1つだけ特殊化するといったことはできない。テンプレートパラメータAとBがあったとして、Aを特殊化したい場合には特殊化したAおよび特殊化したくない部分をパラメータに逃したB<BArg>という2つのパラメータの組み合わせにすれば出来ないことはない、という話。

ローカル・クラス

テンプレート内部でローカルクラスを定義できるよ、という話

型と値のマッピング

1つの値に1つの型を割り当てることでコンパイルタイムの条件分岐ができるよ、という話

型から型へのマッピング

テンプレートの関数のみを部分的に特殊化したい場合に型を導出するだけのType2Typeをパラメータとして指定することにより、余計なオブジェクトが勝手に生成されることなく実装できる。

template <class T, class U>

T* Create(const U& arg)

{

    return new T(arg);

}

というクラスがあったとして

template <class U>

Widget* Create<Widget, U>(const U& arg)

{

   return new Widget(arg, -1);

}

というTだけ特殊化してUはそのまま、という特殊化はできない。なのでType2Type<T>というテンプレートクラスを使い

template <class T, class U>

T* Create(const U& arg, Type2Type<Widget>)

{
}

という形にすれば部分的な特殊化っぽいことはできるよ、という話。

ブーリアン式に基づきコンパイル時に型を選択できるSelectクラステンプレート


template<typename U, bool isPolymorphic>

{

}

のようにbooleanをテンプレートパラメータとして渡すことにより型により特殊化ができるよ、という話(だと思います自信ない)

コンパイル時における変換可能性と継承の検出

A Test(U) {}

という関数があったとして、U以外の全ての型を受けとる関数を作るには

B Test(...) {}

とすればいい、という話

std::type_infoのラッパ

type_infoにはコピーや比較できるラッパーを作った方が便利だよ、という話

Traits

型に関連する決定をTypeTraitsに寄せることにより、コードが綺麗になるよ、という話だが面倒そうなのでパス