Upgrade to Pro — share decks privately, control downloads, hide ads and more …

積もってく会議メモをどうにかしたかった

 積もってく会議メモをどうにかしたかった

2023-03-18
SappoRo.R #10 での発表スライドです。

Kazuhiro Maeda

March 18, 2023
Tweet

More Decks by Kazuhiro Maeda

Other Decks in Programming

Transcript

  1. はじめに 所属 LINE Fukuoka株式会社 Data Scientist DataLabs - Senior Manager

    Data Science Team Machine Learning Team Data Engineering & Solution Team LINE株式会社 CDO Office 5 / 39
  2. 最近の私 会議がめっさ増えた 1日平均で8-12本 いろんなプロジェクト関わるようになったため ヘッドセット装着しっぱなし 骨伝導を導入した Meeting Driven 何をしてるか? 会議メモを書く

    あくまで個人用(議事録は別の人が担当) TODOやNext Actionを書き出す あくまで個人用 タスク管理ツールに登録 メモを保管 8 / 39
  3. 会議メモの実装 res_confl <- conflr::confl_create_post_from_Rmd でOK if (file.exists(Rmd_file)) { res_confl <-

    conflr::confl_create_post_from_Rmd(Rmd_file, interac message(paste("The memo was created at", res_confl)) } else { stop("This Rmd file is not found. Please check this path.") } 後述する「一発で全部やる関数」の中に組み込む 15 / 39
  4. TrelloにはREST APIが提供されている https://developer.atlassian.com/cloud/trello/rest/ Trelloのほぼ全ての要素が扱えそう 各種APIについては今回の発表で は省略 ドキュメントがしっかりしている key/tokenがあれば利用可能 API Call制限などはそれぞれで確

    認してください 管理者により制限されている場合 があります Tokyo.R #100で話したプレゼンを参照 https://speakerdeck.com/kazutan/rniguan- li-saretemiru Trello Rest API 17 / 39
  5. CRUD関数(低水準関数) - GET get_trello_api(base_url, path, verbose = FALSE, content =

    TRUE, query = list(), key = NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/api.R#L136-L166 base_url , path でAPIの行き先を指定 query でクエリパラメータを指定 verboseを出すかどうかを指定可能 content = TRUE で、outputに httr::content() を当てたものを返す key , token はNULL ならローカルのkeyringへ探しに行く batch処理をする場合は、ここにSecretで渡せばOK 21 / 39
  6. CRUD関数(低水準関数) - PUT put_trello_api(base_url, path, verbose = FALSE, content =

    TRUE, query = list(), body = NULL, encode = c("multipart", "form", "json", "raw"), key = NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/api.R#L173-L206 get_trello_api() とほぼ一緒 body , encode については ?httr::PUT を参照 22 / 39
  7. CRUD関数(低水準関数) - POST post_trello_api(base_url, path, verbose = FALSE, content =

    TRUE, query = list(), body = NULL, encode = c("multipart", "form", "json", "raw"), key = NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/api.R#L213-L246 put_trello_api() とほぼ一緒 23 / 39
  8. CRUD関数(低水準関数) - DELETE delete_trello_api(base_url, path, verbose = TRUE, key =

    NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/api.R#L253-L275 get_trello_api() とほぼ一緒 ただし、verbose = TRUE をデフォルトに 24 / 39
  9. 高水準関数 - メンバー情報取得 get_member_infos(base_url, member = "me", post_path = NULL,

    query = list(), verbose = FALSE, content = TRUE, key = NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/get.R#L13-L46 メンバー情報を取得する関数 member ユーザー名もしくはメンバーIDを指定 長さ2以上のベクトルで与えた場合、purrr::map でまとめて実行する me は自分自身を指定する意味となる post_path はさらに対象を指定するときに利用 詳細はTrello APIリファレンスを参照 25 / 39
  10. 高水準関数 - ボード情報取得 get_board_infos(base_url, board_id, post_path = NULL, query =

    list(), verbose = FALSE, content = TRUE, key = NULL, token = NULL) https://github.com/kazutan/trelloR/blob/master/R/get.R#L56-L89 ボード情報を取得する関数 board_id ボードIDを指定 あとは get_member_infos() と同様 26 / 39
  11. 高水準関数 - カード作成 create_card(base_url, board_id = NULL, list_id = NULL,

    list_name = NULL, card_name = "Untiled", card_body = list(), query = list( verbose = FALSE, content = TRUE, key = NULL, token = NULL) カードを作成する関数 list_id を指定すれば、そのリストのところにカード作成 わからなくても、board_id を指定すれば作成可能 board_id と list_name を指定すれば、アクセスしてlist_idを取得して実行で きる card_body に、リストでCardの内容を突っ込めばOK 27 / 39
  12. 高水準関数 - カードにコメントを追加 add_new_comment(base_url, card_id, text, verbose = FALSE, content

    = TRUE, key = NULL, token = NULL) カードにコメントを追加する関数 card_idは必須 text にコメント内容を書き込む Trelloはmarkdown記法を受け付ける(重要) 28 / 39
  13. build_mtg_memo (長いので、分割して貼り付けてます) # 実行プロセス系の関数 build_mtg_memo <- function(Rmd_file, add_trello = FALSE,

    trello_prof # post to confluence if (file.exists(Rmd_file)) { res_confl <- conflr::confl_create_post_from_Rmd(Rmd_file, interac message(paste("The memo was created at", res_confl)) } else { stop("This Rmd file is not found. Please check this path.") } 31 / 39
  14. 続き(2枚目) # trello process if (add_trello) { # check and

    get trello profile if (is_null(trello_profile)) { stop("There is no trello profile. Please check again.") } else { trello_setting <- yaml::read_yaml(trello_profile) } # catch trello section from Rmd rmd_raw <- readLines(Rmd_file) # get trello context trello_context <- rmd_raw[str_which(rmd_raw, "^# Trello"):length(rmd_raw)] # get memo contents memo_contents <- rmd_raw[(str_which(rmd_raw, "^---")[2] + 1):(str_which(rmd_raw, "^# Trello") # create trello contents trello_content <- list( # TODO: ここを必要に応じて追加 title = str_extract( str_subset(trello_context, "^title:"), "^title:(.+)", group = 1) ) 32 / 39
  15. 続き(3枚目) # add confl_memo url to comment add_new_comment( trello_setting$base_url, card_id

    = card_obj$id, text = paste(memo_contents, collapse = "\n") ) # modify Rmd rmd_modified <- c(rmd_raw, "\nTrello Card", card_obj$url) write(paste(rmd_modified, collapse = "\n"), Rmd_file) # message message("The card was created. Plase check Trello.") } } 33 / 39