たのしい駆動開発

たのしいアウトプットの場所

GASを使ってSlackにスプレッドシートのグラフを送信する

Incoming WebhookのAbout的なことはここに書かれてます。 api.slack.com

前提

Incoming Webhook導入&設定済み

全体的なコード

var WEBHOOK_URL = "";
var DRIVE_FOLDER_ID = "";

function sender() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("");

  // テキスト送信
  var values = get_values(sheet);
  var text = generate_text(values[0], values[1], values[2]);
  var payload = JSON.stringify({ text: text });
  post(payload);

  // 画像送信
  var folder = DriveApp.getFolderById(DRIVE_FOLDER_ID);
  save_charts(sheet, folder);
  var image_ids = get_image_ids(folder);
  for (var i = 0; i < image_ids.length; i++) {
    payload = JSON.stringify({
      blocks: [
        {
          type: "image",
          image_url: "https://drive.google.com/uc?id=" + image_ids[i],
          alt_text: "chart_image",
        },
      ],
    });
    post(payload);
  }
}

function get_values(sheet) {
  // スプシからフィールドを取得。ここのコードの中身は気にしないでOK
  var l = sheet.getRange("").getDisplayValues();
  today = Utilities.formatDate(new Date(), "JST", "YYYY/M/d");
  for (var i = 0; i < l.length; i++) {
    if (l[i][0].match(today)) {
      return [l[i][0], l[i][1], l[i][3]];
    }
  }
}

function generate_text(v1, v2, v3) {
  // メッセージ作成
  var text = Utilities.formatString("%s, %s, %s", v1, v2, v3);
  return text;
}

function save_charts(sheet, folder) {
  // グラフ画像をGoogle Driveに保存
  var charts = sheet.getCharts();
  for (var i = 0; i < charts.length; i++) {
    var chart_image = charts[i]
      .getBlob()
      .getAs("image/png")
      .setName("chart" + i + ".png");
    file = folder.createFile(chart_image);
    // Slackで画像を送信するにはこの権限でないとエラーが起きる
    file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
  }
}

function get_image_ids(folder) {
  // Google Driveから画像のURLを取得
  var files = folder.getFiles();
  var ids = new Array();
  while (files.hasNext()) {
    var file = files.next();
    ids.push(file.getId());
  }
  return ids;
}

function post(payload) {
  // Slackに画像を投稿する
  var req = {
    method: "post",
    contentType: "application/json",
    payload: payload,
  };
  UrlFetchApp.fetch(WEBHOOK_URL, req);
}

function remover() {
  // imageのアクセス権限がリンクを知っている人なら誰でも見ることができるようになっている。
  // それがセキュリティ的によろしくないので、送信後画像をディレクトリから削除する
  var folder = DriveApp.getFolderById(DRIVE_FOLDER_ID);
  var image_ids = get_image_ids(folder);
  remove_files(image_ids);
}

function remove_files(image_ids) {
  // fileを削除
  for (var i = 0; i < image_ids.length; i++) {
    var file = DriveApp.getFileById(image_ids[i]);
    file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.VIEW);
    file.setTrashed(true);
  }
}

Incoming Webhookの補足

画像の送信はこのようなJSONを送信する必要がある。

{
    method: "post",
    contentType: "application/json",
    payload: {
      blocks: [
        {
          type: "image",
          image_url: "https://drive.google.com/uc?id=" + image_ids[i],
          alt_text: "chart_image",
        },
      ],
    },
}

いつからか仕様が変わって、Blockというものになったらしい。画像を送信したいときは、以下のドキュメントに沿う必要がある。 api.slack.com

APIのテストはBlock Kit Builderからすることができる。 ここにJSONを貼り付けて、送信できるかどうか試してみるのもいいと思う。 それか、curlを使うのも全然ありではある。

エンジニアで新卒就活をする人は、技術のみならず自己分析も磨こう

新卒就活でめちゃくちゃ苦労した人が約3ヶ月間新卒採用担当をして感じたことを綴っていきます。

前置き

  • これは弊社での話です。他社ではどういう方針を取っているのか分かりません。
  • 他社の事例を持ち込まれても困ります。あくまで一例と捉えてください。
  • 自分が働いている会社は100人に満たない規模のベンチャーです。大企業やメガベンチャーでは違うかもしれません。

結論

とりあえずこの記事で新卒の読者に一番伝えたいことから言います。
技術だけ鍛えていても、自己分析を怠ると面接受かりにくいよ

結論説明

なんで↑の結論になったのかをしていきます。

まず、採用担当の先輩と自分が欲しい新卒の定義をしました。それを大雑把に分けると、以下の2つになります。

  1. Webに関する技術力とCSの下地があり、今後も自発的に成長していきそうか
  2. ビジョン共感と、入社してからやりたいことがはっきりしている

1の説明

これに関しては省きます。この記事で伝えたいことの本筋ではないので。(一応このへんは採用担当内で詳しく深堀りしています)

2の説明

ビジョン共感と、入社してからやりたいことがはっきりしている
正直これに関しては、長期インターン経験がない新卒だと意味がわからないと思います。よって詳しく話していきます。

ビジョン共感とは

まぁその名の通り会社が掲げるビジョンに共感しているか、ということですね。
なぜビジョン共感を求めるのかというと、新卒には技術力よりもボトムアップで会社を引っ張っていく存在になってほしいという願いのほうが大きいからです。
大事なことなのでもう一度書きます。新卒には技術力よりもボトムアップで会社を引っ張っていく存在になってほしいという願いのほうが大きいからです。

正直技術力だけなら新卒で取らなくて良くて、業務委託で十分です。(これは中途採用でも言えます)

ビジョン共感は面接である程度は分かります。その人が今後やってみたいことを聞くのです。
ここで短期〜中長期のやってみたいことを考えており、きちんと逆算できているか。そしてそこに熱意はあるか。という感じです。
ただ、正直これを面接で見極められません。 は????????となるかもしれませんが、そんなもんです。一緒に働いてみないと分かりません。

しかし、この辺をきちんと考えて自己分析して対策しておくことで、面接を突破できる可能性は高くなります。
自己分析はきちんと考え抜きましょう。

最後に

就活してるとき、ビジョン共感がうんちゃらかんちゃら!って言う人はかなり多かったのですが自分はあまりイメージ出来なかったです。
ただ、入社してからやっと分かりました。ビジョン共感は自分のやりたいことと会社のビジョンのマッチなんだなと。
まぁこれは個人の意見なので他の人の考えは違うかもしれませんが

新卒1ヶ月目を振り返って

新卒1ヶ月目を振り返ってみたいなタイトルを付けておきつつ、入社前に約3ヶ月くらい内定者インターンしてました。タイトル詐欺です。よろしくおねがいします。

入社初日のお話

まず、入社式や研修がコロナウィルスのおかげで消えました。そのため4/1は普通にいつもどおりの業務をしてました。草

開発のお話

開発はfeature3, bugfix1の計4PRをマージしてました。結構手戻りが起きたPRがあり、約10日かかってしまったのは本当に反省です...
今回手戻りが発生していた原因に、降ってきた仕様書から伝わる文言と実装してほしい内容が違っていた、というのがありました。あと、自分がここに機能を追加すればいいだろうと考えていたところが全然違っていたということがありました。
この辺はとても難しいところではありますが、今後もっとスピード感を持って開発できるように設計段階からレビューをもらうようにするなど心がけていきたいですね...

あとはリポジトリのコードオーナーになったり、QAのリリースオーナーになったりしてました。そのおかげでめちゃくちゃGitの知識が増えました。

朝会のお話

週1で行われる朝会の運営を新卒メンバーで行ってました。その中でみんなスライドづくりに関する土台があまりなかったのでフォントサイズとかフォント色、行間など、いろいろテンプレ作ってこれを守ってもらうようにしてました。(ただ悲しいことに全然浸透しなかった...)

かなり工数重かったのですが、PDCA回したりKPIを立てて振り返りが行いやすく、結構有意義な場になってました。

採用のお話

面接でめちゃくちゃ落とされてきた人間が落とす側に回ってしまいました。なにか因果関係でもあるんですかね。

ちなみにやってみた理由としては、面白そうだしやってみようくらいのノリではじめました。あとは組織醸成が結構面白いのもちょっとあります。
ただやってみた感想でいうと、会社のためにはなるけどあんまり自分のためになる感がなくて、
じゃあどうやって自分のためになるようにしたほうがいいのか?を考えたとき、個人的にKPI立てて計測する、というくらいしかないなって感じです。

とりあえず最後までやりきったあと、振り返ってみて今後も採用続けていくか考えていこうかなと。

1ヶ月間のリモートワークの所感

会社なら疲れたら場所を変えて仕事する、ってことができたのですが、いかんせん自宅(ましてや今住んでるのシェアハウス)な分ほぼ作業場が固定されてしまい、とても腰が痛くなってしまうというのがかなり辛い...
そのためなるべく姿勢をよくすることがいいかもしれんということを考え、Magic TrackPad2とキーボードパームレストリストレストを購入しました。今まで尊師スタイルだったのですが、ちゃんと分けたほうがいいことを実感しました。

あとは、人が周りにいない分Slackの即レスを心がけて信用をつくる、ということをやっていたのですが、1on1でそれだとあまり集中できなくて結構開発の手戻りが発生してしまうよねと言われて確かに...ってなってました。
信用を作るか開発の集中とスピードを取るかは結構トレードオフなので、とりあえずこの時間は返信少ないよ、集中するよという時間を作ってみました。まぁただ結構その時間に重要な連絡が来たりするので辛かったのですが...

個人の目標のお話

自分は自動化できる仕事はすべて人間から奪い去るという目標があるので、とりあえず細分化して1Qの目標としてCircleCIのconfigを読めて書けるようになる、ということを目標に置きました。
業務に関する勉強も結構はいってくるのですが、大体は半々位の割合で勉強してました。いまんとこいい感じです。

その他

本当に自分がやりたいことをやりまくっていた結果、会社で4月度のMVPをいただきました。本当に自由度が高い会社だからこそできたことなので、とても感謝しています。これからも頑張っていく所存です

プログラミングをはじめて2年が経ったので振り返る。そしてこれから

ちょうど今日が誕生日ということもあり、これを節目として今年度の振り返りとこれからの目標を述べたいと思います。

去年の振り返りはこちら
ssabcire.hatenablog.com

今年度の振り返り

3月~7月末

  • 就活で苦しむ。殆どの時間を就活に捧げる
  • Vue.js触ってみる
  • GoでCLI作成

それくらい。本当に技術関係何もしてない。就活は悪。ダークサイドに落ちてた。
f:id:ssabcire:20200126212239j:plain

書いた記事



8,9月

  • インターン
    • 実際に働く現場を知る
    • Python3, pytestに詳しくなる

書いた記事



10~1月

書いた記事



振り返ってみて

就活中の停滞と、就活が終わってからのインプットアウトプットがすごいことになってるな~と感じますね...
あとは、インターンを経験して実際に働く現場で求められていることなどを知ったことも大きかったです。そこからインプットの仕方がすごく変わったので。
それにしても、大学生活4年間は本当にあっという間でしたね...もう就職なんですね。



来年度の目標とこれから

就活のときから、「自動化できる仕事はすべて人間から奪い去りたい」という思いがあります。
理由は少し長くなりますが、親友が働いている会社の仕事量が膨大すぎて毎日会社に泊まることが続き、最終的に酒に溺れて失踪しました。そのようなことを二度と起こしたくないと思っています。
「自動化できる仕事はすべて人間から奪い去りたい」を実現するために、「最強の自動化エンジニアになる」という大きな目標を立てます。

上記の自動化エンジニアとは

  • テスト自動化ができる
  • 運用の自動化ができる
  • 手作業でしているタスクの自動化ができる
  • 自動化出来るのに手作業でしているものを撲滅することができる

etc...

これらを3~5年間以内には出来るようになりたいと思っています。
そこで、半年間で以下の目標を立て、達成するようにします。

  • CI/CD周りを強くなる
    • CircleCI
    • Cloud Build
    • etc...
  • 運用自動化について強くなる
    • SREについて詳しくなる
    • Infrastructure as Codeについて詳しくなる

また、あまりそれとは関係ないのですが、インターン先で日本語を話せないインド人インターン生のオンボーディングと、プロジェクトを一緒にやっているのですが、私が英語を聞き取れない/話せないのでとてもつらい思いをしています...
そのため、入社までには英語を聞ける/話せるように持っていくことを最優先事項として進めます。

初めてPythonを学ぶ人が業務レベルまでの力を身につけるまでのおすすめの本

こんにちは。研究やインターン先でPython3を書いている者です。
今回は、Python3を触ったことがない、ましてやプログラミングすら初めて、という人に対して向ける記事です。
主に、入門の本から業務レベルまでの知識を身につけられるようになるための本を紹介していきます。

入門編

プログラミング初めての人向け

本当にプログラミングをしたことがない人には、この本がおすすめです。

いちばんやさしい Python入門教室

いちばんやさしい Python入門教室

この本を一度軽く読んだことがあるのですが、プログラミングをしたことがない人でも分かるように書かれており、とても良書です。

他の言語とかちょっと触ったことあるよの人向け

次に、他の言語を触ったことがあったり授業でやったことがあるけど...という人には、この本がおすすめです。

詳細! Python 3 入門ノート

詳細! Python 3 入門ノート

この本もとてもわかり易く書かれており、実際に手を動かしながら書くことで結構Pythonのことを理解できます。私もこの本でPythonを学びましたが、とても分かりやすい本でした。

ステップアップ編

Pythonでできることは数多くあります。

それぞれ興味のあるものをやってみましょう。そして、触ってこれは違うなと思ったら別のものを触ってみて、楽しい!と思えるものを見つけてみましょう。
ちなみに私のPython経歴は、 機械学習から入るが躓く→Webアプリでプログラミング楽しくなる→研究で機械学習自然言語をやりました。コードをたくさん書いてドキュメントが読めるようになるまで機械学習にすぐ飛びつくのは危険かもしれません。

機械学習

機械学習で初心者から触る本は申し訳ながら私は分からないのですが、研究で一番最初に読んで分かりやすかった本はこちらです。

Python機械学習ライブラリ scikit-learn活用レシピ80+ (impress top gear)

Python機械学習ライブラリ scikit-learn活用レシピ80+ (impress top gear)



合わせて、こちらも読むといいでしょう。

この2冊で機械学習の大まかなところは理解できると思います。

自然言語処理

自然言語処理の入門の本といえばまずはこちらからだと思います。自然言語処理初学者向けにわかりやすく書かれています。

Pythonで動かして学ぶ 自然言語処理入門

Pythonで動かして学ぶ 自然言語処理入門


上記の本を読み終えたら、この本がいいでしょう。
ゼロから作るDeep Learning ❷ ―自然言語処理編

ゼロから作るDeep Learning ❷ ―自然言語処理編


私はかいつまんで読みましたが、より自然言語処理に詳しくなることができます。

Webアプリ

PythonでWebアプリを作ってみるなら、メジャーなものでいえばDjangoとFlaskです。好きな方をやってみるといいでしょう。

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

  • 作者:横瀬 明仁
  • 出版社/メーカー: NextPublishing Authors Press
  • 発売日: 2018/08/26
  • メディア: オンデマンド (ペーパーバック)

その他

適当に便利ツールを作ってみるのも、簡単にかけるPythonのいいところです。
この本で手を動かしてみて知識をつけ、自分がつくってみたいものを考えてやってみるのも、プログラミング上達の道です。


業務レベルの力を身につける編

ある程度Pythonのコードもかけるようになってきた!インターン行きたいし業務レベルのことも学びたい!という人にはこちらの4冊の本がおすすめです。

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

テスト駆動Python

テスト駆動Python

  • 作者:Brian Okken
  • 出版社/メーカー: 翔泳社
  • 発売日: 2018/08/29
  • メディア: 単行本(ソフトカバー)

これらの本で、Pythonのバージョン管理や、業務に必要なGit, テストなどを学ぶことで、業務レベルの力を身につけることができると思います。
他にも多く覚えることはありますが、とりあえずこれだけでもとても力は身についていると思います。

おまけ

なんだかアフィリエイトっぽい記事になってしまった...