Emacs org-mode を使った仕事の進め方例(2021年)
はじめに
以前 ↑ の org-mode ブログを書きました。 そこから転職して 2年ほど経った今でも org-mode を仕事で活用しています。
org-agenda他 の今の使い方をまとめてみます。
(前提) 今の仕事
プロジェクト/活動 単位で orgファイル作成
orgファイルはプロジェクト(ほか社内活動)単位で作成します。
命名規則は特にありません。
switch-to-buffer で移動(検索)しやすいバッファ名であれば良いです。
※ バッファ移動時の検索含め、 補完と検索は Counsel を入れています。便利です。 (参考: Emacsの補完と検索を超強化する - Qiita)
orgファイルは 全て ~/org 配下へ
プロジェクトごとにフォルダは基本作りません。 全ての orgファイルは ↓のように雑に置きます。

雑に置いても org-agenda という TODOタスクを集約してくれる機能が
あるので問題有りません。
ヘッドラインにTODOステータスを付与してタスク管理
おおよそ全てのプロジェクトバッファは 以下のような構成です。TODOキーワードをカスタマイズしています。

トップレベルは PROJECT ステータスに設定。
その配下のタスクに TODO や DONE などのステータスを付与して
タスク管理していきます。
ときには、いくつかの子タスクに分ける必要がある
大きなタスク(サブプロジェクト)が出てきます。
その場合は --SUBPJ キーワードを付与、その配下にTODOタスクを配置・管理します。
カスタマイズしている TODO/DONEステータスは以下の通り。
| キーワード | org-agenda 表示 | 備考 |
|---|---|---|
| PROJECT | yes | プロジェクト |
| –SUBPJ | yes | サブプロジェクト |
| TODO | yes | タスクステータス: TODO |
| DOING | yes | タスクステータス: 集中して作業している |
| WAIT | yes | タスクステータス: 相手のレスポンス待ち |
| TREATED | yes | タスクステータス: 作業完了。相手の確認待ち |
| ROUTINE | yes | タスクステータス: 定期的に行わないといけない作業 |
| REMIND | yes | リマインド: org-capture用 |
| DONE | no | タスクステータス: 完了 |
| SOMEDAY | no | タスクステータス: いつかやる |
▼ 色分け

※ TODOステータス/色のカスタマイズ方法は以下参照
org-agenda で各タスクを俯瞰
org-agenda は TODOタスクの集約表示を実現します。 タスク管理 効率化を実現できる org-mode の主要機能です。
︙

仕事始めや、作業の区切りに org-agenda を開きます。 タスクを把握したり、ステータスをアップデートしたりします。
ほか細かい話
お世話になっている org-mode の機能を紹介します。 とくにカスタマイズしているわけではないので簡潔に説明します。
- Capture
- 社内関連の(ちょっとした)タスクを登録するときに使います
- Clocking Work Time
- 工数を計測する必要のあるプロジェクトで使います
- Hyperlinks
- URLやローカルファイルのパスなど、 プロジェクトに関わる情報を全て orgファイルに集約します
- Tables
- 随所で使います
- Org-mode のテーブル編集に慣れるともう離れられません
- Markdown Export
- Working with Source Code
おわりに
引き続き org-mode を愛用していきます。
My Ciscoルータのインターネット(PPPoE)接続設定 【レオネット編、フレッツ光編】
Table of Contents
概要
去年に Cisco C841Mルータ (Amazonリンク) を購入して インターネット接続用ルータとして使用しています。

もともとレオ○レス回線(レオネット) 環境で利用していましたが、 引っ越しがあり現在はフレッツ光環境です。
その2環境でのCiscoルータのConfigを以降セクションで書き記します。
共通設定
C891M は下記の通り WAN側インターフェイスとして GigabitEthernet × 2、 LAN側インターフェイスとして GigabitEthernet × 4の構成です。

今回は
- GE0 … 無線AP接続用
- GE1 … デスクトップPC接続用
- GE2 … Nintendo Switch 接続用
- GE3 … 未使用 (ハブ導入予定)
- GE4 … 未使用
- GE5 … インターネット接続用
として各ポートを設定します。
論理構成図は下記のとおりです。

- ローカル側IPアドレスは 192.168.10.0/24 とします
- 管理用のルータIPアドレスは 192.168.10.254 とします
- PCなど各種デバイスには DHCPでIPアドレス (.1~.99)を割り当てます
- NAPT(Network Address and Port Translation) を使って PCやその他デバイスがインターネット接続できるようにします
VLAN1 設定
interface Vlan1
ip address 192.168.10.254 255.255.255.0
PortFast 設定
interface range GigabitEthernet0/0-3
spanning-tree portfast
GE0,1,2,3 に対して PortFast を有効にします。
PortFast が無効になっている状態だと、PCを起動した際に DHCPによるIPアドレス取得、 通信可能まで時間がかかります。
PC、サーバ、ルータ等が接続するアクセスポートにこのPortFastの設定をするのが一般的です。 (引用: https://www.infraexpert.com/study/stpz7.html)
DHCP 設定
ip dhcp excluded-address 192.168.10.100 192.168.10.254
!
ip dhcp pool local
network 192.168.10.0 255.255.255.0
default-router 192.168.10.254
dns-server 8.8.8.8
lease 0 12
!
- DHCPによるIP割り当てから 192.168.10.100~192.168.10.254 を除外します
- DHCPプール "local" を作成します
- 192.168.10.0/24 の範囲でIPアドレスを割り当てます (上記制約より末尾 .1~.99 が割り当て範囲)
- デフォルトゲートウェイは ルータ自身とします
- DNSサーバは 8.8.8.8 (Google Public DNS) とします
- 割り当てたIPアドレスの有効期限は 12時間とします
設定 (レオネット編)
レオネット はレオ○レス入居者が使えるインターネットサービスです。 このように壁にLANケーブルがにゅっと出ています。

本来はこれにレオ○レス備え付けの Life Stick を接続して テレビ画面上でYoutube を見たり Wi-Fi機能を利用したりできます。
Life Stickは使わず、このLANケーブルを C841Mのルーテッドポート(GE5) に接続します。

ルーテッドポート(GE5) 設定
interface GigabitEthernet0/5
ip address dhcp
※レオネット・壁から伸びているLANケーブルについて
- 少なくとも自分の環境では DHCPによるIPアドレス取得は 1つまでみたいです
- 入手したIPアドレスはあくまで "レオネットのローカルエリア内IPアドレス" であり、グローバルIPアドレスではありません
- 接続後 レオネット専用ベージにて入居者情報を入力することで インターネット接続が可能となります
ルーティング 設定
ip route 0.0.0.0 0.0.0.0 dhcp
- デフォルトゲートウェイとして DHCPサーバ(レオネット) から貰った情報を利用する
NAPT 設定
access-list 1 permit 192.168.10.0 0.0.0.255
ip nat inside source list 1 interface GigabitEthernet0/5 overload
!
interface GigabitEthernet0/5
ip nat outside
!
interface Vlan1
ip nat inside
!
- NAT変換対象となるアドレス範囲(192.168.10.0/24) を ACL1 に記述します
- NAPT設定。ACL1 と GE5インターフェイスを関連付けます
- GE5 を外部ネットワークに指定します
- Vlan1 を内部ネットワークに指定します
設定 (フレッツ光編)
まともな回線になった現在の物理構成図を載せます。

レオネット環境との違い、考慮する点は下記のとおりです。
- レオネット環境はWAN側ポート (GE5) はDHCPクライアントの設定でしたが、 フレッツ光環境は PPPoE(Point-to-Point Protocol over Etherne) 設定を入れます
- レオネット環境と違い、WAN側ポートにはグローバルIPアドレスが割り当てられるため、 セキュリティ設定が必要です
ルーテッドポート(GE5) 設定
interface GigabitEthernet0/5
pppoe enable group global
pppoe-client dial-pool-number 1
- GE5 にて PPPoE 設定を有効化します
- GE5 と dial-pool-number が1の論理インターフェイス(=Dialer 1) を関連付けます
PPPoE 設定
interface Vlan1
mtu 1454
!
dialer-list 1 protocol ip permit
!
interface Dialer1
ip address negotiated
mtu 1454
encapsulation ppp
dialer pool 1
dialer-group 1
ppp authentication chap callin
ppp chap hostname xxxxxxxx@xxx.net
ppp chap password 0 yyyyyyyy
- MTU を 1414バイトとします
- IPトラフィックを対象とする dialer-list 1 を設定します
- Dialer 1にて下記設定を行います
- PPPoE セッション確立時にIPアドレスを要求します
- MTU(Maximum Transmission Unit) を 1454バイトとします
- PPPでカプセル化を行います
- Dialer 1の dial-pool-numberを 1に指定します
- Dialer 1から出ていくトラフィックとして dialer-list 1 を設定します
- ISP(Internet Service Provider) と行う認証として CHAP (Challenge-Handshake Authentication Protocol) を使用します
- CHAP認証のホスト名を記載します
- CHAP認証のパスワードを記載します
ルーティング 設定
ip route 0.0.0.0 0.0.0.0 Dialer1
- デフォルトゲートウェイとして Dialer 1を指定します
NAPT 設定
access-list 1 permit 192.168.10.0 0.0.0.255
!
ip nat inside source list 1 interface Dialer1 overload
!
interface Dialer1
ip nat outside
!
interface Vlan1
ip nat inside
- NAT変換対象となるアドレス範囲(192.168.10.0/24) を ACL1 に記述します
- NAPT設定。ACL1 と Dialer 1を関連付けます
- Dialer 1 を外部ネットワークに指定します
- Vlan1 を内部ネットワークに指定します
セキュリティ 設定
前述の通り WAN側ポートにはグローバルIPアドレスが割り当てられるため、 セキュリティ設定が必要となってきます。
今回は Ciscoの CBAC(Context-Based Access Control) という機能を使います。 CBAC を使うことで、
- LANから WANに向かう通信、およびその戻りの通信 を許可する
- 外部から開始された通信は一部を除いて拒否する
といったFirewall 同等のステートフルな制御が可能となります。 (参考: https://www.infraexpert.com/study/aclz15.html)
Config は下記の通りです。
ip access-list extended EX
permit icmp any any echo
!
ip inspect name CBAC tcp
ip inspect name CBAC udp
ip inspect name CBAC ftp
ip inspect name CBAC icmp
!
interface Dialer1
ip access-group EX in
ip inspect CBAC out
!
- echo要求のみを許可する ACL(EX) を作成します
- 検査対象のプロトコルとして TCP,UDP,FTP,ICMP を指定するルール "CBAC" を作成します
- Dialer 1 に入ってくる通信に対して ACL(EX) を適用します
- Dialer 1 から出ていく通信に対して CBAC を適用します
これで下図のように、LANからWANに向かう通信①、およびその戻りの通信②は CBACによって許可され、外部から開始された通信③は ACL(EX)によって (echo要求以外は) 拒否されます。

まとめ
最後にレオネット環境とフレッツ光環境の Config 差異を載せます (左:レオネット、右:フレッツ光)。

https://i.imgur.com/O147sMq.png
Config 量にもでていますが、フレッツ光環境の構築は割と大変でした。 久しぶりにPPPoEの設定をしたり、初めて CBAC を利用したりと苦戦しましたが勉強になりました。
その分 回線速度アップやグローバルIPアドレスゲットなど、 レオネット環境と比べてリターンが大きいです。
今後はせっかくグローバルIPを取得できたので、何かしらWebサーバを公開できたらなと思っているところです。
AWS CLIでVPCなどを作成する (+ チートシート)
Table of Contents
CLI でどんどん要素を作成していくと、何を作成したか分からなくなることが多い。
そのため、作成した要素を確認・整理できるスクリプトなどを作成しながら作業した。
▼環境
- OS: Windows 10
- 使用ツール: AWS CLI, AWS Tools for Powershell
参考: https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-subnets-commands-example.html
実行手順
1. VPC作成
- VPC 作成:
aws ec2 create-vpc --cidr-block 10.0.0.0/16
2. サブネット作成
- サブネット 作成:
aws ec2 create-subnet --vpc-id vpc-xxxxx --cidr-block 10.0.1.0/24
3. IGW作成
- IGW 作成:
aws ec2 create-internet-gateway - IGW アタッチ:
aws ec2 attach-internet-gateway --vpc-id vpc-xxxxx --internet-gateway-id igw-xxxxx
4. ルートテーブル
- ルートテーブル 作成:
aws ec2 create-route-table --vpc-id vpc-xxxxx - ルート 作成:
aws ec2 create-route --route-table-id rtb-xxxxx --destination-cidr-block 0.0.0.0/0 --gateway-id igw-xxxxx - ルートテーブル 割当:
aws ec2 associate-route-table --subnet-id subnet-xxxxx --route-table-id rtb-xxxxx - 最後に > サブネットに自動パブリック割当設定:
aws ec2 modify-subnet-attribute --subnet-id subnet-xxxxx --map-public-ip-on-launch
チートシート (PowerShell)
確認用スクリプトは使い慣れてる PowerShell (AWS Tools for PowerShell) で作成。
▼ VPC情報取得
- 作成しているVPCすべてのCIDR、ID をリスト
Get-EC2Vpc | %{$_.CidrBlock + "`t" + $_.VpcId}
▼ サブネット情報取得
- 作成しているサブネットすべてのCIDR、AZ、ID をリスト
Get-EC2Subnet | %{$_.CidrBlock + "`t" + $_.AvailabilityZone + "`t" + $_.SubnetId}
▼ IGW 情報取得
- 作成しているIGWすべてのID、アタッチ先をリスト
Get-EC2InternetGateway | %{$_.InternetGatewayId + "`t" + $_.Attachments.VpcId}
▼ ルートテーブル 情報取得
- 作成しているルートテーブルすべての ID、作成先VPC、サブネット関連付け、ルート情報をリスト
foreach($table in Get-EC2RouteTable){ echo "`n### $($table.RouteTableId)" echo " - VpcId: $($table.VpcId)" echo " - Subnet Associations:" foreach($as in $table.Associations){ echo " + $($as.SubnetId) (VpcMain: $($as.Main))" } echo " - Routes:" foreach($rt in $table.Routes){ echo " + $($rt.DestinationCidrBlock) --> $($rt.GatewayId)" } }
↓以下のような出力になる
### rtb-aaaaa
- VpcId: vpc-aaaaa
- Subnet Associations:
+ (VpcMain: True)
- Routes:
+ 172.31.0.0/16 --> local
+ 0.0.0.0/0 --> igw-aaaaa
### rtb-bbbbb
- VpcId: vpc-bbbbb
- Subnet Associations:
+ (VpcMain: True)
- Routes:
+ 10.0.0.0/16 --> local
### rtb-ccccc
- VpcId: vpc-ccccc
- Subnet Associations:
+ subnet-ccccc (VpcMain: False)
- Routes:
+ 10.0.0.0/16 --> local
+ 0.0.0.0/0 --> igw-ccccc
▼他: Nameタグを付ける関数
# -id ... Nameタグを付けるリソースID # -name ... Name Key のValue function Aws-SetNameTag($id, $name){ $tag = New-Object Amazon.EC2.Model.Tag $tag.Key = "Name" $tag.Value = $name New-EC2Tag -Resource $id -Tag $tag }
Ansible 紹介
- 社内でプレゼンしたAnsible紹介の Markdown 出力版
- Ansible とは?メリットは? といった人向け
- ※プレゼン対象の業務内容上、システム運用面のメリットを特に説明している
Ansible とは
Ansible はRedHat社が開発する オープンソースの構成管理ツール
- 多数のサーバやネットワーク機器、クラウドインフラを統一的に制御ができる
- Ansible Engine: Ansible の有償版 (サポート付)

主要な構成要素
- Inventory: 管理対象ノードの一覧を記述したもの
- Playbook: 一連の処理の流れを記述したもの
- Module: 機器設定、制御のためのコマンド

Ansible の特徴
▼エージェントレス
- 管理対象のサーバにエージェントを入れる必要が無い
- 基本的にSSH接続ができれば良い
▼YAML

▼冪(べき)等性
- Playbook を何回実行しても結果(サーバの状態) は変わらない性質
- → Playbook = サーバのあるべき状態
- 「バッチファイルを誤って2回実行してしまい、予期せぬ不具合が起きた」といったことが Ansible では起きない

Ansible Tower とは
URL: https://www.ansible.com/products/tower
Ansible Towerは Ansible の機能拡張製品
- WebGUI 上で操作
- プロジェクトを作成して各ジョブ(Playbook) を管理
- 数クリックでジョブを実行可能
- ジョブのスケジューリング機能
- アカウント毎にジョブ実行権限の設定
Ansible のメリット
Ansible によって、「自動化手法の標準化」ができる
- 自動化の作り方
- 自動化の実行方法
1. 自動化の作り方
▼今まで
- 人・機種によってツールや書き方が異なる (bat, ps1, sh, …)
- サイロ化、属人化が起きやすい
▼Ansible Engine によって
- 全員が同じ方法で自動化ドキュメントを作成できる
→ 共通のコマンドリファレンス (Ansible Document)
→ 共通の文法 (YAML)
2. 自動化の実行方法
▼今まで
- 機器によってログイン方法が異なる (SSH, RDP, Web, …)
- 機器ごとの操作手順書、オペレータの負担
▼Ansible Tower によって
- 全員が同じ方法で自動化を実行できる
まとめ
▼Ansible のメリット
- 導入が容易: エージェントレス
- 属人化を回避: 共通の書式, 共通のリファレンス
- ジョブ実行ミスを回避: 冪等性
▼Ansible Tower のメリット
- オペレータ負担の軽減: 様々な機器に対して、共通のジョブ実行方法
- 適切な権限設定: アカウント毎のジョブ実行権限
Pythonスクリプトで Imgurに画像を匿名投稿
はじめに
- 目的: コマンドラインから画像を投稿する
▼環境
1. Imgur アカウント登録
API 利用のために Imgur アカウントを作成する

2. Imgur アプリ登録
下記サイトからアプリ登録を行う

登録後 表示される ClientID, ClientSecret をメモ
3. API 実行
公式の Python ライブラリを利用
▼ライブラリインストール
pip install imgurpython
▼コード
import sys from imgurpython import ImgurClient # 画像パスの指定 args = sys.argv image_path = args[1] print("image_path: " + image_path) # ImgurClient 作成 client_id = 'XXXXXXXXXXXXXXXX' client_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' client = ImgurClient(client_id, client_secret) # 画像アップロード print("# uploading ...") image = client.upload_from_path(image_path, config=None, anon=True) # 画像リンク表示 print("# upload done") print(image["link"])
▼実行

得られたリンクをコピペして Markdown記事などで利用
<img src="https://i.imgur.com/TgZDCsX.png" width=300>
↑Markdown ↓出力

PowerShellのキーバインドをEmacs風にする【PSReadLine】
はじめに
- 目的: PowerShell のキーバインドを Emacs ライクにする
環境は以下の通り
- OS: Windows 10
- PSVersion: 5.1
手順
PSReadLine を導入する
↓ソース
PowerShell を管理者権限起動して、 Install-Module PSReadLine を実行
notepad $PROFILE を実行、プロファイルに下記設定を追加
if ($host.Name -eq 'ConsoleHost') { Import-Module PSReadLine # キーバインドをEmacs風に変更 Set-PSReadlineOption -EditMode Emacs # ### (以下追加) # Ctrl+i をTab と同じ "Complete" に割当 Set-PSReadLineKeyHandler -Key Ctrl+i -Function Complete # Ctrl+j をEnter と同じ "AcceptLine" に割当 Set-PSReadLineKeyHandler -Key Ctrl+j -Function AcceptLine # Ctrl+y を "Paste" に変更 Set-PSReadLineKeyHandler -Key Ctrl+y -Function Paste # Ctrl+d を "DeleteChar" に変更 Set-PSReadLineKeyHandler -Key Ctrl+d -Function DeleteChar }
Ctrl+yのデフォルトFunction は "Yank"- Yank : キルリング の内容をペースト
- Paste: クリップボードの内容をペースト
Ctrl+dのデフォルトFunctionは "DeleteCharOrExit"- DeleteCharOrExit: カーソル位置の文字を削除、空行の場合は処理を終了
- DeleteChar : カーソル位置の文字を削除
キーバインド
キーバインドは Get-PSReadlineKeyHandler で表示できる
▼カーソル移動
| Key | Function | 内容 |
|---|---|---|
| Ctrl+a | BeginningOfLine | カーソルを行頭に移動 |
| Ctrl+e | EndOfLine | カーソルを行末に移動 |
| Ctrl+f | ForwardChar | カーソルを 1文字前に進める |
| Ctrl+b | BackwardChar | カーソルを 1文字前に戻す |
▼編集
| Key | Function | 内容 |
|---|---|---|
| Ctrl+d | DeleteChar | カーソル位置の 1文字を削除 |
| Ctrl+h | BackwardDeleteChar | カーソル前の 1文字を削除 |
| Ctrl+y | Paste | クリップボードの内容をペースト |
▼コマンド
| Key | Function | 内容 |
|---|---|---|
| Ctrl+j | AcceptLine | Enter と同じ |
| Ctrl+n | NextHistory | コマンド履歴表示 (次の項目) |
| Ctrl+p | PreviousHistory | コマンド履歴表示 (前の項目) |
PowerShell を使ってExcel を操作する
Table of Contents
はじめに
PowerShell を使った Excel 操作のコマンドのメモ。
▼ メリット
- Input – Output を明確化できる
- 1つ1つのコマンド実行結果を視覚的に確認できる
- VBA を触らずに済む
参考
PowerShellをはじめよう Powershell入門
- https://letspowershell.blogspot.com/2015/06/powershellexcel.html
- https://letspowershell.blogspot.com/2015/06/powershellexcel_16.html
Windows PowerShell を使ってExcel を操作する -セル操作編 vol.1
Excel の起動
### Excel の起動 $excel = New-Object -Com Excel.Application # 可視化 (バッチファイルにするときは $Falseに) $excel.Visible = $True # アラートを無効に $excel.DisplayAlerts = $False
可視化を True にすることで、これから流すコマンドの結果を1つ1つ目視確認できる。

シートの追加
### 新規シートを追加 $book = $excel.Workbooks.add() # アクティブなシート(Sheet1) を取得 # ※ $sheet = $book.Sheets("Sheet1") でも可 $sheet = $book.ActiveSheet # シート名を変更 $sheet.Name = "表紙"
既存ワークブックを開く場合は open() を使用する。
### AAA.xlsx を開く $book = $excel.Workbooks.Open("C:\TEST\AAA.xlsx")
セルの編集
### A1セルに値を登録 $sheet.Cells.Item(1,1) = "報告書サンプル" # A1セルを太字、サイズ30に $sheet.Cells.Item(1,1).Font.Bold = $True $sheet.Cells.Item(1,1).Font.Size = 30 # A2セルに作成日時を登録 $sheet.Cells.Item(2,1) = " 作成日:" + (Get-Date).toString()
A1、A2 といった書き方もできる。
# A2のセルに値を設定 $sheet.Range("A2") = "200"
表の作成
# $tableRange = 登録した表の範囲 # $sheet.Cells.Item($x1,$y1) ... 表の左上 # $sheet.Cells.Item($x2,$y2) ... 表の右下 $tableRange = $sheet.Range($sheet.Cells.Item($x1,$y1), $sheet.Cells.Item($x2,$y2)) # 表の罫線を表示 $tableRange.Borders.LineStyle = $True # 表の幅を自動調整 $tableRange.Columns.AutoFit() | Out-Null # 表ヘッダ部分を太字、背景灰色(15) に (参考) https://www.sejuku.net/blog/32288 $sheet.Range("A1","C1").Font.Bold = $True $sheet.Range("A1","C1").Interior.ColorIndex = 15
グラフの作成
先程作成した表 (範囲 $tableRange) をグラフ化する。
### グラフを描画するための領域を作成 # $posX, $posY ... 描画領域の左上座標 # $width, $height ... 描画領域の幅、高さ $posX, $posY = 200, 10 $width, $height = 600, 400 $chart = $sheet.ChartObjects().Add($posX, $posY, $width, $height).Chart # グラフを描画 $chart.SetSourceData($tableRange) | Out-Null # 折れ線グラフに (参考: https://www.relief.jp/docs/excel-vba-xlchartype-list.html ) $chart.ChartType = 4 # -> xlLine # タイトルを表示 $chart.HasTitle = $True $chart.ChartTitle.Text = "アクセス数推移グラフ"
保存、終了
### 保存、終了 $book.SaveAs("$workdir\報告書サンプル_2018-05.xlsx") $excel.Quit() $excel = $Null [GC]::collect()
上書きの場合は $book.Save() で良い。
最後2行はプロセス解放のために必要。