テキストデータをCSV形式に変換する

皆さんお仕事の中で、集計などをするためにEXCELをよく使っているかと思います。もともと、CSVやEXCELで作られているデータであれば、そこに関数を入れることで、簡単にそのデータから集計や抽出ができますね。ただ、元のデータ自体がCSVの形式になっていなかったり、EXCELに張り付けても集計できないようなデータになっていたりで、困ることなどないでしょうか?

例えば・・・

上司:「毎日の天気について記録を取っておいて」

部下:「はいわかりました」

数日後・・・・

上司:「そろそろデータがたまったよね?集計したいからデータをだして」

部下:「はいわかりました」

-------------------------------------------------------------------------------------

2024年5月1日

曜日:水曜日

天気:晴れ

備考:少し蒸し暑い

2024年5月2日

曜日:木曜日

天気:曇り

備考:少し雨がぱらついた

2024年5月3日

曜日:金曜日

天気:雨

備考:雷も鳴った

-------------------------------------------------------------------------------------

上司:「なんじゃこりゃーーーーー。これでは集計ができないじゃないか・・・・」

本当は、こんな感じのCSVデータでもらえれば、すぐに集計などができますよね。

この3日分のデータであれば、頑張ってCSVにコピペしていけば、CSVの形式にすることができますが、これが、1か月分、2か月分となると途方もない作業になってしまいます。

さて、どうにか、ならないものなのか。。。

一緒に考えてみましょう。

CSVとは?

そもそも、CSVとは何でしょうか?

CSVとは、,(カンマ)で区切られたデータ形式のことです。先ほどのデータで言うと、このような状態になります。このデータをCSVの形式で開くと、表のような形式になります。

具体的に、CSV形式で開く方法は、拡張子を.csvに変更します。拡張子とは、ファイル名の後ろについている.txtや.xlxsと改定ある部分になります。表示されていない場合は、下記の方法で表示させることができます。

Explorerの「表示」タブにて、「ファイル名拡張子」にチェックを入れる

CSVファイルを開くためのアプリケーションで開きます。エクセルでも開けますが、無料のアプリでもCSV形式で開けるアプリがあります。

CASSAVA

https://www.asukaze.net/soft/cassava/

CSVの形式に変換する

先ほどの天気の記録に戻ります。欲しかったCSVの形式にするには、以下の通り、変換する必要があります。

-------------------------------------------------------------------------------------

2024年5月1日

曜日:水曜日

天気:晴れ

備考:少し蒸し暑い

2024年5月2日

曜日:木曜日

天気:曇り

備考:少し雨がぱらついた

2024年5月3日

曜日:金曜日

天気:雨

備考:雷も鳴った

-------------------------------------------------------------------------------------

ここで大切なのは、「法則性」です。今回のデータを見てみましょう。

下記のような法則で記載されています。

2024年●月●日

曜日:<曜日>

天気:<天気>

備考:<備考>

これを下記のようにするには、どうしたらいいでしょうか?

2024年●月●日,<曜日>,<天気>,<備考>

テキストデータの文字を以下のように変換する必要があります。

ここで大事なのは、改行も一つの文字として考えることです。

実際に改行せずに考えると、テキストのデータはこうなります。

2024年●月●日<改行>曜日:<曜日><改行>天気:<天気><改行>備考:<備考>

テキストデータとCSVデータを並べてみます。

2024年●月●日<改行>曜日:<曜日><改行>天気:<天気><改行>備考:<備考>

2024年●月●日,<曜日>,<天気>,<備考>

以下の通り、テキストデータを変換すると、CSVの形式になることがわかります。

<改行>曜日:→,

<改行>天気:→,

<改行>備考:→,

他の日付のデータも同じ形式で記載されているので、上記の変換をテキストデータ全体で行えば、CSVの形式に変換することができそうです。

文字列の変換

実際の文字列の変換には、テキストエディタと言う種類のアプリを使用します。

今回は、無料で使えるTeraPadというソフトを使ってご説明します。

TeraPad

https://tera-net.com/

テキストデータをTeraPadで開きます。

Ctr+Rを押すと置き換えのウィンドウが出ます。

「検索する文字列」も変換前のテキストをいれます。TeraPadでは、改行は\nで表されるため、下記のように入力します。

\n曜日:

「置換後の文字列」には、,を入力ます。

「すべて置き換え」をクリックします。

確認画面が表示されるので、「すべて」をクリックします。

変換されました。

同じ手順で、すべての文字列を変換します。

変換が終わったら、保存し、拡張子を.csvに変更します。

エクセルなどでCSV形式で読み込めるアプリで開きます。

変換されました。

1行名に項目名などを入れると、よりデータとして扱いやすくなります。

最後に

私は、仕事のなかで、何度もこの方法が資料作成などに役立ってきました。今回は、シンプルに事例でご紹介しましたが、応用することで、様々な場面で役に立つ方法です。ぜひ皆さんも使ってみてください。少しでも皆さんの仕事の効率化に役立てば幸いです。

【Java】ユーティリティクラスを作る際にやっていること

ユーティリティクラスとは、さまざまなクラスの処理の中で頻出する共通処理をまとめたクラスのことです。普段皆さんが扱っているリポジトリの中で「Common.java」や「○○Utils.java」という名前で作成されているクラスがあるとしたら、おそらくそれのことです。クラスの中には、いくつかのprivate static finalなメンバといくつかのstaticメソッドがあるかと思います。

public class Common {
  public static final String ○○ = ...

  public static String △△ = ...

}

1. クラスをfinalにする

ユーティリティクラスのメンバやメソッドは基本的にpublicで宣言されてstaticに呼ばれることを想定していますが、書き手によってはユーティリティクラスを自分が作成するクラスに継承して利用しようとします。

public class ChildClass extends Common {
...
}

しかし、is-aの関係を満たさないこのような継承は混乱のもとであり、クラスの結合度を無駄に高めてしまい、修正・変更の障壁です。

そのため、クラスにfinal修飾子を付与して継承を不可能にします。(finalを外す修正をしたコーダーがいた場合はレビューでブロックします)

public final class Common {
...
}

public class ChildClass extends Common { // コンパイルエラー
...
}

2. コンストラクタを隠蔽(いんぺい)する

ユーティリティクラスのメンバとメソッドはstatic参照されるため、インスタンスを作成する必要はありませんし、するべきではありません。なので、デフォルトコンストラクタを明示的にprivateにして、インスタンス化を防止します。

public final class Common {
  private Common() {}
}

しかし、これではReflectionで参照されてしまうため、コールされた際にErrorをスローして確実に実行させないようにします。

public final class Common {
  private Common() {
    new AssertionError();
  }
}

最後に

自身が作ったクラスの誤用を防ぐこともAuthorの責任です。クラスを読む人と使う人のことも考えてコーディングして、サービスの保守効率を高めていきたいですね。

入社のご挨拶

はじめまして。
この度中途入社いたしました、山本と申します。

前職ではLINE公式アカウントのサポートシステムの開発とメンテナンス、開発チームの管理などを行っておりました。

システムエンジニアとして長く働いており、組み込み系開発から始まり、サーバーアプリ開発、スマホアプリ開発、Webシステムの開発など、システムの下層から上層まで幅広く開発に携わってきました。

過去の知識や経験を活かして、グリニッジのサービスをよりよいものにしていけたらと思います。

趣味はゲーム、漫画、アニメとオタクな生活をし、猫を見かけたら突撃してモフモフしたくてたまらなくなるくらいの猫好きです。
最近はコストコ、ロピア、イオンモールなど、大きなショップを友達と巡って、いろいろな食材や総菜を探して食べまわるのが楽しくなっています。

食は生きる力ですね!

よく食べ、よく寝て、グリニッジに貢献していけるよう日々精進していきたいと思います。

どうぞよろしくお願いいたします。

グリニッジ製品が「IT導入補助金2024対象ツール」に認定されました!

この度、IT導入補助金2024対象ツールに、「らくらくーぽん」「らくらくフォロー」「らくらく在庫」「らくらく最安更新」が認定されました。

「コストを抑えながら便利なツールを使いたい」「補助金が出るならすぐにでも利用してみたい」とお考えであれば、ぜひこの機会に導入を検討してみてください。

今回は、IT導入補助金2024に関する基礎知識、そしてIT導入補助金2024対象ツールとして認定された、当社グリニッジの提供する「らくらくシリーズ」についてお話しします。

IT導入補助金2024に関する基礎知識

はじめに、IT導入補助金2024について詳しく解説します。

IT導入補助金2024とは

「IT導入補助金2024」とは、令和5年度補正「サービス等生産性向上IT導入支援事業費補助金」として提供される補助金制度です。

この制度は、中小企業や小規模事業者が業務効率化やデジタルトランスフォーメーション(DX)を推進するためのITツール(ソフトウェア、サービスなど)の導入を支援しています。

様々な経営課題を解決するためのもので、これからITツールを導入する企業が対象です。

【補助金の枠組み】
IT導入補助金2024は、以下のような補助対象にまとめられています。

  • 通常枠
  • インボイス枠(インボイス対応類型)
  • インボイス枠(電子取引類型
  • セキュリティ対策推進枠
  • 複数社連携IT導入枠

5つの類型から、各企業の状況や条件に応じ、補助金を申請することが可能です。

ITツールの導入には一定のコストがかかりますが、IT導入補助金2024を利用することでそのコスト負担を軽減できます。

補助金を活用すれば、生産性の向上、業務効率化、ペーパーレス化、セキュリティ強化といった効果を期待できます。

昨年度からの変更点もありますので、詳細は公式URLでご確認ください。
参考元:補助対象について|IT導入補助金2024

グリニッジ製品は最大補助率50%

グリニッジの製品は、IT導入補助金2024の対象ツールとして認定されており、「通常枠」で最大補助率50%が適用され、システム使用料が2年分までまとめて申請することが可能です。

当社の提供する対象ツールは、ネットショップ・自社ECサイトを運営している方の業務効率化や課題解決に最適です。

コスト面がネックでなかなかITツール・システムを導入できずにいた方も補助金を利用することで、スムーズに業務改善が可能になります。

参考元:通常枠|IT導入補助金2024

申請作業もまとめてサポート

IT導入補助金を利用するためには、IT導入補助支援事業者(ITベンダー・サービス事業者)から申請する必要があります。

「補助金の申請は難しそう」「忙しくて申請する暇がない」と考えられていた方でも、グリニッジ製品を使用する場合は申請も含めてサポートいたしますので、非常に安心です。

同時に、グリニッジ製品の導入から運用まで、メール・お電話・オンライン等でしっかりとサポートを行いますので、「導入したが使いこなせない」「忙しくて詳しく学習コストを割くことができない」というような心配もなく、スムーズに利用することが可能です。

参考元:IT導入補助金とは

グリニッジの提供する「IT導入補助金2024対象ツール」の紹介

次に、IT導入補助金2024対象ツールとして認定された、グリニッジ製品について詳しくご紹介します。

詳細URL:SERVICE|グリニッジ株式会社

レビュー促進ツール(らくらくーぽん・らくらくフォロー)

グリニッジの提供する「IT導入補助金2024対象ツール」の一つとして、レビュー促進ツールである「らくらくーぽん」「らくらくフォロー」をご紹介します。

らくらくーぽんは、導入実績5000社以上の楽天市場向けのレビュー促進ツールです。
商品を購入してくれたお客さまに対し、レビューの書き込みを促すフォローメールや、リピーター獲得のための確認・クーポン送信を自動化できます。

また、らくらくフォローは、Yahoo!ショッピングのフォローメール・サンクスメールの配信を自動化しレビューの促進とリピーター獲得をサポートします。

レビューの増加は、新規顧客の獲得や認知度の向上に直結し、売上や利益の向上に大きく貢献します。

レビュー促進ツールを利用することで、時間や労力及び手間などの負担を少なく、効率的にレビューを増やし、売上アップを期待できます。

詳細URL:らくらくーぽん

詳細URL:らくらくフォロー

在庫管理ツール(らくらく在庫)

グリニッジの提供する「IT導入補助金2024対象ツール」の一つとして、ECに特化した在庫管理ツールである「らくらく在庫」をご紹介します。

らくらく在庫は、運営実績10年以上、導入実績500社以上で、在庫管理に特化しているので誰でもカンタンに使いやすいことが特徴です。

異なるモール・カートシステムと連携し、自動で多店舗間の在庫調整が可能です。

24時間365日ほぼリアルタイムに在庫更新できるため、クレームの原因となる売り越しの心配もほぼありません。

在庫0(ゼロ)・在庫少の通知、セット販売、別品番紐づけ機能など、ネットショップやオンラインショップに必要な機能が充実しているため、EC事業を運営における事務処理の負担を大幅に軽減することができます。

詳細URL:らくらく在庫

価格調整ツール(らくらく最安更新)

最後に、グリニッジの提供する「IT導入補助金2024対象ツール」一つとして、価格調査・価格更新ツールである「らくらく最安更新」をご紹介します。

らくらく最安更新は、24時間365日、自動で商品の価格調査と更新が可能で、対応モールは楽天市場・Yahoo!ショッピングです。

EC事業における価格調査は非常に時間と労力がかかるため、後回しになりがちですが、リアルタイムに変動する相場や価格に対応できないと利益を出すことが難しくなります。

価格調査更新ツールを利用することで手間をかけず、「利益が出て売れる最適価格」で販売できるようになるので非常におすすめです。

同業他社や競合ショップとの価格競争に巻きこまれず、複数店舗・多店舗運営における場合においても、業務効率化と売上アップが期待できます。

詳細URL:らくらく最安更新

まとめ:IT導入補助金利用で複数ツール導入もさらにお得!

今回は、IT導入補助金2024に関する基礎知識、そしてIT導入補助金2024対象ツールとして認定された、当社グリニッジの提供するに「らくらくーぽん」「らくらくフォロー」「らくらく在庫」「らくらく最安更新」ついてお話しました。

IT導入補助金を使ってグリニッジ製品を複数利用する、とさらにお得に導入できるため「コスト面でツールの利用が難しかった」というケースの課題解決につながります。

現在、ご紹介したグリニッジ製品各サービスは、全ての機能を利用できる無料トライアル期間を実施しておりますので、まずはお気軽にお問い合わせ、お申し込みください。

最後までお読みいただきありがとうございました。

この記事が、IT導入補助金を利用して、ネットショップ運営の効率化や最適化をしたい方のお役に立てれば幸いです。

MECE(ミーシー)って何ですか?考慮事項を漏れなく書き出そう!

MECE=「モレなく、ダブりなく」

MECE(ミーシー)とは「Mutually Exclusive and Collectively Exhaustive」の略で、直訳すると「互いに重複せず、全体として漏れがない」・・・もっと簡単にいうと「モレなく、ダブりなく」という意味です。

ビジネスではロジカルシンキング(論理的思考)の重要性がよく説かれますが、ロジカルシンキングを実行するために必要な概念がMECEです。

ロジカルシンキングとは・・・

MECEとは・・・

という教科書的な説明は他のコラムに譲るとして、ここではMECEの具体例と、MECEを欠いた場合に起こる困った事例について見ていきましょう。

MECEの例①業務フロー図

業務フロー図

新しいサービスをリリースした場合や、新しい取引相手と協業が始まった場合、社内の業務を効率化する場合など、仕事が増えたり減ったり、手順が入れ替わったりすることはしばしばあります。

  • Aさんは何をするか
  • AさんがタスクaをするのとBさんがタスクbをするのはどちらが先か
  • もしも○○に該当する場合はどうするか、該当しない場合はどうするか
  • ・・・

これらの考慮すべきことを漏らすことなく、全体像を見渡せるように、図形や矢印などを使って、一つ一つのタスクとそのつながりを一枚の図に落とし込んだものが業務フロー図です。

一方、業務の引き継ぎのマニュアルを作る際、タスクを順番に並べただけの単純なリストがよく作られます。

 手順1)○○からCSVをダウンロードする。
 手順2)CSVをExcelで開き、F列に○○を追加し、Excel形式で保存する。
 手順3)Excelファイルを○○課のファイルサーバーにアップする。
 手順4)○○課の▲▲さんにSlackでメンションする。

決まりきった一直線のタスク群を運用し続けるだけならこれでいいのですが、業務の手順や内容を大きく変更する場合には、上記だけでは不十分です。

やるべき手順が多いほど、あるいは「もしAの場合はBするが、Aではない場合はCする」のような分岐が多いほど、上記のような一本道のリストだけでは、業務に漏れが生まれるリスクが上がります。

MECEの例②ロジックツリー

ロジックツリー

ある課題を解決するための方法を考えたり、今起きている問題を漏れなく洗い出して状況把握したり、一見バラバラに見える事象をグループに分類整理する場合などに使われるのが、ロジックツリーです。

たとえば、ある飲食店で売上が落ちているとします。そのまま放置は出来ないので、対策を考える必要があります。

ブレストと称して、ミーティングを設定して原因を洗い出したり、その対策を考えたりします。

  • 周辺のお店に比べてメニューの価格が高い。
  • 駅前に商業施設ができて、人の流れが変わってしまった。
  • 配膳やテーブルの片付けに時間がかかり、利用者の不満が高い。
  • 掃除が行き届かず、店の中からどことなく清潔感が失われている。
  • 新規開店当初は人気があったが、地元客が一巡して飽きられてしまった。
  • ・・・・

このようなリストを元に、2回目のミーティングでは、これまたブレストと称して、それぞれの課題仮説に対して、いきなり解決策を考えがちです。(いわゆる「ジャストアイデア=思いつき」の状態です)

リストに並んでいる課題が、ちょっとした日々の注意だけで片付くならこの程度のリストでもよいでしょう。

しかしこのリストには大小さまざまなレベルの課題が混在しています。

すべての課題と解決策について、優先度すらつけずに同列に扱い、すべてを実行しようとしても、どれも中途半端になったり、実行不可能なのでいつの間にか立ち消えになったりしがちです。

結果、なかなか状況は改善されません。

そもそも議論が拡散したままで、何度ミーティングを開いても解決に向けて事態が進捗しません。

散らかり放題の部屋を片付けるのに、どこから手を付けたらいいか分からないような状態に近いです。

上記の課題リストをロジックツリーで整理すると、たとえば以下のように分類できます。

--------------------------------------------------------------------------------------------
売上が落ちている
 └①メニューの問題
   └周辺のお店に比べてメニューの価格が高い
   └新規開店当初は人気があったが、地元客が一巡して飽きられてしまった
 └②スタッフの問題
   └配膳やテーブルの片付けに時間がかかり、利用者の不満が高い
   └掃除が行き届かず、店の中からどことなく清潔感が失われている
 └③立地の問題
   └駅前に新しい商業施設ができて、人の流れが変わってしまった
--------------------------------------------------------------------------------------------

どうやら店舗の力だけでまず取り組めそうな問題と、もっと根本的・長期的な課題に分かれていそうです。

①②③以外にも「④地域の変化の問題(近隣住民の年齢層が変わってしまった等)」など、別な課題軸があるかもしれませんし、①②③それぞれについて、もっと詳細な課題を挙げられるかもしれません。

初回のブレストのジャストアイデア状態に比べると、課題に優先順位をつけ、次に取るべき対策を考え、優先度を付けやすくなったのではないでしょうか。

課題分析や解決のためによく使われる、市場や顧客セグメントなどを設定した4象限マップやベン図なども、MECEの一種です。

↓よく見かける4象限マップの例です。

4象限

↓これがベン図です。

ベン図

ところで、ベン図は「ベンさんが発明したからベン図と呼ぶ」って、ご存知でしたか?

MECEの例③要件定義・ユースケース図・シーケンス図など

要件定義

プロダクトを開発する際、製造前に整備する要件定義等も、MECEの一つです。

課題を抜け漏れなく把握するロジックツリーが企画職版のMECEなら、要件定義等は開発者版のMECEです。(見た目は若干異なりますが、論理構造はロジックツリーも要件定義も同じです)

開発によって実現したい状態(ユーザーストーリー)や、必要な処理を一枚の図や絵に落とし込むことによって、考慮不足による事故を抑止できます。

MECEで可視化したドキュメントを用意せず、とりあえず手を動かしてプロトタイプをスピーディーに作る手法もありますが、プロダクトが複雑化したり、開発が長期化したりするほど、技術的負債が蓄積されるリスクが高まります。

(そこまで発展&複雑化したプロダクトであれば、そろそろリファクタリングのタイミングかもしれません)

そもそも、適切に設計されたメンテナンスしやすいリレーショナルデータベース自体が、MECE的な思考の結晶といえるでしょう。

MECEの例④会計の複式簿記

複式簿記の仕訳帳

法人会計や青色申告の個人事業主が使う複式簿記は、MECEの代表的なものです。

小学生のお小遣い帳のような単式簿記もMECEですが、一つの取引について貸方・借方に勘定科目と金額を記載する複式簿記は、より精密・複雑なMECEです。

会計処理や税務申告では、総勘定元帳や仕訳帳、現預金の出納帳、その他の補助元帳など多くの帳簿を使います。

それらの帳簿に適切に金額が書き込まれていれば、決算の際には帳簿をまたいだ同じ項目について、すべての金額がピタリ一致するはずです。

会計でMECEが維持されない場合、自社の業績や資産状況を正確に把握できなくなってしまいます。

かつて紙のノートや算盤・電卓で会計を行っていた時代は、MECEを維持すること、つまり異なる役割を持つ複数の帳簿の間で、同じ項目に同じ金額を転記するだけで膨大な労力を要していました。

現代では会計システムや会計ソフトが普及しており、数十年前と比べても会計業務は格段に改善されました。

18世紀の文豪ゲーテは「複式簿記は人類最高の発明」と評しましたが、コンピューターのない時代に、後に何百年も通用し続けるMECEなリレーショナルデータベースを考案した昔の人は、すごいですね…

MECEを完成させること自体が目的ではない

ここまでいくつかMECEの例をご紹介ましたが、MECEを作ること自体が目的なのではなく、MECEには必ず目的があるということは、忘れてはならないポイントです。

  • 業務フロー図は、最終的には運用体制の確立や業務改善のために使われます。
  • ロジックツリーは、最終的には問題を解決するために使われます。
  • 要件定義やその他の図は、最終的には完成度の高いプロダクトをリリースするために使われます。
  • 複式簿記は、最終的には会社の業況を把握して次の打ち手を考えるために使われます。

MECEはそれ自体が非常に美しく、MECEを完成させるだけでも頭を使う楽しいゲームです。しかしビジネスに活用する以上は、その「出口」は常に意識する必要があります。

当社の新プロダクト「IMG-UP(イメージアップ)」におけるMECEの例

新プロダクトIMG-UP

最後に、当社が2024年にリリースした新プロダクト「IMG-UP(イメージアップ)」を例に、MECEによる検討プロセスの一部をご紹介します。

IMG-UPは、樂天ユーザーの90%以上を占めるスマホユーザー向けに、商品の楽天ランキング情報やレビュー点数など、購買の決め手となる情報を自動取得し、商品画像の空き枠にアピール用の画像を自動生成するプロダクトです。

→IMG-UPのサービスページ

これまでの当社のプロダクト開発で培われたUI/UXに関わる知見を反映しており、店舗のみなさまが迷うことなく自力で必要な操作を行えることを、かなり重視しています。

管理画面の配色ひとつとっても、操作に必要な情報を取得し、理解しやすいように考慮されています。

画面の配色だけでもさまざまな検討項目がありますが、ここでは特に「色覚」に関するMECEをご紹介します。

※あわせてこちらのエンジニアのブログも、ぜひご参照ください。

配色決定に先立つ「色覚」に関するMECE

「色の見え方」は実は人それぞれで、赤いものが赤く見え、黄色いものが黄色く見えるような、一般的な色覚(C型)が最も多いですが、少数ながらも、C型とは別な色覚のタイプがいくつかあり、その対象者から見ると、それぞれのタイプや強度によって、色の見え方が異なります。

色覚のタイプ特徴
C型最も多い色覚
P型赤色を感じることが難しい
D型緑色を感じることが難しい
T型青色を感じることが難しい

IMG-UPは、色覚のちがいも考慮して、画面の配色を検討しています。

最も多いC型の人が識別しやすいかどうかは当然考慮するものとして・・・

  • ではP型の人にとってはどうか?
  • ではD型の人にとってはどうか?
  • ではT型の人にとってはどうか?

このように色覚をMECEで挙げた上で、配色を検討しています。

とはいえ、MECEの分類それぞれに対応した解決策を考えればいいかというと、話はそう単純でもありません。

実際には、ある色覚における見えやすさを優先すると、他の色覚ではかえって見づらくなるということも起こります。

したがって現在のIMG-UPは、いかなる色覚でも見やすく、色覚のMECEのどの分類にも通用する配色やUIを採用しています。

適切な配色、配色に依存しないUI、アイコンのデザインや文字表記など、さまざまな解決策があります。どのような形の解決策であれ、課題を整理するためのMECEを使っているにはちがいありません。

ジャストアイデアで配色を考える場合の無限ループ

一方、配色をジャストアイデア(思いつき)で考えると、どうなるでしょうか?

おそらくこうなります。

  • 配色事典をパラパラとめくる
  • 「これが素敵そう?」「これが分かりやすいんじゃないか?」とブレストし、何パターンかピックアップ
  • 「なんだかこれが一番よさそう」で採用し、実装
  • 「ん?なんかちがう」という違和感をおぼえ、変更を検討し、再び配色事典をパラパラめくる
  • (以下無限ループ)

そもそも議論が拡散したままで、いつまで経っても最適な配色が確定せず、品質も向上しません。ジャストアイデアの最もよくないパターンにはまり込みます。

散らかり放題の部屋を片付けるのに、どこから手を付けたらいいか分からないような状態に陥ることでしょう。

MECEを課題解決のツールとして使いこなそう

ここまで、MECEの具体例や、MECEを欠いた場合に起こる困った状況についてご紹介しました。

一見バラバラに見える事象をMECEに落とし込んで考えるスキルは、課題解決や論理的思考力の基本となるものです。

ご紹介した事例も、企画職やエンジニア、デザイナー、会計担当にいたるまで、あらゆる職種にかかわります。(日常生活で、散らかり放題の部屋を目のあたりにし、途方に暮れているときにも役に立つかもしれません!?)

目先のタスクに埋没するだけでなく、目の前にあるものをMECEで分類してみる。

一見遠回りに見えますが、結局は業務の効率化や品質の向上につながり、仕事の手戻りや考慮不足を未然に防げるようになることでしょう。

※ちなみに当社には、研修の一環で、会社負担で(勤務時間中に)グロービスのロジカルシンキング講座を受講できるという制度があります。

現在リファクタリング中です!

みなさん、枝豆が大豆ってご存じでしたか?
今日の豆知識です。古関です。

昨年度からグリニッジでは、品質改善に取り組んでいます。
その過程の中で、なかなか取り組めていなかったリファクタリング
コードの修正と一緒に行っています!

リファクタリングをする目的

保守性の向上

コードをより理解しやすく、変更しやすくすることで、保守性を向上させます。読みやすいコードは、バグを見つけやすく修正しやすくなります。

柔軟性の向上

コードを柔軟にし、将来の変更や機能の追加に対応できるようにします。柔軟性があるコードは、要件の変更や新しい機能の追加に対して素早く対応できます。

効率の向上

コードを効率的にすることで、パフォーマンスが向上し、リソースの効率的な利用が可能になります。また、冗長な処理や無駄なコードを削除することで、実行時間やメモリ使用量を削減できます。

信頼性の向上

コードの品質を向上させ、バグの発生を減らすことで、信頼性を高めます。信頼性の高いコードは、安定した動作を提供し、ユーザーの満足度を向上させます

可読性の向上

コードをより読みやすくすることで、他の開発者やチームメンバーが理解しやすくなります。可読性が高いコードは、コラボレーションやチームワークを促進し、コミュニケーションコストを低減します。

実際の取り組み

テストやカスタマイズの対応により、一部のユーザーのみ処理をわけたい事があります。
リファクタリング前は下記のように、テストアカウント情報を直接コードに埋め込んでいました。

// リファクタリング前のコード
if (user.equals("test_user1") || user.equals("test_user2")) {
テスターの処理内容
} else {
他ユーザーの処理内容
}

リファクタリングでは、下記のように変更しました。

// 下記コードをModelに記述
public boolean isTestUser() {
  return user.equals("test_user1") || user.equals("test_user2") ;
}
// テストユーザーで分岐したい処理
if (model.isTestUser()) {
  テスターの処理内容
} else {
  他ユーザーの処理内容
}

変更前はユーザーごとに分岐させたい処理が複数存在する場合に、
新しいユーザー名をそれぞれに追記する作業が発生しました。
変更後では、Modelの1カ所に追加するだけで良くなりました!

最後に

レビューとしては、分かりやすくなったとレビューをいただきました!
他にもっといい書き方や、柔軟性のあるコードをかけるように、頑張りたいと思います!

最近耳にするWebAssemblyとは?

1年以上前ですが、このブログでプログラミング言語のトレンド調査を行いました。

その中でも上位に来ていたものに

「Assembly Language」

がありました。

ブログを上げた際にはアセンブラの一種かと思い、特に調べることもなかったのですが、最近、よく耳にするワードがあります。

「WebAssembly」

さらにはその中で「Rust」がいいよ、という内容が目に止まりました。

ただ「Rsut」は「Rsut」だよね?「Web」と書かれているということはブラウザで動作するということか?

いろいろ気になったので調べてみました。

WebAssembly (WASM)とは?

WebAssembly (Wasm)は、ウェブブラウザで実行される低レベルのバイナリフォーマットで、主に高性能なウェブアプリケーションの開発に利用されます。JavaScriptとは異なり、WebAssemblyはバイナリ形式であるため、ブラウザが解釈しやすく、実行速度が速いのが大きな特徴です。

https://qrz.co.jp/blog/webassembly_function/

弊社でもJavaScriptのフレームワークはいくつか導入しています。

  • React
  • Angular
  • Vue.JS

などを使ってサービスの提供を行っています。

確かにネックとなるのはそれほど実行速度は早くない、というところでした。

それがWebAssemblyでは解消されるということになります。

WebAssemblyの特徴

上記で実行速度を上げましたが、その他の特徴も調べてみました。

JavaScriptを超える高速処理

これは先ほども述べましたが、バイナリ形式であるためが大きいものと想像されます。

従来はJavaScriptによって記述されていた部分をWebAssemblyに置き換えることで、処理速度が改善されます。実測値の報告データによると約3倍の処理速度が期待できるそうです

3倍の違いというのはかなり大きいです。高速な処理が要求されるであろうゲームや、多くのデータを利用するシミュレーションやAIなどに有効になってきそうです。

多くのブラウザで対応済み

メジャーブラウザは多くで対応済みです。なので動作に心配ないのも安心です。

  • Chrome
  • Edge
  • Firefox
  • Safari
  • Opera

最新の対応状況はこちらで確認できます。

https://caniuse.com/wasm

移植性・言語選択肢の多さ

「Rust」が使える?という今回の疑問の回答がこちらになります。

低レベルのバイナリフォーマットは標準化されており、多くの言語が対応しています。

  • Java
  • PHP
  • C# .NET
  • C++
  • Ruby
  • C
  • Swift
  • R
  • Go
  • Rust

「Rust」もありますね。

バイナリフォーマットさえ出力できるものであれば、言語は問わないということですね。

WebAssemblyでは

多くの言語が使える=既存のソースコードの流用ができる、ということにもなります。

「Rust」には「Yew」というフレームワークもありました。

また最近はWebAssemblyに特化した「Oynx」といった言語も登場しています。

どの言語が利用されているのか?

Scott Logic社が、WebAssemblyの利用状況などに関する調査報告を毎年行っており、直近の「The State of WebAssembly 2023」を見てみます。

記事のグラフを抜粋しました。Rustが一番利用されています。さらに3年連続で一番利用されていることが分かります。40%以上と高い利用率ですので、よく話題になっているのかもしれません。

もう一つ、気になるグラフがありました。

WebAssemblyは実は利用用途はWebだけではないんです。

サーバレス、コンテナ、プラグイン開発と多岐に渡ります。

上記ではWebAssembly (Wasm)は、ブラウザで実行と書きましたが、正確には仮想マシン用バイナリ命令フォーマットの仕様になります。

そのフォーマットがWasm ランタイムと呼ばれるスタックベースの仮想マシンによって実行されることになるため、特定のプラットフォームに依存しないことになります。
また、Wasm は OS、 CPU アーキテクチャに依存していません
OS (Windows、Mac、Linux) や CPU アーキテクチャ (x86-64、ARM) が異なる環境でも動作します。
Wasm ランタイムが OS や CPU アーキテクチャの差異を吸収しているため Wasm アプリケーションでは意識する必要がありません。

これによってWebだけではなく、いろいろなところで活用できるというわけです。

最近良く聞く、と言いましたが、実はAWSのLambdaでWebAssemblyが利用できる、というのを見たのが最初の知ったきっかけになります。

サーバサイド向けとしてSpinというフレームワークも存在しているようです。

https://twitter.com/ThorstenHans/status/1775799593931846143

WebAssemblyでできないこと

良いことずくめなWebAssemblyですが、できないこともあります。

システムのルート権限でアクセスできない

OS やデバイス自体にシステムのルート権限でアクセスできません。したがって、USB や Bluetooth、画面などに直接アクセスすることは不可能です。

DOM操作が行えない

WebAssemblyはブラウザがHTMLを解析する際に生成するデータ構造であるDOM(Document Object Modelの略)の操作もできません。

WebAssemblyの設計仕様はHTMLの要素を操作するものではありません。DOMの操作にはJavaScriptを使う必要があります。

そうなんです、WebAssemblyはブラウザ上では単独では利用できないのです。

ですがJavaScriptを使えば良いだけですので、そんなにネガティブに考える必要はなさそうです。

WebAssemblyを使ってみたい

調べれば調べるほど、いろいろな可能性を秘めたWebAssembly。

しかし最近の動向でもWeb以外での利用も増えてきているとはいえ、メインはWeb利用です。

多言語対応、プラットフォーム非依存、高速性など多くの特徴を持っており、ぜひ取り入れてみたいと思わせる魅力があります。

新しいサービス開発となったら、Yewあたりで、いやまずはLambdaで使ってみたいですね。

ビジネス実務法務検定2級~受験チャレンジ~

昨年の11月にビジネス実務法務検定(以下:ビジ法)の2級にチャレンジしました。
今回は、ビジ法受験に向けて行った勉強法を紹介していきたいと思います。

ビジネス実務法務検定とは

ビジネスの場で必要な法律の基礎知識を習得することのできる資格です。

3級では主に民法についての知識が問われますが、
2級では民法に加えて、商法・会社法についての知識も必要になります。

試験期間は1年に2回あり、秋に受験しました。
今年の申込み期間や試験期間についてはこちらのページで案内されています

▼受験案内・お申込み - 東京商工会議所
https://kentei.tokyo-cci.or.jp/houmu/exam-info/#content01

受験のきっかけ

会社の推奨資格としてビジ法の3級を紹介されたので、
最初は軽い気持ちで3級にチャレンジしてみました。

3級は夏に受験しましたが、あと少しのところで不合格という結果になり、
自分でもびっくりするほど悔しい気持ちになりました。
あと少しだったのであれば、次は2級を受験して必ず合格しよう、と強く思ったことがきっかけです。

筆者のスペック

本記事のレベル感の参考として、筆者のスペックを記載します。

  • テキストをじっくり読んで勉強することが苦手
  • 学生時代の1番の苦手科目は社会科
  • 法律に関して勉強するのは(ほぼ)初めて

一度は3級にチャレンジしているので、2級の勉強をした時点では(ほぼ)初めてという感じです!

問題の出題形式と受験方法

試験時間は2時間で、正しい選択肢を選んで回答していく内容となっております。
100点満点とし、70点以上をもって合格とします。

受験方法は自宅で受験するIBT方式と、各地の会場で受験するCBT方式があります。
私はIBTの方が受験費が安いことと、自宅での受験なのでギリギリまで勉強できるという理由でIBT受験にしました。
IBT受験は受験者が用意したパソコンの内蔵カメラやスマートフォンを使用して、
部屋の様子やパソコンの周りなどを試験管に確認していただいたり、画面共有をしながら受験したりと、
自宅からの受験とはいえ厳重に管理された状態で受験します。

また、パソコンの周りは紙などは置けないため、紙でメモはできません。
問題画面のメモ欄にパソコンでメモをしながら問題を解いていきました。

実際の学習方法

ビジ法は選択肢から回答する試験内容となっておりますが、
その選択肢が多いため、選択肢がなくても答えがわかるぐらいに理解していないと、
合格は難しいです。

受験する人のレベルによっては、公式の問題集のみでも十分だと思いますが、

  • ほぼ初学者
  • 理解する前に回答を覚えてしまう恐れがあった
  • 予備知識が全くないため解説を理解することができない
  • 難しい文章を読み進めるだけだと集中力が持たず、頭に入らない

という理由から、複数の教材を用意して学習を進めました。

試験までの大まかな勉強の流れは下記の図の通りです。

メインはスタディングの動画の視聴をして進めていき、
理解が追い付かない部分はYouTubeの「動画で民法がわかーる。」というチャンネルから
関連動画を探して視聴をしました。


上記のYouTubeチャンネルは民法だけではなく、
商法や会社法も難しい言葉はあまり使わず親しみやすい例も交えて解説しているので非常に助けられました。あとアザラシがかわいいです。
また、スタディングでは1セクションごとに問題集を用意しているので、
1セクション視聴をするたびに問題集で復習をしました。

動画視聴やアプリの問題集は手軽に学習ができるので、
移動中や入浴中や料理をしているときなど、隙あらば勉強するようにしました。
ひと通りの講座を受講し、問題文が理解できるようになってから
公式問題集の練習問題に着手しました。

公式問題集もひと通り練習問題を解き、不正解だった問題はふせんを貼って、
ふせんが貼られている問題を中心に繰り返し確認しました。
本番を想定してメモはとらず、選択肢を見なくても答えが浮かぶように、
公式テキストの内容も確認しながら総仕上げをしました。

使用した教材は下記の通りです。

【動画教材】
▼ビジネス実務法務検定試験® 2級合格コース[2024年試験対応]
https://studying.jp/bijihou/itempage/course2-2024.html
※アプリの問題集も上記サービスのものを利用しました

▼動画で民法がわかーる。【行政書士試験対策】
https://www.youtube.com/@azarasi
※一部動画はメンバーシップに入会する必要があります

【書籍】
▼ビジネス実務法務検定試験Ⓡ2級公式テキスト〈2024年度版〉
https://amzn.asia/d/8rd4Ojz

▼ビジネス実務法務検定試験Ⓡ2級公式問題集〈2024年度版〉
https://amzn.asia/d/gObTDws

試験結果

合格です!!v(>▽<)v♪

試験を振り返って

実は最初の方はテキストのみで勉強を進めており、
理解ができずなかなか学習を進めることができなかったので、本腰を入れての勉強期間1カ月半ほどでした。
また、会社法や商法など普段は触れる機会のないジャンルの勉強でしたので、
初めて聞く単語も多く、同じ動画を何回も観たりして、理解するのに時間がかかりました…。

そのため、試験前の勉強時間に模擬問題に着手することができず、
本番では時間切れにならないか冷や冷やしながら受験することになりました。

問題集を解く際は選択肢を見ないようにしていたことは非常に効果的でした。

まとめ

無事、合格ができ、3級に落ちてしまったときの悔しさを晴らせて本当によかったです。

仕事のあとの長時間の勉強はけっこう大変でしたので、
次回のビジ法受験を考えている方は今からでも少しずつ、余裕を持って勉強に着手した方がいいと思います!(どんな試験にも言えることですが)

1級はかなりの難関のようなのでビジ法チャレンジはこれにて終了にしますが、
今後、別の試験にもチャレンジしていきたいと思います!

メールアドレスの正規表現

こんにちは、窪田です。

正規表現でメールアドレスをチェックしたいという状況は、エンジニアとして働いている以上、頻繁に起きるのではないでしょうか。

今回はメールアドレスの形式に当てはまる正規表現について解説したいと思います。


正規表現とは

正規表現とは、「文字列を一つの形式で表現するための方法」です。

正規表現を使用することで、いくつかの文字列を一つの文字列で表すことができます。

例えば、メールアドレスはそれぞれが異なる文字列ですが、メールアドレスの形式は決まっているので正規表現を使用することで、文字列がメールアドレスであるか、そうでないかを判断できます。


メールアドレスの正規表現

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$

これがメールアドレスの形式に当てはまる正規表現です。

この正規表現について、少し解説してみます。


正規表現の解説

メールアドレスは@以前のローカル部分@以降のドメイン部分に分けられるので、正規表現も同じようにローカル部分とドメイン部分に分けてみます。

ローカル部分

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@

ドメイン部分

([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$


ローカル部分の正規表現の解説

^

文字列の先頭を意味します。


[a-zA-Z0-9_\-]+

英数字、アンダーバー(_)、ハイフン(-)のうち、1回以上繰り返されることを意味します。

ピリオド(.)はメールアドレスの先頭に設定できないため、ピリオドは含めません。

メールアドレスに使用できる記号を増やした場合は、[]の中に追記してください。

この際、ハイフン(-)のように正規表現で特殊な意味を持つ記号は「\記号」としてエスケープする必要があります。


(\.[a-zA-Z0-9_\-]+)*

これは、ピリオド(.)と、英数字、アンダーバー(_)、ハイフン(-)のうち1回以上繰り返されるグループが、0回以上繰り返されることを意味します。

ピリオドは連続して使用することができず、ローカル部分の末尾にも使用できないため、このような複雑な正規表現になっています。

この正規表現により、a.@~やa..@~のようなメールアドレスは認めず、a@~やa.b@~を許可しています。

^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@でチェックした場合

a.@~やa..@~のようなメールアドレスは形式が正しくない判定になっている。


^[a-zA-Z0-9_\-]+([a-zA-Z0-9_\-\.]+)*@でチェックした場合

a.@~やa..@~のようなメールアドレスも形式が正しい判定になってしまう。


@

これは@が1つ一致するという意味です。


ドメイン部分の正規表現の解説

([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+

英数字と、英数字、ハイフン(-)のうち0回以上繰り返しと、英数字と、ピリオド(.)のグループが、1回以上繰り返されることを意味します。

ハイフンはラベル(ドメインの.で区切られた文字列)の先頭と末尾には使用できないため、このような正規表現になっています。


[a-zA-Z]{2,}

英字が2回以上繰り返されることを意味します。


$

文字列の末尾を意味します。


まとめ

今回はメールアドレスの正規表現について解説してみました。

正規表現を日本語で説明するのは非常に難しかったので、記事を読んでくださった方に理解していただけたか不安ですが、何かの参考になっていれば幸いです。

正規表現でメールアドレスの形式をチェックする際には、今回紹介した正規表現を使ってみてください。

Cloud FunctionsでAPIを作る!

あなたが今日も積み上げる理由になりたい。岡村です。

今回は以下2つを紹介できればと思います。

経緯

前回、水族館を作った話をさせていただきました。
水族館の機能の一部として、Discordからメッセージを取得する処理が必要でした。

これまで通りGoogle Apps Scriptで全て実装できればよかったのですが、
Google Apps ScriptからではDiscordのAPIへのアクセスが
遮断されてしまうという壁に当たり、数日寝込みました。(エラーの詳細)

思いついた対策としては、DiscordのAPIにリクエストするAPIを作成すること。(まぎらわしい)
Google CloudのCloud Functionsで実装しました。

Cloud Functionsではサーバーレス環境でお手軽にコードをデプロイし、実行することができます。Cloud Functionsがリクエストを中継してくれることで無事、
遮断されずにメッセージを取得することができました。

前置きはここまで。それでは実際にやってみましょう!

この解説でやってみること

チャンネル内には以下のようなメッセージがあるという前提です。
「テストテストテスト」以降のメッセージを取得してみます。

Cloud Functionsの設定

関数作成

「ファンクションを作成」をクリックします。

関数の構成を設定

「関数名」はお好みで。

例として今回はDiscordのメッセージを取得したいので「getDiscordMessages」。
HTTPリクエストをトリガーに関数を実行したいので「トリガーのタイプ」は「HTTPS」を選択。
「認証」は「未認証の呼び出しを許可」を選択。

コーディング

以下にソースコードを置いたのでコピペしてみてください。

内容としましては、
ポストされた情報を元に、メッセージ最大取得件数である100件を上限に
Discordへメッセージ取得をリクエストしています。
レスポンスはそのままクライアントへ返しています。

index.js

const fetch = require('node-fetch');
const functions = require('@google-cloud/functions-framework');

const END_POINT_GET_CHANNEL_MESSAGES = 'https://discord.com/api/channels/';

/**
 * discordAPIにアクセスできないGASの代わりにdiscordからデータを取得します。
 * 
 * 取得できた場合は、jsonオブジェクトを返します。ステータスは200です。
 * 既に最新メッセージを取得しており、取得するデータがなかった場合は、空のjsonオブジェクトを返します。ステータスは300です。
 * エラーが発生した場合は、空のjsonオブジェクトを返します。ステータスは400です。
 *
 * @param {Object} request クライアントからのリクエストに関する機能を提供するオブジェクト。
 * @param {Object} response クラアントへのレスポンスに関する機能を提供する提供するオブジェクト。
 */
functions.http('getDiscordMessages', async (request, response) => {

  let returnJson = new Object();

  try {

    const channelId = request.body['channelId'];
    const lastMessageId = request.body['lastMessageId'];
    const botToken = request.body['botToken'];

    const urlGetChannelMessages = END_POINT_GET_CHANNEL_MESSAGES + channelId + '/messages?after=' + lastMessageId + '&limit=100';

    const headers = {
      "User-Agent": "DiscordBot " + (urlGetChannelMessages, 10),
      "Authorization": "Bot " + botToken
    }

    const options = { 
      "method": "GET",
      "headers": headers
    }

    let responseFromDiscord = new Object(); 

    try {
      responseFromDiscord = await fetch(urlGetChannelMessages, options); 
      returnJson = await responseFromDiscord.json();
      response.status(200);

    } catch(error) {
      throw new Error('discordへのリクエスト中にエラーが発生しました。');
    }

  } catch(error) {
      console.error('エラーが発生しました。error:');
      console.error(error.stack);
      response.status(400);
  }

  response.send(returnJson);
  return;
});

package.json

{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.1.3", 
    "node-fetch": "^2.6.0"
  }
}

デプロイ

「デプロイ」をクリックし、完了まで待機します。
これでCloud Functions側の準備は完了です。

DiscordのBot作成

アプリケーション作成

「New Application」をクリックします。
アプリケーション名はお好みで。

レスポンスにメッセージ内容を含ませる設定

「Bot」タブをクリックします。
「MESSAGE CONTENT INTENT」をオンにします。
これを忘れるとレスポンスに含まれるメッセージが全て空になるので注意です。

Botにメッセージ読み取りを許可するためのURL作成

「SCOPES」は「bot」にチェックを入れます。
「BOT PERMISSIONS」は「Read Messages/View Channels」「Read Message History」に
チェックを入れます。

Botにメッセージ読み取りを許可する

「GENERATED URL」に生成されたURLにアクセスし、
メッセージを取得したいDiscordのサーバーを選択します。

「認証」をクリックします。
これによりBotがチャンネル内のメッセージを読み取る権限を得るので、準備は完了です。

動作確認

Thunder Clientを利用しCloud Functionsに作成した関数にリクエストしてみます。

Enter Url」にはCloud Functionsに作成した関数の詳細画面の
URL」に記載されているURLを入力します。

channelId」にはメッセージ取得したいDiscordチャンネルのIDを入力します。

lastMessageId」にはメッセージ取得範囲の開始位置としたいメッセージの
1つ前にあるメッセージのIDを入力します。

botToken」にはDiscord上に作成したBotのトークンを入力します。
Botタブの中で「Reset Token」をクリックすることで表示されます。
1度しか表示されないため、忘れてしまった場合はリセットが必要です。

「Send」をクリックするとレスポンスが返ります。
「content」にメッセージが入っていますね。

あとがき

いかがでしたでしょうか。

取得できましたら、あとはレスポンスをお好きなように扱っていただければ!

岡村の場合は、友達が毎日【今日の積み上げ】を送ってくるので、それを数えるなどしております。
スプレッドシートに最終取得メッセージを記録し、
新着メッセージのみを取得しに行くようなイメージです。

前回からおなじみとなってきた積み上げDiscordですが、
そろそろ発足してから9ヵ月くらいになるようです。
今日の積み上げポイント略して「きょうつみポイント」は
メンバー合計が350kpを超えました。

毎日の小さな努力も可視化されて積み重なれば、山のようですね。

山。山と聞いて思い出すのは、ヤマノススメ3期12話を見ながら泣いた日のこと。

また何か作ったら共有します!