kakakakakku blog

Weekly Tech Blog: Keep on Learning!

python-docx を使って Python でリッチな Word ドキュメントを作る

python-docx を使うと Python で Word ドキュメントを操作できる.新しく Word ドキュメントを作ることもできるし,既存の Word ドキュメントから文章を抽出することもできる.前に紹介した python-pptx と関連している.最近 PowerPoint の文章を Word に繰り返しコピーする機会があり,作業効率を上げるために python-pptxpython-docx を組み合わせた自動化コードを実装していた.

github.com

python-docx : サンプルコードを実行する

python-docx のドキュメントにサンプルコードが載っている.実装されている機能をザッと箇条書きにすると以下のようになる.

  • 見出し
  • 段落
  • 文字スタイル(太字 / イタリック)
  • 箇条書き
  • 段落番号
  • 画像
  • テーブル
  • 改ページ

python-docx.readthedocs.io

さっそく python-docxpip install してからサンプルコードを実行すると,以下のような demo.docx を作れた!スゴイ!便利!なお,画像を埋め込む実装で monty-truth.png は存在しないため cat.jpg にした.

f:id:kakku22:20201216164902p:plain

サンプルコードも載せておく.

from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

document.add_picture('cat.jpg', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')

python-docx : 他の機能も試す

サンプルコードには入っていなかった他の機能もドキュメントを読みながら試す.

  • テンプレート
    • Document オブジェクトに Word ドキュメントを指定するとテンプレートに書き込める
  • ヘッダー
    • Section オブジェクトから header プロパティにアクセスできる
  • 文字スタイル(サイズ / フォントスタイル)
    • Paragraph オブジェクトから font プロパティにアクセスできる
  • フッター
    • Section オブジェクトから footer プロパティにアクセスできる

今回は「青背景」のテンプレートを作って,Impact フォント(サイズ 50)で「kakakakakku blog」と書き出す.さらに「ヘッダー」「フッター」も書き出す.コードも直感的に読みやすくそこまで違和感なく実装できる.

from docx import Document
from docx.shared import Pt

document = Document('template.docx')
section = document.sections[0]

header = section.header
paragraph = header.paragraphs[0]
paragraph.text = '/// This is Header'

p = document.add_paragraph().add_run('kakakakakku blog')
font = p.font
font.name = 'Impact'
font.size = Pt(50)
font.bold = True

footer = section.footer
paragraph = footer.paragraphs[0]
paragraph.text = '/// This is Footer'

document.save('demo.docx')

コードを実行して demo.docx を開くと以下のようになった(フッターは隠れている).おお!これは便利!

f:id:kakku22:20201216164925p:plain

まとめ

python-docx を使うと Python で Word ドキュメントを操作できる.Word ドキュメントを直接作るのではなく,プログラムから間接的に操作したいときに使える.最近たまたま PowerPoint の文章を Word に繰り返しコピーする機会があり,作業効率を上げることができた.

python-pptx 関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

python-pptx で PowerPoint の「非表示スライド」を判定する

Python で PowerPoint を操作するライブラリ python-pptx は本当に便利で,前に「発表者ノート」を抽出するサンプルコードを紹介したけど,引き続き今も使っている.PowerPoint ファイルの文章レビューを自動化したり,業務で使うスクリプトも増えてきた.作業効率アップにも大きく貢献している.

kakakakakku.hatenablog.com

「非表示スライド」を除外する

最近 python-pptx「非表示スライド」を処理対象から除外する必要があり,ドキュメントを読んだけど,Slide オブジェクトには is_hidden のようなプロパティはなさそうだった.しかし python-pptx の仕組みを調べていたら,Slide オブジェクトの内部的な Schema 構造に show という属性を発見した.

<xsd:complexType name="CT_Slide">
  <xsd:attribute name="show" type="xsd:boolean" default="true"/>
</xsd:complexType>

そこで Slide オブジェクトに対して _element.get('show') を実装すれば「非表示スライド」を判定できるようになる.動作確認をしたところ,返り値は None(通常)と '0'(非表示)だった.サンプルコード title.py を載せておく.

from pptx import Presentation

presentation = Presentation('example.pptx')

for slide in presentation.slides:
    if slide._element.get('show') is None:
        print(slide.shapes.title.text)

動作確認をする

動作確認のために以下のようなスライド example.pptx を作った.2ページ目を「非表示スライド」にしてある.

f:id:kakku22:20201211003122p:plain

サンプルコード title.py を実行すると,2ページ目を除外できた.

$ python title.py
slide title 1
slide title 3

まとめ

python-pptx「非表示スライド」を判定する Tips は知っておくと便利!引き続き python-pptx を使っていくぞー!

DevOps Topologies : DevOps 文化を築くベストプラクティスな組織構造とは

DevOps 文化を築くときに知っておくと便利なサイト「DevOps Topologies」を読んだ.「アンチパターン = DevOps Anti-Types」な組織構造(計7種類)と「ベストプラクティス = DevOps Team Topologies」な組織構造(計9種類)が紹介されている.サイトではそれぞれの組織構造の解説と関係性を図解した絵が載っていてわかりやすい!本記事ではサイトを翻訳するのではなく,あくまで個人的なメモとしてまとめる.なお,日本語訳も参考程度に載せておいた!

web.devopstopologies.com

目次

  • 1. DevOps Anti-Types
    • Anti-Type A: Dev and Ops Silos(Dev と Ops のサイロ化)
    • Anti-Type B: DevOps Team Silo(DevOps チームのサイロ化)
    • Anti-Type C: Dev Don't Need Ops(Dev が Ops を必要としない)
    • Anti-Type D: DevOps as Tools Team(ツールチームとしての DevOps)
    • Anti-Type E: Rebranded SysAdmin(リブランディングした SysAdmin)
    • Anti-Type F: Ops Embedded in Dev Team(Dev に組み込まれた Ops)
    • Anti-Type G: Dev and DBA Silos(Dev と DBA のサイロ化)
  • 2. DevOps Team Topologies
    • Type 1: Dev and Ops Collaboration(Dev と Ops のコラボレーション)
    • Type 2: Fully Shared Ops Responsibilities(完全に共有された Ops 責任)
    • Type 3: Ops as Infrastructure-as-a-Service(IaaS としての Ops)
    • Type 4: DevOps as an External Service(外部サービスとしての DevOps)
    • Type 5: DevOps Team with an Expiry Date(有効期限のある DevOps チーム)
    • Type 6: DevOps Advocacy Team(DevOps 推進チーム)
    • Type 7: SRE Team(SRE チーム)
    • Type 8: Container-Driven Collaboration(コンテナ駆動コラボレーション)
    • Type 9: Dev and DBA Collaboration(Dev と DBA のコラボレーション)

1. DevOps Anti-Types

🌀 Anti-Type A: Dev and Ops Silos(Dev と Ops のサイロ化)

「Anti-Type A: Dev and Ops Silos」は,よく知られた Dev と Ops の間に壁があるような状況で,お互いにコンテキストが合わないためにソフトウェアの開発と運用に問題が出てしまう.2009年に Flickr によって提唱された「Dev and Ops」に似ていると思う.

🌀 Anti-Type B: DevOps Team Silo(DevOps チームのサイロ化)

「Anti-Type B: DevOps Team Silo」は,独立した「DevOps チーム」が作られて,また別のサイロ化が進んでしまう状況のことを表現している.単純に「DevOps」というバズワードに翻弄されている可能性もあるし,僕自身も数年前に「DevOps Engineer」という肩書を使っていた経験もあり実際の現場ではよくありそう!ただ一時的に「Dev と Ops を近付ける目的」「DevOps チーム」を作るのは効果があるとも書かれている.その場合は,後半に出てくるベストプラクティス「Type 5: DevOps Team with an Expiry Date」となる.

個人的には以下の Netflix のプレゼンテーション「How Netflix Thinks of DevOps」に出てくる「DON'T DEVOPS / DO CULTURE」というフレーズが好きで,この YouTube は何度も繰り返し観ている.おすすめ!

www.youtube.com

🌀 Anti-Type C: Dev Don't Need Ops(Dev が Ops を必要としない)

「Anti-Type C: Dev Don't Need Ops」は,Dev 主導で DevOps を実現する組織構造となり,最初はベストプラクティスなのでは?と感じたけど,意味としては,例えば「クラウドを使えば Ops は不要」というような思想から「運用の必要性」を過小評価してしまっている状況のことを表現している.その後,運用の波が押し寄せて,ある意味で現実を知ることになると「Type 3: Ops as Infrastructure-as-a-Service」「Type 4: DevOps as an External Service」に進化していく.

🌀 Anti-Type D: DevOps as Tools Team(ツールチームとしての DevOps)

DevOps を実現するために,例えば「継続的デリバリーパイプライン」を構築したり,「構成管理」の仕組みを作ったり,自動化ツールの開発にフォーカスしすぎてしまう状況のことを表現している.個人的には「Anti-Type B: DevOps Team Silo」にも似ていると感じた.当然ながらツールチェーンが整うことによる価値はあるけど,Dev と Ops のコラボレーションが実現できない点に再検討の余地がある.

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

  • 作者:Kief Morris
  • 発売日: 2017/03/18
  • メディア: 単行本(ソフトカバー)

🌀 Anti-Type E: Rebranded SysAdmin(リブランディングした SysAdmin)

よく知られた SysAdmin(システム管理者)という役割をリブランディングして DevOps(やることは SysAdmin と同じ)として採用を進めているような状況のことを表現している.エンジニアリングの成熟度が低い組織で起きると書いてある.重要なのは,役割をリブランディングしただけでは「文化的/組織的な価値」は生まれないことだと思う.「Anti-Type A: Dev and Ops Silos」「Anti-Type C: Dev Don't Need Ops」にも関連するけど「DevOps」というバズワードに翻弄されていると Anti-Type に近付いてしまう.

🌀 Anti-Type F: Ops Embedded in Dev Team(Dev に組み込まれた Ops)

組織は Ops を長く存続させたくなく,Dev に「インフラ構築」「モニタリング」などを担当させる.しかし,プロダクト主導で行うと中途半端になる可能性があると書いてある.解説では,後半に出てくる「Type 2: Fully Shared Ops Responsibilities」とは違うと書いてある.ようするに「中途半端になるな!」ということだと理解したけど,個人的にはベストプラクティスなのでは?と感じたし,わかりにくかった.

🌀 Anti-Type G: Dev and DBA Silos(Dev と DBA のサイロ化)

レガシーで大規模な組織構造において,専任の DBA (Database Administrator) がデータベース関連タスクを担当している状況のことを表現している.重要なのは DBA の良し悪しではなく,データベースに関係するリリースの全てを DBA に頼むため,継続的デリバリーの観点で DBA がボトルネックになってしまう.過去に似た経験もあり,イメージしやすかった.

2. DevOps Team Topologies

次に「ベストプラクティス = DevOps Team Topologies」を紹介する.それぞれに「Potential effectiveness(潜在的な有効性)」という効果を表す指標も載っている.

⭐️ Type 1: Dev and Ops Collaboration(Dev と Ops のコラボレーション)

  • Potential effectiveness: HIGH

「Anti-Type A: Dev and Ops Silos」で紹介した「Dev and Ops」に載っている DevOps のイメージに非常に近いと思う.Dev と Ops がコラボレーションをしながら,それぞれの技術的な専門性を共有していく.具体的な例としては,Dev はログのことを深く考えて実装したり,Ops は TDD (Test-Driven Development) を理解したり Git の操作に慣れたりすると書いてある.

⭐️ Type 2: Fully Shared Ops Responsibilities(完全に共有された Ops 責任)

  • Potential effectiveness: HIGH

Dev と Ops の役割が完全に共有(オーバーラップ)されている.チーム全員が同じ目標に向けて集中している.Netflix や Facebook などウェブサービスを提供していると実現しやすいけど,多くの場合では適用しにくく「Type 1: Dev and Ops Collaboration」のように Dev と Ops の役割は分割されていくと書いてある.本当?個人的には1番好きな組織構造だと感じた.関連した役割としては Netflix の提唱する「Full Cycle Developers」という考え方もとても好き!

netflixtechblog.com

⭐️ Type 3: Ops as Infrastructure-as-a-Service(IaaS としての Ops)

  • Potential effectiveness: MEDIUM

クラウドを活用することにより,アプリケーションをデプロイしたり,拡張性を高めることができる.特にコードでインフラを操作できるようになるため,Dev が運用のことを考えながら進めやすくなる.納得できる内容だった.最初から「Type 1: Dev and Ops Collaboration」に挑戦するよりも素早く価値を引き出せると書いてある.

⭐️ Type 4: DevOps as an External Service(外部サービスとしての DevOps)

  • Potential effectiveness: MEDIUM

特に小規模な組織だと,ソフトウェアの運用を主導するための資金や経験やメンバーがいない場合がある.そこで,例えば Rackspace などのサービスプロバイダーと連携をして,サポートを受けながら学んでいく.その後「Type 3: Ops as Infrastructure-as-a-Service」もしくは「Type 1: Dev and Ops Collaboration」に移行していく.

⭐️ Type 5: DevOps Team with an Expiry Date(有効期限のある DevOps チーム)

  • Potential effectiveness: LOW to HIGH

組織構造としては「Anti-Type B: DevOps Team Silo」に似ているけど,チームとしての寿命が異なる.最終的にベストプラクティスの「Type 1: Dev and Ops Collaboration」「Type 2: Fully Shared Ops Responsibilities」を目指すために一時的な責任を与える.コラボレーションを実現するために「スタンドアップ」「カンバン」などの DevOps プラクティスを組織に広めていく.さらに技術的な検証や実装も進めていく.「Anti-Type B: DevOps Team Silo」にならないように気を付ける.

⭐️ Type 6: DevOps Advocacy Team(DevOps 推進チーム)

  • Potential effectiveness: MEDIUM to HIGH

「Type 5: DevOps Team with an Expiry Date」で長期的な責任を与えるべきではないと書いてあったけど「Type 6: DevOps Advocacy Team」は,継続的に Dev と Ops のコラボレーションを推進する役割を担当する.DevOps プラクティスを組織に広めていくことから「DevOps 推進者(アドボケイト)」と呼ばれることもあると書いてある.「Anti-Type B: DevOps Team Silo」にならないように気を付ける.

⭐️ Type 7: SRE Team(SRE チーム)

  • Potential effectiveness: LOW to HIGH

DevOps では,Dev もオンコール(障害対応)に参加することが推奨されている.例えば Google により提唱されている SRE (Site Reliability Engineering) モデルを採用して,ソフトウェア開発に対してサポートを受けることもできる.サイトに載っている図解によると Dev / Ops / DevOps / SRE それぞれの役割が少しずつオーバーラップしている.さらに SRE はコード(実装)の見直しまで手を出す点もポイントと言える.「Anti-Type A: Dev and Ops Silos」にならないように気を付ける.

⭐️ Type 8: Container-Driven Collaboration(コンテナ駆動コラボレーション)

  • Potential effectiveness: MEDIUM to HIGH

Kubernetes の普及など,コンテナワークロードが一般的になった今,アプリケーションのデプロイやランタイム要件をコンテナイメージとしてカプセル化できるようになった.エンジニアリング文化をうまく築けていると,コンテナは Dev と Ops の境界として機能すると書いてある.しかし,コンテナワークロード特有の運用もあることも忘れないこと!「Anti-Type A: Dev and Ops Silos」にならないように気を付ける.

⭐️ Type 9: Dev and DBA Collaboration(Dev と DBA のコラボレーション)

  • Potential effectiveness: MEDIUM

Dev と DBA (Database Administrator) の溝を埋めるために,能力を補完しながらコラボレーションを実現する.大規模なデータベースを管理している組織に適していると書いてある.それ以上は具体的に書かれてなく,少しイメージしにくかった.「Anti-Type G: Dev and DBA Silos」にならないように気を付ける.

まとめ

DevOps 文化を築くときに知っておくと便利なサイト「DevOps Topologies」を読んだ.実際に組織構造がパターン化されているとイメージしやすく,再利用性も高そうに感じた.興味があったら是非サイトを見てみてもらえればと!

web.devopstopologies.com

関連記事

今思うと,数年前に経験した「DevOps 推進タスク」「Type 5: DevOps Team with an Expiry Date(有効期限のある DevOps チーム)」に似ているように感じた.

kakakakakku.hatenablog.com

コラボレーションを実現するなら「Effective DevOps」も合わせて読むと良さそう!

kakakakakku.hatenablog.com

「5分あったらやること」をリストアップしよう /『「ひとり会議」の教科書』を読んだ

書籍名に惹かれて『1日10分であらゆる問題がスッキリする「ひとり会議」の教科書』を読んだ.「ひとり会議」とは「積極的にテーマを持って自分に質問を投げかける場」のことで,簡単な「セルフコーチング」と表現しても良さそう.

僕自身,平日は朝イチに「メモ帳」に1日の TODO を書き出しているし,毎週日曜日 22:00 頃に「1週間の振り返り」をする生活をかれこれ「5年以上」も続けているほどには習慣化できている.だからこそ,本書で紹介されていた多くの TODO は日常的に意識できているものだったけど,その中でも特に印象に残った「2点」TODO を紹介する.

📝 目次

本書は全体的にカジュアルな文章で,文字数は少なく,挿絵もあり,スラスラと読める.1時間もあればザッと読み終わると思う.また本書には「やってみよう」というアクティビティとして,多くの「TODO」が紹介されている.気になった TODO は実際に書き出してみたりした.読むだけではなく,アクションに繋げると効果的だと思う.

  • Chapter.1「ひとり会議をはじめる」
  • Chapter.2「5つのひとり会議」
    • 手法 1「テーマ会議」
    • 手法 2「問題対策会議」
    • 手法 3「フリー会議」
    • 手法 4「スケジュール会議」
    • 手法 5「情報収集会議」
  • Chapter.3「ひとり会議後の仕事術」
  • Chapter.4「自分を見つめるひとり会議デラックス」

📝 5分あったらやること

「スケジュール会議のコツ」の中に「ワクワクは仕込むもの」という話があり,そこに以下の TODO が載っていた.そして「時間ができたらやろう」では「はじまらない」とも書いてあり大好きなフレーズだった.

1.「5分あったらやること」をリストアップする。

Trello を使ってタスク管理をしていて,できる限り「粒度を細かく」するように意識している.個人的に「タスクに着手するまでに時間が掛かるタイプ」なので,定期的に読み直している「小さな習慣」を参考に「小さすぎて失敗すらできない」ことを意識していたつもりだったけど,最近また粒度が大きくなっているような気がしていた.今回改めて具体的な「5分」という指標に出会えてやり直すことにした.また実験的に Trello に新しく「5 minutes」リストも作った.業務関連や日常生活や気分転換など,幅広く活用してみて効果を検証したい.

kakakakakku.hatenablog.com

📝 どうしたら楽しくなるか?

同じく「ワクワクは仕込むもの」という話の中に以下の TODO も載っていた.

2.「今日一日、どうしたら楽しくなるか?」を考える時間を持つ。

朝イチに TODO を書き出したり,毎週日曜日に「1週間の振り返り」をしていても,ほとんど「自分は成果を出せているか?」「自分は成長できているか?」「自分は次は何に挑戦したいか?」という視点を軸にしていて「どうしたら楽しくなるか?」という視点で考えたことはなかった.本書を読みながら,そもそも僕自身「楽しい」という感情をあまり持っていないことにも気付けた.まずは「楽しさ」を自分の中で定義するところからはじめつつ,考える時間も少しずつ取り入れていきたい.

📝 まとめ

書籍名に惹かれて『1日10分であらゆる問題がスッキリする「ひとり会議」の教科書』を読んだ.自分自身を「振り返る」ことや「セルフコーチング」に興味がある人は読んでみると良さそう!

複数ユーザーでも簡単に画面共有ができる「Screego」を試した

リモートで働くことが増えたであろう今年は「画面共有」を使う機会も増えたと思う.例えば,ミーティング中に資料を投影したり,リモートペアプロ(モブプロ)をしたり.僕自身は技術講師として,演習中にトラブルになっているお客様の問題解決をするときにも「画面共有」をよく使う.ツールで言えば,Zoom / Discord / Amazon Chime / Microsoft Teams / Google Meet / Screenleap など,選択肢はいろいろあるけど,今回は Go で実装された OSS の画面共有ツール「Screego」を試す.

github.com

🖥 Screego の特徴

「Screego」のドキュメントには以下「5種類」の特徴が載っている.参考として日本語訳も載せておく.また「Screego」を支える要素技術として STUN (Session Traversal Utilities for NAT)TURN (Traversal Using Relays around NAT) の紹介もドキュメントに載っている.

  • Multi User Screenshare(複数ユーザーでの画面共有)
  • Secure transfer via WebRTC(WebRTC でセキュアな転送)
  • Low latency / High resolution(低遅延 / 高解像度)
  • Simple Install via Docker / single binary(Docker で簡単にインストール / シングルバイナリ)
  • Integrated TURN Server see NAT Traversal(統合された TURN サーバーで NAT トラバーサルをする)

screego.net

🖥 Screego を試す

「Screego」のデモサイトが公開されているため,簡単に試せる.

app.screego.net

デモサイトにアクセスして,そのまま「CREATE ROOM」ボタンを押せばすぐに使える.id は slim-tan-weasel など,毎回ランダムな単語の組み合わせで生成されるし,自分で指定することもできる.簡単!

f:id:kakku22:20201130001315p:plain

最初は「no stream available」と表示されるので,画面下(1番左)の「Start Presentation」ボタンを押して「画面共有」を開始する.

f:id:kakku22:20201130001410p:plain

今回はサンプルとして「Screego」のコードを VS Code で表示しているウィンドウを画面共有している.以下のスクリーンショットは別ブラウザで画面共有を見る側の視点で取得した.「Screego」の特徴にも載っている通り,コードを操作しても遅延はほとんど感じなかった.とは言え,今回の検証環境は同じネットワーク上に存在する macOS 同士になるため,正確な結果とは言えないと思う.

f:id:kakku22:20201130002006p:plain

🖥 複数ユーザーでの画面共有を試す

「Screego」の特徴に載っている「Multi User Screenshare(複数ユーザーでの画面共有)」も試す.今度は画面共有を見る側から kakakakakku blog を表示したブラウザを画面共有する.すると右下にピクチャ・イン・ピクチャのような UI で表示された.これは便利!クリックするとメインの画面共有と入れ替えることもできる.

f:id:kakku22:20201130002920p:plain

🖥 まとめ

Go で実装された OSS の画面共有ツール「Screego」をデモサイトで試した.簡単に使えるし,複数ユーザーでの画面共有は便利だし,機能面では使えそうだった.そして「Screego」の特徴にも載っていた通り,Docker で簡単にインストールできるため,次は自分専用の「Screego」環境を構築してみようと思う.

関連記事

tailscale.com