My Ciscoルータのインターネット(PPPoE)接続設定 【レオネット編、フレッツ光編】

Table of Contents

  1. 概要
  2. 共通設定
    1. VLAN1 設定
    2. PortFast 設定
    3. DHCP 設定
  3. 設定 (レオネット編)
    1. ルーテッドポート(GE5) 設定
    2. ルーティング 設定
    3. NAPT 設定
  4. 設定 (フレッツ光編)
    1. ルーテッドポート(GE5) 設定
    2. PPPoE 設定
    3. ルーティング 設定
    4. NAPT 設定
    5. セキュリティ 設定
  5. まとめ

概要

去年に Cisco C841Mルータ (Amazonリンク) を購入して インターネット接続用ルータとして使用しています。

img

もともとレオ○レス回線(レオネット) 環境で利用していましたが、 引っ越しがあり現在はフレッツ光環境です。

その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など各種デバイスには DHCPIPアドレス (.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
!

設定 (レオネット編)

レオネット はレオ○レス入居者が使えるインターネットサービスです。 このように壁に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

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

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

  1. 実行手順
    1. 1. VPC作成
    2. 2. サブネット作成
    3. 3. IGW作成
    4. 4. ルートテーブル
  2. チートシート (PowerShell)

AWS CLIVPC 他ネットワーク基本要素を作成する。

CLI でどんどん要素を作成していくと、何を作成したか分からなくなることが多い。
そのため、作成した要素を確認・整理できるスクリプトなどを作成しながら作業した。

▼環境


参考: 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 はYAML形式で記述 (≠プログラミング言語)
  • テキストベースであるため、更新時の差分比較が容易
  • 厳密なインデントルールに注意

▼冪(べき)等性

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

Ansible Tower とは

URL: https://www.ansible.com/products/tower

Ansible Towerは Ansible の機能拡張製品

  • WebGUI 上で操作
  • プロジェクトを作成して各ジョブ(Playbook) を管理
  • 数クリックでジョブを実行可能
  • ジョブのスケジューリング機能
  • アカウント毎にジョブ実行権限の設定

Ansible のメリット

Ansible によって、「自動化手法の標準化」ができる

  1. 自動化の作り方
  2. 自動化の実行方法

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 アプリ登録

参考: https://api.imgur.com

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

登録後 表示される 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】

はじめに

環境は以下の通り

手順

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"
  • 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

  1. はじめに
    1. 参考
  2. Excel の起動
  3. シートの追加
  4. セルの編集
  5. 表の作成
  6. グラフの作成
  7. 保存、終了

はじめに

PowerShell を使った Excel 操作のコマンドのメモ。

▼ メリット

  • Input – Output を明確化できる
  • 1つ1つのコマンド実行結果を視覚的に確認できる
  • VBA を触らずに済む

参考

PowerShellをはじめよう Powershell入門

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行はプロセス解放のために必要。

Emacs org-agenda他を運用して1年経ったのでまとめる

Table of Contents

  1. はじめに
  2. 設定内容 (init.el)
    1. agenda files 構成
    2. org-capture 構成
    3. その他
  3. 運用方法
    1. TODO items: タスクの登録
    2. org-agenda: アジェンダの表示
    3. org-capture: リマインドの登録
    4. org-clock: 工数計測
    5. org-clocktable: 工数表示
  4. 1年間運用した感想

はじめに

org-agenda や org-capture, org-clock などの自分なりの運用をまとめます。

org-agenda … (簡単に言うと) ファイル毎に散らばったTODOタスクを集約して、
管理してくれるorg-mode のタスク管理機能

org-capture … (簡単に言うと) org-mode のメモ取り機能。さっとメモを書ける。

org-clock … org-mode の計時機能


参考サイト

設定内容 (init.el)

agenda files 構成

↓ init.el (抜粋)

;; アジェンダ表示の対象ファイル
(setq org-agenda-files '(
             "c:/Users/AAA/org/aaa.org"
             "c:/Users/AAA/org/anken"
             "c:/Users/AAA/org/remind.org"
                         ))

org ディレクトリ構成は下記の通り

org/
 │  aaa.org
 │  remind.org
 │  knowledge.org
 │
 ├─anken
 │     AAA.org
 │     BBB.org
 │     CCC.org
 │     :
 │
 └─tech
       powershell.org
       lpic.org
       ccna.org
       :
ファイル名 用途
aaa.org 社内業務関係をここに書く。 **アジェンダ対象**
remind.org さっとメモを取る ( **org-capture** する)とき用。 **アジェンダ対象**
knowledge.org ちょっとした知見をメモする ( **org-capture** する)とき用。
anken フォルダ 案件ごとにorgファイルを管理。 **アジェンダ対象**
tech フォルダ 技術情報用。

org-capture 構成

↓ init.el (抜粋)

(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "c:/Users/AAA/org/remind.org" "■Capture")
     "* REMIND %? (wrote on %U)")
    ("k" "Knowledge" entry (file+headline "c:/Users/AAA/org/knowledge.org" "TOP")
     "* %?\n  # Wrote on %U")

remind.org には REMIND item が溜まっていく。

knowledge.org には (ちょっとした)知識 が溜まっていく。

その他

その他雑多な設定。読み飛ばしてOK。

;; ##### org-agenda
;; C-ca で org-agenda
(define-key global-map "\C-ca" 'org-agenda)

;; アジェンダ表示で下線を用いる
(add-hook 'org-agenda-mode-hook '(lambda () (hl-line-mode 1)))
(setq hl-line-face 'underline)

;; 標準の祝日を利用しない
(setq calendar-holidays nil)

;; TODO状態
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "REMIND(r)" "|" "DONE(d)" "SOMEDAY(s)")))

;; DONEの時刻を記録
(setq org-log-done 'time)

;; タグリスト
(setq org-tag-alist '(("meeting" . ?m) ("office" . ?o) ("document" . ?d) ("kitting" . ?k) ("study" . ?s) ("travel" . ?t) ))


;; ###### org-capture
;; C-cc で org-capture
(global-set-key "\C-cc" 'org-capture)


;; ##### org-clock
;; clockログを隠す
(setq org-clock-into-drawer t)

;; clocktable の体裁を整える
(defun my-org-clocktable-indent-string (level)
  (if (= level 1) ""
    (let ((str " "))
      (while (> level 2)
        (setq level (1- level)
              str (concat str "--")))
      (concat str "-> "))))

(advice-add 'org-clocktable-indent-string :override #'my-org-clocktable-indent-string)

運用方法

TODO items: タスクの登録

アジェンダ対象の org の、各見出し(タスク) にTODO ステータスを付ける。
(見出し内で C-c C-t でステータス登録)

筆者は下記ステータス を init.elで登録。

ステータス 説明
TODO 未完了タスク。そのままの意味
WAIT 未完了タスク。待ち状態
REMIND 未完了タスク。リマインド (org-capture 用)
DONE 完了タスク。そのままの意味
SOMEDAY 完了タスク。いつか手を付ける

また、見出し上で C-c C-c を実行することでタスクにタグを付けられる。

筆者は下記タグを init.el で登録。後述の工数表示でタグ毎に掛けた時間をまとめて報告書にした。

タグ 用途
meeting 会議
document 設計書などの資料作成
kitting 機器構築
study 学習、調査
travel 出張
office 事務作業

org-agenda: アジェンダの表示

出社して Emacs を起動後に、 C-c a n で Agenda 表示 (TODO リストと1週間の予定)。
アジェンダ対象ファイルからTODO キーワードのタスクを抽出してリストアップしてくれる。

Agenda上で主に使用するキーは下記の通り。

キー 説明
n,p 項目の上下移動
Enter 選択タスクへバッファ移動
t 選択タスクのTODO ステータス変更
I 選択タスクの計時開始
O 選択タスクの計時終了
C-c C-s 選択タスクの予定日登録
C-c C-d 選択タスクの締切日登録
q Agenda を閉じる

定期的に org-agenda を開いて TODO 状況を把握する。

org-capture: リマインドの登録

「ちょっとこれやっといて」的なことを言われたときに使う。
案件の本筋でない支援や、社内業務など細々した(忘れそうな)タスクを org-capture でメモしていく。

C-c c で org-capture 起動。下記画面が表示されるので "t" を選択。

タスク内容を書いて C-c C-c で登録完了。
org-agenda を開くと 登録されていることが確認できる。

org-clock: 工数計測

タスク消化に掛けた時間を計測する。

▼タスクの計測開始

  • Agenda 上でタスクを選択して I
  • or タスクの見出し内で C-c C-x C-i

LOGBOOK 内に計測開始時刻が記録される。

▼タスクの計測終了

  • Agenda 上で O
  • or 任意の orgバッファで C-c C-x C-o
  • or タスクの TODO ステータスを DONE にする

LOGBOOK 内に終了時刻、経過時間が記録される。

org-clocktable: 工数表示

任意の orgファイルに下記のような内容を書く。

#+BEGIN: clocktable :maxlevel 2 :scope agenda :tstart "2018-01-01" :tend "2018-01-31"
#+END:

記述した #+BEGIN: ... 上で C-c C-c を実行すると対象期間の計測結果が表示される。

↑は 2018年1月分の計測結果を表示している。

他にも下記のようなパラメータがある。組合せて所望の計測結果を表示させる。
(詳細: https://orgmode.org/manual/The-clock-table.html#The-clock-table )

パラメータ 説明
:block thisyear 今年の計測分
:block lastweek 先週の計測分
:tags "meeting" meeting タグが付いたタスクの計測分

1年間運用した感想

★やっぱり org-mode、org-agenda は最高

複数案件を同時にこなすには org-agenda が欠かせなくなりました。
これからも org-agenda にはお世話になると思います。


org-capture も便利

これを使う前は とっさのメモを、とりあえず scratch バッファに書いて ・・・
といった対応を取っていました。

org-capture を使うことで、無駄なくリマインド登録・知識メモができるようになりました。


org-clock は下のような報告書を作成するときには役に立ちましたが、
半年ほどしか続きませんでした。

業務報告のためだけではリターンが少なかったです。

もう少し有益な分析ができるようにタグを見直したほうが良いかもしれません。
(例えばプロジェクトのフェーズ毎にタグ分けする、など)


統計

案件フォルダの orgファイル数 28個
案件フォルダの orgファイルサイズ合計 393KB
DONE(完了) にしたタスク数 700個
SOMEDAY(いつかやる) にしたタスク数 43個
org-capture でREMIND を取った数 345個
org-clock で測った時間 26日と20時間59分