2022年10月18日火曜日

Xeon e5 2620 v4 から e5 2643 v4(中古)へ換装

Xeon x 2サーバー来歴

  自宅のVMWareサーバー& Jenkinsビルド用に2016年末 Xeon e5-2620 v4 x 2CPUのマシンを作りました。

 当時はmac mini(2012)でXcodeのコンパイルがあまりに辛かったのでWindows上でXCodeを動作させてコンパイルしていたりもしました。(Asset Storeのグレーなアプリ) 

 手元のmac miniはCorei7で2Core 4スレッドで事実上Corei5、つまりナンチャッテCorei7でした。

 性能より消費電力が低いのが売りだったみたいです。まぁminiシリーズですからね。

 実際 2CPUで16Core 32スレッドは強烈でmac miniの10倍速でコンパイルが終わりスクラッチ&ビルドが死ぬほど捗っていました(miniだと15分、2620v4だと2分かからない)

 資産の関係で20万円を超えたくなかったのでメモリーは32GByteとしました。

 CPUは@5万円もしたのと、もう一ランク上は@7万円となり予算超えで諦め。

 

SSDをOptaneへ 2年目

 その後SSDをOptane 900Pに変えたら更にコンパイルが早くなりました。

 OptaneはシーケンシャルリードはNAND SSDと大差ありませんが、C++の小さいファイル1万個ともなるとIOPSが10倍と効きまくり。コンパイル速度が30%ほどアップしました


メモリーを64GByteへ 3年目

 元々32GByteでしたがメモリーショックでドカンと価格が落ちたので追加で+32GByte
ECC付きのレジスタードメモリー。
 サーバー用マザーの為メモリーバスが4chもあるので、4ch(8枚)全部埋まりました。


CPUを換装 5年目 超快適!

 今回CPUをXeon 2643 v4 x 2 に交換しました
 聞いたことない型番だったんですが、Xeon v4 中古で一年くらい地道に検索したらでてきましたよ、1つ17,500円。ebayだと12,000円くらいからありますがes品だったりラベル書き換えCPUかもしれないので日本の業者さんを選択
 元々コンパイル用のマシンだったのでコア数重視だったんですが、最近はVisual Studioで開発にも使い出しました。
 ベースクロックが2.1GHzというのが存外モッサリ
 VSのコンパイル時は当然マルチスレッドでコンパイルしてくれますが、エディターが2.1GHzというのがツライ。
 自分のキータイピングの速さは大したことないんですが、最近のIDEは超優秀な補完・推奨機能があってこの推奨候補がでるのにキーボードの入力が妨げられていたのです。

 なので今回はベースクロック重視

CPUBase ClockCore数(2CPU)CineBench R23
2620v42.1GHz1612332
2343v43.4GHz1213004

表にするとこんな感じで、マルチスレッドでのコンパイル速度はほぼ同じです。

ところがこの通常3.4GHzというのがVSエディターではやたらに効いてるようで 

超快適 !!

あと電力と熱はこんな感じ。室温は20度くらい

CPUメーカーTDPコンパイル実測PC全体アイドル時コンパイル時温度
2620v485W40W100W25度(笑
2343v4135W85W100W75度

 2620v4の消費電力と温度がおかしい。超当たりだったのかも。選別品なのでもっと上位のCPUになる筈だったのかもしれません。

 コンパイル時の消費電力は120Wから350Wと激増しましたが、もうビルドマシンじゃないので目をつぶります。VSエディタ上なら100Wと変わりません 


長生きしてくれよ 

 Xeon e5 v4シリーズではこれ以上のベースクロックがなさそうなので、このマシンはこれで拡張終了ですかね。

 Xeonはサーバーメーカーの案件毎に本当に色々な型番があるので探すの大変ですが、用途にぴったりなのが見つかって良かったです。

これからさらに10年くらい長持ちしてほしいな。


おしまい


2022年2月5日土曜日

Hue Bridge V2 API (Phirips Hue Lamp)

HueのREST API V2を使う

 我が家では、照明コントロールにHueのブリッジを複数使って、家中のライトをコントロールしているのだ

 SiriでもAlexaでもコントロールできるので楽ちん


アプリ使えば?

 はい、前はそれで十分でした。使いやすいGUIアプリだったし

 ところがiOS13あたりから改悪されて、アプリケーションは長時間起動し続ける事ができなくなったのだ!アリエン
 寝る前に30分だけタイマーして電気を徐々に暗くしていただけどそれができなくなった

 ムキー

 iOSのショートカットを作ってもiPadがスリープすると「ショートカットアプリ」自体がkill processされちゃう。iOS 裏アプリは5秒しか動けない制限。

 つまり「スクリプト」をアラームにしても「アラームアプリ」までは目覚ましの機能で起動するんだけど、その後「ショートカットアプリ」がすでに死んでるんでその先の「Hueの照明を消す」に進まない。
 「アラームアプリ」はスーパースペシャルで、「ショートカット」なんて新参者にはあまり権限がないようだ
 しかたない、自作するか


やれやれどっこいしょ

 V1 APIとV2 APIがあるんだけど、V1は古いAPIなので、もうじきなくなるよ、と脅し文句がAPIリファレンスに書いてあるけど、告知されてから早10年以上たってる気がする

 家電なので10年や20年は使うから、そうそう無くせないよね

 またV1じゃないとできない機能があるらしい。はよ解決しろ

V1 API

http://192.168.0.127/debug/clip.html

 httpでもアクセスできるよ、いいんかい。確か初代のブリッジはCPUとメモリがしょぼすぎて httpしかできなかったのでAppleのHomeに公式登録する事ができなかったんだよな

 初代ブリッジはhttpsの実装ができないので、新しくブリッジに買い直したんだよ

 1万円近かったよ

 海外は初代ブリッジ下取りするサービスがあるんだけど、日本のサポートに問い合わせたら

「そんなサービスの予定はありません、フヒヒ」

と言われてがっかりした

 フヒヒは言ってなかった気がする


V2 API

前準備

まずはブリッジのDHCPのアドレスが必要なのだ

Hueブリッジは勝手にインターネットにつないでくれてちゃって


https://discovery.meethue.com/


にブラウザでアクセスするとどういう仕組みなんだか、自宅のブリッジが全部出てくる

[{"id":"002992aaae7ee5c3","internalipaddress":"192,168.0.115","port":443},{"id":"00354ffe299d29","internalipaddress":"192.168.0.127","port":443}]

うむ、怖いww

まぁルーターのDHCPリストとmacアドレスを老眼で突き合わせてショボショボ IPを探すよりは楽なんだけど

このidはいつ使うのかな。自分のアプリでブリッジを見分ける時に使うのかも

複数のルーターを使っている人は知識あるから説明は不要でしょう

postmanなるツールを使うなら、SETTINGSの

Headers 項目

  1. Send no-cache header をon

  2. Send Postman Token Headerをon

  3. Trim keys and values in requst body をoff

  4. SSL certificate verification を off. (俺俺証明書だから)

としときなさいよ、と

ハイカラなGUIが不得意な8bitおじさんなのでcurlで作業するのじゃ、ヨボボ

1は  -H 'Cache-Control: no-cache'

2と3は無視

4は -k をくっつけとけばよさそうじゃのぅ

ブリッジにIDを作る

まずREST APIをアクセスできるように、ブリッジに適当な名前で「アプリ#ユーザー名」の登録をする

urlを /api

Message Body の中に

{"devicetype":"my_app#mydebug"}

とか入れる。

my_app が 今回決めたアプリケーション名(適当)で、

mydebugがそのアプリのユーザー名という事らしい

何個作れるんですかね


curl -X POST -H 'Cache-Control: no-cache' -k "https://192.168.0.127/api" --data '{"devicetype":"my_app#mydebug", "generateclientkey":true}'

を送信すると

[{"error":{"type":101,"address":"","description":"link button not pressed"}}]

hueブリッジのボタンを押せ、とな。押入れまで歩いて一回だけポチする

30秒くらいでこの呪文の効果が切れるらしいのでダッシュで戻り、さっきのcurlをもう一度たたくと

[{"success":{"username":"LuY7AOkGozQTotCstgya28EUddfYpSflIr-CCPc","clientkey":"007E618660B3464232C29946A01CE3DF"}}]

なんか手に入ったっぽい!

これ何人くらい登録できるんすかね。ブリッジのメモリーなんてたかが知れてるし

で、このusernameをヘッダーにくっつけとくとGETができるようだ

返ってくるのが一本グソのjsonなので jq で整形する

# brewはおググりください
% brew install jq

usernameはさっき手に入れてたので、-H "hue-application-key: LuY7AOkGozQTotCstgya28EUddfYpSflIr-CCPc"をくっつけて、/clip/v2/resource/device のリクエスト

curl -H 'Cache-Control: no-cache' -k "https://192,168.0.127/clip/v2/resource/device" -H "hue-application-key:LuY7AOkGozQTotCstgya28EUddfYpSflIr-CCPc" | jq

でっかいjsonキター

このjsonはランプのuuidとか入ってて、これがバレると外からアクセスできちゃうからhueの画面を貼っとく







APIの一覧

ユーザー登録すると、以下のurlでapi一覧を見る事ができる

https://developers.meethue.com/develop/hue-api-v2/


よし、これを使って30分で消えるタイマーをRaspberyy PIで作るぞ

今年度中には


2021年3月2日火曜日

DHT22 is not a Maxim standard.

けっこう外人さんがくるので英語でも書いておく

DHT22 (AM2302) はオレオレ 1Wireだった


DHT22 is not a Maxim standard. 

Using the RaspberryPI 1wire driver (GPIO4) is a mistake!

There is a program written in python3 from the device manufacturer that can be used for this purpose.

Since it is not a 1wire standard, it was not possible to connect multiple sensors to the same bus.


DHT22は1wireと書いてあるけど、マキシム社の規格ではありません。

RaspberryPIの1wireドライバ(GPIO4)を使うのは間違いです。

デバイスメーカーからpython3で書かれたプログラムがあるのでそれを利用しましょう


という事で、ここから先には奮闘記が書いてあったんだけど、結論からいえば上記の注意の通りである。

1wire規格ではないので、複数のセンサーを同じバスにつなげる事はできませんでした。

20年は押入れの中に入っているとおもう

奮闘記は嘘/紛らわしいので消しました


というかGPIO 4に接続している人多いな。

これ間違いだから。

あとプルアップは VCC(電源)が5Vとの時は 5.1KΩって説明書に書いてあるから!

10kΩとか
sudo dtoverlay w1-gpio gpiopin=4 pullup=4
は間違いだから

Raspberry PIのプルアップは 1.5KΩしかないのでセンサーがドライブできない。

動いたとしたらたまたまだからね


18B20(maxim 1wire tempture sensor)と並列にぶら下げられると思って5個も買っちゃったよ、トホホ



おしまい

2021年2月28日日曜日

HDC1080 と RaspberryPI と Golang で温度湿度を読み取る

  タイトルの通りなんですが、Amazonで購入した HDC1080 という温度と湿度を測るチップをRaspberry PI4 とGO言語を使ってI2Cバスから読み取ってみました


HDC1080のデータシートはここから手に入れました

# i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 


似たような温度湿度センサーSi7021と同じアドレスだ

Pythonは嫌だ

 なんだってまたGo言語を使うのかというと、HDC1080の読み取りでググるとほとんどがPythonで書かれているんですよね
 で、PythonはPython2とPython3で互換性がなく、パッとソースみただけじゃどっちかわかんない書き方をしているものが多いです

 pipコマンドでライブラリを入れるんですが、pip3だとpip2だのいろいろバージョンがでてくる

 しかも pip serch 欲しいライブラリすると...

pip3 search test

ERROR: XMLRPC request failed [code: -32500]

RuntimeError: PyPI's XMLRPC API has been temporarily disabled due to unmanageable load and will be deprecated in the near future. See https://status.python.org/ for more information.

 ううーん、pip3 install ホゲホゲ はできるのに、サーチできない。

 pip3をアップデートしろ、という書き込みをみたのでアップデートしたらpip(Python2のほう)がぶっ壊れたww

 真の原因は、どうやら現在searchする為のサーバーが攻撃だかリクエスト有りすぎだかでダウンしていて、回復する見込みはないという絶望的な状態とのこと(2021/02現在)

 意味わからんのでPythonは金輪際使いたくない。

 昔インフラの仕事もしてたから、破壊的バージョンアップを平気でするスクリプト系は嫌いなんだよ。Dockerとかこのあたりを解決したかったんじゃないかとも思える 

 Rubyは2.0系にAppleが開発に加わって破壊的なのが激減したから許す

2021年2月26日金曜日

Zabbix 4 LTS グラフ 日本語文字化けの修正方法

Zabbixのグラフが豆腐になってしまう

 Raspberry PI 4だとRAMが4Gもあってzabbixが楽々動作

 

 まずは日本語フォントをダウンロードする。

ipa00303.zip じゃないとダメ

リンクが切れていたらファイル名でググって手に入れてましょう。

 最新のipaフォント(IPAexfont00401)だとなんかうまく出ない

 ipa.go.jp っていつの間にかなくなってたのね。あちこちこの手の情報はあるけど、リンクが切れまくってるのと、最新フォントならいけるだろ、と思ったらイケなかった。


$ sudo su -

# wget https://ja.osdn.net/projects/ipafonts/downloads/51867/ipag00303.zip

# cd /usr/share/fonts

# unzip  ~/ipag00303.zip        

 //  ipag00303/ipag.ttf ができあがっている事


# cd /etc/alternatives/

# mv zabbix-frontend-font zabbix-frontend-font.org

# ln -s /usr/share/fonts/ipag00303/ipag.ttf /etc/alternatives/zabbix-frontend-font

zabbix-serverが動作したままでもこの変更でブラウザをリロードしたら即座に反映できた

なんか元のフォントに比べると、弱っちい見た目になるけど日本語である事のほうが重要

表示用のhtmlを修正してフォントサイズを少し大きくすればいい筈だけどめんどいからパス


end

2021年2月23日火曜日

Si7021 + Rasspberry PI + GoLang

HDC1080の記事を書いたあとに、「産業用高精度 温度湿度」センサーと書いてあったのできっとすごいセンサーだと思って amazonでポチッた

ポチったあとにデータシートみて驚愕したんだけどI2Cのアドレスは 0x40 固定だった

HDC1080とまったく同じだ。 

RaspberryPi3 だと I2Cが一個しかないので一個しかぶら下げられない。なんという事でしょう。Pi4なら複数のI2Cがあるけど

温度/湿度なんてI2Cほど速度いらないから1-wireのほうがいいのかな。こちらはデバイス毎に固有アドレスがあるし。 

どこかからソースパクってこよう、は安易すぎた 

なかなか古いデバイスのようで、GoLang + Si7021 でググるといくつか github にヒットする

けどなんかこうGoLangのバージョン依存してたり、OS依存しててコンパイルできなかったりした

結局 ここのデータシート 読んで自分で書いた方が早かった。3時間も無駄にしたよ.. 


CRCはちゃんと計算しよう 

最初10分で書いた信頼性がなさすぎた
実験でケーブルが短い時は大丈夫だったけど、3mの単芯ケーブルにしたら通信エラーが起きているっぽくで、湿度が-50%とかになってる

他のセンサー(DC-CO2-20)では通信エラーが起きていないので、デバイスのドライブが弱いのかな、と人のせいにしてはいけない 。ちゃんとCRC計算しよう...


ハードウェアの結線

Raspberry PIとの結線は SDA,SDL, 3.3V , GND の4本だけ

GoLang は 1.16 で macOSを使用 

アドレスの確認

# i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

0x40にいた。HCM1080と同じアドレスだ。困る。

 

I2Cをsudoしなくても読めるようにする

これはグラフツールのzabbixが読めるようにする設定
ユーザー名がpiの人は zabbix を pi にするとよさそう

# sudo usermod -aG i2c zabbix


パッケージの準備

% mkdir si7021

% cd si7021

% go mod init si7021

go: creating new go.mod: module si7021

go: to add module requirements and sums:

go mod tidy


% go mod tidy

go: finding module for package github.com/davecheney/i2c

go: found github.com/davecheney/i2c in github.com/davecheney/i2c v0.0.0-20140823063045-caf08501bef2


ソース

// macOS closs compile

// GOOS=linux GOARCH=arm go build 

package main



import (

  "fmt"

  "os"

  "time"

  "github.com/davecheney/i2c"  // go get github.com/davecheney/i2c

  "encoding/binary"

)


const (

    wait = 100 * time.Millisecond // 100milisec 

)


func write(dev *i2c.I2C, s string) {

  chars := []byte(s)

  dev.Write(append([]byte{0x40}, chars...))

  time.Sleep(wait)

}



func help() {

    fmt.Println( "exp: hdc1080 0 or 1 (0=Ondo 1=Shitudo 9=reset")

}



// 2byteの値から1byteのcrcを返す

func calcCRC(seed byte, buf []byte) byte {

  for i := 0; i < len(buf); i++ {

    seed ^= buf[i]

    for j := 0; j < 8; j++ {

      if seed&0x80 != 0 {

        seed <<= 1

        seed ^= 0x31

      } else {

        seed <<= 1

      }

    }

  }

  return seed

}


func Reset() {

    dev, _ := i2c.New(0x40, 1)


    dev.Write([]byte{0xFE}) // CMD_RESET

    time.Sleep(wait * 5)

}


func ReadData(cmd byte) float32 {

    var i float32

    var b  = []byte{0, 0, 0}

    var b2 = []byte{0, 0}

  

    // 0x40 is I2C address , 1 is /dev/i2c-1

    dev, _ := i2c.New(0x40, 1)

    cnt := 0;

    

again:

    dev.Write([]byte{cmd}) // CMD_TEMPTURE

    time.Sleep(wait)

    dev.Read(b) // 3byte読み込み

    b2[0] = b[0]

    b2[1] = b[1] // 素人すぎるプログラムww

    

    crc := calcCRC( 0x00 , b2 )

    if crc != b[2] {

        fmt.Fprintln( os.Stderr , "CRC error")

        time.Sleep( wait * 10 ) // 1秒

        Reset()

        time.Sleep( wait * 10 ) // 1秒

        

        cnt += 1

        if cnt > 5 {

            return -1

        }   // error

        goto again

    }


    i = float32(binary.BigEndian.Uint16(b2))

    time.Sleep(wait)

    return i

}


func main() {

  if len(os.Args) < 2 {

    help()

    os.Exit(-1)

  }


  switch os.Args[1] { 

  case "0":

      f32 := ReadData(0xF3) // / CMD_TEMPTURE

      if ( f32 != -1 ) {

          c := float32(f32) * 175.72 / 65536. - 46.85

          fmt.Printf("%.2f\n",c)

      } else {

           fmt.Println(-1)

      }

  case "1":

      f32 := ReadData(0xF5) // / CMD_HUM

      if ( f32 != -1 ) {

          c := float32(f32) * 125. / 65536. - 6.

          fmt.Printf("%.2f\n",c)

      } else {

           fmt.Println(-1)

      }

  case "9":

    Reset()


  default:

    help()

  }

}




コンパイル

GOOS=linux GOARCH=arm go build 

これでバイナリができたので、RaspberryPIに scp して実行

# 温度

$ ./si7021 0

21.715549316406246


# 湿度

$ ./si7021 1

39.543670654296875


# リセット送信 (いるのかな? )

$ ./si7021 9



高精度?

うーんと、精度はどうなんだろう

hdc1080と温度で0.5度くらい、湿度で1%くらいの差くらい

hdc1080も割と高精度なんでは...


おしまい