出力を入力へ

プログラミングに関する基本的な事を中心にまとめます

OpenShift Meetup Tokyo #1 に参加しました

海外からOpenShiftコアメンバを招いての OpenShiftの最新機能および今後のロードマップについて語ってもらう 国内初の?OpenShift公式コミュニティイベントに参加してきました.

参加者も既にOpenShiftを利用している人が多く, LT含めて内容が濃いイベントでした.

openshift.connpass.com

OpenShift JPのご紹介

発表に先立ってOpenShift関連の簡単な紹介.

海外含めたOpenShift共通のコミュニティとして OpenShift Commonsをチェックしておくといいよか, 今後国内でもRedHat Forumとかハンズオンセミナーあるよとか.

commons.openshift.org

redhat-forum.jp

www.redhat.com

中でも,気になった内容として OpenShift Container Engine という OpenShiftの新しいディストリビューション(?)の紹介があった. 既にCI環境等を構築しているユーザ向けに ロギングやCI/CD機能などをOpenShift Container Platformから省いたものらしい.

確かに,すべての環境をKubernetes/OpenShiftに移行しないケースもあるので 選択肢の1つとしてあるのはうれしい気がする.

blog.openshift.com

OpenShift Strategy and Roadmap & OpenShift Day 2 Management

タイムテーブルでは2つに分かれていましたが内容盛り沢山のため, 休憩カットでOpenShift 3.11の最新機能を2つのデモを通しての紹介と メジャーアップデートを控えたOpenShift 4.0についての紹介がありました.

www.redhat.com

リリースサイクルの話として, Kubernetesのリリースから1-3ヶ月後の 1サイクル遅れでリリースされるという話や KubernetesのコントリビューションはGoogleRedHatが大半を占めているという話. また,OpenShift 3.11ではCoreOSを買収し,Techtonicの機能を OpenShiftに統合したリリースであるという説明があった.

具体的なTechtonic由来の機能として,管理者向けコンソールが統合され, クラスタのステータスやリソース状況が確認できる. また,OpenShift上の操作イベント/発生イベントが時系列で確認でき, 各イベントから詳細な内容を確認できるということを 実際の画面を通した紹介があった.

また,デモとしてRBACの機能により参照可能なリソースを GUIから操作可能であることの紹介があった. 権限設定ミスにより本来参照できて欲しくないリソースが参照できてしまう状況にて, 管理者がGUIを通して権限を修正することで, 参照可能なリソースが修正できることを実際に動作させて説明があった.

もう1つの主要な新機能として PrometheusおよびGrafana による 監視機能の紹介があった. 単に連携しているだけでなく,コミュニティベースの知見を活かした 監視ルール等が反映されているとのこと. ただし,収集した監視データは永続化されていないとのこと. 永続化するには別途ボリュームプラグイン等を導入して対応する必要があるらしい.

プレビュー版ではあるが,Operatorも3.11から導入された. Prometheusやetcd, mongoDBなどのOperatorがある.

そのあと,OpenShift 4.0のロードマップにっついての説明があった. 新機能として, Unified Hybrid Cloud, Day-2 Operations, Kubernetes App Marketplace の紹介があった.

Unified Hybrid Cloud は パブリッククラウドやオンプレミスで動作する 複数のOpenShiftを連携動作させるための機能. Day-2 Operationsとして,Operatorが正式サポートされる. 中でもAnsible Operatorがサポートされ, Operator Frameworkに従ってansible playbookが実行できるようになる件は気になる話だった. また,Istioによるサービスメッシュも統合される. (実際にはIstioは3.11から Tech Previewで利用できる).

これ以外にも, Container Native Virtualizationの話があった. これはKubeVirtをベースとし,podを操作するように VM操作ができるようになるものらしい. 以下スライドの16ページにも記載あるが, VMがコンテナ内で動作しているように見える.詳細がよくわからない.

www.slideshare.net

ホストOSとしてRHELおよびCoreOSについても説明があった. 従来のOpenShift3.11まではOSにRHELを利用していたが, OpenShift4からはこれに加え,CoreOSを利用する選択肢が増える. このときデプロイがOpenShiftと統合されイミュータブルなインフラとして管理できる.

加えて,アップデートが Over the Airとなることで運用が容易かつ 高頻度なアップデートが可能になる. もちろんアップデートが強制されるわけではなく ユーザがアップデートのタイミングを決定できるし 必要に応じてロールバックもきちんとサポートされているという補足もあった.

そんな気になるOpenShift4のリリースは パブリックベータを2018年12月-2019年1月頃に公開し, フィードバックを踏まえて正式リリースになるとのこと.

LT: OpenShift上で動くAPI管理「3scale」

www.slideshare.net

OpenShiftにおけるAPI管理ツールである3scaleの紹介. APIゲートウェイはもちろん,課金・負荷抑制のための流量制御や GUIベースでの仕様設定,API利用状況の確認 keycloakと連携した認証機能などをサポートする.

LT: プライベートネットワーク上でOpenShift

プロキシ環境下でOpenShiftをセットアップする場合における プロキシ設定やDNS設定のカスタマイズ方法の紹介. Ansibleスクリプトの修正やデプロイ後の影響範囲など.

Jenkins ユーザ・カンファレンス 東京 2018 に参加しました

作成・公開が遅くなったけど,3週間前に開催されたJenkinsユーザカンファレンスの参加記録です.

Jenkinsの公式ユーザカンファレンスとして3年に1度開催されている Jenkins ユーザ・カンファレンス東京2018に参加しました. 3連休中日の9/23(日)に開催でしたが,約300名規模が参加するなど非常に盛況でした.

聴講セッション

基調講演 (CloudBees, Inc. 川口耕介さん)

ソフトウェア開発・CI/CDの重要性といった全体の話から Jenkinsのユーザ拡大,CloudBeesの取り組みといった現状についての紹介. その後Jenkinsの最近の新機能として以下の5つを中心に説明があった:

  • ビルドフローを設定ファイルとして記述してリポジトリに保存する Jenkins Pipeline
  • デフォルト設定とプラグインをパッケージ化して5分でJenkinsを使えるようにする Jenkins Evergreen
  • Jenkins自体の設定をファイルとして記述し履歴管理を可能にする Configuration as Code
  • JenkinsがSPOFになることを回避するため,成果物等をS3に保存するなど分散実行する Cloud Native Jenkins
  • Kubernetesと連携し,簡単にかつ学習コスト少なくKubernetesの恩恵を受けられるようにする Jenkins X

既に利用しているPipelineや情報としては知っているJenkins Xもあるが, 知らない機能やJenkinsが現在も大きく変化しようとしていること, その方向性を知ることができたのはよかった. 新機能についてはリリースされたばかりのものもあるので実際に評価して確かめていきたい.

Accelerate with Jenkins X (James Rawlings さん)

クラウドネイティブな開発を簡単に実現するため, 簡単には利用できないKubernetesをJenkins Xを通して簡単に利用できるようにする, というJenkins Xのミッションとそのデモの紹介.

デモでは実際にコマンドからGitHub上にリポジトリを構築したり,Kubernetesクラスタを構築したり, パイプラインを生成してビルド・デプロイを実施したりできる.

デモを見るまではCI環境として利用するKubernetesを構築することが Jenkins Xの内容だと理解していたが,説明やデモを見て Kubernetesは完全に隠蔽してその上で動かすアプリを提供するものだと理解した.

Jenkinsおじさんの育て方 (ビズリーチSREチームマネージャー 阪本稔さん)

slides.com

今後もCIの重要性が増す中で,開発を支援しトラブル対応可能な人材を育てるために SRE本を参考に教育カリキュラムを構築・実践してきた内容の紹介.

内容はJenkinsをターゲットにはしているけど,SRE本および教育方針がメインテーマに感じた. CI/CDの歴史やJenkinsの基礎知識は問題ないにしても, 既存ジョブの知識やトラブルシューティングtipsはどう教えるのか難しいのではと感じた. ジョブやパイプラインにどのようなものがあるのかという設計指針や プロジェクトやJenkinsバージョン等によって異なるトラブルシューティングtipsは そう簡単には教育資料としてまとめられる気がしない.

AWSとJenkinsを活用して1年間で約500回商用デプロイした話とKubernetes活用 (NTTデータAgileプロフェッショナルセンタ主任 高見将則 さん)

speakerdeck.com

実際のWebサービス開発においてJenkinsを導入した事例における, 導入の話や,パイプラインの設計およびトラブル対応の紹介.

発表時間の割に重要な情報が多い印象を受けた(当時は発表自体はすぐ終わり質疑に多くの時間が割かれた). パイプラインとしてブランチビルド,リリースビルド,デプロイの3種類を定義していることは, 確かに自分も似たような構成を取ってはいるが,きちんと名前付けして整理されていない. パイプラインの設計は暗黙知化されているので,設計指針とすれば複数開発プロジェクトに展開できる知見だと感じた.

開発が始まってからの導入が難しいので事前または初期に導入すべし,というのはその通りだけど それに必要となる教育(特に他社ベンダへの展開)をどうしたのかが気になった. 最近ではJenkinsだけでなくCIは当然の知識としてあるのかもしれないけど 自社の場合はまだCIとは何か,CIの必要性といったことを上司含めて説得する必要があるので 特に課題が具体化されていない初期でどのように説得するのかは悩ましいところ. (課題が具現化された状況では導入は遅く,具現化される前は軽視されて取り合ってくれない).

課題なんかもよくあるテーマだと感じた. 特にスローテストまわりはプロジェクトや開発フェーズによって いろいろな要因があるので何度も悩まされる課題という印象. こういった課題への対処こそきちんと知見として共有していく必要がある.

LT: Jenkinsを簡単運用ツールとして活用して非エンジニアに喜ばれた話 (morihayaさん)

www.slideshare.net

定型的なSQLクエリの管理にJenkinsを利用したという話. 非エンジニアとは言うが運用チームの話なのである程度技術背景もあるし 導入もそこまで大変ではないかな,という印象.

Jenkinsを利用することでレビューや認証認可を強制する,というのは納得感のある話. むしろ非エンジニアだと少しリッチでGUIのあるcron程度で十分なので Jenkinsだと機能過多になる,という話の方が多いのでそういった話かと勘違いしていた.

話を聞く限りではまさにJenkinsがバッチリとはまるケースの印象. 問題はこういった仕組みを導入するとJenkinsインフラの管理もこちらの仕事にされるところだろうか. 責任分担をどうしたのかが気になる.

LT: Jenkins World 2018の参加報告 (Masayoshi Sakamotoさん)

Jenkins World 2018のホットトピックであった * as Code, DockerのCI/CD, DevSecOpsの紹介と 特に気になったセッションの紹介.

いずれのテーマもまさに今注目の内容なので Jenkins Worldのような場で話を聞けるのは羨しく思う. 特にDevSecOptまわりは,考え方としては知っていても実感できていないので 非常に気になるところ. コンテナCI/CDも自分の環境でやっと形になったところなので, 段階的にでも導入するという話を聞いて自分が取り組んでいることに 確信が持てたのでよかった.

LT: Jenkinsで運用業務の改善をしてみて気づいたこと (Yoshitaka Shirakoさん)

www.slideshare.net

Jenkinsの自動化により効率化やコード化による品質向上を実現したが 自動化が目的化してしまい本当に必要な業務効率化には至らなかったという話.

自動化による業務改善自体は上手くいっているが 上司をまきこめなかったので最適化はできなかったという話だろうか. 似たような話に自動化を進めた結果,自動化した中身がブラックボックス化 してしまうという話だと思ったので,ここまでできているのなら上出来では?とも考えてしまう.

これは改善の目的をどこに置くかという話で, いわゆるアジャイルにおけるふりかえりを踏まえた 課題の明確化や継続的な改善に取り組まないと 中途半端な状況で改善が止まってしまう.

自分もかなり悩んだ状況なので参考に頑張りたい.

LT: JenkinsとCodeBuildとCloudBuildと私 (Shoji Shirotori さん)

www.slideshare.net

Jenkinsの管理や権限設計の改善のために CodeBuildやCloud Buildの利用比較を行った話.

気にはなっていたけど検討できていない内容だったので参考になる話ではある. ただし,Cloud Buildはともかく, CodeBuildはCodePipelineなど複数サービスを組合せてパイプラインを構築することが 前提となっている様子なのでもう少し検討したいところ.

Jenkinsのすべてを置き換えるのか,一部を置き換えるのか, パイプラインの方針などによって異なるので 必要な機能に応じて自分でもいろいろ比較検討してみたいところ. 最近だとAzure DevOpsも比較対象に加えたい.

参加記録 ARC103

前回からちょっと時間が空いてのARC103. CとDの部分点を解いて 600(2) 79:45, 533rd 1003 -> 1081(+78) パフォーマンス1537でhighest更新.

C - /\/\/\/

方針自体はすぐに思い付いた. 数列の偶奇で分けて,一番出現頻度が高い数字に合わせて他の数を修正すればよい. 偶奇で同じ数にはできないので,偶奇それぞれで2番目まで出現頻度の高いものをカウントし, 偶奇のそれぞれにて出現頻度が最も高い値が同じならば,偶奇どちらかを2番目に出現頻度が高い数にすればよい.

最初上手く実装する方法あるのかと考えたが なさそうなので愚直に実装した. n も v_i も 105程度なので実行時間の制約は厳しくない.

さっさと実装して提出するもWA,不具合を見付けて修正・再提出するもWA (22:55経過時). 奇遇の最も出現頻度が高い数字が等しい場合に2番目に出現頻度が高い数に修正する処理について, なんとなく分岐処理があやしかったので修正して提出したところACとなった.

正答できたとはいえ,なんとなくで修正して提出する非常にあいまいな対処.

D - Robot Arms

入力例2に助けられた. どういったときに条件を達成できないのか考え, 入力例2を考えて, X_i + Y_i の偶奇が等しくなければいけないことに辿りついた.

配点と他の人の解答状況からのメタ読みで, 600点は無理と判断して部分点狙いでいくことに決定. X_i と Y_i が小さいときはどうすれば条件を満たすアームが簡単に構築できるか考えていたら 腕の長さ1のアームをたくさん並べればいけそうだと判断. それに気付いてからは10分かからずに実装して提出,AC.

と中であきらめて他の事をしていたのがもったいなかった.

Harbor 1.1を1.5にアップグレードする

新しくCNCFプロジェクトに入ったHarborを今まで利用してきた1.1から 現時点で最新の1.5.2にアップグレードする. 今後大きく変更が生じることが予測され, 実際1.6からはDBをPostgresqlに移行する計画なので それまでにプロジェクトの構成を確認しておく.

前提

現在は以下の設定で運用している

  • Harbor1.1.1を利用
  • Docker Registryファイルはローカルファイルシステム
  • Notary / Clairは利用していない

これを以下の通りアップグレードする

  • Harbor 1.5.2を利用
  • Docker Registryファイルはローカルファイルシステム
  • Clairのみ利用し,Notaryは利用しない

Docker Registryファイル(おそらくイメージファイル)はS3などに保存することもできるが今回は変更しない. また,Clairのみ有効化する.

アップグレード方針

詳細はドキュメントを参照.ただし,あまり整備されていない様子なので 読み解くのが大変だった(自分は苦労した).

github.com

結論として,マイグレーションの対象は /data/databaseharbor.cfg. NotaryやClairを利用している場合はこれに加えて/data/notary-db/data/clair-dbが増える様子.

上記データをマイグレーションツールのバックアップ機能でバックアップしておき, マイグレーション機能でDBスキーマと設定ファイルを変換した上で Harborをセットアップ・実行することでアップグレードが完了する.

ただし,設定ファイルのマイグレーションは1.2以降からのサポート. このため自分の環境では一度1.1 -> 1.2 にDBスキーマをツールで移行し,設定ファイルを手動で移行する. その後マイグレーションツールを利用して 1.2 -> 1.5にDBスキーマと設定ファイルを自動移行させる.

1.1 -> 1.5に直接移行できればよかったが, 特に1.1の扱いが他のバージョンとは異なる様子. マイグレーションツールで1.5に移行できないのはもちろん, 論理バックアップしても正常にリストアできなかった. このため,1.1の状態では物理バックアップ (/data/database自体をコピーしておく)しておき, 1.2で動作することを確認した状態で論理バックアップなどを行い 1.5へのマイグレーションの準備を整備する.

アップグレード手順

まずはHarbor 1.1のDBの物理バックアップと設定ファイルのバックアップを行う.

$ sudo tar cfz /backup/harbor-database-1.1.1.tar.gz -C /data database
$ sudo cp ~/harbor-1.1.1/harbor.cfg /backup/harbor-1.1.1.cfg

次にHarbor 1.2へのDBスキーマと設定ファイルのマイグレーションを行う. GitHubのリリースページから 1.2.2の(online/offline)インストーラをダウンロードし, ホームディレクトリにharbor-1.2.2とリネームして展開する. DBのマイグレーションは以下のスクリプトを実行する. 設定ファイルは手動で変更する必要があるので, Harbor 1.1に変更を加えた内容に従い, harbor-1.2.2/harbor.cfgに同等の変更を加える.

マイグレーション実行後は, harbor-1.2.2/install.sh を実行し, Harbor 1.2.2が正常に動作することを確認する. docker-compose psですべてのコンテナがUpであること, Harborページにアクセスして画面が表示されることが確認できればおそらく大丈夫. 動作確認後はdocker-compose downでHarborを停止させておく.

Harbor 1.1の状態でDBの物理バックアップは行っているので大丈夫だが, 必要であればこの時点で論理バックアップを行う. 論理バックアップは以下のスクリプトを実行する.

リストアしたい場合は, /data/database以下を削除した上で 以下のリストアスクリプトを実行すればよい.

最後にHarbor 1.5へのマイグレーションを行う. GitHubのリリースページから 1.5.2の(online/offline)インストーラをダウンロードし, ホームディレクトリにharbor-1.5.2とリネームして展開する. harbor-1.2.2/harbor.cfgでharbor-1.5.2/harbor.cfgを上書きし, DBのマイグレーションは以下のスクリプトを実行する. 今回は,設定ファイルも自動マイグレーションしてくれるので1.2時点での設定内容をそのままに, harbor-1.5.2/harbor.cfgを上書きして1.5用に自動修正してくれる.

マイグレーション実行後は, clairを有効にするため以下のスクリプトを実行する.

$ /home/thaim/harbor-1.5.2/install.sh --with-clair

DBおよび設定ファイルのマイグレーションが成功しており, 必要なコンテナやClairの設定が正常終了するとアプリが動作した状態になる. docker-compose -f docker-compose.yml -f docker-compose.clair.yml ps ですべてのコンテナがUpであること, Harborページにアクセスして画面が表示されることが確認して Harbor 1.5へのアップグレードは完了.

おそらく,1.2などで運用していれば問題なかったのだろうが 1.1という中途半端な(?)バージョンで運用していなかったのが問題だった.

IntelliJ IDEAで複数言語混在プロジェクトを作成する

例えば,1つのプロジェクト内にJavaPythonが混在する場合, デフォルトのSDKJavaにするとPythonファイルでモジュールがUnresolved referenceに, SDKPythonにするとJavaのファイルがコンパイルエラーになる.

これを解決するためには,プロジェクトの設定として 利用するコンパイラ(SDK)を複数指定する必要がある.

利用するSDK一覧の定義として, メニューの File -> Project Structure -> Platform Settings -> SDKs に登録する. 例えばOracle JRE8とシステムのPython 3.5など.

f:id:thaim:20180809032957p:plain

その上で,同 Project Structure -> Project Settings -> Modulesにて 対象プロジェクトを選択し, '+'ボタンから上記手順で追加したSDKを指定する.

f:id:thaim:20180809032910p:plain

これで,JavaファイルとPythonファイルを混在させても IDEがいい感じにコンパイラを使い分けてくれる.

参加記録 ABC104

最近のABCは難し過ぎる. ABしか解けなかったけど,これでレート上がるんだから皆解けなかったのだろう.

AB解いて300(10:38), 576th 956 -> 990(+34), パフォーマンス1214

B - AcCepted

正規表現で解けるかな,なんてことは一切考えず愚直に実装した.

'A', 'C'の文字が含まれている位置の確認はともかく, それ以外の文字が小文字であることの確認処理の実装があまり上手くなかった. 'A', 'C'が含まれていることを確認済なので,全文字列の大文字数をカウントする想定実装がシンプルだが 'C'の位置候補でループ処理することしか考えていなかったので 文字列全体のループを別途作る?とか考えていた.

結局提出したのは,'C'の位置だけ記録して,元の文字列全体を小文字化した上で 'A','C'だけ大文字に変換して元の文字列と一致するか確認する方法. 実装直後に想像以上に汚い実装になったので悩んだけれど 結果は正しそうなのでさっさと提出してしまった.

C - All Green

解説の「中途半端に解く配点は1種類以下であり、それ以外の配点は完全に解くかまったく解かない」が全てだと思う. これに気付けなかったので全探索を諦めてしまったし,最後DPで解こうか悩んだ上で実装できなかった. 考えてみれば上記方針はあたりまえなのでこれは気付きたかった.

実装面ではビット操作による全探索に苦手意識があるのと, 完全に解く問題が与えられた上で,残りスコアを中途半端に解く場合に何問解けばいいかを

int need = (G - s + s1 - 1) / s1;

とコンテスト中にさらっと実装するのは無理だったかな,と感じた. どちらもわかっていれば大した事ではないのでしっかりと復習しておく.

D - We Love ABC

方針はCより簡単だった. DPを利用すること,処理した文字列の位置と処理状況を利用すること は比較的早く気付けたが,その後の実装が上手くいかなかった.

解説のように漸化式を上手く構築できればいいけど, 今回のような少し複雑な式になると,まだまだ解けそうにない. このあたりの感覚はもっと多くのDPを解いて慣れるしかないのかと考えてる.

RocketChatの実装を調べたけどわからなかった

前回の続き.

結局FlowRouterの利用設定がおかしいだろうことはわかったけど, 原因は特定できなかった.

おそらく原因は packages/rocketchat-libにあって, 一次的にはgetRouteLinkが返すリンクがおかしい. ただし,getPermaLinkや directoryのリンクであるonTableItemClickのように出力がおかしいものだけでなく, chatNowLinkroomDataのように正常に動作するものもあるので getRouteLinkがおかしいわけではなく, FlowRouterに設定されたルーティング情報がおかしいのだろう.

各種チャンネルはdefaultRoomTypes.jsで定義されているが, この実装であるaddはおそらく正常に動作している. 他の正常に動作するルーティングを定義するrouter.jsと 比べても特におかしいところはない.

むしろこのルーティングのactionであるopenRoomの 実装がおかしいのではないかとは考えたが,これが何をしているかよくわからず, また特段おかしいところも見付けられなかった.

正直なところ,慣れないフロントエンド,初めてのmeteorで 上手く不具合修正できる気がしない. 今後どのようにデバッグすればいいのだろうか.