きしだのはてな このページをアンテナに追加 RSSフィード

2017-07-26(水) ソフトウェアエンジニアの人数に関するフェルミ推定

ソフトウェアエンジニアの人数に関するフェルミ推定 01:28 ソフトウェアエンジニアの人数に関するフェルミ推定を含むブックマーク

以前から、日本のプログラマってどのくらいいるんだろう?って思ってて、なんとなくの数字を思い浮かんでいるので、メモ的に書いておきます。

2〜3倍の差はあっても1桁は違わんだろうなーくらいの誤差感です。


まず、プログラマ全体の数。どうも、20万人〜100万人くらいな感じ。かき集めて200万人はいなさそう。

IT人材白書2017の「情報処理・通信に携わる人材」が100万人ちょい。

ある程度の機能を持ったプログラムをドキュメントやチュートリアルを見ながら自分のコードで書けるというのは、5万人〜10万人くらいではないかなと。

本を買ったりして自分で勉強する人が3〜5万人。

小さなアプリケーションをひとりで作れるレベルだと1〜3万人。

自発的に勉強会に出る人は5000人〜1万人。東京に6000人、大阪700人、福岡300人くらいかなー。*1

高階型がわかるとか、高階関数がわかるとか、ある程度「プログラム」というものを抽象的にわかっている人が3000〜5000人。

それなりのシステムを設計できるとか、DBのチューニングができるとか、それなりのコードが書ける人が1000〜3000人。

オープンソースミドルウェアフレームワークのソースを追ってコア機能に手を入れれる人が100〜300人。*2

そういったミドルウェアフレームワークを作れる人が50〜100人。

新しい枠組みを作れる人が10〜50人。


IT人材白書2017

IT人材白書2017

*1:東京都市圏人口は福岡圏の10倍なのだけど、それ以上の差がある。一方、大阪圏は3〜4倍なのにそこまでの差を感じない。

*2:これは、やればできるだろう人ではなくて、実際にやれる人。上位500人くらいからは時間がかけれることも含める感じ。あと、ここでのミドルウェアフレームワークは、システムの主要部品になる程度の粒度感

2017-07-25(火) UR22mkIIが不安定なときにやったこと

[]UR22mkIIが不安定なときにやったこと 00:22 UR22mkIIが不安定なときにやったことを含むブックマーク

DTM用のオーディオインタフェースにSteinbergのUR22mkIIを使っているのですけど、頻繁に切断されたり、なんか不安定でした。だいたい解決した気がするので、メモしておきます。


頻繁に切断されていた件については、挿しっぱなしになっていたギターシールドを抜いたら解決した気がします。

たぶん、フリーになっている端子がどこかで短絡してリセットされてたとかではないかと。


それが解決したら、CubaseでASIOドライバを設定したときに"Device could not be opened"と表示されて使えませんでした。

これはUSBをPC本体側の別のポートに挿しなおすと解決しました。USBポートの制約の問題か、ドライバの問題な気がする。


様子みて、また何かあったら追記していく予定。


1:09追記 やっぱ不安定なままだ・・・

トラックバック - http://d.hatena.ne.jp/nowokay/20170725

2017-07-21(金) DTMを始めている

[]DTMを始めている 05:14 DTMを始めているを含むブックマーク

音楽やりたいなーとずっと思っていたのだけど、時間がすごく取られるのは わかっていたので、なかなか手が出せていなかったのだけど、ついうっかり始めてしまった。

で、4月くらいからDTMを始めた。


最初は、Cubaseと付属の音源でいけるよねー別に追加で音源買う必要もないよねーと思ってたのだけど、うっかりPianoteq 5というピアノ音源を買ってみたら、その表現力にはまってしまった。ぼくはピアノは弾けないのだけど、鍵盤をがしゃがしゃやるだけで楽しい。

通常の音源は1鍵ずつ数段階の音量ごとにサンプリングするのだけど、Pianoteqは物理シミュレーション音源でちゃんと響きを計算するのですよね。そうするとどうなるかというと、たとえば高いドを音がならないように押さえたままで低いドを強く鳴らすと、共鳴でその高いドが響くのです。

基本的にぼくはピアノの音はあまり好きではなくて、特にサンプリング音源だとドミソを鳴らしたときにドとミとソの音が個別に鳴るのが気持ち悪かったりするのですけど、Pianoteqだとドとミとソの音がピアノの箱の中で響いて混ざっている感じがするので気にいってます。


とはいえピアノの曲をつくるのは難しくて、とりあえずギターがやりたいと思ってELECTRI6ITYというギター音源と、AmpliTubeというアンプシミュレータを買ってしまいました。

このあたりは、id:d-kami さんの http://d-kami.hatenablog.com/entry/2017/01/25/222403 あたりを参考にしたりしました。

AmpliTubeはアンプやエフェクタを買い足せるという沼があるので、これは結構危険です。5150っぽいアンプとかメタルディストーションっぽいエフェクタとかを買ってしまいました。

んで、これはもうメタルがやりたいという気分になったので、メタル用ドラム音源として名高いらしいSSD4というのを買って、ベースもこれまた物理シミュレーション音源のMODOBASSというのを買いました。

ほんと沼。

けど、AmpliTubeはワウもコントロールできたりしてほんとに楽しくて、とりあえずなんかメタルっぽいのを作ってみました。なんか音色とかもっとどうにかできた気もするのですけど、アンプとかエフェクタの設定がほんとに沼だったので、もうあきらめました。ギタリストのいう「音作り」っていまいち意味がわかってなかったんですけど、これは大変だなということがわかりました。

最後の、ドラムをドコドコやってるところが結構お気に入りです。


あと、MODOBASSは原理的にスラップがよさげという噂だったので、スラップベースを試してみたくて、1週間くらい毎日スラップの弾き方入門動画とかをみて勉強して短いスラップベースのフレーズを作ってみたりしました。

一応、物理的に弾けるはずのフレーズにしてるのだけど、なかなかMODOBASSがいい感じの弦で弾いてくれなくて、その設定をかなりやるのが面倒でした。使う弦で音色がぜんぜん違うので、ちゃんと指定してあげないといい感じにならないのです。最後、同じフレーズを別の弦で繰り返して音色の違いをこっそり楽しむみたいなこともできるけど。

それと、ちょっとリバーブなどをかけてみようと思ったのだけど、これは失敗な気がしますね。よさげなリバーブが欲しいのだけど、結構高い。


という感じで、DTM沼に腰までつかった感じがあるのだけど、まだまだ続くのじゃ・・・

トラックバック - http://d.hatena.ne.jp/nowokay/20170721

2017-07-08(土) A-ONEサーキットを攻略する

[][] A-ONEサーキットを攻略する 04:13  A-ONEサーキットを攻略するを含むブックマーク

前回、こんな感じで走ろうというメモをしました。

http://d.hatena.ne.jp/nowokay/20170604#1496578628

さて、これが活かされたでしょうか


前半

エーワンは、1-4コーナーと6-9コーナーを5コーナーでつないだ2つの部分からなっていると考えられます。

前半は、2コーナーをうまくまわれるかどうかがキモになるのですが、前回はブリヂストン看板の手前のクッションで外によって、ブリヂストン看板から曲がっていくというイメージで曲がっていました。

f:id:nowokay:20170708233719p:image


実際は、曲がるのが遅れて大回りになってしまうことが多かったのだけど。


これが、もうすこし内側で回れるかなと考えてみたわけです。

f:id:nowokay:20170604205712p:image


こんな感じのイメージ。

f:id:nowokay:20170708233720p:image


で、試すんだけど、くるくる回ってしまいました。新しいチャレンジには失敗がつきものです。

けどよく見ると、これちゃんと曲がれているのだけど、怖くなってアクセルを抜いてしまっているのがだめな気がします。


これは比較的うまくいっています。


ただ、やはりイメージが悪かったようで、実際には1コーナーのクッション手前で切り込んでいくところをそのまま行って、ブリヂストン看板手前から曲がり始めてるイメージがよさそう。

f:id:nowokay:20170708233721p:image


後半

後半は、5コーナー出口で外につけて、7コーナー手前を外に膨らんでイン側に抜け、8コーナーアウト側から看板に抜けていく、というイメージでした。

f:id:nowokay:20170708233722p:image


ただ、それだとあまりなめらかではない。


ということで、6コーナーから7コーナーはもっとまっすぐいくようにしてみました。

f:id:nowokay:20170604205710p:image


こんな感じ。7コーナーから8コーナーも無理に端までよらず、真ん中を横切るイメージで。

f:id:nowokay:20170708233723p:image


で、やはり回ってしまいます。

実はこれ、6コーナー手前にアスファルトの段差があって、ブレーキを踏んだ状態でそこを飛ぶと回ってしまうみたいです。


6コーナーから7コーナーにかけて、アクセルをパーシャルに踏んで車が安定するように気を付けるようにすると、いい感じに曲がれるようになりました。


6コーナー手前もあまり外側につける必要ない気がするので、次回はここもまっすぐつっきるイメージでやってみます。

f:id:nowokay:20170708233724p:image


トラックバック - http://d.hatena.ne.jp/nowokay/20170708

2017-06-09(金) ラムダのオブジェクトはどう作られるか

[]ラムダのオブジェクトはどう作られるか 06:20 ラムダのオブジェクトはどう作られるかを含むブックマーク

ラムダは匿名クラスのシンタックスシュガーだとか言われますけど、オブジェクトの作られ方が違いますね。

というのを検証してみます。

(jdk1.8.0_112で動かしています)


ループの中でhogeにラムダを渡して、hogeでオブジェクトを表示します。

まず匿名クラスを使ったコード。

public class LambdaObj {
    public static void main(String[] args) {
        for (int i = 0; i < 2; ++i) {
            hoge(new Runnable() {
                @Override
                public void run() {
                }
            });
        }
    }
    
    static void hoge(Runnable r) {
        System.out.println(r);
    }
}

実行するとこう。

myproject.LambdaObj$1@15db9742
myproject.LambdaObj$1@6d06d69c

明確にnewしてるので、毎回違うオブジェクトが渡されています。


これをラムダにしてみます。

public class LambdaObj {
    public static void main(String[] args) {
        for (int i = 0; i < 2; ++i) {
            hoge(() -> {});
        }
    }
    
    static void hoge(Runnable r) {
        System.out.println(r);
    }
}

実行すると、こう。

myproject.LambdaObj$$Lambda$1/834600351@548c4f57
myproject.LambdaObj$$Lambda$1/834600351@548c4f57

オブジェクトが使いまわされていることがわかります。

ラムダと匿名クラスは違うということですね。

バイトコードとしては

private static void lambda$main$0() {
  //ラムダの中身
}

のようなメソッドが生成されて、invokeDynamicをよんでラムダオブジェクトを取ってくるようなコードが生成されます。このinvokeDynamicでいろいろやられているということですね。


めでたしめでたし。


ではなくて、もうちょっと調べてみます。

ラムダの中で、外側のローカル変数であるargsを使ってみます。

public class LambdaObj {
    public static void main(String[] args) {
        for (int i = 0; i < 2; ++i) {
            hoge(() -> {
                String[] a = args;
            });
        }
    }
    
    static void hoge(Runnable r) {
        System.out.println(r);
    }
}

そうすると、こう。

myproject.LambdaObj$$Lambda$1/834600351@1fb3ebeb
myproject.LambdaObj$$Lambda$1/834600351@548c4f57

この場合は匿名クラスに展開されるのかなーと思ったけど

private static void lambda$main$0(String[]) {
  //ラムダの中身
}

のようなメソッドが定義されますね。


外側のローカル変数を使わない場合は簡易なオブジェクトを使っていて、外側のローカル変数を使う場合は引き渡すローカル変数のコピーをもったオブジェクトを渡さないといけないので毎回オブジェクトを生成してる、とかですかね。