2019/01/08

iPhone8購入

iPhone 8購入

以前購入したモトローラ Moto G5sがポケモンGoをやるには遅くてまいっていたので、Appleの初売りと Rebates(リーベイツ)のポイントアップが重なったタイミングで購入。

iPhone8

開封の儀

発売されてずいぶん経っているモデルなので、視点を変えて、宅配便で送られてきたときの箱から取り出す様子。

宅配便 iPhone

バリバリやらなくても開く、スマートな箱に入っていた。

移行は楽チン

以前使っていたiPhone SEから設定を引き継いだのだが、楽チン。iTunesで取っていたbackupから戻した後、iPhone SEとiPhone 8を並べて放置。これで設定が引き継がれるのだから、便利なものだ。

iPhone 設定 移行 引継ぎ

ケースと保護フィルム

ケースはいつものTPU。保護フィルムはiPhone 8/7/6s/6用というのを買ったら、ちょっと小さかった。

moto G5sよりも小さい

少し小さくなった。

moto G5s iPhone 8 比較 大きさ

iPhone SEの大きさで、全面液晶だといいんだけど。

古いモデルとはいえ、ポケモンGoもサクサク動く。とはいえ、アプリはどんどん重たくなっていくので、iPhone 8をいつまで使い続けられるだろうか。



2019/01/05

2019年年賀状


今年もよろしくお願いします。


2018/12/31

SREに思う

話題の職種SRE

今年はSREが話題になった。SRE本が出て広く読まれたということもあるが、バズワードになることなく実体が伴っているということは、SRE Advent Calendar 2018 - Qiitaの各記事を見ても明らかだろう。

ただ、SREと呼ばれる役職はやることが多岐にわたるため、「SREの部隊を作る」と言われた時の不安も多い。

運用エンジニアを補充するための方便

SRE本第1章には、システムの運用をソフトウェアエンジニアが行うようにしたとある。運用を行うのだからと、従来の運用(devとopsに分断した状態のops)のミッションのまま、「SRE」と偽って人を集めるところがでてくると、不幸だ。
第5章に、「運用業務を、各人の作業時間の50%以下に抑えるという目標」とある。つまり、SREチームは運用チームの単純な言い換えではないのだ。運用業務以外のエンジニアリング、つまり、ツールの作成や信頼性のための機能の追加、モニタリングのセットアップなどの活動が、業務時間の半分を超えるような職種だ。「問題が発生したから対処する」という受け身の運用チームとは、性格が全く異なっている。
「攻めの運用チーム」と仕事をしたという記憶が残っていないので、SREは運用チームとは異なった職種であるとは言い切れないのだが、少なくとも、「受け身の運用チーム」とは異なった職種であろう。

class SRE implements DevOps

悩んでいた一文ではあったのだが、Advent Calender 24日目のSRE風のインフラエンジニアにならないために - Work Recordsを読んで納得。確かに、高速にリリースできれば問題が起きた時も ロールバックする/修正版をリリースする どちらの手段も有効だろう。

しかし、devが「高速にリリースできる」ように作っていないと無理な話だし、opsにはそれを実行するための腕が必要になってくる。devとopsが顧客へのサービス提供という点で協力し合う文化が醸成されていなければ、難しい話だ。

  • 「運用回避」のまま放置されている障害
  • devには公開されていない本番環境のリソース使用状況
  • リリースに立ち会わないdevチーム
  • devにエスカレーションされない障害通知のチケット
うまく協力し合えていないのではないか?という事象は、いろいろ考えられる。協力の文化がないところには、SREは時期尚早ではないか?

監視

SRE本第3章、エラーバジェットの話。客観的なメトリクスを定義し、そこからSLOとエラーバジェットを規定する。devとopsの対立を、「エラーバジェット」を導入して解決する。ここで重要になってくるのが、定義したメトリクスの監視。
自社のサービスの監視項目を見てもすっきりしなかったので、考え直してみた。

  • インフラレイヤーでの監視
  • サービスレイヤーでの監視
  • devが気にする項目の監視
インフラレイヤーでの監視は、AWSのCloudWatchにデフォルトで出てくる項目だったり、Mackerel(マカレル): 新世代のサーバ管理・監視サービスのagentがデフォルトで監視している項目である。「サーバ監視」と言っても良いかもしれない。
サービスレイヤーでの監視は、インフラレイヤーよりももう少し大きな視点から見た監視。極端なことを言えば、サーバが1台止まっていても、ちゃんと可用性を確保する構成になっていて提供サービスに影響がなければ「問題なし」と判断する。
devが気にする項目の監視は、APMと呼ばれる分野かもしれない。サーバが動いていても、リクエストに対する処理の1つがエラーになったらNGと判断する。
この3つに分類してみると、サービスレイヤーでの監視を行うサービス(商品)は少ない気がする。URL外形監視をおこなう - Mackerel ヘルプなどのURL監視や、LoadBalancerでのレスポンスタイムやHTTP Statusの監視くらいか。

ただ、[SRE Advent Calendar] 監視システムの特徴から考える監視設計のポイント - かつひささんの日記にあるように、SREの成果を見るには信頼性を計測する必要があるので、そう簡単な話では済まないはずだ。サービスにするほどのニーズが集まらない(分散してしまう)とか、そもそもSREはプログラムを書ける人だから自分たちで作ってしまっているとか、そういった事情があるのだろう。
監視の目的がサーバ監視とは異なるから、従来の運用チームが使っていた仕組みではうまくいかない可能性も考えておく必要がある。

まとめ

信頼性の問題は、SREという役を作れば解決するものではない。そういった役割を作れるだけの文化が醸成されていないかぎり、そして、役を作れば解決するという考えを改めない限り、どんなことをやっても解決しないだろう。



2018/09/29

PRIMERGY TX1310 M1購入

FUJITSUのサーバ購入

お家サーバが動かなくなってもう10ヶ月。いい加減なんとかしようと探してみたら、NTT-X Storeで安く出ていたので購入。

1uのラックマウント型ケースにマザーボードを買ってきて組み立てていたけど、3,4年で動かなくなる。以前もサーバーのマザーボード交換 を行ったけど、ケースに収まるものを見つけるのが大変だった。

開封の儀

FUJITSUのダンボール。

キーボードやアクセサリが上の段。
重いサーバ本体は下の段。
ドライバー無しでケースを開けられるのが嬉しい。
左が底面、下が前面。底面に2台、隠しベイに2台HDDが取り付けられる。5インチベイにも取り付けられそうだけど、HDDのマウンターはついていない様子。

ディスクを移植してサーバ復活

ディスクを入れ替えてスイッチオン。無事にFreeBSDが立ち上がり、Network I/Fも認識されて復活。
と思ったら、USBキーボードが認識されない。/boot/loader.conf でehciをロードするよう設定して、解決。

Copyright (c) 1992-2013 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.4-RELEASE-p23 #3: Sat Jan 31 05:41:37 JST 2015
    root@dorothea.home.group.jp:/usr/obj/usr/src/sys/dorothea i386
gcc version 4.2.1 20070831 patched [FreeBSD]
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) CPU G3420 @ 3.20GHz (3192.63-MHz 686-class CPU)

  Origin = "GenuineIntel"  Id = 0x306c3  Family = 6  Model = 3c  Stepping = 3
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x45daebbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,<b11>,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,XSAVE,RDRAND>
  AMD Features=0x2c100000<NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
avail memory = 3578269696 (3412 MB)
ACPI APIC Table: <FTS    D3219-A1>
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s)
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  2
ACPI Warning: FADT (revision 5) is longer than ACPI 2.0 version, truncating length 268 to 244 (20101013/tbfadt-392)
ioapic0 <Version 2.0> irqs 0-23 on motherboard
kbd1 at kbdmux0
cryptosoft0: <software crypto> on motherboard
acpi0: <FTS D3219-A1> on motherboard
acpi0: [ITHREAD]
acpi0: Power Button (fixed)
acpi0: reservation of 67, 1 (4) failed
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x1808-0x180b on acpi0
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
vgapci0: <VGA-compatible display> port 0xf000-0xf03f mem 0xf7800000-0xf7bfffff,0xe0000000-0xefffffff irq 16 at device 2.0 on pci0
pci0: <serial bus, USB> at device 20.0 (no driver attached)
em0: <Intel(R) PRO/1000 Network Connection 7.3.7> port 0xf080-0xf09f mem 0xf7d00000-0xf7d1ffff,0xf7d35000-0xf7d35fff irq 20 at device 25.0 on pci0
em0: Using an MSI interrupt
em0: [FILTER]
em0: Ethernet address: 90:1b:0e:xx:xx:xx
ehci0: <EHCI (generic) USB 2.0 controller> mem 0xf7d34000-0xf7d343ff irq 16 at device 26.0 on pci0
ehci0: [ITHREAD]
usbus0: EHCI version 1.0
usbus0 on ehci0
pcib1: <ACPI PCI-PCI bridge> irq 16 at device 28.0 on pci0
pci1: <ACPI PCI bus> on pcib1
pcib2: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
pci2: <ACPI PCI bus> on pcib2
pci2: <network, ethernet> at device 0.0 (no driver attached)
ehci1: <EHCI (generic) USB 2.0 controller> mem 0xf7d33000-0xf7d333ff irq 23 at device 29.0 on pci0
ehci1: [ITHREAD]
usbus1: EHCI version 1.0
usbus1 on ehci1
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel Lynx Point SATA300 controller> port 0xf0d0-0xf0d7,0xf0c0-0xf0c3,0xf0b0-0xf0b7,0xf0a0-0xf0a3,0xf060-0xf07f mem 0xf7d32000-0xf7d327ff irq 19 at device 31.2 on pci0
atapci0: [ITHREAD]
atapci0: AHCI called from vendor specific driver
atapci0: AHCI v1.30 controller with 6 6Gbps ports, PM not supported
ata2: <ATA channel> at channel 0 on atapci0
ata2: [ITHREAD]
ata3: <ATA channel> at channel 1 on atapci0
ata3: [ITHREAD]
ata4: <ATA channel> at channel 4 on atapci0
ata4: [ITHREAD]
pci0: <serial bus, SMBus> at device 31.3 (no driver attached)
pci0: <dasp> at device 31.6 (no driver attached)
acpi_button0: <Power Button> on acpi0
acpi_tz0: <Thermal Zone> on acpi0
acpi_tz1: <Thermal Zone> on acpi0
acpi_hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 14318180 Hz quality 900
atrtc0: <AT realtime clock> port 0x70-0x77 irq 8 on acpi0
atrtc0: Warning: Couldn't map I/O.
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
uart0: [FILTER]
uart0: console (115200,n,8,1)
pmtimer0 on isa0
orm0: <ISA Option ROM> at iomem 0xc0000-0xcffff pnpid ORM0000 on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
ata0: <ATA channel> at port 0x1f0-0x1f7,0x3f6 irq 14 on isa0
ata0: [ITHREAD]
ata1: <ATA channel> at port 0x170-0x177,0x376 irq 15 on isa0
ata1: [ITHREAD]
coretemp0: <CPU On-Die Thermal Sensors> on cpu0
est0: <Enhanced SpeedStep Frequency Control> on cpu0
p4tcc0: <CPU Frequency Thermal Control> on cpu0
coretemp1: <CPU On-Die Thermal Sensors> on cpu1
est1: <Enhanced SpeedStep Frequency Control> on cpu1
p4tcc1: <CPU Frequency Thermal Control> on cpu1
Timecounters tick every 1.000 msec
IPsec: Initialized Security Association Processing.
ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled
usbus0: 480Mbps High Speed USB v2.0
usbus1: 480Mbps High Speed USB v2.0
ad4: 953869MB <WDC WD10EZEX-00RKKA0 80.00A80> at ata2-master UDMA100 SATA 6Gb/s
ad6: 1907729MB <ST2000DL003 9VT166 CC32> at ata3-master UDMA100 SATA 6Gb/s
ugen0.1: <Intel> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
SMP: AP CPU #1 Launched!
Root mount waiting for: usbus1 usbus0
uhub0: 2 ports with 2 removable, self powered
uhub1: 2 ports with 2 removable, self powered
Root mount waiting for: usbus1 usbus0
ugen0.2: <vendor 0x8087> at usbus0
uhub2: <vendor 0x8087 product 0x8008, class 9/0, rev 2.00/0.04, addr 2> on usbus0
ugen1.2: <vendor 0x8087> at usbus1
uhub3: <vendor 0x8087 product 0x8000, class 9/0, rev 2.00/0.04, addr 2> on usbus1
uhub2: 6 ports with 6 removable, self powered
Root mount waiting for: usbus1 usbus0
uhub3: 8 ports with 8 removable, self powered
ugen0.3: <American Power Conversion> at usbus0
Trying to mount root from ufs:/dev/ad4s1a
fuse4bsd: version 0.3.9-pre1, FUSE ABI 7.19


2018/08/15

Spring BootでJDBCの設定を確認する

JDBCの設定は難しい

なかなか避けて通れないDB。JavaでDBを使うなんてよくあることだし、ググれば簡単かと思いきや、まともに使うための設定が書いてあるページにたどり着くのは困難。サンプル通りに作ったのに、1日経ったらエラーで止まっているなんてのはよくある話。

地雷が何箇所にもあるので、トラブルシューティングに従ってやってみたところで、原因が違えば何の効果もない。が、意図した通りに設定されているということに確証が持てなければ、何をやっても無駄だ。というわけで、設定を確認する方法をまとめてみる。

Tomcat DBCPを設定する

JDBCというか、Connection Pooling。Javaなら普通Poolingするでしょうから、Spring Boot + Tomcat DBCP + MySQLのパターンに絞ってみる。

Tomcat DBCP(Tomcat JDBC Pool)については、Commons DBCPを超えるTomcat JDBC Poolとは (1/2):Tomcat 7の新機能で何ができるようになるのか?(番外編) - @ITがわかりやすい。

Spring Boot は Tomcat DBCPをサポートしているので、設定でうまくやれる。はずなのだが、Spring Bootのバージョンによって設定パラメータ名が変わっているので、どのバージョンについて話しているのかを確認しないと、悩むことになる。

MySQLのtime out系はよく見かけるトラブル。

  • Lost connection to server during query
  • MySQL server has gone away
といったものが、よく食らうエラー。

time outに関係するパラメータをうまく設定すれば解決できるのだが、Spring Bootだと、パラメータ名何だったっけ?ということになる。特に、別々のDB Serverに同時に接続できるよう、パラメータ名を変更した場合はわからなくなりがち。

設定内容を表示させる

設定内容をログに出すなり、APIのレスポンスとして返すようにするなりすれば、確認できる。というのが、Spring Boot configuration for Tomcat’s pooling data source | The Art of Codeに書かれている。具体的なコードが書かれているので、英語アレルギーでもコードだけ見ればわかるだろう。
DataSourceオブジェクトを作って、そのプロパティを表示するコードなのだが、どんな設定がされているのか、このアプローチなら確かに確認できる。

タイムアウトに対処する設定

ググるとtestOnBorrowをセットすればよいとかvalidityQueryをセットしろとか見つかるが、不十分な設定を書いている記事も多い。まだブラウザで開いていたページは

といったところ。

ネットワークが絡んでくるのでシステム構成の違いによる影響が大きく、一般化してまとめるのが難しい、というか、具体的でなくなってしまうのかな。ただ、「使う前or定期的に DBにクエリーを投げて、接続が使える状態かどうか確認する」というアプローチなので、それを実現するための設定を行っていくというのが解決方法になる。



2018/05/20

ポケモンGOにmoto G5sはパワー不足

画面が大きめのスマホが欲しい

今までiPhone SEでポケモンGOをやっていたのだが、画面がちょっと小さい。メールやスケジュールの文字が見難く感じることが多くなってきたので、画面が大きいスマホを買うことにした。

最近のAndroidは持っていなかったので、Androidでほどほどのお値段で外国製の中からチョイス。国産メーカーだと、アップデートがすぐに終わってしまって、データ盗られ放題のまま使わざるをえないことになってしまうからね。
IIJmioでキャンペーンをやっていたので、モトローラ Moto G5sに決定。

moto G5s開封の儀

パッキングはもうスマホでおなじみの形式。


ふたを開けると

裏はすっきり。カメラ部分の出っ張りは気になる。

simフリーだからIIJ mioで扱っている

当然、IIJ mioのsimを入れても、問題なく認識される。ちなみに、タイプD。
サイズはnanoなので、iPhone SEで使っていたsimを持ってきた。

ポケモンGOはちょっとカクカクする

ARモードも使えるのだが、ジムバトルでポケモンを選ぶ画面のスクロールがもたつく。また、ジムの画面から通常のフィールド画面に戻るとき、画面の描画が半分くらいでいったん止まる。後者はともかく、前者は意図しないポケモンが選ばれることがあり、ちょっとイラつく。
G5から画面を大きくしたので、処理が追いつかないのかもしれない。

moto g5sのケースと保護フィルム

スマホには付き物。特殊素材で衝撃を吸収! 『衝撃吸収【光沢】保護フィルム Moto G5s』Moto G5S ケース TopACE 超スリム クリア TPU ソフトケース 落下防止 指紋防止 耐スクラッチ全面保護 Moto G5S対応をチョイス。

もう少し小さいのがいい

5.2インチサイズはちょっと大きい。胸ポケットに入るか入らないかくらいなので、もう一回り小さくてもいいかなぁというのが正直なところ。世界市場的には、ニーズのない大きさなのかなぁ?



2018/04/29

遅いSQLをあぶり出す

犯人は誰だ

DBが遅いという。サーバのスペックや処理内容、開発会社のレベルを考えると、どうも設計やSQLに問題がありそうだ。
「DBアクセスが遅い」と文句を言っても「サーバのスペックをあげてくれ」としか回答してこないレベルなので、ボトルネックになっているSQLを調べることにした。

スロークエリの調べ方

Postgresだと、 スロークエリの分析 | Let's Postgres というページにまとまっている。
しかし、

  • Amazon RDS for PostgreSQL | AWSって、pg_stat_statements使えたっけ?
  • スロークエリって、何秒以上をログ出力するようにすればいい?そのクエリって、頻繁に使われるの?
といった問題があり、今回は保留。

MySQLの場合、 Kazuho@Cybozu Labs: MySQL のボトルネックを統計的に監視・解析する方法で紹介されている、GitHub - kazuho/mprofile: http://developer.cybozu.co.jp/archives/kazuho/2009/07/mysql-539d.htmlが使える。 Postgres向けを探したが、調べ方がよくなかったのか、見つけられなかった。

pg_stat_activityを使う

pg_stat_activityで現在発行中のsqlを見る - メモス\(^o^)/。これを定期的に実行すれば、よく実行されるSQLがあぶり出される。
必要な情報をまとめると、実行するSQLは

SELECT now(),query_start, query FROM pg_stat_activity WHERE state='active';
でOK。cronに書いて出力をファイルにリダイレクトすれば、後でゆっくり分析できる。

どのクエリとどのクエリが同じなのか、判断する必要がある。とりあえずはよく出てくるSQLのうち、query_start - now()が大きな値になっているものを調べるのがよさそう。大体の時間も見えてくるので、スロークエリを設定するときにも役に立つ。

作り逃げに注意

よろしくないSQLも、データ量が少ない頃は問題が見えてこないことが多い。開発を外注して自社で運用なんてスタイルをやっていると、こういう爆弾をつかまされることになりがちだ。