ゆるおたノート

Tomorrow is another day.

【備忘録】初めてイベント運営してみて出来たこと・出来なかったこと - 事前準備編

少し時間が経ってしまいましたが、3/9と4/20にノンプロ研のイベントを仙台で開催させていただきました。

※両日とも終了しています。 ノンプロ研もくもく会@仙台Vol.1 - connpass ノンプロ研もくもく会@仙台Vol.1 | eventon(イベントン)

心情的なことは既に書きましたので、具体的な反省として、今回動いた中で「やっておいて良かった」、「もっと改善したい」など、自分で思ったことを忘れないうちに記録しておきます。
次はいつ出来るか分かりませんが、いつかのために…!

まずは、事前準備編から。

やって良かったこと

会場は足を使って探す

主宰のタカハシさんにもご用命いただきました。

ホームページや情報サイトに書かれている「徒歩●分!」や「●人収容!」のような情報は、不動産と同じくらいかなーりザックリ書かれています。
私が見た限りでも、「少し盛られてるなー」くらいに思った方が安全だと思いました。

さらに、「距離的には近いけど迷いそう」とか、「たしかに机は人数分あるけど、座るのはギュウギュウになりそうだなー」とかの情報も、実際に足を運んで自分の目で見ないと分からない点でした。

また、ちょっと話が逸れますが、私は学生時代の一時期ジャズセッションに通い詰めていました。
会場のジャズバーやライブバーの多くは「アブナイ街」の真ん中にありました。新宿歌舞伎町とか、駅前だけど地下街だとか、徒歩数分圏内にラブホがあるとか。
私自身は慣れてしまったので女でも1人で通ってましたけど、女性は誘いづらいなーと思うことが結構ありました。

いわゆる勉強会は、「その日限り」の参加になってしまう方も多いでしょう。
その点も考えて、人気(ひとけ)が無かったり、周りに「ホテル」が多かったり、会場までの道のりで不安になりそうな場所は避けるようにしました。

その代わり、駅からちょっと距離はあったのですが…その点はトレードオフですかね。

運営神に相談する

アレやってコレやって…というイメージは何となく頭にあったものの、実際仕切るとなったら、何をすればいいのかさっぱり分からない状態でした。
上述の会場探しから当日の仕事まで、何から何まで知らなかったです。
「そんなんでやってて良いのか?」と自分でも思いますが、一旦それは置いておいて、、、

ノンプロ研には、やりたい人が自ら手を挙げる土壌もあってか、いろんなベテラン(=神)の方が集まっていました。
社会人の集まりなので、当然と言えば当然なのでしょうか…?

それで、「お金は事前決済にした方が安全」とか、「会議室のWifiパスワードを四方に掲示しよう」とか、「初めてのもくもく会ならリモートで支援があった方が良い」とか、具体的なアドバイスを沢山いただきました
(この場をお借りして、お礼申し上げます。本当にありがとうございました!)

やれば良かったこと

モデルケースを体験しておく

↑と関連しますが、イベント運営の経験は、大人になってからは全くありませんでした。*1

参加者側と運営側で視点や目的はだいぶ違うなぁと。
いかに今までのんびり参加していたことか…
特に3/9は何も出来ず任せっきりになってしまったのが、結構凹みました。

事前にアシスタントをやるだとか、流れと作業をある程度身体で覚えていれば、もう少しスムーズに動けたんじゃないかなと思います。

夜はしっかり寝る

地味なことですが、結構大事だと思いました。

慣れないことをやっていたのもあって、(過剰に?)緊張していました。
勉強会とは言え一応趣味の時間なので、多少は楽しい気持ちを持ち帰ってほしいなとか考えていたら、両日とも夜はあまり眠れず…
(結果的に出来ていたかどうかはあまり自信がありませんが…)

もう少しシャッキリした頭で動きたかった。

荷物を確認する

詳しくは後述しますが、「アレも必要だな、これも必要だな…」と直前にポンポン浮かんでくるので、当日はどんどん時間が無くなって割と焦りました
多分これは私の性格・特性的なものもあると思います。

当日の負担を少しでも減らすために、当日朝には使わないPCとかケーブル類とか、前夜までに準備できるものは余裕をもって準備してしまいましょう。

さらに余裕があれば、朝ごはん&昼ごはんも。

イベント名を掲示するシートを作成する

↑と関連して。

会場がマンションの一室だったので、入室するのにためらわれた方が何名かいらっしゃいました
いま考えれば、自分が同じ立場でもそうなるだろうなーと容易に想像できます。

もくもく会の日は特に、もくもくすることで既に頭いっぱいになっていて、ドアも閉めたままになってしまい…(ごめんなさい)
画面もSlackを拡大して映してましたが、部屋の外からは見えるワケが無いですね…(ごめんなさい)

せめて、入り口から見える位置にでっかくディスプレイしておけば、「ここか!」って気付けますよね。

当日余裕があればその場で作成してもいいと思いますが、まだ何も定まっていない状態なので…
ある程度見栄えのいいものを作ることも考えて、これは事前に作っておいても損は無いだろうなと思いました。
せめてテンプレだけでも!

データの管理を考えるとGoogleスライドが良いのでしょうか…?
また、当日WifiのIDとパスワードを入力するスペースも忘れずに。

(出来れば)アンケートを用意する

今回は何もしなかったのですが、良い形で継続していくことを考えるなら、やっぱりコレは必要かなと思いました。

仲間内でやるだけなら後でもコミュニケーションは取れますが、オープン参加のものは感想を聞きようが無いことに気付きまして。
あと、個人的にも気になってしまうので…

何名かはその後twitterでフォローさせていただいていますが、正直な感想は匿名の方が答えやすいですよね。

まとめ

「余裕をもって準備」が下手なのがバレバレですね。
懇親会でも「得意不得意がハッキリしてるよね」と言われたのですが、このさき何十年も生き残れるのか不安です。

最近は凸凹人間も世の中で認められるようにはなってきたものの、自分自身、何が得意かもよく分かっておらず…

そろそろ年齢的にそんな事言ってられないので、具体的な対策をせねば…

連載目次

  1. 【雑記】人が怖いのに何故かイベントの運営を買って出て思ったこと - ゆるおたノート
  2. 当記事【備忘録】初めてイベント運営してみて出来たこと・出来なかったこと - 事前準備編 - ゆるおたノート
  3. 【備忘録】初めてイベント運営してみて出来たこと・出来なかったこと - 当日・後日編 - ゆるおたノート
  4. 【備忘録】初めてのLTで出来たこと・出来なかったこと - ゆるおたノート

注釈

*1:強いて言えば、学生時代に飲み会係や合宿係をやったくらいで。
取りまとめとか苦手なので、いつも半泣きでした。
就活生でも使えないネタ。苦笑

【雑記】人が怖いのに何故かイベントの運営を買って出て思ったこと

年末に「2019年内に何かイベントしたいな~」とぼんやり呟いてから約4か月。
あっという間に2回もイベントの運営者をやってしまいました。

ドラマーの癖に、ソロが回ってくると頭が真っ白になって音楽を止めるくらい笑えないほど目立つのが苦手なのに、自分から発案してしまったのは何故だろう。

実測値が欲しくて、自転車も持っているのにわざわざ歩いて貸し会議室を回り…
興奮と緊張で大して眠れずボケボケのまま自己紹介をして失笑を買い…
恐らくそのまま帰るつもりだった方々を強引に引き留めて日本酒を飲み比べ(おいしい)…

「手を挙げてしまったからには」と、これまで出会ったテキパキ動いてくれる人々を想像して、ポンコツなりに頭を使いました。
でも、やっぱり分からないことが多すぎて。

きっと、関係者の皆様にはイライラと不安をお届けしてしまっていると思います…
余計なことして申し訳ありません…


あぁ、こりゃ私には向いてないわ。
人を助けるのが好きだなんて、ずいぶん驕ってるな。

帰り道は後悔が頭を埋め尽くして、上り坂が辛い。
心なしか、右手のPCも行きより重い気がする。


とか残念なポエムを本当に坂を上りながら脳内でこしらえつつ、振り返ってみると…

やりたいと言ったら「やっちゃいましょう!」と即返ってきた。
準備の時から「こういう時は〇〇があるとイイね!」と助け船をいただいた。
終わると「楽しかった!」「参加して良かった!」「またやって下さい!」って声を掛けて下さる方も居た。

あぁ、これかぁ。こういうことかー。嬉しいなー。
社交辞令だとしても、私じゃなくてフォーマットへの言葉でも。単純だー。

人より出来ないことが多いのって、実は長所なのかもしれないですね。
ちょっとしたことで喜べるし。

でも本当は、この楽しさが広まってくれたらもっと嬉しいです。
自己満足で終わるんじゃなくて、1回限りでサヨナラじゃなくて、ノンプロ研が広まってほしい。
教えてもらうだけじゃなくて、みんなで学ぶ会。
皆オトナだから、マイペースでも知らないことだらけでも怒られないよ。

そして、私じゃなくて有能な方が仕切ってくれたら完璧!
だれか居ませんかー!
ていうか、個人的にリアルに継続が厳しい状況でして…

いつか、後ろの方でこっそり「ほらね、楽しいでしょ?」とか、あたかも自分が育てたかのようにドヤ顔する古参おじさんに、私はなりたい。

※※※※※※※※※※※※※※※※※※※※※※※※※※

昨夜途中まで書いた記事です。
眠気と闘いつつだったので案の定いつも以上に気持ち悪いけど、このまま上げちゃいますw

真面目な振り返りは、後ほど別途記事にしたいと思います!

連載目次

  1. 当記事【雑記】人が怖いのに何故かイベントの運営を買って出て思ったこと - ゆるおたノート
  2. 【備忘録】初めてイベント運営してみて出来たこと・出来なかったこと - 事前準備編 - ゆるおたノート
  3. 【備忘録】初めてイベント運営してみて出来たこと・出来なかったこと - 当日・後日編 - ゆるおたノート
  4. 【備忘録】初めてのLTで出来たこと・出来なかったこと - ゆるおたノート

【読書記録】Webの勉強を再開してみた

突然ですが、もし同僚や友人にインターネットについてこんな質問をされたら、あなたは自力で説明出来ますか?

  • HTTPって何?
  • Webページってどうして世界中で見られるの?
  • そもそもインターネットって何?

私は…全部Noです。笑
なんとなーく知ってはいるけど、言葉で説明しろと言われたら詰まります…

プログラミングを勉強していると、説明なしに専門用語が登場することもありますよね。
GASで言えば、HTTPリクエストやDOM、トランザクションとか。

いちいちつど調べないといけないし、分かったような分かんないような…でモヤモヤ。
そもそも解説記事もノンプログラマーやプログラム入門者はお呼びでないらしく、最悪その説明すら解読できないこともしばしば…

「調べてみて分からないことは、とりあえず飛ばしちゃえ!そのうち分かるよ!」
…なんて言われることもありますが、「そろそろ苦しいなぁ…」と思ってきました。

そんなところで、ある方のツイートで以下2冊の紹介を拝見。

その方によると、Web初心者は前者を読んでから後者を読むのがオススメとのことです。
本屋でザっと中身を見たところ、たしかに後者は高度に感じたので、私もまずは前者を購入してみました。

対象読者

冒頭にあったHTTPをネットで調べると、だいたいこんな説明です。

HTTPとは、インターネット・プロトコルのうちの1つ。TCP/IPと組み合わせて、WebサーバーとWebページをやり取りする手順、規約。

ここで、1つでも横文字単語に「?」が浮かんだ方には、今回の本がWebサービス*1理解の助けになると思います。

HTTP、インターネット、プロトコルTCP/IP、Webサーバー、Webページ…*2
それぞれについて、イラストと短文で解説されています。

もちろん、大抵のことはネットで調べれば分かっちゃう時代なので、これらも自分で調べて自分でまとめていけば、理解出来る方もいると思います。しかも無料で。*3

だから、私も購入をためらってしばらく本屋さんをウロウロしましたが笑、最終的に以下の点を理由に購入を決めました。

  • 全体の把握にあまり時間を掛けたくない
  • そもそも予備知識が殆どない
  • 調べながらリンクを辿るうちに「結局どれとどれが繋がってどういう意味になるんだっけ?」と、こんがらがりがち

私のような方にとっては、自分に合った文体・ボリューム体系的にまとめてくれているものを参考書として1冊手元に置いておく価値はあるかなと思います。

ちなみに本書では…

本の帯には、対象者として以下のように書かれています。

本書は、次のような方のために書かれています。

  • これからIT系の仕事に就かれる方
  • これから社内の情報システムを担当される方
  • Webシステムに関連する技術と実務を、幅広く、バランスよく学びたい方

私の場合は「実務」というより「興味」本位で手に取ったので上記はどれも当てはまらないような気もしますが笑、強いて言えばGASやWebサービスの勉強という意味で3つ目でしょうか。

本の構成

見開き1ページで、1テーマを2~3項目ずつ解説。
Webの仕組み・成り立ちから、Webシステムの設計・運用の思想、セキュリティと認証など、概念的なものを広く浅く扱われています。

まだ1章に目を通しただけですが、関連する用語や解説の中で新しく出た用語もそれぞれ解説ページが記載されているので、「だからー!その説明が意味分かりませんからー!(怒)」みたいなことはありませんでした。

巻末には索引もあり、イラストと易しい文章で項目ごとにサーッと内容を把握できるので、辞書的に分からないところだけ知識を補強するような読み方*4もできると思います。

これを読み終わったら…

まえがきにも

本書が扱う範囲は、あくまで入門的な部分にとどまります。

とあるので、これを読み終えたとしても「Webを理解した」状態には遠く及ばないでしょう。
実務に必要な方はWebを支える技術(前述)も読む必要があると思われますが、素人の私にも理解できるのかどうか…???(不安)

ちなみに今回の本はシリーズ物(下記)で、ネットワークやサーバー等についても出版されています。
Amazonのレビューによると情シスさん向けで全くの初学者には少し難しいらしいのですが、実物を見つつ検討しようかなと思います。

あとは、もし出来れば同じような構成・レベルでコンピュータそのもの*5とか、はやりの機械学習とか出してくれたらなーと淡く期待しています。

うーん、私はどこに向かってるんだろうか…?

シリーズのリンク

注釈

*1:本書の中でもWebサービスとWebシステムは違う意味の用語として説明されていますが、ここでは「Webシステム」を便宜的にWebサービスとして記載します。

*2:WebサーバーやWebページなんかは既に知っているかと思いますが…

*3:現に、そういう目的のWebサイトもありますね。
同サイトで、先日ノンプロ研で紹介されていたこちらの記事も面白いです!

*4:現代用語の基礎知識」的な。

*5:OSの成り立ちとか演算や記録の仕組みとか。「コンピュータサイエンス」と言うんでしょうかね…?

【ドルオタ】アルバムほしいなぁ。

こちらの記事は、下記URLに移転しました。
約3秒後に自動的にリダイレクトします。

ジャンプしない場合は、下記をクリックしてください。

新記事はこちら

【ドルオタ】アルバムほしいなぁ。 - ゆるオタクのつぶやき

【VBA】変数のスコープを整理してみる。

GASがなかなか 言うことを聞いてくれない 身に付いてないので、
最近はこちらの記事でVBAの勉強を挟んでみています。

tonari-it.com

「コレは上書き出来て、アレはダメで…」
頭で考えてたら何だかこんがらがってきたので、変数のスコープについて図で整理してみました。
※便宜上、型宣言の部分は省略しています。適宜補完して下さい。

変数のスコープ図。

Spreadsheetで貼ってみますが、見辛かったらご指摘ください。

<2019/02/02 追記>
※画像に差し替えました。


クリックで拡大します。

内側に行くほど、壁が厚くなります。

なお、プライベート・モジュール・レベル変数は、「宣言セクション」で宣言する必要があります。

変数の使い分け。

問題のスコープですが。

前提として、外から中の変数へアクセス(呼び出し、操作)することは可能です。
中から外へは、アクセスできません。

他のモジュールからアクセス

プライベート・モジュール・レベル変数であれば、下記のようにモジュール間で呼び出して使うことは出来ます。

上記の図を例にすると、Module1からModule2の変数b2を呼び出す場合、Module1では以下のように記載します。

'[Module1]
Module2.b2

ただし、定義や現在の値が把握しづらくなるなど、事故の原因になるため実際の使用は控えます。

よって、他のモジュール(やプロシージャ)の変数が必要になったら、原則、引数で受け渡します。

'[Module1]
Public Sub exampleProcedure1()

    Dim tmp1 As String
    tmp1 = "TEST"
    Call exampleProcedure2()

End Sub

'[Module2]
Private Sub exampleProcedure2(byVal tmp2 As String)

    MsgBox "これは" & tmp2 & "です。"

End Sub

どうしてもパブリックにするなら

引数を使わずに他のモジュールからアクセスする場合は、Publicステートメントを使ってパブリック変数とします。

Public a As

ただ、これも定義や現在の状態が把握しづらくなるため、必要に迫られない限りは使用を控えます。

初心者の私が知っている範囲では、必要になるのはクラスくらいでしょうか。

<2019/10/28 追記>
クラスでもパブリック変数はあまり使わないようですね…逆に何処で必要なんだろう…?

www.yuru-wota.com

www.yuru-wota.com

まとめ。

ここまでをまとめると、VBAの変数は以下のように扱います。

  • 可能な限り、スコープは小さく、小さく。コーディング的にも、物理(人間の視野)的にも。
  • 外からのアクセスが必要になったら引数で渡す。
  • オブジェクト変数の場合は、不要になったらset 変数 = Nothnigで参照を切っておく。(今回は言及していませんが。)

クラスが使えるようになったら、ここに項目が増えていくのかもしれませんね。
GASと同様、身に付くにはまだまだ時間がかかりそうですが、使いこなす日が楽しみです。わくわく。

以上、お勉強メモでした。

【雑記】おばあちゃん。

こちらの記事は、下記URLに移転しました。
約3秒後に自動的にリダイレクトします。

ジャンプしない場合は、下記をクリックしてください。

新記事はこちら

【雑記】おばあちゃん。 - ゆるオタクのつぶやき

【Excel VBA】定型メールをボタン1つで作成する手段を考える話。

毎日、仕事でメールを書いています。

顧客情報(Webページ)をコピペして、その説明を書いて、何回かチェックして送信、…
という流れなのですが、頭の回転が遅いのとケアレスミスでやり直すのとで結構時間を食います。そして無駄にイライラする…

そうこうしているうちにお客様もお待たせしてしまうし、誤開示なんてことになったら…
と考えると良いことがありません。

そもそもコピペ部分はシステムでどうにかして欲しいのですが笑、なかなかそうもいかず。
少しでも頭を使う時間を確保するためにExcelの力を借りてみました。

シートの作成イメージ

AAA不動産から、BBBカンパニーに何やら不穏な会合のお知らせをお届け、という設定(仮)。

※画像はイメージです。 f:id:yuricks7:20181111180953p:plain

まず、定型的な項目に絞って入力項目を考えます(A列)。
B列にその内容を記入すると、D列のExcel関数でメール本文が作成されます。

作成後、D1セルにあるこれを格納ボタンを押すとD列の文章が
クリップボードに格納されるので、それを貼り付けて送信、という寸法です。

コード

D1セルのボタンに設定するコードは以下の通りです。

Option Explicit

'=======================
'【1】格納するセルの範囲を設定
'=======================
Public Sub setVariableForInfoMail()

    Const FIRST_ROW As Long = 2
    Const LAST_ROW As Long = 23

    Dim TARGET_COL As Long = 4

    Call storeIntoClipboard(FIRST_ROW, LAST_ROW, TARGET_COL)

End Sub

'F列で内容の違うメールを作成して、F1セルにもボタンを作る
Public Sub setVariableForAskMail()

    Const FIRST_ROW As Long = 2
    Const LAST_ROW As Long = 7

    Dim TARGET_COL As Long = 6

    Call storeIntoClipboard(FIRST_ROW, LAST_ROW, TARGET_COL)

End Sub

'=======================
'【2】連結した文字列をクリップボードに格納する(メイン)
'=======================
'事前にライブラリの参照設定をしておく。
'ユーザーフォームの 追加 > 削除 でok。
'ライブラリ名:【Microsoft Forms 2.0 Object Library】
Private Sub storeIntoClipboard(ByVal firstRow As Long, _
                               ByVal lastRow As Long, _
                               ByVal targetCol As Long)

    Dim ThisSheet As Worksheet
    Set ThisSheet = ThisWorkbook.ActiveSheet

    Dim tmpStrings As String
    tmpStrings = joinStrings(ThisSheet, firstRow, lastRow, targetCol)

    With New MSForms.DataObject
        .SetText tmpStrings<br>'変数の値をDataObjectに格納する
        .PutInClipboard<br>'DataObjectのデータをクリップボードに格納する
    End With
    
    '参考としてH列に連結結果を出力
    Const OUTPUT_COL As Long = 8
    ThisSheet.Paste Destination:=ThisSheet.Cells(firstRow, OUTPUT_COL)
    
    MsgBox "格納しました。" & vbCrLf & _
                "一旦メモ帳に貼り付けてお使いください。"

End Sub

'=======================
'【3】文字列を連結する
'=======================
Private Function joinStrings(ByRef targetSheet As Worksheet, _
                             ByVal firstRow As Long, _
                             ByVal lastRow As Long, _
                             ByVal targetCol As Long) As String

    Dim results As String: results = targetSheet.Cells(firstRow, targetCol)
    
    Dim i As Long
    For i = firstRow + 1 To lastRow
        results = results & vbCrLf & targetSheet.Cells(i, targetCol)
    Next i

    joinStrings = results

End Function

ちょっとだけ補足します

【1】格納するセルの範囲を設定

ワークシートの列ごとに何パターンか定型文を用意するとして、
ボタンごとに格納する範囲を設定します。

Public Sub setVariableForInfoMail()

    Const FIRST_ROW As Long = 2
    Const LAST_ROW As Long = 23

    Dim TARGET_COL As Long = 4

    Call storeIntoClipboard(FIRST_ROW, LAST_ROW, TARGET_COL)

End Sub

※多分これは最終行の取得(苦手)でもう少し柔軟に変更できる気がします。。。

【2】連結した文字列をクリップボードに格納する

クリップボードにデータを格納するにあたり、データオブジェクトという
少し特殊な機能を使います。

ライブラリ一覧から探すのは数が多すぎてちょっとめんどくさいので笑、
ユーザーフォームをいったん追加して削除することで参照設定だけ適用します。

'事前にライブラリの参照設定をしておく。
'ユーザーフォームの 追加 > 削除 でok。
'ライブラリ名:【Microsoft Forms 2.0 Object Library】

'~~(中略)~~

    With New MSForms.DataObject
        .SetText tmpStrings<br>'変数の値をDataObjectに格納する
        .PutInClipboard<br>'DataObjectのデータをクリップボードに格納する
    End With

また、そのまま貼り付けすると文字化けを起こす*1ので、メモ帳などのエディタを経由して変換します。

    MsgBox "格納しました。" & vbCrLf & _
                "一旦メモ帳に貼り付けてお使いください。"

私のレベルと時間の関係で今回はやめましたが、これも本当はコードで解決すると思います。ADOオブジェクトとやらで…?

【3】文字列を連結する

文字列の連結と言ったらJoin関数と思ったのですが、連結対象を
範囲(二次元配列)で渡す
ので動いてくれませんでした。
配列を取り出して改行を足して文字列に…とか考えてたらよく分からなくなってしまいました。笑

<2018/01/05追記>
WorksheetFunction.TRANSPOSE関数というものを使うと、
二次元配列を一次元に直してくれるというコメントをいただきました。ありがとうございます!
詳しい説明は、頂いた下記リンクをご参照ください。
thom.hateblo.jp

というわけで、現状(未修正)は1行ずつ取り出して
手動でつなげる流れです。

Private Function joinStrings(ByRef targetSheet As Worksheet, _
                             ByVal firstRow As Long, _
                             ByVal lastRow As Long, _
                             ByVal targetCol As Long) As String

    Dim results As String: results = targetSheet.Cells(firstRow, targetCol)
    
    Dim i As Long
    For i = firstRow + 1 To lastRow
        results = results & vbCrLf & targetSheet.Cells(i, targetCol)
    Next i

    joinStrings = results

End Function

イメージとしては、
----------------------
文 + 改行
文 + 改行
文 + 改行
~中略~
文 + 改行
+ 改行
---------------------- という動きです。
※最後は改行しません。

参照

【2】の部分は、ほぼ下記から拝借いたしました。
www.moug.net

いつもお世話になっております!

まとめ

ブログ用に簡素にしていますが、実際は入力欄とメール本文のシートを分けて、
顧客情報のページからコピペ→必要な情報を関数で抜き出して入力する形になっています。
完璧ではないので、操作自体はまだちょっとめんどくさいです。

ただ、少なくとも誤字脱字は減ったのと作業スピードは上がりました。
そもそも入力を間違えたら元も子もないですが…そこは最低限Wチェックでカバーするとして…

余裕が出来たら、入力欄はページ丸ごとコピペだけでデータを抽出できるといいな
と考えています。人間の操作は限りなく0に減らしたいですね。

今の業務では使っていないですが、今後Outlookも使うようになったら
送信まで自動化できそうだな~と。

あと、文字コード問題は早めに対処したいです。優先度高めで。

やりたいことだけ膨らんで実現まではなかなかたどり着かないのが残念ですが、
少しずつ時間を見つけて頑張ります。それでは!

注釈

*1: たぶん文字コード(Shift-JISとUnicode)の問題で…

【#ノンプロ研】私のこれまでとこれからの話。

<2019/11/18 追記>
ノンプロ研は2019年4月末に退会しています。
既に内容が古い可能性がありますが、何卒ご容赦ください。。。

ノンプロ研Advent Calender 2018の10日目を担当します、yuricks7@yuricks7)と申します。

ノンプロ研 Advent Calendar 2018 - Adventar

アドベントカレンダーというと、毎日シールをめくってクリスマスを待っていた友人(かわいい)を思い出すのですが、そういうイベント事に疎い私は「さすが欧米文化はオシャレだなぁ」なんて他人事に思っていました。
(と言っても、彼女は純日本人ですけど…)

その当時は知らなかったけど、これをブログに転用?して技術系ブログ大集合!みたいな企画が広まっているのですね。
最近は技術ブログだけでもないようですが、ノンプロ研に所属している自分も、ご多分に漏れずこちらに参加することになりました。

特に新しいことはやっていないので何を書こうかと考えた結果、この間書いた記事(後述)の続きがまだ無かったので、今回は2018年の振り返り来年の目標を記したいと思います。

どうぞゆるくお付き合いください。

私のこれまで

今年も含め、直近3年間の経過を下記の記事にまとめました。
もし興味がありましたらご覧いただければと思います。

【#ノンプロ研】自分のスキルとかまじめに考えてみた話。 - ゆるおたノート

2018年

上記(とその後の2ヶ月)を踏まえ、今年を振り返ってみます。

今年始めたこと

プログラミングの勉強(Web編)

1月~3月頃は、先輩たちの書いたVBAコードを自分が読めるように書き換える、というのを業務の空き時間にやりながら、割り振り表から自分の担当を抽出するツールや、社内ツールからコピペした情報を文章に変換するツールを作ってみました。

ほとんどExcelの関数とマクロの記録でしたが、「自分で書いたコードが動く」達成感だけでニヤニヤしました。
お陰でついつい業務そっちのけで熱中してしまいました。笑

ノンプロ研に入ってからは、出来るだけ毎日PCに向かうようにしました。
これはきのぴぃさんのツイートがキッカケだったと思うのですが、ごめんなさい、該当のツイートを見つけられませんでした…

寝落ちすることも多かったので完全に毎日ではないですが、時間になると「あ、やるか」とスタート出来ました。

何度か朝活にも挑戦しましたが、夜型人間なのでこれは全く続きませんでした。。。
夜中に決意して早寝しても、朝になると「1分でもあれば寝たい」気持ちに負けてしまう。
ここは来年も意識改革と習慣改善に取り組まなければと思っています。

このため、勉強は主に平日深夜と週末でした。
隣の部屋で寝ている家族に一応気を使って(笑)、暗い部屋でカタカタ取り組みました。

また、ノンプロ研に入ったころにちゃんと勉強しようと思い立ち、いくつかWebサービスや書籍の力を借りました。
まずは初心者向けサービスを中心に、取っ掛かりやすい物に手あたり次第アタック。

Webサービス / Paiza

勉強として最初に使ったのはこちらです。
環境構築不要!初心者でも楽しく学習できるプログラミング入門サービス【paizaラーニング】

本職プログラマの養成をメインとするサービスのためか、VBA講座は無かったので、「なんかPython流行ってるし私もやってみたい。無料だし。」という動機だけで何となくPythonを選び、動画と見比べつつコードを書いてみました。

声優さんのアニメ声と早口にちょっとムズムズしたけど、動画は分かりやすかったと思います。
あと、RPG風の進捗画面は、主人公もかわいくて楽しかったです。

レッスンを1通りやったところでスキルチェックにもチャレンジしましたが、これは全然解けませんでした…
問題文が読めない…日本語なのに…絶望…

とりあえず標準出力はできたので、これは用語と作法を知らないだけだと自分に言い聞かせて、ここは保留することに。
今後また少しずつ挑戦したいです。

Webサービス / CodinGame

Paizaのスキルチェックと合わせて、何か問題を解いてみたいと思って1問だけ覗きました。
Coding Games and Programming Challenges to Code Better

簡単な英語ではあるものの、日本語が一切無いのでまず求められている仕様を理解するところから難しいです。
(日本語のブログもありますが、ほとんどネタバレか宣伝記事でした…)

でも自分で書いたコードの動きをアニメーションで見られるので、(全然書けなくて判定がNGばかりだったことに目を瞑れば)文字通りゲーム感覚で楽しかったです。

少しだけゲーム開発をしている気分になれました。笑
お正月にまたやろうかな?

Webサービス / Progate

言わずと知れた初心者向けプログラミング学習サービス。
Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

ちょっとやっては他の言語、ちょっとやってはまた他の言語、と気の向くままに進めました。

最終的に講座の制覇はやめたんですが、どの言語もやることはほぼ同じなのを知れたことと、興味が先行していたので勉強に前向きになれたことは収穫だったと思います。

※2018/12/10現在の進捗状況 2018/12/10現在の進捗状況

一時期結構やったつもりでしたが、改めて見ると全然進んでないですね…

Twitter / #100DaysOfCode

Twitterで知ったハッシュタグで、世界中の人たちがプログラミングの勉強記録を付けています。

先日の記事に書いた時点でDay67。
最終的に、12/05にDay100達成しました。つい最近です。はぁ、長かった…

結局毎日は出来なかったし自己満足ですが、「こんなに勉強した」という達成感と、「前より●●が出来るようになった」と文字として残ること、そしていろんな人から「いいね!」を貰えたことは、大いに自分を励ましてくれました。

ある程度を超えるとハッシュタグ上の自分の履歴を追えなくなるのに気付いて、途中からリプライのツリー形式にしたことで、振り返りもしやすくなりました。
(見たくない人はまとめて非表示にすることもできるし。)

たぶんペースは落ちると思いますが、勉強記録はハッシュタグを変えて続けたいと思います。
(あとノンプロ研の100本ノックも。)

勉強会 / ノンプロ研

Webサービスとはちょっと違いますが、今年1年で一番影響があったのはやっぱりコレ。
コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研

というか、VBAの神、タカハシノリアキさんを始めとするノンプロ研の皆さんでした。
ノンプロ研に出会わなければ、今頃もずっと鬱々としていたでしょう。

自分でモノを作って動かす経験をして、メンバーの皆さんと交流して、流行りの?言葉を借りれば自己効力感とか自己肯定感も少し得たと思います。

エネルギーが無いときは何か簡単な作業から、というのは最近よく聞きますが、より効果的な方法として何か「創作」をして強制的に「アドレナリン」を出すのが良いそうです。
詳しくは別途記事にできればと思います。

最近はそれを意識して、「何かやる気が出ない」時はモノを作るように心掛けています。

また、TwitterでもSlackでも、メンバーの皆さんは明るくて前向きです。
質問したら絶対答えてくれるし、間違えてもそっと軌道修正してくれるし、ふざけつつめっちゃ勉強してるし、オフはしっかり満喫していらっしゃる。

そして、知識欲がすごいです。
プログラムを志すなら当たり前なのかもしれませんが、ノンプロ研以外にも勉強会に出かけたり、仕事に使えるツールの情報共有したり。
知識欲がすごいです。(2回目)

私はネガティブかつ、かなりのめんどくさがりなので、何も考えずに生きていたらきっと出会えなかったであろう方達ですね。

プログラミングの勉強(書籍編)

また、読書は苦手ですが、Webサービスだけでなく書籍にも向き合って取り組んでみました。

VBAのツボとコツ

前職の先輩にオススメされた本。

すぐに本屋で買ったけど結局しばらく放置してしまい…
でもやっぱり1回は本を読んで勉強しよう、と思い直して最初に手に取った1冊です。

初心者の人に向けて、とにかく徹底的に易しく書いてあります。
だから、既に分かってた部分はちょっとまどろっこしくて若干読み辛いところもありましたが、「知ってる」を「解ってる」に変えてくれます。

そして、「モノを作り上げた!」という達成感が味わえます。
初心者の勉強には大事。

コードを書くなんて怖いけど、とりあえず何かを作れるようになりたい方にオススメです。

脱入門者のVBA

ツボとコツを1周してちょっとテンション上がったので、勢いそのままに買いました。初kindle本。

ツボとコツとは違うシリーズですが、同じ著者なのでとにかく易しく丁寧に説明してくれます。

私は「1行書いて、さぁ動作確認!」→失敗→「あれ、戻せない…」となりがちなんですが、
「その前に、一旦ブックを保存しましょう」
「動かしたら『保存せずに』開き直しましょう」
など、転ばぬ先の杖のようなコメントが常に書いてあります。

人によってはしつこく感じるかもしれませんが、うっかりミスが日常茶飯事な私にはとても嬉しいです。

プロトタイプのデバッグに着手したところで止まってるので、また時間作って続きをやらねば。

詳解GAS

仕事ではG Suite使えないんですが、流行りに乗りたい気持ちと、1つの言語を体系的に学ぶ経験を積むために購入しました。

噂には聞いていましたが、とにかくデカくて厚いです。長いです。笑
受験勉強も薄いテキストの繰り返しで乗り切った誤魔化した私にとっては、それだけでかなりの苦行です。笑

本屋さんで見て少しビビってしまったので、とりあえず心理的障壁を減らすべく、kindleで購入しました。
でも、リファレンス本としても使えることを考えると、紙の本で買った方が良かったかなと今は思っています。

今、7章の後半です。
過去のツイートによると8/25に初めたようなので、ちょこちょこ浮気しつつ3ヶ月掛けていますね。

著者のタカハシさん曰く8章までは必須とのことなので、当面はそれを目標にちまちま取り組んでいます。

自己理解

下記にも関係するため本当はここに書きたいのですが、字数の関係でまた別の記事にします。ごめんなさい。

今年意識したこと

前回の記事に書けなかった部分ですが、いま意識しているのは

  • 自分が楽しむこと
  • 完璧主義を手放すこと

です。

カッコつけては失敗し凹んできたので、最近はあまり100%を目指さないことにしています。

また、今までは誰かに褒めてもらいたい気持ちが少なからず、いやむしろ結構あったのですが、大人になると満たされるのはなかなか難しいです。
そして、「独りで勝手に潰れる」のを繰り返してきました。
アドラー心理学によれば、自分の行動目的を「他者に依存」している状態です。

ここから卒業すべく、まずは自分が満足することを目標にしました。

たぶんノンプロ研のメンバーとしてはレベルの低い取り組みだろうと思いますが、道半ばで投げ出さないように、長期的に見て今の自分より成長することを自分に言い聞かせて。

今年出来るようになったこと

サービスジプシーはしましたが、完全に投げ出すことは減ったし、苦手だった事務処理も心理的障壁は無くなりました。

そして、会社でも徐々に集計業務を任せてもらえるようになりました。
レポートは後で検算しているらしいのでまだ完全には信用してもらえていない気がしますが、一歩ずつ前進はしているかな、と今は考えています。

2019年

やりたいことリスト

来年は、以下の3つを実現したいと思います。

何かツールを作り、世に出す

スゴイものでなくて良いので、何か外にアピールできるものが欲しい。

ブログ記事を30本以上書く。

今は月に2本を目標にしていますが、来年はもう一声して30本を目標にします。
そして少しはアドセンスが欲しい…

仙台で何か開催する

ノンプロ研仙台が出来るといいなぁ…需要無いかなぁ…

コンセプト

今年の2つに加えて、来年はまた誰かに貢献することを考えます。

  • 自分が楽しんだ上で、誰かに喜んでもらうこと
  • 完璧主義を手放すこと

「自分が楽しんだうえで」がミソ。

ゆるく楽しく、こだわるところはこだわる。来年もマイペースに1年を過ごしたいと思います。

最後に

ここまでお付き合いいただきありがとうございました。

アドベントカレンダーは、まだまだ続きます。
まだノンプロ研に入ってない方は、少しでもノンプロ研に興味が出たら是非お気軽に門を叩いてみてください。
正直ちょっとお高いですが笑、ヘタな習い事するよりもずっと楽しい日々になると思います。

そしてノンプロ研の皆さん、ちょっと早いですが、引き続き来年もヘタレなポンコツをよろしくお願いいたします。

~昨日とうとう雪が積もった仙台の外れより~

【ドルオタ】疲れた時には天使の笑顔を、の話。

こちらの記事は、下記URLに移転しました。
約3秒後に自動的にリダイレクトします。

ジャンプしない場合は、下記をクリックしてください。

新記事はこちら

【ドルオタ】疲れた時には天使の笑顔を、の話。 - ゆるオタクのつぶやき

【ドルオタ】疲れた時には天使の笑顔を、の話。

こちらの記事は、下記URLに移転しました。
約3秒後に自動的にリダイレクトします。

ジャンプしない場合は、下記をクリックしてください。

新記事はこちら

【ドルオタ】疲れた時には天使の笑顔を、の話。 - ゆるオタクのつぶやき

【GoogleAppsScript】コールバック関数を使わずに表現する方法を考えてみた話。

最近、コールバック関数なるテクニックを学びました。
配列の要素たちに対して、反復メソッド(に指定した処理)を繰り返し適用・処理してくれるというものです。

これを使うと、何段階かの処理をシンプルに表現できます。ちょー便利。

代表的なのは、forEachメソッド(またの名をforEach文)*1でしょうか?

ただ、その代わり実際の処理が見えなくなりやすいので、コードを共有するときはノンプログラマーの壁になってしまうのだそうです。

(今のところGASツールの共有どころか「コーディングのコの字も出てこない」部署に居ますが…笑)*2
いつかチームで自動化に取り組む時のために、そして自分の勉強のために、より基礎的な(?)for文を使って処理内容の再現に挑戦してみました。

サンプル

GAS本より、下記のサンプルを拝借しました。

(p.182) ▼サンプル 7-4-7 reduceメソッドとreduceRightメソッド

function myFunction_7_4_7() {
  var array1 = ['Bob', 'Tom', 'Jay', 'Dan'];

  //引数array1の先頭の要素から取り出して、順番に連結する
  var result1 = array1.reduce(function(str, name, index, array) {
    return str + name;
  });
  Logger.log(result1);
  
  //引数array1の末尾の要素から取り出して、順番に連結する
  var result2 = array1.reduceRight(function(str, name, index, array) {
    return str + name;
  });
  Logger.log(result2);
}

今回は、これを書き換えてみます。
(たぶん反復メソッドの中で簡単な方なので…)

まずはお勉強 ~反復メソッドとコールバック関数~

基本構文

配列.反復メソッド(コールバック関数, 反復の初期値);

これを少しずつ分解して考えてみます。

分解して考えてみる

引き数

反復メソッドの引き数は、以下の通りです。

反復メソッド(コールバック関数, 反復の初期値)
  • Function callback:コールバック関数
    反復に必要な処理を、「関数リテラル」で指定します。省略不可。

  • Optional Object initialValue:反復の初期値
    コールバック関数の始めの処理に、最初の引き数として使用されます。
    「Optional」、つまり省略可です。
    省略すると配列オブジェクトの最初の要素(インデックスは0)が使用されます。
    ただし、配列が空だとエラーになるので要注意。

戻り値

「コールバック関数の戻り値」で「アレコレした結果」を返します。

◆reduceメソッド、reduceRightメソッド

reduceメソッドは、配列の要素を「先頭から昇順」で取り出して、「左から」順に1つの値へまとめて返します。

先頭の要素から順に1つの値へまとめる

逆に、reduceRightメソッドは「末尾から降順」に取り出して「右から」順に並べて返します。

コールバック関数の中身

これらのメソッドでは、コールバック関数の中で以下の4つを引き数に取ります。

function(ひとつ前の結果, 現在の値, 現在のインデックス, 呼び出されている配列) {
  return 処理;
}
  • previousValue (accumulator)
    ひとつ前の処理結果、または初期の値(initialValue)

  • currentValue
    現在処理されている要素の値

  • Optional index
    現在処理されている要素のインデックス。省略可。

  • Optional array
    呼び出されている配列。省略可。

例えば、今回のサンプルのうちreduceメソッドで考えてみます。

var array1 = ['Bob', 'Tom', 'Jay', 'Dan'];

// 関数リテラルでコールバック関数を定義
function(str, name, index, array1) {
  return str + name;
}

コールバック関数の中で、各引き数の値は下記のように変遷します。

// 1回目
function('', 'Bob', 0, array1) {
  return '' + 'Bob'; //'Bob'
}

// 2回目
function('Bob', 'Tom', 1, array1) {
  return 'Bob' + 'Tom'; //'BobTom'
}

// 3回目
function('BobTom', 'Jay', 2, array1) {
  return 'BobTom' + 'Jay'; //'BobTomJay'
}

// 4回目
function('BobTomJay', 'Dan', 3, array1) {
  return 'BobTomJay' + 'Dan'; //'BobTomJayDan'
}

このように、コールバック関数は、反復メソッドの呼び出し元である「Arrayオブジェクト」から、各引き数の中身として勝手に要素を引っ張ってきてくれます。

そのため、引き数とは言っても自分で値を持っているので、コールバック関数の各引き数の中身はこちらで定義出来ないようです。
名前は自由に変えられるのにな…

改めて、構文。

これらを踏まえて今回のメソッドを書き換えてみると、構文は次のようになります。

配列.反復メソッド(function(ひとつ前の結果, 現在の値, 現在のインデックス, 呼び出されている配列) {
  return 処理;
}, 反復の初期値);

入れ子だからカッコが多くてなんかややこしいですけど…

書き換えてみた。

さて、本題です。

サンプル(再掲)

(p.182) ▼サンプル 7-4-7 reduceメソッドとreduceRightメソッド

function myFunction_7_4_7() {
  var array1 = ['Bob', 'Tom', 'Jay', 'Dan'];

  //引数array1の先頭の要素から取り出して、順番に連結する
  var result1 = array1.reduce(function(str, name, index, array) {
    return str + name;
  });
  Logger.log(result1);
  
  //引数array1の末尾の要素から取り出して、順番に連結する
  var result2 = array1.reduceRight(function(str, name, index, array) {
    return str + name;
  });
  Logger.log(result2);
}

処理の流れ

一応書いておくと、処理の流れとしては下記のとおりです。

  1. reduce関数に配列を渡す。
  2. joinElements関数で要素を連結する。
  3. インデックスの昇順で2.を繰り返し、結果をResultに繋いでいく。
  4. 連結の結果をRewriteMethods関数に返して、ログ出力する。
  5. reduceRight関数も、インデックスの降順で2.~4.を行う。

コード

※変数名は便宜的に少し変えています。

/* -------------------------------メイン------------------------------- */

function RewriteMethods() {
  var testArray = ['Bob', 'Tom', 'Jay', 'Dan'];

  var reduceResult = '';
  reduceResult = reduce(testArray);
  Logger.log(reduceResult);

  var reduceRightResult = '';
  reduceRightResult = reduceRight(testArray);
  Logger.log(reduceRightResult);
}

/* ----------------------------反復メソッド---------------------------- */

//繰り返しを昇順に設定して連結
function reduce(Array) {
  var Result1 = ''; //念のため初期化
  
  for (var i = 0; i < Array.length - 1; i++) {
    var index1 = i;
    var str1 = Array[index1]; //ひとつ前の処理結果
    var name1 = Array[index1 + 1]; //現在の値
    
    Result1 = joinElements(str1, name1, Result1);
  }
  return Result1; //コールバック関数の戻り値
}
//同じく降順に設定して連結
function reduceRight(Array) {
  var Result2 = ''; //念のため初期化
  
  for (var j = Array.length - 1; j > 0; j--) {
    var index2 = j;
    var str2 = Array[index2]; //ひとつ前の処理結果
    var name2 = Array[index2 -1]; //現在の値

    Result2 = joinElements(str2, name2, Result2);
  }
  return Result2; //コールバック関数の戻り値
}

/* ---------------------------コールバック関数------------------------- */

//ひとつ前の処理結果に、現在の値(要素)を繋げる
function joinElements(str, name, currentResult) {
  if (currentResult.indexOf(str, 1) <= 0) {
    return str + name;
  } else {
    return currentResult + name;
  }
}

感想と展望

今回は関数で置き換えてみました。
ただ、ここまで書いてから気付いたことですが、本来は「Arrayクラス」のメソッドなので関数ではなくクラスとprototypeプロパティを使った方が良いのでは?と思いました。
リファレンスでもそうなっていますね。(後述)

でも、初級者間で共有するという目的の場合は、クラスを使ってしまうと本末転倒なので、今回のコードの方が使えるかなと思います。

また、調べながら記事を書いていて、調べれば調べるほど疑問や気になることが増えて、どんどん「ワケワカラン!」になりました。(これも後述)
結局、すべては解決出来てない状態で書いてます。悪しからず…

そして個人的には、英語の勉強も兼ねて英語のリファレンスを読んでみたかったのですが、GASのリファレンスでは該当の部分を見つけられませんでした…
探し方が悪いのか、そもそもコンテンツが違うのかな…?

今後のためには調べ方も勉強する必要がありそうです。めんどくさい。

疑問が解消したら、少しずつここにも書き加えていきたいと思います。

<2019/10/28 追記>
GASのリファレンスは、「GAS特有のクラス」についてのドキュメントでした(恥)。
JavaScriptの文法は別途調べよう、ということですね。

余談

仮引数は一部省略可

上記の例では、コールバック関数の中でindexarrayは処理に使われていません。
これらはOptionalなので、このように書いても同じように動きます。

// コールバック関数
function(str, name) {
  return str + name;
}

逆に、敢えて宣言しておけば、function()の処理の中でそれぞれを使うこともできます。
例えばこんな感じ。

// コールバック関数
function(str, name, index, array1) {
  return String(index) + str + name;
}

ただし、indexはcurrentValue(※)の添え字なので、「0ではなく1から出力される」ことは注意が必要です。
※↑のサンプルコードではname

混乱してきたら、return文の1行前に↓を追加して実行し、ログを確認してみてください。

Logger.log('(%s) %s, %s', index, name, array);

値の動きを追えるのでオススメです。

ブラウザ依存

GASの親分であるJavaScriptの話ですが、Webブラウザによってはこのメソッドが対応していないこともあるそうです。

リファレンスに自分で実装する方法も載っているので、必要な方は参考にされると良いかと思います。
(書き換えを先に自分で試してから説明とか調べたので知らなかったのですが、多分コレが今回やろうとしてることの正解ですね…)

※GASはGoogleさんが標準装備してくれてるので、ココは関係ないです!
わーい、覚えることが減ったぞー。

型の疑問…

試しに、スクリプトエディタでreduceメソッドを途中まで入力してみると、下記のようにヒントが出ます。

initialValueも戻り値も「値」なのに型はObjectなんですよね…なぜだろう?

reduce(Function callback, Object initialValue) : Objcet

これは「(評価前でまだ型が分からないので)なにがしかのオブジェクト」って意味なのかな???🤔

参照

今回お世話になったのは、下記の書籍とWebサイトです。

書籍

  • みんな大好きGASの教科書!サンプルの出典元です。

リファレンス

*1:VBAで言うと「For Each文」が似てますね。

*2:<2019/10/28 追記>
転職してコーディングの仕事を少し頂けるようになりました!

【GoogleAppsScript】制御構文で処理から抜け出すパターンが多すぎるので整理してみた話。

最近、VBAと共にGASをお勉強しています。

ノンプロ研の「今週のお題」チャンネルを眺めていたところ、ちょうど新しいお題が更新されました。

お題は、FizzBuzz問題

FizzBuzz問題を色んなパターンでどうぞ!
→1から100までの数を出力、ただし3の倍数のときは数の代わりに「Fizz」、
5の倍数のときは「Buzz」、3と5の両方の倍数の場合には「FizzBuzz」と出力
(ノンプロ研 #12_今週のお題 チャンネルより)

プログラムのお勉強では定番だそうです。

ちょうどif文やfor文などの制御構文を勉強したばっかりでしたが、
勉強とは言っても写経つづきで実践問題はまだ試してなかったし、
「お、これなら書ける…?今がこの時!」と息巻いて挑戦してみました。

が、ループをどう書くかで悩んでしまいました。

繰り返すとか繰り返さないとかしゃらくせぇ!勝手にしやがれコノヤロー!!ヽ(`Д´)ノ

…とは思っても、残念ながらコンピュータにはそんな言葉通じないので、
(例によって時間は経ってしまいましたが)整理してみました。

最初のソースコード

お題は、先述のFizzBuzz問題

if文とfor文を組み合わせて、初心者コードで書いてみました。
下記は、その初稿です。

function FizzBuzz() {
  for (var i = 1; i <= 100; i++) {
    if (i % (3 * 5) === 0) {
      Logger.log('FizzBuzz');
      continue;
 
    } else if (i % 3 === 0) {
      Logger.log('Fizz');
 
    } else if (i % 5 === 0) {
      Logger.log('Buzz');
 
    } else {
      Logger.log(i);
 
    }
  }
}

JavaScriptに慣れ親しんでいる方はお気づきかと思いますが、こちら↑には間違いがあります。

構文エラーは出ないし、処理も想定通り動いてくれたのですが、正しい書き方ではありません。
つまり、プログラミングの敵である「何故かちゃんと動く」コードです。

書いている間も「for文の内側のif文で条件を満たしたときにどこで次のiに進むのか??」で混乱しつつ、
自信が無いながらも提出してみたところ、ノンプロ研のGAS番長さんにコメントをいただきました。
いつもありがとうございます!!

「5行目のcontinueいらんはず~!」

そう、if文の場合は、どこに書くかが問題ではなくてcontinue文自体不要なのです。
混乱した原因は、同じ制御構文の中でも、使用するモノによって必要なステートメントが違ったり
ステートメント自体不要だったりすることでした。

同じ過ちを繰り返しては困るので、処理から抜け出す表現の違いを
以下に整理してまとめてみます。

参考文献

今回の参考文献と出典元はこちら。いつもお世話になっております。

それぞれの構文の詳細はこちら↑をご参照ください。

if文

概要

通常の条件分岐。

最初のtrueブロックの処理が終わり次第、抜け出す

条件式1、条件式2、~と順番に判定し、最初に条件式がtrueだったブロックが実行される。

if (条件式1) {
  //条件式1が true の場合に実行
 
} else if (条件式2) {
  //条件式2が true の場合に実行
 
~~~
~~~
 
} else {
  //上記すべての条件式が false だった場合に実行
 
}

switch文

概要

条件式内で、左辺(式)は共通で右辺(値)だけが変わっていくような場合は、
この方がif文よりシンプルに書ける。

trueブロックを順に実行し、break文で抜け出す

式に該当するcase節以降のすべての処理を実行する。

switch (式) {
  case 値1:
    //式 === 値1 だった時の処理
    break;
 
  case 値2:
    //式 === 値2 だった時の処理
    break;
 
~~~
~~~
 
  default:
    //式が上記すべての値に合致しなかった時の処理
}

なお、break文が無い限りは、ブロックの途中で抜け出せない。

while文

概要

条件式を満たしている間は、処理を繰り返す。回数は条件式の内容により変化するので不定

条件式がfalseになったら、処理を止めて抜け出す

条件式がtrueの間はブロック内の処理を繰り返し、条件式がfalseになったらwhileループを抜ける。

while (条件式) {
  //条件式が true の間、繰り返し実行される
}

※(注意)無限ループの例

while文は、whileループを抜けるように組まなければならない。

//▼サンプル4-4-2(p.111)より
function myFunction() {
  var x =0;
  while (x < 100) {
    x *= 3; //0に何回3を掛けても、xは増えない
    Logger.log ('xの値:%s', x);
  }
}

上記のような例では、永遠に処理が終わらない。

GASの場合は"関数myFunctionを実行中…"が消えなくなるので、キャンセルで消して処理を強制終了すること。
(GASなら制限時間が来れば自動終了するけど、サーバーへ余計な負担になるので…)

for文 と for...in文

概要

  • for文とは?
    カウンタ変数(通常はイテレータiを使って回数を制御しつつ、繰り返す。

  • for...in文とは?
    オブジェクト内のすべてのプロパティについて繰り返し処理を行う。

抜け出し方は、どちらも同じ。

break文で処理を止めて抜け出す

break文と、for文、if文とを組み合わせることで、ループの終了条件を増やすことができる。

for (初期化式; 条件式1; 増減式) {
  if (条件式2) {
    break; //条件式2が true になったらループを中断してfor文の外へ
  }
 
  //(条件式2が true になると飛ばされる)
}

continue文で次にスキップする

条件式を満たした場合のみループ処理をスキップして、次の繰り返しに移行する。

for (初期化式; 条件式1; 増減式) {
  if (条件式2) {
    continue; //条件式2が true なら、for文内の処理は1回スキップして次の繰り返しへ
  }
 
  //(条件式2が false の時のみ実行される)
}

ループにラベルを付けて階層を指定する

ループや条件分岐をネストした場合、ラベルの付与をすることで
中断(break文)したりスキップ(continue文)したりする階層を指定することができる。

/* for文 その1==================== */
ラベルA : //※ここは【半角スペース+コロン】
for (初期化式1; 条件式1; 増減式1) {
 
  /* for文 その2---------------------------------- */
  for (初期化式2; 条件式2; 増減式2) {
    if (条件式3) {
      break ラベルA; //※ここは【セミコロン】
      //条件式3が true になったら、for文①(ラベルAのついたfor文)のループを中断してfor文①の外へ
    }
 
    //(条件式3が false の時のみ実行される)
  }
  /* ------------------------------------------ */
 
}
/* ============================== */

お勉強まとめ。

以上より、今回のお題の正解(の1つ)も記載しておきます。

function FizzBuzz() {
  for (var i = 1; i <= 100; i++) {
    if (i % (3 * 5) === 0) {
      Logger.log('FizzBuzz');
 
    } else if (i % 3 === 0) {
      Logger.log('Fizz');
 
    } else if (i % 5 === 0) {
      Logger.log('Buzz');
 
    } else {
      Logger.log(i);
 
    }
  }
}

他の方の回答やネットを見ると、まだまだ書き方があるみたいです。
クラスとか二項演算子とか。私にはまだ難しいですが…

余談ですが、間違ったコードを「成果物」として公開するのは、本来良いことでは無いと思います。
でも、チームプレイではない孤独なノンプログラマーとしては、上述のように直接フィードバックを頂けるのは
とても有難いことですし、私みたいなモノグサ人間でもちゃんと復習するキッカケにもなりました。

なので、私のようにビビりな方がもし居れば、勉強中のうちにダメなところもどんどんアウトプットして、
ガンガン叩いてもらって笑、今のうちに弱点を潰して行きましょう!…という受け売りです。笑

そして、早く私も誰かを助けられるようになりたい。

【#ノンプロ研】自分のスキルとかまじめに考えてみた話。

こちらの記事は、下記URLに移転しました。
約3秒後に自動的にリダイレクトします。

ジャンプしない場合は、下記をクリックしてください。

新記事はこちら

yuru-wota.hateblo.jp

【#ノンプロ研】自分のスキルとかまじめに考えてみた話。

以前参加した定例会、まだ宿題を提出していませんでした。
だいぶ経ってからもう1度動画を見返して、提出しなきゃと思ってはいたのですが…

ノンプロ研の本拠地?、Slackのチャンネルは既にアーカイブされておりました。
…遅すぎた。笑

そんなわけで、書くところが無くなってたので(こっぱずかしい内容ではありますが)こちらに書いてみることにします。
※長くなってしまったので、前後編になります。

定例会08 向こう3年のスキルアッププランを考える

定例会では、タカハシさんの独立から(その時点で)直近までの行動記録についてお話されていました。

3年間。私はどう生きてきたかなぁ。

まず、振り返ってみました。

キリが悪かったので3年+α分です。
スキルアセット的なところと、それに関することは太字にしています。

2014年1月。田舎のスーパーでアルバイト。

他店から異動してきた社員さんにちょっとだけ発注作業を任せていただき、データ分析に社員さんの作ったマクロを使用。
ここでVBAなる魔法を知る。

社員なら「早朝のオープンから閉店まで居るのが当たり前!社長が来るなら休日返上!」な会社で、この方は社内で「定時に帰る神」と呼ばれていました。
(わたし的VBAの神様その1。)

さすがに社長来店時はちゃんと出勤されてましたが笑、集計作業はマクロでさっさと終わらせ、発注メールは辞書登録で1文字だけ入力で送信、品出し・加工・棚卸しはとにかくテンポ良く。

効率化、効率化、効率化…
これが「デキる人」なんだな、と思いました。

自分はと言うと、PC作業以前に、品出し・加工がなかなか進まない。
学生時代に料理も少ししてたし自信があったはずなのに、かなりどんくさい店員でした。

いま思えば、このころが自分の「働き方」の価値観を決める原点だったかも知れません。

ふと、ちょっと前に登録してた派遣会社のことを思い出し、その会社のオンライン講座で休日にExcel関数(IFとかVLOOKUPとか)を勉強するも、集計表に数値を入力するだけだった自分には、まだ使い道がありませんでした。

上述のマクロも、自分でも弄ってみたくて中身を見てみたものの、さっぱり意味が分からずそっと画面を閉じた…

2016年5月。田舎を飛び出し、ガテン(検査業務)兼事務職を体験。

真夏だって、雨の日だって、ヘルメットかぶって屋外作業。
社員の大半はガジェット苦手の超アナログな会社…

検査データのExcelファイルも、手入力でレポート用に加工して、完成したレポートも一旦印刷してから目視で誤字確認するので、報酬系不足のうっかり人間には集中力が続かず。

現場は先輩たちが手取り足取り教えてくれたし、各地に出張してめちゃくちゃ楽しかったのですが、事務仕事は単純作業の山で眠くてたまりませんでした。

仕事が無い時にネットで条件付き書式なる神業を発見し、こっそり修正案を作成してみたものの、ベテラン様が怖くて提案できずじまい…笑

2016年8月~9月。空白の2か月。←

「この先どうしようかな~」とぼんやり過ごす。

正直、何をしてたか記憶があまり無い…

2016年10月。弟に異変。

クローン病が見つかり、「闘病の手伝い」という名目で引っ越すことに。

単発バイトをしながら関東と東北を行ったり来たりしつつ、仕事を探す。

2017年1月。外資系コールセンターに派遣。

「The 外資」のイメージ通りの会社。笑
毎日大量のレポートがメールで届き、英語で「これ、意味分かんないけど?」「これ、どうなってんの?」が飛び交う。

ノルマとか厳しい会社だけど、(福利厚生も含めて)いいアイディアはすぐに採用!!そして即実行!!
スピード感、ハンパない。

私は英語なんてできないし、そばで折衝と顧客対応のメール、集計のお手伝いをするだけでしたが、「なんかカッコイイ会社にいる」というだけで自己満足してました。笑

ここで、VBAの神様その2に出会いました。
大量のレポート集計の柱は、東京本社でVBA担当をされていたスーパー派遣マンでした。
(この方は単純作業もチーム内の処理速度トップ…)

教えてもらった本はすぐに買った後すぐ積読になって、ネットでVBA入門のサイトを夜中に一気読みし、会社のVBAコードを隙あらばのぞき見しつつ、自分用にもツールを作って共有してみたりしました。

まだ実際の作業が早くなったわけでもないので、周りには「なんかまた遊んでる」としか見られてなかったのですが、仙台チームはPC苦手な方が多かったので、そのサポートとしては少し貢献できたかなと思います。

この会社ではペーパーレス化を推進していて、事業サイドでもマニュアルをHTMLで残したり、データ抽出にSQLを使ってたり、部署と人によってはLinuxを使ってたりしたようなので、このころにノンプロ研に出会っていればもうちょっと天国感が延びたかもしれません。

シフト表もデータで届くし、勤怠連絡もメール一本だし、、、(勤怠はペーパーレス関係ないけど)

学生時代にちょろっとやったHTMLで私もマニュアル作成に少し参加したものの、最後の方でマニュアルの記述言語が急に独自言語限定に仕様変更されて、私はついていけなくなりました。笑

2018年3月。コールセンターに派遣。

バリバリな外資系で体調を崩し、違う会社に変更。
メール作成が主業務ですが、またアナログな会社でした。というか、現在進行形でアナログです。

各種資料は紙で配布。シフト希望や日報も紙で提出。
クライアント様のデータは書式バラバラ・表記ゆれ天国で、正確にソートできない、検索もできない…

この辺の改善はまだ私には出来ませんが、それまでせこせこVBAショートカットを勉強していたおかげで、メイン業務の質・スピードは少し自信が持てるくらいにはなりました。

そして、タカハシさんのツイートから「アウトプットが大事」と学んで、このブログを開設してみました。
が、ちょろちょろ記事を書いてみたものの、いまいちアウトプットの感覚がつかめず続かない…

ノンプロ研も入りたいなーとふんわり思いつつ、タカハシさんのサロン開設報告を眺める。

2018年4月。ノンプロ研に入会。

疲れて深夜に漫然とツイッターを眺めていたところ、東北民にもノンプロ研入会のチャンス。
一気に準備して定例会に初参加しました。

この辺りは過去に書いたので、割愛します。
もしご興味がありましたらご覧いただければと思います。

2018年5月。Progateを始める。

ノンプロ研の先輩方の間で何やら賑わっていて、CEO様にもリプライをいただき、調子に乗って入会。笑
アプリを中心に、興味の向くままにいろんなコースをつまみ食いしました。

主にやったのは、HTMLCSSRuby
上述の通りWeb系なら学生時代に少しやってたので、無理なく付いていけるなと思って。

ただし、夜中にやってたこともあり、のめり込み過ぎてだんだん業務に支障が出るようになったので、業務に直接関係無いWeb系の勉強は、その後一旦休止することにしました。

でも、Progateのお陰でプログラミングの勉強が一歩進んだ気がします。

2018年6月。勉強習慣をつけてみる。

Twitterで流れてきた#100DaysOfCodeに参加。(ここが公式かな?)

案の定、何日も空いたりして毎日は出来ていないものの、いまだに継続中です。
6/16にスタートして、ただいま(前日の10/14を入れて)Day67です。
…あれ、「毎日じゃない」とか「たまに書き忘れてる」とかにしても計算が合わないな?笑

はい、「毎日じゃなくていい」を拡大解釈して、3か月経った今やっと半分を超えた程度でゆるく続けています。笑

ツイート内容としては、ブログを残す代わりに「アウトプット」を意識して書いてます。
長すぎず、たまに付け加えたりも出来たりして、これが功を奏して続いてるのかな、と思います。
(本当は何か記事も書けるといいのですが、写経している本をコピペするわけにもいかず難しくて…)

そして、ゆるく継続してきた副産物として、自己評価とか自尊心とかが上がってきた気がします。
この点については、下記が参考になります。 完璧主義をやめると、何でも思い通りになる?!ADHD対策の秘策とは。 - 成人ADHDが理想の生活を目指すブログ

さらに、仕事でレポート作成を一部任せてもらえることになりました。
プレッシャーではありますが、素直にうれしい!

残り33Days、今年中に達成できるといいのですが。
終わるころにはどうなっているでしょうか?

2018年10月。現在。

最近はYさんの引退にショックを受けて?体調を崩し、夜な夜な昔の動画を漁ったりしていますが、勉強も忘れないように頑張ってます。
今のところ勉強しているのはVBA(とVBS)、GASとツール連携です。

そして、ノンプロ研でブログのノルマが始まるみたいなので、久しぶりにまじめに筆を執ってみた次第です。
私は2週に1回ということで。…コレいつからかな?

まだオリジナルは無いけど、勉強したことや考えていることについて、今後はブログにも少しずつ記事を書いていきたいと思います。

前編まとめ。

約4年を振り返ってみました。
出来る出来ないは置いといて、なんだかんだPC周りを気にして生活してきたような気がします。

先日検査を受けてみた結果、作業スピード的な部分は脳の器質的に苦手らしいのですが(この辺はまた別の記事にするかもしれません)、それをPCで補っていけるように今後も勉強を続けていきたいです。

将来どうなるかは分からないけど、「他者に惑わされず、今を生きる」を大事にしたいと思います。

最後に、今読んでるこの本、読書嫌いでも読みやすくてオススメです。(唐突w)

つづく。

2018年の振り返りと来年の目標について、書きました。

【#ノンプロ研】私のこれまでとこれからの話。 - ゆるおたノート

【CSS】コードブロックの見た目をVBA用に変えてみた話。

お久しぶりです。ブログが更新できていなくてごめんなさい。

最近は、もっぱらVBAGASでせこせこ写経に取り組んでいます。
それで、学んだコードの記録ついでに、ちょこっとだけリファレンスを更新したんです。
【随時編集】VBAリファレンス集 - ゆるおたノート
でも、なんか見た目が気に入らなくて…

前々から気になってたことでもあって、先生のサイトみたいな見た目にしたかったけど、 これはインストールとか要るみたいでなんかめんどくさくて
よくお世話になっているブログも最近見た目が変わって、カッコイイなーと思っていました。

…ふと「そう言えばちょっと前にProgateというサイトでCSSを学んでたなー」と思い出して、その復習と腕試しも兼ねて、ソースコードの見た目を弄ってみました。
自分のVBEがモデルですが、結果的にちょっとQiita風味にもなって「プログラミング勉強してます感」が増したので満足しています。

ただ、作業にあたってVBAプログラマー向けの記事を見つけられなかったので、教えることは2度学ぶことというノンプロ研(というか主宰タカハシさん)の教えに則り、僭越ながらそのコードについてご紹介します。

※ついでに、このブログ本文の文字も少し小さくしました。
読みづらい等ありましたら、ご遠慮なくコメントいただければと思います。

サンプル

Sub test1()
    'これはVBA向けの表示サンプルです。コードは適当です。
    Dim tmpMsg As string
    tmpMsg = "こんな" & ThisWorkbook.ActiveWorksheet.Cells(1,1).Value & "感じです。"
    msgbox tmpMsg
End Sub

はてなブログとしてはマイナーな言語なのか、セレクタ*1の基準がちょっと微妙なので、一部ヘンなところで色が変わるところもあります。

(それさえ目を瞑れば)おおむね私のVBEの表示に近くなったので、とりあえずは良しとします。

カスタマイズのコード

今回のソースコードを残しておきます。色だけでなくフォントも弄りました。

<2019/05/07追記>
フォントを基本的に等幅のものになるよう変更し、少しサイズも下げました。

<2020/10/30追記>
フォントと色を(個人的に)より読みやすいものに変更しました。

/*--------------------------------------
  シンタックス・ハイライトのフォント
--------------------------------------*/
.entry-content pre.code {
  line-height: 1.5em; /* 行間を詰める */

  font-size  : .85em;
  font-family: 'Roboto Mono',
               'BIZ UDゴシック',
                Consolas,
               'メイリオ',
                Meiryo,
               'ヒラギノ角ゴ ProN',
               'Hiragino Kaku Gothic ProN',
               'MS ゴシック',
               'MS Gothic',
                sans-serif;

  color           : #f0f0f0; /* white 文字色 */
  background-color: #000000; /* black 背景 */
}

/* シンタックス・ハイライト */
.synSpecial    { color: #66FFFF; } /* (明るめの水色) 特殊文字・記号(←変数名とか?) */
.synType       { color: #66FFFF; } /* (明るめの水色) 型 */
.synComment    { color: #FF33CC; } /* (ピンク)  コメント */
.synPreProc    { color: #f0f0f0; } /* White    プリプロセッサ */
.synIdentifier { color: #FFD700; } /* Gold     識別子 */
.synConstant   { color: #F0E68C; } /* Khaki    定数 */
.synStatement  { color: #00CCCC; } /* DarkTurquouse ステートメント */

使い方

余裕と需要があったら、あとで画像を追加します。

  1. はてなブログ管理画面に入る

  2. サイドバーから デザインを選択

  3. をクリックしてカスタマイズタブを開く

  4. デザインCSSを選択

  5. 表示されたテキストボックスに、↑のコードをコピペ
    ※お好みでline-heightsans-serif;の部分は削ってください。

色指定のクラス

コメントにも入れてありますが、分かっている範囲で簡単に表にしてみました。
まだ勉強不足で?だらけですが…

クラスとプロパティ 意味 カラーコード VBA用語
.entry-content pre.code {
  background-color: ***;
}
        
コードブロックの背景 #000000
Black(背景)
- -
.entry-content pre.code {
  color: ***;
}`
        
通常の文字色 #f0f0f0
White
オブジェクト、変数名、プロパティなど Thisworkbook, tmpMsg, FormatConditions, ...
.synSpecial {
  color: ***;
}
        
特殊文字・記号 #66FFFF
(濃い目の水色)
(その他の予約語とか変数名?) start, ...
.synPreProc {
  color: ***;
}
        
プリプロセッサ #f0f0f0
White
(一部のプロパティとメソッド?) Count, Add, ...
.synComment {
  color: ***;
}
        
コメント #FF33CC
(濃い目のピンク)
コメント 'ほげほげ
.synType {
  color: ***;
}
        
データ型 #66FFFF
(濃い目の水色)
データ型 String, Long, Variant, ...
.synStatement {
  color: ***;
}
        
ステートメント #00CCCC
DarkTurquoise
キーワード Sub, With, If, ...
.synConstant {
  color: ***;
}
        
定数 #F0E68C
Khaki
真偽値、名前付き引数等の定数、数字など True, xlUp, 0, ...
.synIdentifier {
  color: ***;
}
        
識別子 #FFD700
Gold
識別子(とVBA関数?) Msgbox, UBound, InStr, ...

補足

  • フォントは上から順に優先度が高く、読者の環境に合わせて適用されるようになっています。

  • 同じ黄色と水色でちょっと差をつけているのは、気分です。
    使い勝手によっては後で変えるかもしれません。

  • line-Heightプロパティで、コードブロック内の行間も詰めてあります。
    遊びで試しに 50% にしてみたらとんでもないことになりました笑

  • VBA(というかVB)向けに調整してあるため、他言語のコードブロックとしては少し見づらいかもしれません。

  • CSSは「マークアップ言語のひとつで云々…」なので、プログラム警察に怒られるかなと迷いましたが、今回は「プログラム」カテゴリの記事としてアップしてます。
    マークアップ関係の記事は今のところ書いてないし、そんなに読まれる記事でもないと思うので…
    気になる方はごめんなさい。

参考記事

以下を参考にさせていただきました。ありがとうございました!

コードブロックのカスタマイズ

サンプルとして載っているコード自体は、VBAではなくC#用とのことです。
セレクタの使い方を含め、参考にさせていただきました。
はてなブログのソースコードの色を変更する - PG日誌

セレクタの判別方法

Google Chromeでページの要素を取得して確認しました。
ブログを見やすくする:ソースコードを見やすくカスタマイズ ~はてな記法、Markdown記法~ - VBAの勉強を始めてみた

VBEの色設定

(コメント以外は)こちらの内容を基にしています。
【エクセルVBA】VBEの背景色や文字色を変更して画面を見やすくしよう

色設定については上記とほぼ同じ内容ですが、VBAコーディングはこちら↓の本から勉強しました。
すべてはここから始まった。

…信者と言われてもかまわないさ。新刊が楽しみです。


*1:というかクラスですかね?