プログラムの勉強について

こんにちはmtjです。

プログラムの勉強について プログラムを勉強しようとして本を読むと大体挫折してしまうと思います。
IF文、For文という文章を読んだとしても分岐、繰り返し処理をするものだとわかってもそれを使う場面が想像できないと只詰め込むだけになってしまうためです。

プログラムの勉強はインプットとアウトプットが合わさって初めて物になると自分は思います。
繰り返し、分岐の話もそれを元に何が作れるかを考えると勉強も捗ると思います。

例えば繰り返しで簡単な時計を作ろうとします。
Forループでは固定回数しか動かせないので時計は途中で止まってしまいます。
そこでWhile等の無限ループを覚え、無限ループをするとメインスレッドが止まってしまうので別スレッドの動き等を学んだりします。

上記のように何かを作ろうとすれば付随していろいろな事も勉強できます。

プログラムを教える人達(主に学校で)がそういう意識を持つことでもっとプログラムの面白さ、簡単さを伝えられるのではないのかなと思いました。
プログラムの難しさはプログラム自体じゃなく勉強の仕方自体にあると自分は思います。

プログラマーの必要性

こんにちはmtjです。

現代の小さくて安いAIカメラ等を見て思いますが 最近はプログラムレスで面白い機能があるサービス、商品が大量にあります。
その商品自体はプログラムで組まれておりますが 使う側はプログラムがほとんど必要ありません。

昔に比べてプログラムですべて作るより、プログラムで使える面白いサービス、商品にアンテナを貼り
それらを上手に使用する能力のほうが現代では必要ではないかと思います。

特にクラウドサービス類は1から作るとしたらとんでもない労力になります
作り方を知っている、想像できるまではあってもよいのですがそれらシステムを実際に作る必要がある人は一部の人でしょう。
大半の人はそれらを上手に使用する方法を覚えたほうが物になります。

今後の展示会等でもそういった物を覚えていけたら良いなと思いました。

リモート環境の変化

こんにちは、mtjです。

最近リモートでライブ映像がリアルタイムで見れる等色々なものが遠隔でおこなるようになっています。
ネット環境の進化もありますが一番はクラウド環境でしょう。

昔であればストリーミングであれば想定人数に耐えれるだけのサーバーを用意してそれ用にネットワークを構築して等ハード面で様々な準備が必要でした。
現在はボタン1つで1日もせずにサーバーを増やせます。
足りなくなったら即増やし、不要になったら即破棄できサービスの運用もそういう意味では簡単に作って、破棄というのができるようになり便利になったような気がします。
今後はそのようなサービスに対してフットワークが軽い人が人気になるのではないのかと感じました
便利なサービスが出た場合に提案、対応しさらにクラウド環境を便利にしていく そういう時代になっていくのかなと感じました。

.Net Dictionaryの速度

先日大量のデータを処理集計するために Dictionaryに格納していたのですが
10万件を超えたあたりで急に速度が落ちることがありました。

Dictionaryのキーを任意作成のStructにしておりましたが 別にテストで作成したものでは1万、10万、100万はDictionaryの個数に比例して増加しておりました。
(1万件が80msecならば 10万件は800msecのような状態)

今回のデータ処理用に作成したものは10000件で100msec程度だったので 30万で3秒前後だと考えておりましたが実際には7時間でした。
遅い原因を調べるために.Netのソースを確認し結果的にはStructのHashCodeが重複しやすい物の場合は今回の様な結果になるのではないかと思いました。

DictionaryのContainKeyの内部で使用している部分

        public bool TryGetValue(TKey key, out TValue value)
        {
            if (key == null) throw new ArgumentNullException("key");
 
            int bucketNo, lockNoUnused;
 
            // We must capture the m_buckets field in a local variable. It is set to a new table on each table resize.
            Tables tables = m_tables;
            IEqualityComparer comparer = tables.m_comparer;
            GetBucketAndLockNo(comparer.GetHashCode(key), out bucketNo, out lockNoUnused, tables.m_buckets.Length, tables.m_locks.Length);
 
            // We can get away w/out a lock here.
            // The Volatile.Read ensures that the load of the fields of 'n' doesn't move before the load from buckets[i].
            Node n = Volatile.Read(ref tables.m_buckets[bucketNo]);
 
            while (n != null)
            {
                if (comparer.Equals(n.m_key, key))
                {
                    value = n.m_value;
                    return true;
                }
                n = n.m_next;
            }
 
            value = default(TValue);
            return false;
        }

GetBucketAndLockNoはこの通り

        private void GetBucketAndLockNo(
                int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount)
        {
            bucketNo = (hashcode & 0x7fffffff) % bucketCount;
            lockNo = bucketNo % lockCount;
 
            Assert(bucketNo >= 0 && bucketNo = 0 && lockNo < lockCount);
        }

上記Nodeの取り出しのバケットNoがhashcodeを使用しているのでカスタムのKeyを使用する場合はHashCode十分に分散するか考えて作成していかないといけないのかもしれません。
遅い原因はチェック中なのでHashCodeの件は間違っているかもしれません進展があれば再び書きたいと思います。

ちなみにコードはこちらで確認できます。

リモートツールの良し悪し

こんにちは、mtjです。

コロナによりリモート管理ツールが色々社会で流行るようになってきました。
文字ベースのやり取りができるチャットツールまでは良いのですが リモート会議ツール等に関しては扱う個人の慣れに大きく影響されてしまいます。

リモート会議ツールに関しては
・音声
・画面共有の仕方
・各自発言者の認識

オフラインでは気にしなくても良いような点で不都合が発生します。
会議ツールの選定+事前確認内容の資料等を準備したほうが慣れてない人達にも解りやすい気がしました。

ちなみにマイクはUSB接続がおすすめです ジャック式のでも動きますがPCのデバイスに依存してしまうため満足に動かない、ノイズが酷い等損をする場合があります。

プログラミング言語の変化

こんにちはmtjです

プログラミングは基本勉強し続けていくものというのは大体のプログラマが思っている事だと思います。

自分のメインとしているC#も2012年頃と比べるとかなり書き方が違います。(バージョンでいうと5.0から8.0or9.0)

しかし、.Netの互換性等もあり最新のOS向けのプログラムは最新Verで作らないといけないわけではないので
10年前のC#でも現代で動かすことが可能です。
勉強をやめてしまっている人でもプログラムを書くことは可能ですが古い書き方になってしまい
最新の書き方で書かれているものならば理解自体が難しくなってしまうと思います。

言語が進化していれば自ずと勉強していくものですが 言語自体が古く進化がない言語だと勉強が止まってしまうので
その場合はかなり努力が必要だと思います。

そういう意味でも若い人がCobol、VB6等を頑張って保守するのでなく現在の流行りの言語を行わせ
年配者が古い言語を保守すべきなのではないかと感じました。
古い言語を勉強すること自体は幅も広がり悪いことでは無いと思いますが 古い言語を専門にしては先細りの分野なので
将来性が薄いと感じてしまいます。

PCパーツの変化

こんにちは mtjです。

GPUのRTX3090が販売されました。
以前のRTX2080を軽く超えるものらしいです。
シェーダー処理のFLOPSで言うと2080が11TFLOPSで3090は36TFLOPSらしいです

現状自分は1080tiなのでレイトレーシングすらまともにできないのでどちらでも欲しいのですが
2080の2倍以上という性能は魅力的です。
3090は欲しいのですが価格も20万超えと圧倒的なので悩んでいるところです。

あと数十年もすればこの性能がタブレット等携帯端末になっているかもしれないと考えると本当技術の進化は圧倒的です。

自分たちプログラマもハードの性能を発揮できるように勉強も必要になっていくと思います。
現状でも大量のCPUコアを扱えるので非同期処理等をうまくできないとコアを遊ばせてしまう状態です。

プログラムの変化もそうですが扱うPCの性能、進化を知るのも大事だと感じました。

ipV6

最近自分の部屋もipv6契約にしました。

ipV6なので早くなります! と思いきや自分のルーターは2014年ぐらいのものなのでIPv4 over IPv6に対応していなくて 新しいルータを
買うことになりました。
そのままではipV6で使えないので遅いです。
まだipV6のサイトだけ早いことを確認しただけなので 実際にipV4のサイトまで早くなるかは楽しみですが

ipV6に詳しくない人は案外古いルーターのままipV4のまま使っているのではないのでしょうか?

ルーターの設定もままならない人はレンタルなので問題なさそうですが
自分でルータを買って終端機器とつないでいる人はipV6にしたのに遅いなぁって思って使っていたりするのではないのでしょうか?

よくわからないならレンタルが一番ということですね

新規ソフトと既存ソフトの改造

こんにちは

現在新規ソフトの設計、作成を行っております。
やはり新規ソフトのほうが気楽に作れます。

既存ソフトの場合は共通化、既存機能の把握、リファクタリング等新規追加前の検討が必要になり
予想以上に時間がかかります。

もちろん元ソフトの設計にも引っ張られます。

改造の方が新規に同じ機能を作るより簡単に思われがちですが 複雑なアルゴリズムを流用する等ない限りは基本改造のほうが負荷は大きいと感じました。

リファクタリング、共通化等考えなければ簡単にできますが そのようなソフトはいずれ破城してしまいます。

AI

こんにちは mtjです

最近聞く事が少なくなったAI関連の話

出た当初から色々言われていますが 映画のターミネーターのように自律的に動くAIのようなものはまだまだ先でしょう

一般向けにはそういう風に動いてるように見せるAIもできるでしょうがお手本、もしくは正解がないものをAIで勝手に考えるというのは現状では難しいと思われます。

とあるG社の翻訳AIもそうですがあれもひな型となる言語の文章を読み込ませそれぞれの言語の特徴を覚えさせ反復させることで翻訳精度を上げています。
AIを持ってきてこれを翻訳してくれ という感じでできるものでなく 専門家が考えたアルゴリズムに沿って勉強しその結果正しいであろう使い方を出力します(基本学習させた他の結果)

会話AIもそういったもので他の人との会話、もしくは学習させる文章等を記録し基本的に多の方で話すようにします。

学習させる専門家がいてAIは初めて成り立ちます
日本語の学習をさせているのに別の言語、もしくは多種多様な言語を学習させれば使い物にならない日本語会話AIができあがるでしょう。

囲碁のAlphaGoは深層強化学習といわれるもので AIが自分で考えその結果を人間が評価(アルゴリズム等による採点か成否)するような方法で

報酬の決め方があいまいであればあるほど使い物にならなくなります。

画像処理等でよく使用されるものは教師有りの学習でOK,NGの物を事前に与えこれはOK、これはNG等を覚え現実の画像を判定していくものです。
OK、NGで与えるものがOKぽいNG、NGぽいOKだったりすればするほど使い物にならなくなります。

世の中のAIはまだまだ専門家のサポートツールとの立ち位置なので一般家庭にどのような形で降りてくるか楽しみではありますね