むにえる牧場

毎日むにえるをつくっています

GASで名簿からランダムに抽選するルーレットを作る

概要

とある新社会人になった友人から、「新卒内で当番をランダムに決めるためのアプリが欲しい」と相談を受けたのでGoogle Apps Script(以下GAS)でサクッと名簿ルーレットのようなものをつくってみました。

できあがったものはこんな感じ
(ちなみにこれは各曜日の掃除当番を決めるみたいな感じのものです)

f:id:jalemy:20190518172119g:plain
名簿ルーレットの動作サンプル

コード

ハマりどころ

x列の要素があるセルのみすべて取得する

sheet.getRange('A:A').getValues()

これでA列の値をすべて取得できるのですが、空のセルまで取得してしまうため、余分な要素がある配列になってしまいます。
そこで Array.prototype.filter() を利用して空要素を除外します。

sheet.getRange('A:A').getValues().filter(String)

セルの内容のみ削除する

RangeObject.clear()
RangeObject.clearContent()

clear() を利用するとセルの色付け設定など、すべてが消えてしまいます。
clearContent() を利用すれば入力されている値のみ削除できます。

スプレッドシートのボタンとGASの処理を結びつけ

挿入 > 図形描画 でボタンっぽいものが作れます。
ボタンの上で右クリックすると、ボタン上にハンバーガーメニューアイコンが出てくるので、 スクリプトを割り当て を選択します。
自分で作成したメソッド名を指定すればボタンクリックでイベント発火のトリガーとしてボタンを利用できるようになります。

f:id:jalemy:20190518173512p:plain
ボタンにGASのスクリプトを割り当て

まとめ

2,3時間程度で要望を整理しながら作れたので、ちょっとしたツールのようなものを作るのにGASは便利だなーという感想です。
SpreadSheetを利用する機会は多々ありますし、Excelと違って共有するのも楽です。
そのうちGAS + TypeScript環境も整理していろいろ作りたいです。

学生時代の数学って大事だなと思った話

概要

とある企業の面接にてソートアルゴリズム、もとい計算量の求め方をそらで説明できるかと言われ、「やべえ……できねえ……」となってしまったので、改めて勉強し直してました。
勉強用に使っている本はこちら

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

アルゴリズム図鑑 絵で見てわかる26のアルゴリズム

本の中で、まっさきにバブルソートの紹介がされ、計算量の求め方も紹介されるのですが、そこでの途中式が理解できませんでした……。

※Cを1回の処理にかかる計算量として
CN+(N-1)C+(N-2)+・・・+C(2)+C(1)
=C \displaystyle \frac {1}{2}N(N-1)
↑これの  \displaystyle \frac {1}{2} がどこから出てくるのかわかってなかった。

よく考えてみると数列の公式を使ったもので、「学生時代の数学って……大事だな……」と身に染みたので備忘録。

1からnまでの和を求める公式

1+2+3+・・・+n
という数式があった場合、
 \displaystyle \frac {1}{2}n(n+1)
となります。

なぜこの数式になるのか、具体的な数字を入れて考えてみます。
仮にn=10だとすると、 x=1+2+3+4+5+6+7+8+9+10 になります。

ここで同じ式を逆順で並べると、
x=1+2+3+4+5+6+7+8+9+10
x=10+9+8+7+6+5+4+3+2+1
この2つの式をまとめると、
2x=(1+10)+(2+9)+(3+8)+(4+7)+(5+6)+(6+5)+(7+4)+(8+3)+(9+2)+(10+1)
2x=(11)×10
x=(11×10)÷2
になります。

同様の手順をnのまま進めれば、
x=1+2+3+・・・+(n-2)+(n-1)+n
x=n+(n-1)+(n-2)+・・・3+2+1
この2つの式をまとめて、
2x=(1+n)+(2+(n-1))+(3+(n-2))+・・・((n-2)+3)+((n-1)+2)+(n+1)
2x=(n+1)+(n+1)+(n+1)・・・(n+1)+(n+1)+(n+1)
(n+1)がn個あるので、
2x=n(n+1)
x= \displaystyle \frac {1}{2}n(n+1)

公式が導けました。
 \displaystyle \frac {1}{2}もどこから出てきたか理解できました。

まとめ

学生時代の勉強は大事だと改めて痛感した瞬間でした……。
完全に自分のための備忘録記事です。
ただ一度文章化すれば見直せるし、頭にもインプットしやすいので、役に立つはず。たぶん。

GitHubでcommit間の差分を確認する小技

概要

GitHubでは、branch間・commit間の差分を見やすくしてくれる機能があります。
他の人にレビューしてもらう際に、とても便利だと思うのですが、ぐぐってみたところあまり引っかからなかったので紹介。

github.com

f:id:jalemy:20190508085324p:plain
commit-branch間の差分

このような形でcommit・branch間の差分をとって、commit内容を確認できます。

branch間の差分

https://github.com/{user_name}/{repository_name}/compare/{branch_name}...{branch_name}

上記のようなURLにアクセスすればbranch間の差分が確認できます。

master以外のbranchが存在する場合は、そのbranchページに移動すれば下記画像のようなUIが表示されるので、そこから遷移することも可能です。

f:id:jalemy:20190508085403p:plain
compareボタンが表示される図

commit間の差分

https://github.com/{user_name}/{repository_name}/compare/{commit_hash}...{commit_hash}

これでcommit間の差分が確認できます。

commit-branch間の差分

https://github.com/{user_name}/{repository_name}/compare/{commit_hash}...{branch_name}

commitとbranch間の差分も見れます。

tag間の差分

https://github.com/{user_name}/{repository_name}/compare/{tag}...{tag}

tag間の差分が見れます。
バージョン間の変更が一覧できるので結構便利かもしれない。

日付ベースでの差分

https://github.com/{user_name}/{repository_name}/compare/{branch_name@date}...{branch_name}

日付を指定して差分を見ることもできます。
日付部分の指定は、

master@2019-5-5
master@{2day}

と日付を入力することもできるし、2日間といった指定もできます。

まとめ

GitHubでの便利な小技(?)を紹介しました。
他の人にレビューしてもらう際に、レビューしやすいように差分を表示したり、リリース前に差分をまとめて確認したりなど、結構使える場面は多いと思います。

自分自身が、結構使い方を忘れるので備忘録的な投稿でした。

参考

Comparing commits across time - GitHub Help

flask + OpenCVで笑い男合成機のようなものをつくった

概要

しばらく体調を崩していたので、リハビリがてらflask + OpenCVを利用して、動くものを作ってみました。

顔認識をして、顔と判別したものに笑い男(注:攻殻機動隊)のアイコンを合成するというものです。

flaskを利用するのははじめてでしたが、かなり簡単にできました。
(pythonもそんなに書いたことないですが、簡単なものを作るのにとても利便性を感じます。)

実行結果

f:id:jalemy:20190403222344g:plain
笑い男合成機の動作図

コード

アプリケーションコード

テンプレートコード

ディレクトリ構造はこんな感じになってます。

$ tree
.
├── LICENSE
├── README.md
├── app.py
├── smile.png
├── templates
│   └── index.html
└── uploads

感想

3,4か月ぶりくらいにブログ記事を書いたせいで、全然文章が思いつかなくて日本語の量が少ないです……

OpenCVのみでalpha透過pngを合成するのに詰まったため、Pillow(PIL)を利用しました。
(本来ならば、alphaチャンネルをもとにマスク画像を生成して、マスク画像で切り抜いた画像を重ねる という手順でできるはずなのですが、pythonに不慣れなせいで詰まりました。)
Pillowを利用すればかなり楽に合成ができたので導入すると良いと思います。

複数人顔が写っている画像でも動作します。
しかし、顔認識の精度に関わるcascadeファイルをOpenCV標準のものを利用したので、少々ムラがあります。

f:id:jalemy:20190403225143g:plain
三人の画像に動作させた図

次いで、AWS上で動かせるようにしてみたりしようかなと思う次第です。

参考

画像は、ぱくたその画像を利用させていただきました。

www.pakutaso.com

Mac上にC#でのアプリ開発環境を整えて、iPhone実機ビルドするまで - Visual Studio for Mac

概要

Mac上でC#を利用して何か作りたいと思い、環境を整備したのでメモ書きです。
Visual Studio for MacというMicrosoft謹製の便利なものがあったので、それを入れればほとんど終わります。

iPhoneの実機ビルドをするときに、結構手順がややこしくて手こずったので追記します。

Xcodeをインストール

まずはおなじみXcodeをインストール。
別の機会で、すでに入っている場合はスルーしてください。

f:id:jalemy:20181223220257p:plain:w400
Xcode - App Store

XcodeApp Storeから入れます。
結構時間がかかるので、暇な時間にやっておくと良いかと思います。
30分~1時間くらいかかるだろうか……記憶が曖昧です。

Visual Studio for Macをインストール

続いて、Visual Studio for Macをインストールします。

visualstudio.microsoft.com

こちらのリンクからダウンロードしてインストールします。
インストール時に、iOSAndroid用のコンポーネントを入れるかどうか聞かれますが、どうせ無料だし入れておいて損はないだろうの精神で、全部チェック入れてインストール。

こちらもインストールするときに結構時間がかかります。
自分の環境では20分超かかりました。

iPhoneでテストアプリを動かしてみる

せっかくだからiPhone実機にてテストアプリを動かしてみます。

Visual Studio for Macで新規プロジェクトを作成する

  1. ファイル -> 新しいソリューション と選択して下記のような画面を出す

  2. マルチプラットフォーム -> アプリ -> ネイティブアプリ(iOS, Android)と選択して次へ

  3. アプリ名と組織の識別子を入れる
    今回は適当にtestにしました。

  4. プロジェクト名、ソリューション名をデフォルトのままで作成

これで新規プロジェクトが立ち上がります。
シミュレーターならこのままビルドして動作させることができるのですが、実機を対象にしてビルド、デプロイするとエラーで怒られます。

f:id:jalemy:20181223215333p:plain
Visual Studio for Macで実機ビルドしようとして出たエラー

このエラーを解消するにはXcode側でごにゃごにゃとしなければなりません。

Xcodeで新規プロジェクトを作成する

  1. Xcodeを開いて、File -> New -> Projectと選択する

  2. プラットフォームにiOSを選択し、Single View Appを選択して、Nextを押下する

  3. Product Name, Organization Identifier, Bundle Identifierと入力する
    このとき、入力したBundle Identifireが必要になるので、控えておくこと

  4. General -> Singingにて、iPhone Developoerアカウントにログインする
    僕はまだAppleの有料Developer契約してないので、無料provisioningを利用してます

  5. Xcodeでビルドをして、iPhoneにアプリをデプロイ
    iPhone側で 設定 -> 一般 -> プロファイルとデバイス管理 -> デベロッパAPP
    と進めてアプリを信頼する設定にする必要があります。

f:id:jalemy:20181223215745p:plain
Xcode - Identity, Signingの設定

これでiPhoneにただ白いページを表示する空のアプリが作成されました。

Visual Studio for MaciPhoneにアプリをデプロイする

  1. 画面左のソリューションタブにて、 [project名] -> [project名].iOSと選択

  2. Info.plistを開く

f:id:jalemy:20181223220647p:plain
Visual Studio for Mac - Info.plist設定

  1. 署名で手動プロビジョンングを選択

  2. Bundle Setting Optionsを開いて、Xcodeで利用したIDと同じIDを選択する
    Provisioning Profileは、自動にしてOK

f:id:jalemy:20181223220517p:plain
Visual Studio for Mac - provisioning設定

  1. バンドル識別子の欄にXcodeで作成したBundle Identifire(バンドル識別子)を入力する

  2. ビルド&デプロイ

これでテストアプリを実機ビルドすることができました。
今回作った(?)テストアプリの見た目はこんな感じ。

f:id:jalemy:20181223215630p:plain:w300
Xamarinテストアプリの見た目

アイテムをリスト形式で表示して、追加することもできます。
ちょっとカスタムするだけでなんかToDoアプリっぽいものとか作れそうな雰囲気です。

まとめ

MacにてC#を利用した開発環境を整えて、実機ビルドまで試してみました。
C#というかXamarinのお作法とか歴史について勉強しないとなと思う次第です。

なんかアプリ作ってみようかと思うのでネタください。

参考

Xamarin.iOS アプリの無料プロビジョニング - Xamarin | Microsoft Docs

通勤時間2時間以上は心身ともに病むぞという話

この記事は、ねおりんアドベントカレンダーの11日目の記事です。

概要

八王子という東京の西端から、都心に通う通勤について書きます。

はじめに断っておきますが、
「通勤時間は無駄である。会社の近くに住んだ方が良い。」

以上です。

通勤時間が往復で2時間以上かかる

現在、八王子~原宿という経路で通勤をしています。
朝は、ちょうど良い時間に特別快速/通勤快速といった早い電車がないため、ざっと1時間30分くらいかかります。

夜は、時間を合わせさえすれば特別快速/通勤快速の電車に乗れます。
500円くらい追加で払って、特急列車に乗ることもできます。
特急列車に乗っても1時間弱かかります。

合わせて2時間半くらいです。

2時間半あったら何ができるのか

考えたら負けです

睡眠時間を2時間半伸ばすこともできるし、ゲームだってできます。
時給1,000円だったら2,500円です。

だいたい1か月の出勤が20日くらいになると思うので、
150分 × 20 = 3000分
3000分は50時間
つまり2日くらい損してます。

八王子にも良いところはある

  • 閑静な住宅街
  • 空気が美味しい
  • 家賃が安い
  • 食べ物も安い
  • 高尾山がある

あとは八王子ラーメンとか、高尾山とか高尾山とか高尾山とかがあります。

最近SUUMOに掲載されていた、この記事を読んで「めっちゃわかる……」ってなってました。

suumo.jp

結論

通勤時間は無駄です。
可能な限り会社の近くに住みましょう。
オススメはドアツードアで30分以内くらいかなと。

ちなみに僕は遠方通勤を続けていて、多大なるストレスを抱えました。
今は特急とか利用して、満員電車を避けるようにしているのでだいぶマシです。

さいごに

ねおりんの真似をして無職期間2週間のことについて書こうかと思いましたが、全然おもしろいことをかけなかったのでやめました。

明日12日は、@108do_fuさんです。
図らずもお題が被ってしまった気がします。
よろしくお願いします。

「テキスト校正くん」を導入して読みやすい文章を書きやすくなった

この記事は、write-blog-every-week Advent Calendar 2018の6日目の記事です。
write-blog-every-weekSlackへのjoinはこちらから

概要

ブログ記事を書くときには、読みやすい文章を書くことに意識を割かなければなりません。

11月からカックさん( id:kakku22 )のブログメンターを受けていますが、
誤字、脱字について注意を受けることが何度かありました。

とくに技術系の用語について

  • GitHubgithubと書いてしまう(大文字小文字の誤字)
  • QiitaQittaと書いてしまう(スペルミス)

というミスが多くありました。
これに気付くのはなかなか難しいため、校正ツールを導入しました。
ブログ執筆を支える技術としての紹介記事です。

テキスト校正くん

VS Codeテキスト校正のためのプラグインが存在します。

ics.media

テキストファイルや、Markdownファイルで日本語文章を書いているときに、自動的に文章のチェックをおこなってくれます。

f:id:jalemy:20181202215231g:plain
Githubgithubと間違えた場合

f:id:jalemy:20181202215237g:plain
同じ助詞を2重で使ってしまった場合

上記画像のように間違いがある箇所に対して、下線を引いて、誤りの内容まで通知してくれます。
この他、

  • 「ですます」調、「である」調の混在
  • ら抜き言葉
  • 二重否定
  • 箇条書きでの句点利用
  • 漢字の「ひらく」表現(特に->とくになど)

などなど、さまざまなチェックを行ってくれます。

テキスト校正くんを使ってみた感想

テキスト校正くんを使ってみて1か月弱経過しました。
例として挙げた、技術用語の誤り同じ助詞を2重に利用してしまうといったミスは目に見えて減りました。

また、誤字・脱字に対して意識を割かなくて良いので、「脳のリソースを無駄に使わなくて良い」という点が最高です。
(校正チェックなんて人間のやる仕事じゃないんだ……)

誤字・脱字が減った影響で、多少は読みやすい文章が書けるようになったかなという気がしています。
もちろん伝えやすい文章書けてなかったり、そもそも構成が悪かったりとかいろいろありますが……(要努力)

まとめ

ブログ執筆を支える技術としてテキスト校正くんを紹介しました。
無料で使えるツールですし、インストールの手間もとくにないので、ぜひ使ってみてはいかがでしょうか。

write-blog-every-week アドベントカレンダー7日目は、@Linus_MKさんです。
機械学習をやっていて滅茶苦茶強そうなエンジニアだと観測しているので、乞うご期待。
よろしくお願いします。