自作PC

こんにちは mtjです

今回自分の使用しているPCをAMDからintel12世代にしました。
CPUの交換は約3年ぶり IntelCpuは10年ぶりぐらいになります。
DDR5+intel12世代で色々と快適になりました。

久しぶりのCPU交換だったので色々失敗
AMDCPUは交換時にすっぽんしてしまったのでマザボにダメージがあるかもしれません。
CDドライブの電源コネクタにエアーをしなかったので内部でショートしたのかCDドライブも動かなくなりました。

CDドライブはだめになりましたが intelCpuもCPUクーラーも簡易水冷にしましたが問題なく動いています。
消費電力は高負荷時で約500Wぐらいでした。
PCは満足な状態になったのでいい買い物だったと思います。

簡易水冷をつけて思いましたがPCケースが大分狭いと感じました。
時代の流れでグラボ等色々巨大化してるので10年前のPCケースではもうそろそろ限界かもしれません。
今度大きい変更のときにPCケースも新しくするべきかもしれません。

カーネルレベル

こんにちは mtjです。

最近カーネルレベルで対策を行うアンチチートソフトが話題になっている。
カーネルとは と思う方はリングプロテクションで調べてみると早いと思う。

今までの権限では監視しきれないから 低層で動かし広い権限で監視を行おうということだと思う。

昔ならばDirectXをフックして色々するチートが合った気がする
アンチチートソフトがバイナリパターンとかの監視をしているので それなら直接DirectXの動作を書き換えてしまおうという感じなのかもしれない。
現代ではそのレベルでなく デバイスドライバレベル、どこかでUEFI BIOSレベルで動いているという記事も見た気がする。
UEFI BIOSならばリング-2か-3のはずなので 本当にカーネルレベルのリング0だと検知できない気がする

そういったチート対策の記事を見てPCが高度化したことにより解析、脆弱性を突く方法もどんどん高度化しているんだなと感じる
コンピューターセキュリティは本当終わりがなさそう

そして、チートは別としてプログラマーとしてはそういった低層で動くプログラムをどういう風に作り どういう風に導入しているか気になる。

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

こんにちは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にしたのに遅いなぁって思って使っていたりするのではないのでしょうか?

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