株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

心の筋トレ、始めませんか?

みなさんご存知でしょうか。
今年もあと4ヶ月で終わってしまうんです。
時の流れって恐ろしいですよね。

そんな中、私は職種が変わりました。
どうも!!4月からヘルプデスクからSRE(インフラエンジニア)へ転向した
IMAXです\\\٩( 'ω' )و////テテーン!!

毎日ひたすら必死に過ごして、たくさんのメンバーの助けがあって
チャレンジ出来ることになりました!!
その間によく言われたのが「怒らないよね」「怒ったところみたことがない」でした。
「怒りの感情とかどう処理してるの?」と聞かれることもしばしば。

確かに今までの人生振り返っても、怒ったことや声を荒げたことってないなぁ。

はて、私の怒りはドコに行ったのでしょう…?
最近よく耳にするワード 「アンガーマネジメント」 を交えつつ
失った怒りを探す旅に出かけたいと思います。

そもそも怒りって?

f:id:aimstogeek:20190903145938p:plain

心理学上で感情は、下記2パターンに分かれると言われています。

一次感情:自分が本当に感じている感情
二次感情:一次感情を受けて発生する感情

怒りはこの2つのうち「二次感情」に該当します。
喜怒哀楽と表現されるほど強い感情なのに、なぜ一次感情ではないのか。

実は、怒りとはすぐに感じるものではなく
怒りの元となる「感情」があって初めて怒りに変わるのです。

こんな経験したことないですか?


友人と待ち合わせをしていましたが、10分20分たっても友人は現れません。
何度電話をしても、メールをしても連絡は返ってきません。
事故にあったのか、事件に巻き込まれたのではないか、と心配になってきます。
ぐるぐると考えているうちに1時間が経過…。
そのとき友人が「ごめんごめん!待った?」と悪びれる様子もなくやってきました。
「待った?じゃないでしょ!遅れるなら連絡くらいしてよ!」と、
あなたは怒りをぶつけてしまいます…


友人が来ない時に発生する「不安」「恐怖」「悲しみ」や、
いざ来たときに感じる「安心」が一次感情です。
それらを受けて発展したのが「怒り」となります。
怒りを表現するときにも使われる”火山”を想像すると分かりやすいかもしれません。

f:id:aimstogeek:20190903145957p:plain
どかーん
マグマ部分に怒りの元となる感情があり、それらを経て噴火(怒り)が発生します。
脳が素早く処理してしまうので大抵は一次感情に気づかず、
直接怒りになったと思いがちですが、必ず怒りの元となる感情が潜んでいるのです。

また怒りは要望や期待の表れでもあります。
「〇〇してくれると思ったのに!」「■の後は△するのが当たり前じゃない?」など
期待値が高いとそれを求めるが故に出来なかったときのギャップが怒りに変わりやすいのです。

一次感情を制すものが怒りを制す!?

f:id:aimstogeek:20190903150012p:plain
ふぅ
そんなときに役立つのがアンガーマネジメントです。
怒りを否定したり抑えたり、怒りの感情そのものを無くすことではなく、
感情と上手に向き合ってコントロールすることを指します。

根底にある一次感情を理解・受け入れることによって二次感情へエネルギーが抑えられ「怒り」とうまく付き合うことが出来ます。

精神的な修行で大変そう……と思うかもしれませんが所謂、心の筋トレです。
やり続ければ成果が出る、とも言われています!!
また何事もやってみないと分からないことが多いので、
次のポイントに気をつけながら、自分の怒りについて振り返ってみましょう!

心の筋トレでLet's Control!!!!

f:id:aimstogeek:20190903150029p:plain
心の筋トレには3つのポイントがあります。

■ 衝動のコントロール 怒りのエネルギーが強く出るのは、最初の6秒だと言われています。
直ぐに行動してしまうのではなく
「なぜ今怒りを感じたのか」を考えて、一次感情を探っていきましょう。
そして分析し、相手へ怒りではなく一次感情を伝えるようにすることで
こちらの気持ちも理解してもらいつつ「急に怒られた」などの誤解も避けられます。

■ 思考のコントロール 相手の価値観は自分と異なること、”こうすべきである”という部分を見直し、
自分の求めているポイントと相手が与えてくれるものの差を理解しましょう。
またそれでも自分が求めていたものが必要である、と結論が出た場合には
怒りに任せるのではなく、提案や別の形式で求めるようにしましょう。

■ 行動のコントロール 自身によって変えられるもの、変えられないものがあるのを理解しましょう。
どうにもならないことにイライラし続けるのは自らストレスを生み出すだけです。
出かける日に限って雨なこと、コーヒーをカーペットにこぼしてしまった時など、
怒りの対象がなんであれ、どうにもならないことは割り切るのが一番です。
そのあと自分が出来ることに集中し、解消していきましょう。

例であげた待ち合わせの会話で改善ポイントを上げると…
友人が来た際にかける言葉は
・心配したよ!遅刻したことはしょうがないから、次からは連絡してほしいな
・何かあったのかと不安になるから、一言でいいから連絡してほしいな
と伝えると一次感情である「心配」「不安」を交えながら、
怒りを「なぜこう思ったか」に変換し、相手への理解と対策を出せるようになります。
※連絡せず1時間遅刻することを肯定しているわけではないですよ!

それでは、実際に最近怒ったことがあれば振り返ってみましょう。

・衝動のコントロール → なんで怒りを感じたか、すぐに怒りをぶつけてしまったか
・思考のコントロール → 怒りを感じた時、本当は何を求めていたのか
・行動のコントロール → どうにかできる/できない、のどちらだったのか。

これを次回からは相手に対して発信してしまう前に考え、
一度落とし込んでから話すようにしてみてはいかがでしょうか。

最後に

心の筋トレ、いざチャレンジ ٩( ᐛ )و
うまくコントロールできれば感情に飲み込まれることもなくなります。
また自分だけでなく相手にも不快な思いをさせずに、より良い人間関係を築くことが
できるのではないでしょうか。

私自身を振り返ると、無意識に一次感情で伝えていたり、
起こったことはしょうがない!となっていたことが多い気がします。
だから怒りまで到達しなかったのかな。
怒りは失われたのではなくそもそも居なかったのかも…ᐠ( ᐛ )ᐟ
コントロールして高ストレスを感じることなく!相手も自分もハッピーに…!!!

それでは皆さん、良いストレスフリーライフを!!!
※あくまで個人の見解のお話なので、必ずしもストレスフリーになるとは限りません。
┌参考書籍┐

アンガーマネジメント 11の方法―怒りを上手に解消しよう

アンガーマネジメント 11の方法―怒りを上手に解消しよう

  • 作者: ロナルド T.ポッターエフロン,パトリシア S.ポッターエフロン,藤野京子
  • 出版社/メーカー: 金剛出版
  • 発売日: 2016/09/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る


\\一緒にはたらく仲間を募集中!! // 919.jp

【ソフトウェア】設計書の役割とは?

こんにちは〜。
某大会の某県代表のboriです。

最近、自身の業務においてもそうですが、
仮想通貨やスマホ決済サービスによる事故がメディアに取り上げられたりする事が増え、設計や開発フローについて改めて考えさせられます。

今回は、ソフトウェアにおいての設計書の役割をいくつかご紹介できればと思います。

設計書のイメージ

はじめに

ここで言う「設計書」とは種類や範囲を厳密にしませんので、
包括的にイメージしてもらえればと思います。

また、今回は設計の対象の例として「キーボード」というモノを使用します。
ご紹介する役割はモノでもソフトウェアでも重要なのと、
具体的な形としてあるモノの方が設計の重要性、役割をイメージしやすい方が多いかと思いますので!

まず、設計の対象はモジュール(部品)まで含めるのが基本です。
キーボードで言えばキーの一つ一つだとします。

今回はそのキーの情報を以下の3つに絞ります。

数と形の情報」「配置場所の情報」「押した時の効果

これら3つの情報を設計書に記すことでどのような効果があるのか?を、
いくつかの項目ごとにご紹介します。


品質・生産性

数と形の情報 足りない、欠けたキーがあれば組立時に気付く。
配置場所の情報 組み立てが楽。誤った配置をするミスが減る。
押した時の効果 キーの1つ1つでテストが行える。

上記を見ていただいた通り、設計書がある事によって生産速度も向上し、
不良品の数が減りますよね!

よく「○回の耐久・落下テストに耐えた」と、いうような品質保証文句がありますが、
同様のテストをキーの一つ一つで行うことも可能です。
構造上、実はこのキーだけ脆かった!なんて欠陥にもテスト段階で気付きやすいです。

ソフトウェアでも同様のことが言え、実装スピードの向上、
バグやロジックの欠陥に早い段階で気付きやすいです。


拡張性・メンテナンス性

数と形の情報 修復時に正しい数、形が把握できる。
配置場所の情報 修復時に正しい配置が把握できる。
新しいキーを配置できないか把握しやすい。
押した時の効果 他の影響範囲(ショートカットキー)を把握しやすい。
追加するキーが重複していないか把握しやすい。

キーボードを作った人はもちろんの事、第三者が修復や機能を追加する時に
わざわざ分解せずとも設計書があれば色々と把握しやすいですよね。

ソフトウェアにおいても同様で、わざわざコードを読み解いていかずとも、
設計書があれば既存機能の把握、新規機能の追加の余地・必要性・影響範囲などが把握しやすいです。

他人が書いたコードを読み解いていくのって労力を要します。
ましてやそれがコメントが無いコードでは特に。


ゴールへの指針

数と形の情報 要件と紐付け、なぜこのような形にしたのかの意図を把握でき、
正しい形を見失わない。
配置場所の情報 要件と紐付け、なぜこのような配置にしたのかの意図を把握でき、正しい配置場所を見失わない。
押した時の効果 要件と紐付け、必要・不要な機能を把握しやすい。

有り得ることではないかもしれませんが、
キーボードを組み立てる人がユーザーの事を考え、「こういう形の方がよくない?」、「このキーはこの配置がいい」と勝手に作り変えようとします。

しかし、設計にはユーザーの事を考えての理由があり、
それらは要件として挙がってきます。

しっかりと要件に沿った設計書があれば、ユーザー想いの組み立てる人は(きっと)設計書通りに作ってくれることでしょう。

逆に、要件に沿った設計がされていない場合、
設計者がプロジェクトのゴールをしっかり把握していない事に気付けます。
設計書が要件に沿っていない場合、不要な機能も見つかるかもしれません。

そういう意味で、しっかり書かれた設計はプロジェクトのゴールを指し示し、
その設計書通りに組まれた制作物はクライアントやユーザーの希望に沿うはずです。


設計を活かす為に

設計書の存在は大変重要なのですが、設計書があるからといって
必ずしも良い制作物ができるとは限らないという事も覚えていただきたいです。

家に例えますが、優秀な設計書があったとしても、
施工業者の手抜き工事による欠陥住宅なんて事もあります。

ソフトウェアにおいても同様の事はありますが、
往々にして実装者よりも開発フローに問題がある事が多いです。

十分なスケジュールが確保されていたか?
チーム内、チーム間の連携はうまく取れていたのか?
開発中に過度な要件変更はなかったか?

良い設計書は良い開発フローでこそ活かされます。


さいごに

簡単にいくつかの項目をご紹介させていただきました。
設計書の役割としては今回ご紹介させていただいたものが全てではありません。

項目自体もまだまだありますし、
今回の項目内だけでももっと多くの役割が存在するかと思います。

また、設計書に必要な情報(形の情報etc)を漏れなく挙げていくという事がとても重要で難しかったりもします。

要件をしっかり定める、その要件を満たす、または不都合な情報を抽出するには
ディレクターや設計者の力に依る部分が大きいです。

設計は決して楽な作業ではありませんし、場合によってはとても労力を要します。
それでも、今回挙げさせていただいた役割だけでも設計の大切さは伝わったかなと思います。

開発フローや設計を今一度考え直し、
事故無く、余裕を持って開発を進めていきましょう!



\\一緒にはたらく仲間を募集中!! // 919.jp

人を動かす6つの心理

こんにちは!サービスプランナーのよっすぃです。

断捨離を始めて数ヶ月、家の中が随分スッキリしてきましたが、広いスペースができるとついつい家電を買ってしまいます。

さて、仕事をするときには、色々な人に動いてもらうことが大切になりますが、人が動くときにはいったいどんな心理が働いているのか気になりますよね。 今日は「影響力の武器」という本に書かれた、人が動くときに影響を受ける6つの心理をご紹介します。

f:id:aimstogeek:20190822145128j:plain:w250
影響力の武器[第三版]: なぜ、人は動かされるのか
ロバート・B・チャルディーニ (著)


とても有名な本ですので、より詳しく知りたい方は一度お読みいただくとよいかもしれません。といっても500ページ近くありますが...

それでは、早速一つずつ見ていきましょう。

①返報性

相手から何かしてもらったときに、「お返ししたい、しなければ」と感じる心理です。 例えば、誕生日に誰かからプレゼントをもらったとき、相手の誕生日に何かしてあげたいと思いますよね。

f:id:aimstogeek:20190821154952p:plain:w250


返報性が働く場面は沢山あります。普段「おはよう」と挨拶したときに、相手が「おはよう」と返してくれるのも、この心理が働いています。

返報性は悪い方にも働きます。例えば、いつも自分のミスを誰かのせいにしている人から頼みごとをされても「こいつの言うことは聞くもんか!」と思いますよね。
自分がされて嬉しいことを、相手に喜んでもらうためにやるという気持ちが大切です。

②コミットメントと一貫性

人は、自分が決めたこと・やったことについては、その後も同じ態度・言動を貫こうとします。

f:id:aimstogeek:20190821172534j:plain:w270


例えば、隣の人から「トイレに行くので、この席みていてもらえますか?」と言われて「いいですよ」と答えると、自分がトイレに行きたくても我慢して席を守るような行動を取ったりします。

この心理は、本人の口から言ってもらうと更に強く働きますが、「強制・言わされている」と感じるとコミットメントは弱まります。 お仕事などで何かをお願いするときは、きちんと説明して、本人に「自分の意思でやる・やりたい」と思ってもらうことが大切ですね。

③社会的証明

周りの多くの人が、何を正しいと考えているかで判断することです。やっている人が多ければ多いほど強く影響します。

例えば、物を買うときに口コミでのレビューを参考にしたり、セールスマンから「みんなやってますよ」と言われたら商品を買ってしまうなどです。 わざとレジの数を減らして行列を作り、人気店だと思わせているお店もあります。

f:id:aimstogeek:20190821155928p:plain:w330


ただ、相手にとって全く興味のないことや、その人が他人から影響を受けないくらい自信を持っていることには効果がありません。 相手が一歩踏み出せないときに、その不安を取り除いたり、背中を押してあげるために使ってあげるとよいかと思います。

④好意

自分が好意を感じている人の願いは受け入れやすいという心理です。

f:id:aimstogeek:20190821163125p:plain:w230


どんなことで好意を抱くかは様々ありますが、例えば以下のようなものがあります。
 ・身体的な魅力を感じる
 ・自分と類似性を感じる(外面・内面問わず)
 ・お世辞を言われる(お世辞だと分かっていても効果あり)
 ・繰り返し接する
 ・共通の敵を想定して協力しあう
 ・自分が好きなものと関連付けされる
  (好きな芸能人が出ているCMの商品を好きになる)

もちろん、自分のためだけに相手の好意を利用してはいけませんし、それでは好意を持ってもらえなくなります。 相手から好意を持ってもらうための努力と、相手の好意に感謝の気持ちを持ってアプローチすることが大事ですね。

⑤権威

人は、権威のある人の言うことは正しいと思って従う傾向にあります。また、実際に権威があるかどうかではなく、権威があると感じていれば、相手の言うことに従いやすくなります。

f:id:aimstogeek:20190822140115p:plain:w220


権威を感じるものは「肩書き」が典型ですが、他には以下のようなものがあります。
・服装(白衣を着ている人はお医者さんだと思いこむなど)
・装飾品(高級自動車に乗っている人は、社会的地位が高いと思うなど)

権威にはとても強い影響力があるため、相手が盲目的に動いてしまうリスクがあります。 自分に権威を感じている人には「あなたはどう思う?」と意見を聞いたり、権威を感じる人の言ったことでも「それは本当か?」と前向きに疑うことが大切です。

⑥希少性

人は、手に入りにくいもの、手に入る機会が少ないものに対して、より強く手に入れたいと感じます。「期間限定」や「先着◯名様」などがそうですね。

f:id:aimstogeek:20190822143240p:plain:w220



希少性は、制限の掛け合わせが多いと強く働きます。例えば、以下の2つを比べてみてください。

「女性限定のチョコレート」

「女性限定のチョコレート、本日が最終販売、残りあと5個、次の入荷は1年後」

おそらく、後者の方をより強く手に入れたいと思ったのではないでしょうか。

希少性は多用すると薄れてしまうので(1年中閉店セールをやっているお店で、それほど買いたいと思わないですよね)、ここぞという場面で使って特別感を演出するのがよいでしょう。

まとめ

いかがでしたでしょうか。
どれも、普段から使っている、使われていると感じた方もいらっしゃると思います。

私は、以前の職場でリーダーをしていたとき、同じことを言っているのにAさんには従ってBさんには反発する人がいるなど、人に動いてもらう難しさを実感したことがあってこの本を読みました。

この心理を実践する中で感じたことは、人を動かす技術は習得可能でありながら、どの心理がより強く働くかは人や状況によって異なるということです。

大切なことは、相手に気持ちよく動いてもらうために、その人は今何に関心があって、どんなことを大事にしているだろうかを考えた上で、これらの心理をうまく活用することだと思っています。

ちなみに、返報性は双方がハッピーになる要素が満載なのでオススメです♪


\\一緒にはたらく仲間を募集中!! // 919.jp

USBブート用DBANをノートPCで利用しようとした際にはまった話

こんにちは!
ヘルプデスクのmiです。

弊社はもうすぐ夏季休暇です!
2019年の弊社の夏季休暇期間は8月10日(土)〜8月18日(日)までです。長い^^
長期休暇は弊社の文化でもあるので、この期間を活用して日頃できないことをやっていきたいと思います!
休み明けに社会復帰できるか、少し心配ではありますが…

さて、少し前の話になるのですが、弊社でレンタルしているノートPCを返却することになり、DBANでデータを消去をすることになりました。
その際、ちょっとしたつまずきで作業がなかなか進まなかったので、そのつまずきポイントと解決方法をまとめてみました!

DBANとは

そもそもDBAN(Darik's Boot and Nuke)とは、コンピュータのストレージのデータを完全に消去するフリーソフトです。

DBANはフロッピーディスクやCDから起動するように作られていますが、今回データ消去対象のノートPCにはCDドライブがついていなかったため、USBから起動できないか試してみました!

※DBANのデフォルトのデータ消去方式は、米国国防総省準拠の方式なので復元が難しく、そのためデータ消去の際に利用しています。
※容量にもよりますが、データ消去には1日程度かかります。

つまずきポイントその1:isoイメージの書き込み

最初、USBに直接DBANのisoイメージを書き込む方法をいくつか試していました。
しかし、ノートPCにDBANのUSBをさしてみても何も反応してくれないという結果でした…。

その後、Rufusというインストーラーを使ったら、うまくできたようで、ノートPCが無反応という事象は解決できました。(rufus-3.4.exeを使用)

Rufusを使ってUSBにDBANを書き込む方法は、多少の画面の違いはありましたが、以下のサイトの説明が丁寧でわかりやすかったです。

www.gigafree.net



つまずきポイントその2:バージョン

最初、DBANのバージョン2.3.0(最新バージョン)をRufusでUSBに書き込んだのですが、ノートPCで操作を進めていくと「error cat: can't open '/proc/cmdline': No such file or directory 」という文言で怒られて、先に進めなくなっていました。

色々と調べてみたところ、比較的新しいPCだと、バージョン2.3.0では上記のエラーが出るようです。
バージョン2.2.8、もしくは2.2.7だと上記のエラーは出ないとのことです。

sourceforge.net


今回はバージョン2.2.8をUSBに書き込みし直しました。
すると、ノートPCでエラーが出ることもなく、無事データ消去ができました!

いかがでしたでしょうか?
特殊なつまずきかもしれませんが、私と同じようにはまってしまっている方のお役に立てれば幸いです。
それでは^^


\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

文字列結合スニペット

こんにちは!Czです!

僕はよく科学館にいくのですが、行く理由の一つとしてプラネタリウムがあります。
ある科学館では夏限定で公開しているプラネタリウムがあり、そのプラネタリウムのウリが何と「12K」と超高解像度!

4年前に初めて体験したのですが、その没入感に魅了されて今では夏の恒例行事として家族で月3回観に行くほどです!(家族はあまり乗り気ではないですが...)

ユーザの声としては

「まるで宇宙船に乗って宇宙を旅しているみたい」

「えっ?座席動いてる??」

「あ〜涼しい」

とのこと。※個人の感想です

科学館に許可を取っていないので名前は伏せておきますが、興味がある方は「12K プラネタリウム」で検索!

ふぅ...プラネタリウムの宣伝できたし、これでブログ完了でいいよね?えっ、ダメ?


え〜今回のテーマは「文字列結合スニペット

まぁ大したことないです。今開発中の仕様で以下のようなものがあるのでそれをネタにしようと思います。

  • 選択された項目を「/」区切りで表示
  • 値が選択されていなければ表示しない

今回はこういったあるあるな処理を効率よく書きたいなぁと言う話です。

プログラムを始めたばかりの人の参考になってくれればと思います。

※本プログラムはPHP+Laravelを使用しています。ですが他の言語やフレームワークでも応用が効くと思います。

あまり良くないパターン(sample1)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample1($isNurse, $isManager, $isCertifiedNurse)
{
    $value = '';

    if ($isNurse) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '看護師';
    } else {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= 'その他';
    }

    if ($isManager) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '管理職';
    }

    if ($isCertifiedNurse) {
        if ($value !== '') {
            $value .= '/';
        }
        $value .= '認定看護師';
    }

    return $value;
}

上記サンプルではif文を使い、条件に当てはまったら文字列を追加すると言う処理をしています。

よく見ると「/」を入れるかどうかの判定はどれも同じなのですが、文字列を順次結合するやり方をとっているため都度判定が必要になっています。

もう少し短くしたいですね。

悪くはないパターン(sample2)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample2($isNurse, $isManager, $isCertifiedNurse)
{
    $values = [];

    if ($isNurse) {
        $values[] = '看護師';
    } else {
        $values[] = 'その他';
    }

    if ($isManager) {
        $value[] = '管理職';
    }

    if ($isCertifiedNurse) {
        $value[] = '認定看護師';
    }

    return implode('/', $values);
}

sample1の時に気になっていた「/」を入れる処理を、PHP標準のimplode()と言うメソッドを使って実現しています。

$valuesに入れるかどうかの判定をif文で行なっている為、ちょっと長くなりがちですね。

値が存在するものだけにフィルタリングするパターン(sample3)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample3($isNurse, $isManager, $isCertifiedNurse)
{
    $values = [
        $isNurse ? '看護師' : 'その他',
        $isManager ? '管理職' : '',
        $isCertifiedNurse ? '認定看護師' : '',
    ];

    return implode('/', array_filter($values, function ($it) {
        return $it !== '';
    }));
}

$valuesに入れる処理を一括で行い、if文を三項演算子に置き換え、値がない場合は空文字を代入しています。

そして、array_filterを使って空文字を排除することで目的を達成しています。

割とスッキリしているかと思います。

一時変数を使わないパターン(sample4)

# 入力値
$isNurse = true;
$isManager = false;
$isCertifiedNurse = true;

# 期待値
'看護師/認定看護師'
<?php
# 処理
public function sample4($isNurse, $isManager, $isCertifiedNurse)
{
    return implode('/', array_filter([
        $isNurse ? '看護師' : 'その他',
        $isManager ? '管理職' : '',
        $isCertifiedNurse ? '認定看護師' : '',
    ], function ($it) {
        return $it !== '';
    })); // 「看護師/認定看護師」
}

すごく短くなりましたが、implodeとarray_filterの中で値を作っているので可読性があまり良くありません。

プログラミングに慣れてくるとついついこう書きがちですが、忘れた頃に見直すと何でこんな書き方したんだーとなっちゃうかもしれません。

応用編(sample5)

以下の条件を追加

  • 入力値が配列になり、期待値も配列となる
  • マスターテーブルからidをキーにnameを取得する
# 入力値
$params = [
    [
        'label' => 'A',
        'isNurse' => true,
        'isManager' => false,
        'isCertifiedNurse' => true,
        'categoryId' => 1,
    ],
    [
        'label' => 'B',
        'isNurse' => false,
        'isManager' => true,
        'isCertifiedNurse' => false,
        'categoryId' => 0,
    ],
    [
        'label' => 'C',
        'isNurse' => true,
        'isManager' => true,
        'isCertifiedNurse' => true,
        'categoryId' => 2,
    ],
];

# CategoryMaster::all()の取得結果
[
    [
        'id' => 1,
        'name' => 'ほげ'
    ],
    [
        'id' => 2,
        'name' => 'ふが'
    ],
];

# 期待値
[
    'A/看護師/認定看護師/ほげ',
    'B/その他/管理職',
    'C/看護師/管理職/認定看護師/ふが',
 ]
<?php
# 処理
public function sample5($params)
{
    $categoryMasterById = CategoryMaster::all()->keyBy('id'); // LaravelのEloquentモデルを使ってマスタデータを取得し、idごとの値に変換している

    return array_map(function ($param) use ($categoryMasterById) {
         $categoryMaster = array_get($categoryMasterById, $param['categoryId']);
         $categoryMasterName = (is_null($categoryMaster)) ? '' : $categoryMaster['name'];

        $values = [
            $param['label'],
            $param['isNurse'] ? '看護師' : 'その他',
            $param['isManager'] ? '管理職' : '',
            $param['isCertifiedNurse'] ? '認定看護師' : '',
            $categoryMasterName,
        ];
        implode('/', array_filter($values, function ($it) {
            return $it !== '';
        }));
    }, $params);
}

マスタデータの参照が増えたり、入出力が配列になってもそこまで複雑ではないですね。

if文を使わなくても割とシンプルにかけることがわかると思います。

こういうスニペットを多く覚えておくことで実装速度も上がりそうですね!(実行速度が上がるかどうかはまた別の問題)

ただ、個人的にはメモに貼ったスニペットをコピペして実装するのはおすすめしないですね。常に頭で考えるようにしていただきたいです。

そうすることによりどんどんブラッシュアップされ、よりよいコードが書けるようになると思います。

おまけ

応用編をsample1のように記述して見るとこうなります。

<?php
# 処理
public function sample5($params)
{
    $categoryMasters = CategoryMaster::all();
    $categoryMasterById = [];
    foreach ($categoryMasters as $categoryMaster) {
        $categoryMasterById[$categoryMaster->id] = $categoryMaster;
    }

    $values = [];
    foreach ($params as $param) {
        $value = '';
        if ($param['label'] !== '') {
            if ($value !== '') {
                $value .= '/';
            }
            $values .= $param['name']
        }

        if ($isNurse) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '看護師';
        } else {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= 'その他';
        }

        if ($isM) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '管理職';
        }

        if ($isCertifiedNurse) {
            if ($value !== '') {
                $value .= '/';
            }
            $value .= '認定看護師';
        }

        if (isset(categoryMasterById[$param['categoryId']]) {
            $categoryMaster = categoryMasterById[$param['categoryId']]
            if (!is_null($categoryMaster)) {
                if ($value !== '') {
                    $value .= '/';
                }
                $value .= $categoryMaster['name'];
            }
        }

        $values[] = $value;
    }
}

ながいですねー。応用編が20行に対し、このメソッドは57行もあります。

短い方が良いということではないですが、1メソッドあたりの行数が多いと読む人のコストが高くなってしまうのでそこも考慮して実装したいですね。

まとめ

  • ただ短くするのではなく、後から読む人のことを考え、読みやすさも考慮しつつ実装しましょう。
  • スニペットを使う際はどこからか拾ってきたコードをコピペで使うのではなく、なぜこう書くのかを理解しながら使いましょう。
  • スニペットは時間とともに風化します。常にどうあるべきかを自分自身の頭で考え実装しましょう。

以上!

※ここにあるプログラムは動作確認をしていないのでコピペで動かない可能性があります。ご自分で考え、動作をきちんと確認しましょう。



\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

Googleフォームを使ったアンケートをHTMLメールで送信する【基礎】

日課内で『ピザ会』企画があり、ピザをたくさん食べた後にシメのパスタと闘いました。 サービスプランナーのmkです( ^ω^ )

気づけば早くも入社3年目、3回目の登場です。

今回はGoogleフォームを使ったアンケートを、HTMLメールに載せて弄ってみたのでその紹介をしたいと思います!

今回のゴール↓↓↓↓

記事のタイトルとアイキャッチ画像をメールに反映した結果のイメージ
フォームのイメージ
今回のゴール

やりたいこと:HTMLメール×Googleフォーム

クイックが運営するメディアの1つに「Dybe!」というサイトがあります。

ten-navi.com

メディアに関わっている人は誰しもが気になる、『実際記事に対してどう思われているのだろう......』というユーザーの生の声。

せっかく社内にターゲット層がいるので、率直な意見を聞いてみよう!ということで、アンケートを実施することにしました。


Googleフォームからメールを送信した場合の表示
Googleフォーム上で送信したメール

Googleフォーム上から対象者にメールを送信すると、「タイトルやアイキャッチ画像をみて直感的に回答してください」と書いてあるのに、それを確認するにはサイトかTwitterに行かないといけない状態に。(フォームにとんでもTwitterのリンクのみ)


サイトの特性として「タイトルとアイキャッチ画像をみたときの意見」が重要なので、どうにか実現したい!

※Dybe!はSNSやキュレーションメディアからの流入を想定しているサイト。


しかし、Googleフォーム上でそれを満たすためには、毎回アイキャッチの画像をUPをしなければならない...

フォーム自体を毎回編集して送信するのは手間である...

ということで、メール上に「タイトルとアイキャッチ画像を自動で表示させる!」ことを達成するためにHTMLメールの作成をしてみました( ^ω^ )


やったこと①:GASでHTMLメールを作成

function sendGmail(){
      var to = '送信対象者のメールアドレス';
      var mailTitle = 'メールのタイトル'; 
      var mailText = 'HTMLメールが表示できない相手の場合のテキストを設定';
      var html = HtmlService.createHtmlOutputFromFile("message").getContent();
      
      // オプションでHTMLメールの中身を指定
      var options = { htmlBody: html, from:'送信元アドレスを指定' };
      
      // メールを送信
      GmailApp.sendEmail(to, mailTitle, mailText, options);
}

※HTMLメールの中身は別(message.html)で指定

※送信元のアドレスはGmailの差出人登録をされているメールアドレスのみが有効。 登録されていないメールアドレスを入力しても、反映されませんので注意が必要です。


やったこと②:記事のURLからタイトルとアイキャッチ画像を自動で取得

var url_article = '記事のURL';
var meta_title = /<title>([\s\S]*?)<\/title>/i;
var meta_img = /<meta property=\"og:image\" content=\"(.*)\">/i;
var title = meta_title.exec(UrlFetchApp.fetch(url_article).getContentText())[1];
var img = meta_img.exec(UrlFetchApp.fetch(url_article).getContentText())[1];

※今回はtitleタグとog:image用のmetaタグから情報を取得

やったこと③:メールにタイトル、アイキャッチ画像、フォームを反映

メールの内容をmessage.htmlに書く。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <style>スタイルはここに</style>
  </head>
  <body>
    <p>お疲れ様です、Dybe!編集部です。<br>記事アンケートにご協力お願いいたします!</p>
    <h2>Dybe!記事アンケート     </h2>
    <!-- ▼▼記事ここから -->
    <div class="post_container">
      <div class="post_block-text">
        <div class="text">
          <div class="in-pict">
            <img src="画像URLが入ります">
          </div>
          <p>タイトルがここに入ります<br>
          <a href="記事URLがここに入ります">記事URLここに入ります</a></p>
        </div>
      </div>
    </div>

    <!-- ▼▼アンケートここから -->
    <div class="form-style">
      <form action="">
        // フォームの中身がここに入ります
        <button type="submit" name="button" value="送信">内容を送信</button>
      </form>
    </div>
  </body>
</html>

※今回は、②で取得した情報をもとにreplaceでHTMLメールに反映しています。

※スタイルはお好みに。

やったこと④:Googleフォームの要素とHTMLメールのフォーム要素を紐づける

初めはGoogleフォームでの運用を開始していたこともあり、送信した情報がGoogleフォームで回答した結果と合わせて残るようにしたい!ということで、地道にGoogleフォームのIDを紐づける作業……

作成したGoogleフォーム(プレビューモード)にアクセスし、ソースからform actionをみつけてHTMLメールのformにaction=""部分を反映し、

<form action="https://docs.google.com/forms/d/e/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/formResponse" target="_self" method="POST" id="XXXXXX">

あとはひたすら各inputのnameを反映させる、、、

メールアドレスだとname="emailAddress"、他のinput要素は”entry.XXXXXX”という形になっているはずです。

紐づけておけば、メール上で送信したデータがきちんとGoogleフォームに送信されます〜


やったこと⑤:複数の対象者、記事にも対応(おまけ)

下記を考慮して、スプレッドシートに入力することで一度で送信できるように!

  • 1日に複数記事がUPされる

  • 複数人の対象者に送信する

  • 送信対象者を気軽に変更できるように

送信対象者・記事URLの入力例
送信対象者・記事URLの入力例


たどりついたもの

記事のタイトルとアイキャッチ画像をメールに反映した結果のイメージ
フォームのイメージ
記事のタイトルとアイキャッチ画像をメールに反映した結果

メール上でタイトルとアイキャッチ画像が確認できるように!

わざわざフォームに行かずに回答もできるので、回答者の負荷の軽減も期待できるはずです。


今回のボリューム少なめのフォームでも要素の紐づけが面倒だったので、簡単なものでの活用がおすすめです〜



気になった方は、ぜひDybe!の記事も読んでみてください!!!

ten-navi.com



\\一緒に良いサービスを作って成長したい、そんなメンバーを募集中です! //
919.jp

【Windows 10 Pro】業務時間外のPCシャットダウン方法について

お久しぶりです。シスアド 兼 情シス担当のスカイ(甘党)です。

夏ですね~!はい、今回も「あるあるPC管理者の悩み」を書かせて頂きます。

第四回あるあるPC管理者ネタは働き方改革で話題になっている、
業務時間外はPCを強制的にシャットダウンしたい」です。

働き方改革の一環で「PCを強制的にシャットダウンする」ツールを導入した結果、
長時間労働が是正されました!って事例を最近よく聞きますよね。

個人的に、いつ導入検討と言われてもおかしくない状況になってきたかと思います。
終業時間が強制される事により生産性があがるのか疑問ではありますが、
本題へと移りたいと思います。

要件

業務時間外になったらPCを強制的にシャットダウンしたい\(^o^)/

  ※Windows 10 Pro環境で検証済です。
  ※前提条件はActive Directory環境がある事です。
  ※あるある管理者ネタなので新規ツールを導入する予算はないものとします。

はじめに

まず要件を細分化して箇条書きにしてみます。

平日(月~金):勤務間インターバルを11時間で設定。
 A.21:00にPCのシャットダウンを実施する。
 B.08:00~21:00はPCにログオンができる。
 C.21:01~07:59はPCにログオンができない。

休日(土日):簡単に説明がしたいので祝日は除外。
 D.24時間PCにログオンができない。

Aはタスクスケジューラとshutdownコマンドで設定ができます。
B、C、DはActive Directoryを利用して設定ができます。
分けて考えてみると、1つ1つの作業が簡単であることがわかりますね。

設定方法

シャットダウン時間をタスクスケジューラに登録する方法(箇条書き:A)

 ①タスクスケジューラから「タスクの作成」をクリックします。
   [名前]を入力し[セキュリティオプション]を変更します。
  f:id:aimstogeek:20190711155113p:plain

 ②トリガータブを開き「新規」をクリックします。
   [毎週]、[21:00]、[曜日]を変更します。
  f:id:aimstogeek:20190711160033p:plain

 ③操作タブを開き「新規」をクリックします。
   [プログラム]に「C:\Windows\System32\shutdown.exe」と入力し、
   [引数]に「-s -f -t 30」と入力します
  f:id:aimstogeek:20190711155508p:plain

ログオン時間制限設定手順(箇条書き:B、C、D)

 ①Active Directoryで対象ユーザーのプロパティを開きます。
  f:id:aimstogeek:20190711150152p:plain

 ②[アカウント]タブの[ログオン時間]をクリックします。
  f:id:aimstogeek:20190711150208p:plain

 ③月~金の21:00~8:00、土日の全時間を「ログオン拒否」に設定します。
  f:id:aimstogeek:20190711150219p:plain

設定時の動作

業務時間外にログオンを試みますと以下のようになります。
  f:id:aimstogeek:20190711150632p:plain

さいごに

最低限の要件を満たしていますが注意点があります。
Active Directoryを利用する為、社内NWに接続している環境である事が条件です。
 =キャッシュでログオンする際には設定の影響なくログオンができます。

わかりやすく言いますと抜け道があります/(^o^)\
ノートPCであれば自宅に持ち帰りPCを起動しログオンする事が可能です。
※上記で述べたキャッシュでログオンしている為。

ローカルにデータがある状態であれば自宅で仕事ができますので、
データを持ち出される事でセキュリティリスクが高まってしまいます\(^o^)/

PCの持ち出しができない環境のみで有効である手法でした....(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)

今回の案は運用検討時にボツとなりました!失敗あるある~~!!

おまけ

私個人の持論ですが、働き方改革における情シスの役割とは
ITを利用して業務改善を手伝い、便利にしてハッピーにする事だと思っています。



\\一緒に『明日のはたらくを創る』仲間を募集中です!! // 919.jp