SlideShare a Scribd company logo
1 of 51
Download to read offline
⃝⃝を支える技術
2016.04.08 増田貴士(@masutaka)
日⃝を支える技術
2016.04.08 増田貴士(@masutaka)
日報を支える技術
2016.04.08 増田貴士(@masutaka)
マスタカの日報
• 序盤はエンジニアでなく
ても分かる話を
• 中盤はプロダクトごとに
セクション分け
• 終盤は翌営業日にやるこ
とを全部列挙。日報駆動
開発のため
とあるスクリプトとの出会い
http://kitak.hatenablog.jp/
entry/2014/04/22/013849
出力を自分好みに変えて、
* [Bundle Update on 2016-03-24 - masutaka/awesome-github-
feed](https://github.com/masutaka/awesome-github-feed/pull/
38) by deppbot **merged!**
* [Fix performance - masutaka/github-nippou](https://
github.com/masutaka/github-nippou/pull/44) by masutaka
**merged!**
RubyGems.orgにリリースや!
• 2014年12月7日
• https://rubygems.org/gems/github-nippou/versions/0.0.1
• commitコメントに引用元書いて
• https://github.com/masutaka/github-nippou/commit/
4f408a6d
だましだまし使う日々
• 今日活動したIssueやPullRequestを取得できない時が
ある
• タイトルやステータスが古い時がある
• Issueのクローズやcommitへのコメントを検知できな
い
• なんか遅い
• やる気のない(リファクタリングしてない)コード
1年3か月放置…
先々週(2016-03-21)
なぜかやる気になった
※ 勉強会のことは意識していなかった
こんな感じ!
改善はほぼ完了
✓ 今日活動したIssueやPullRequestをもれなく取得
✓ 期間を指定することも可能になった
✓ タイトルやステータスも現在の値を取得
✓ Issueのクローズを検知。commitへのコメントは今
回見送り
✓ パフォーマンスは限界まで上げられた
✓ 満足行く程度までリファクタリングした
順を追って話します。
Octokit
https://github.com/octokit/octokit.rb
GitHub Events API
List events performed by a user
https://developer.github.com/v3/activity/events/#list-events-
performed-by-a-user
If you are authenticated as the given user, you will see your private
events. Otherwise, you'll only see public events.
GET /users/:username/events
ここで使われていると思う
paginationあり
https://developer.github.com/v3/activity/events/
Events support pagination, however the per_page option is
unsupported.The fixed page size is 30 items. Fetching up to ten
pages is supported, for a total of 300 events.
Only events created within the past 90 days will be included in
timelines. Events older than 90 days will not be included (even if the
total number of events in the timeline is less than 300).
curlでの取得例
$ curl -s -u <username>:<personal access token> https://
api.github.com/users/:username/events
[
{
"id": "3825680181",
"type": "PullRequestEvent",
"actor": {
"id": 170014,
"login": "masutaka",
"gravatar_id": "",
"url": "https://api.github.com/users/masutaka",
"avatar_url": "https://avatars.githubusercontent.com/u/170014?"
},
(snip)
pagination
$ curl -I <username>:<personal access token> https://
api.github.com/users/:username/events
(snip)
Link: <https://api.github.com/user/170014/events?page=2>;
rel="next", <https://api.github.com/user/170014/events?page=10>;
rel=“last"
(snip)
Octokit
https://github.com/octokit/octokit.rb
UserEvents取得方法
client = Octokit::Client.new(login: 'masutaka', access_token: 'xxx')
user_events = client.user_events(‘masutaka')
デフォルトでは最大で30個取得
UserEventsのハマりどころ
• client.user_eventsが返すイベントはデフォルト30個
• タイトルやステータスはイベント発生時のもの。
現在とは違う可能性あり
• 今回捕獲すべきイベントタイプ(※)は4つ
• IssuesEvent, IssueCommentEvent, PullRequestEvent,
PullRequestReviewCommentEvent
• IssueのふりをしたPullRequestがある
※ https://developer.github.com/v3/activity/events/types/
最初のスクリプト
1. UserEvents取得(30個だけ)
2. 必要なUserEvent以外捨てつつ、標準出力
に整形して表示
• 今日活動したIssueやPullRequestを取得できない時が
ある
• タイトルやステータスが古い時がある
• Issueのクローズやcommitへのコメントを検知できな
い
• なんか遅い
• やる気のない(リファクタリングしてない)コード
これらの原因
情報を漏れなく完璧に取得
1. UserEvents取得(30個)
2. 次のページ取得がまだ必要ならUserEventsを取
得し続ける➰
3. 必要なUserEvent以外捨てる
4. 残ったUserEventsの現在のタイトルやステータ
スを取得しつつ➰、標準出力に整形して表示
完璧になりました!
でも遅くなりました/(^o^)\
数秒だったのが、遅い時で20秒以上に…
パフォーマンス分析するぞ!
1. UserEvents取得(30個)… 約1.4秒
2. 次のページ取得がまだ必要ならUserEventsを取
得し続ける➰ … 約1.5秒 x 最大9回
3. 必要なUserEvent以外捨てる
4. 残ったUserEventsの現在のタイトルやステータ
スを取得しつつ➰、標準出力に整形して表
示 … 約1.0秒 x 残ったUserEvent数
GitHub APIへのアクセスに時
間がかかっていた
パフォーマンス改善1
@client.user_events(@user)
!
@client.user_events(@user, per_page: 100)
fetch数を30から100に増やす
1. UserEvents取得(100個)… 約1.8秒
2. 1日100個に収まることがほとんどなので、
次のページ取得が必要な確率は低い
3. 必要なUserEvent以外捨てる
4. 残ったUserEventsの現在のタイトルやステー
タスを取得しつつ、標準出力に整形して表
示 … 約1.0秒 x UserEvent数
↑改善!
パフォーマンス改善2(修正前)
def list
lines = []
user_events.each do |user_event|
line << format_line(user_event)
end
puts sort(lines)
end
並列化してみよう
パフォーマンス改善2(修正後)
def list
lines = []
mutex = Mutex::new
# https://github.com/grosser/parallel
Parallel.each(user_events, in_threads: 5) do |user_event|
line = format_line(user_event)
mutex.synchronize { lines << line } # 排他制御
end
puts sort(lines)
end
パフォーマンス改善の結果
修正前: 17.531秒
↓
修正後: 7.660秒(デフォルト: 5並列)
修正後: 6.655秒(10並列)
※ 2016年3月30日で計測
1. UserEvents取得(100個)… 約1.8秒
2. 1日100個に収まることがほとんどなので、次
のページ取得が必要な確率は低い
3. 必要なUserEvent以外捨てる
4. 残ったUserEventsの現在のタイトルやステータ
スを5並列で取得しつつ➰➰➰➰➰、標準出
力に整形して表示 … 約1.0秒 x UserEvent数 ÷ 5
↓改善!
使い方
$ github-nippou help
Commands:
github-nippou help [COMMAND] # Describe available commands or one specific
command
github-nippou list # Displays today's GitHub events formatted for
Nippou
github-nippou version # Displays version
Options:
s, [--since-date=SINCE_DATE] # Retrieves GitHub user_events since the date
# Default: 20160406
u, [--until-date=UNTIL_DATE] # Retrieves GitHub user_events until the date
# Default: 20160406
デモ
リリース
まとめ
パフォーマンスチューニング
したいだけの人生だった。
ご静聴ありがとうございました。
• $ github-nippou | sed -e "s@- feedforce/@- @g"
>> ~/tmp/nippou.md
後悔
☓ github-nippou
⃝ github_nippou
並列化といえば、
Go言語・・・!

More Related Content

Viewers also liked

プラグイン作って儲かった話
プラグイン作って儲かった話プラグイン作って儲かった話
プラグイン作って儲かった話Masahiro Nakashima
 
写真共有サービスの現状と課題
写真共有サービスの現状と課題写真共有サービスの現状と課題
写真共有サービスの現状と課題Shinya ICHINOHE
 
写真共有アプリのバックエンドサーバー
写真共有アプリのバックエンドサーバー写真共有アプリのバックエンドサーバー
写真共有アプリのバックエンドサーバーShinya Okano
 
kintone 京王バスでの 入れ方 使い方
kintone 京王バスでの 入れ方 使い方kintone 京王バスでの 入れ方 使い方
kintone 京王バスでの 入れ方 使い方Cybozucommunity
 
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズkintone papers
 
コミュニケーションゲーム「野球のポジション当てゲーム」
コミュニケーションゲーム「野球のポジション当てゲーム」コミュニケーションゲーム「野球のポジション当てゲーム」
コミュニケーションゲーム「野球のポジション当てゲーム」Jun Chiba
 
E2D3 2016年1-6月-活動報告書
E2D3 2016年1-6月-活動報告書E2D3 2016年1-6月-活動報告書
E2D3 2016年1-6月-活動報告書E2D3.org
 
TOSM 2011 - Ecollaboration
TOSM 2011 - EcollaborationTOSM 2011 - Ecollaboration
TOSM 2011 - EcollaborationCSP Scarl
 
Coach's guide to effective simulation facilitation preview
Coach's guide to effective simulation facilitation previewCoach's guide to effective simulation facilitation preview
Coach's guide to effective simulation facilitation previewSuekennnedy
 
How to design for the web
How to design for the webHow to design for the web
How to design for the webCyber-Duck
 
19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione - 19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione - CSP Scarl
 
Csp@scuola uav corso1_lez4
Csp@scuola uav corso1_lez4Csp@scuola uav corso1_lez4
Csp@scuola uav corso1_lez4CSP Scarl
 
Svea ecollab-presentazione 2010.ppt
Svea ecollab-presentazione 2010.pptSvea ecollab-presentazione 2010.ppt
Svea ecollab-presentazione 2010.pptCSP Scarl
 
10 Scenarios of Google Apps Data Loss
10 Scenarios of Google Apps Data Loss10 Scenarios of Google Apps Data Loss
10 Scenarios of Google Apps Data LossDatto
 
Influence of cochlear implantation on peripheral vestibular receptor
Influence of cochlear implantation on peripheral vestibular receptorInfluence of cochlear implantation on peripheral vestibular receptor
Influence of cochlear implantation on peripheral vestibular receptorKarl Daniel, M.D.
 

Viewers also liked (20)

プラグイン作って儲かった話
プラグイン作って儲かった話プラグイン作って儲かった話
プラグイン作って儲かった話
 
写真共有サービスの現状と課題
写真共有サービスの現状と課題写真共有サービスの現状と課題
写真共有サービスの現状と課題
 
写真共有アプリのバックエンドサーバー
写真共有アプリのバックエンドサーバー写真共有アプリのバックエンドサーバー
写真共有アプリのバックエンドサーバー
 
kintone 京王バスでの 入れ方 使い方
kintone 京王バスでの 入れ方 使い方kintone 京王バスでの 入れ方 使い方
kintone 京王バスでの 入れ方 使い方
 
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ
【デブサミ2017】45分で早わかり!kintoneの基本とカスタマイズ
 
コミュニケーションゲーム「野球のポジション当てゲーム」
コミュニケーションゲーム「野球のポジション当てゲーム」コミュニケーションゲーム「野球のポジション当てゲーム」
コミュニケーションゲーム「野球のポジション当てゲーム」
 
E2D3 2016年1-6月-活動報告書
E2D3 2016年1-6月-活動報告書E2D3 2016年1-6月-活動報告書
E2D3 2016年1-6月-活動報告書
 
TOSM 2011 - Ecollaboration
TOSM 2011 - EcollaborationTOSM 2011 - Ecollaboration
TOSM 2011 - Ecollaboration
 
Coach's guide to effective simulation facilitation preview
Coach's guide to effective simulation facilitation previewCoach's guide to effective simulation facilitation preview
Coach's guide to effective simulation facilitation preview
 
How to design for the web
How to design for the webHow to design for the web
How to design for the web
 
19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione - 19 Luglio 2013 - Il Futuro della Televisione -
19 Luglio 2013 - Il Futuro della Televisione -
 
Prototype_2
Prototype_2Prototype_2
Prototype_2
 
Csp@scuola uav corso1_lez4
Csp@scuola uav corso1_lez4Csp@scuola uav corso1_lez4
Csp@scuola uav corso1_lez4
 
e-Commerce are you there?
e-Commerce are you there?e-Commerce are you there?
e-Commerce are you there?
 
Svea ecollab-presentazione 2010.ppt
Svea ecollab-presentazione 2010.pptSvea ecollab-presentazione 2010.ppt
Svea ecollab-presentazione 2010.ppt
 
Buduj Wartość i Reinwestuj
Buduj Wartość i ReinwestujBuduj Wartość i Reinwestuj
Buduj Wartość i Reinwestuj
 
10 Scenarios of Google Apps Data Loss
10 Scenarios of Google Apps Data Loss10 Scenarios of Google Apps Data Loss
10 Scenarios of Google Apps Data Loss
 
Breve repaso de Historia Contemporánea
Breve repaso de Historia Contemporánea Breve repaso de Historia Contemporánea
Breve repaso de Historia Contemporánea
 
D3.1sunstar
D3.1sunstarD3.1sunstar
D3.1sunstar
 
Influence of cochlear implantation on peripheral vestibular receptor
Influence of cochlear implantation on peripheral vestibular receptorInfluence of cochlear implantation on peripheral vestibular receptor
Influence of cochlear implantation on peripheral vestibular receptor
 

Similar to 日報を支える技術

st2でシステム管理
st2でシステム管理st2でシステム管理
st2でシステム管理You&I
 
今さら聞けない人のためのgit超入門 OSC2018京都 資料
今さら聞けない人のためのgit超入門 OSC2018京都 資料今さら聞けない人のためのgit超入門 OSC2018京都 資料
今さら聞けない人のためのgit超入門 OSC2018京都 資料VirtualTech Japan Inc./Begi.net Inc.
 
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2Yoshitaka Seo
 
Extension & Triggerを活用しよう
Extension & Triggerを活用しようExtension & Triggerを活用しよう
Extension & Triggerを活用しようTsukasa Takagi
 
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3Yoshitaka Seo
 
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションKubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションTakashi Kanai
 
Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)Shinya Nakajima
 
Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Shinya Nakajima
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampMasahiro NAKAYAMA
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
20201102 postgresql unconference_debility
20201102 postgresql unconference_debility20201102 postgresql unconference_debility
20201102 postgresql unconference_debilitySatoshi Hirata
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎真哉 杉野
 
Windows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAIWindows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAITomokazu Kizawa
 
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!Yasuaki Matsuda
 
Metahub for github
Metahub for githubMetahub for github
Metahub for githubSuguru Oho
 
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasia
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasiaExcel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasia
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasiaTakeshi Komiya
 
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~Takanori Suzuki
 

Similar to 日報を支える技術 (20)

st2でシステム管理
st2でシステム管理st2でシステム管理
st2でシステム管理
 
今さら聞けない人のためのgit超入門 OSC2018京都 資料
今さら聞けない人のためのgit超入門 OSC2018京都 資料今さら聞けない人のためのgit超入門 OSC2018京都 資料
今さら聞けない人のためのgit超入門 OSC2018京都 資料
 
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
 
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section2
 
Extension & Triggerを活用しよう
Extension & Triggerを活用しようExtension & Triggerを活用しよう
Extension & Triggerを活用しよう
 
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3
IoT キットハンズオンのソースコード解説します クラウド編 Part1 Section3
 
今さら聞けない人のためのGit超入門
今さら聞けない人のためのGit超入門今さら聞けない人のためのGit超入門
今さら聞けない人のためのGit超入門
 
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container ClusterオーケストレーションKubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
 
Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)Visual Studio App Centerで始めるCI/CD(Android)
Visual Studio App Centerで始めるCI/CD(Android)
 
osc_tokyo20100226
osc_tokyo20100226osc_tokyo20100226
osc_tokyo20100226
 
Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)Visual Studio App Centerで始めるCI/CD(iOS)
Visual Studio App Centerで始めるCI/CD(iOS)
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccamp
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
20201102 postgresql unconference_debility
20201102 postgresql unconference_debility20201102 postgresql unconference_debility
20201102 postgresql unconference_debility
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎
 
Windows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAIWindows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAI
 
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!
Azure Function GAした!Visual Studio Tools for Azure Functions もプレビューだ!
 
Metahub for github
Metahub for githubMetahub for github
Metahub for github
 
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasia
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasiaExcel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasia
Excel 方眼紙撲滅委員会 活動報告 2013.9 #yapcasia
 
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
デブサミ2014-Stormで実現するビッグデータのリアルタイム処理プラットフォーム ~ストリームデータ処理から機械学習まで~
 

More from Takashi Masuda

Emacsからgitをゆるく使う
Emacsからgitをゆるく使うEmacsからgitをゆるく使う
Emacsからgitをゆるく使うTakashi Masuda
 
Langrich社でのEmacs活用、langrich.el
Langrich社でのEmacs活用、langrich.elLangrich社でのEmacs活用、langrich.el
Langrich社でのEmacs活用、langrich.elTakashi Masuda
 
第3回関西Emacsポジションペーパー
第3回関西Emacsポジションペーパー第3回関西Emacsポジションペーパー
第3回関西EmacsポジションペーパーTakashi Masuda
 
初心者向けtwittering-modeのススメ
初心者向けtwittering-modeのススメ初心者向けtwittering-modeのススメ
初心者向けtwittering-modeのススメTakashi Masuda
 
Linuxカーネル超入門
Linuxカーネル超入門Linuxカーネル超入門
Linuxカーネル超入門Takashi Masuda
 

More from Takashi Masuda (8)

Emacsからgitをゆるく使う
Emacsからgitをゆるく使うEmacsからgitをゆるく使う
Emacsからgitをゆるく使う
 
Langrich社でのEmacs活用、langrich.el
Langrich社でのEmacs活用、langrich.elLangrich社でのEmacs活用、langrich.el
Langrich社でのEmacs活用、langrich.el
 
第3回関西Emacsポジションペーパー
第3回関西Emacsポジションペーパー第3回関西Emacsポジションペーパー
第3回関西Emacsポジションペーパー
 
初心者向けtwittering-modeのススメ
初心者向けtwittering-modeのススメ初心者向けtwittering-modeのススメ
初心者向けtwittering-modeのススメ
 
Linuxカーネル超入門
Linuxカーネル超入門Linuxカーネル超入門
Linuxカーネル超入門
 
I talk3
I talk3I talk3
I talk3
 
Vcsは分散型へ
Vcsは分散型へVcsは分散型へ
Vcsは分散型へ
 
正規表現
正規表現正規表現
正規表現
 

日報を支える技術