チームラボ ボタニカルガーデン大阪 レポート

先日、チームラボ ボタニカルガーデン大阪に伺いましたので感想など。
公式HP→https://www.teamlab.art/jp/e/botanicalgarden/

チームラボ ボタニカルガーデン大阪は、長居公園内にある大阪市立長居植物園の一角をアート空間にしています。
屋外での光のアートということで、入場は夜の19:30以降です。

まずは人が近づくと木の下から照らす光が強くなり、周辺の木へとその光が伝播するアート「呼応するサルスベリ」。
ちょうどサルスベリの花が綺麗に咲いている様子がライトアップされて、非常に美しかったです。

その先には、展示内容の案内が表示されるアプリのインストールを促す案内が。
夜の屋外ですので、屋内のように展示案内が書かれていても暗くて読めないので、スマホで閲覧できるのはとても良い手法だと思いました。
広い園内に10を超える展示があるのですが、GPSで現在地に近い展示案内がすぐに読めるようになっています。
ただ、GPSの精度の問題かと思うのですが、目の前にある展示の案内が出ないことが多々あり、惜しいなと感じました。

チームラボのデジタルアート作品は、『見る』だけでなく『触れる』展示があるのも特徴のひとつで、今回も人の背丈よりも大きな卵型のオブジェがあり、皆さん思い思いに触れて写真を撮られていました。

ボタニカルガーデン大阪は常設展示なので、夜のお散歩やデートに出掛けてみてはいかがでしょうか。

以下、展示の一部を写真でご紹介します。

ツバキ園の呼応する小宇宙-固形化された光の色
風の中の散逸する鳥の彫刻群

Power Automate Desktopでメールを一括送信するフロー

今回はPower Automate Desktopを使った「メール一括送信フロー」をご紹介します!

フロー概要

今回ご紹介する「メール一括送信フロー」の概要は以下の通りです。
担当Aさんが、異なった職種を希望する複数の派遣スタッフさんにメールを送ります。

事前準備

フローを作成する前に、送信対象リストとメールテンプレートを用意しましょう。

  1. 送信対象リスト
    今回はExcelでメール送信する対象者リストを作成します。
    氏名
    カナ
    メールアドレス
    テンプレート
  2. メールテンプレート
    送信対象リストのテンプレートに記述された、テンプレートを作成します。
    ● プログラマー希望.txt
    ● 事務職.txt

フローの作成

  1. Excel の起動
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    Excelの起動:次のドキュメントを開く
    ドキュメントパス:送信対象リストのパスを指定
    インスタンスを表示する:ON
    読み取り専用として開く:OFF
    【詳細】
    ※変更なし
    【生成された変数】
    ExcelInstance
  2. Excel ワークシートから最初の空の列や行を取得
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    Excelインスタンス:%ExcelInstance%
    【生成された変数】
    FirstFreeColumn
    FirstFreeRow
  3. Excel ワークシートから読み取り
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    Excelインスタンス:%ExcelInstance%
    取得:セル範囲の値
    先頭列:1
    先頭行:1
    最終列:%FirstFreeColumn – 1%
    最終行:%FirstFreeRow – 1%
    【詳細】
    セルの内容をテキストとして取得:OFF
    範囲の最初の行に列名が含まれています:ON
    【生成された変数】
    sendList

  4. 現在の日時を取得します
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    取得:現在の日時
    タイムゾーン:システムタイムゾーン
    【生成された変数】
    CurrentDateTime

  5. 変数の設定
    変数:thisMonth
    値:%CurrentDateTime.Month%

  6. 変数の設定
    変数:newColum
    値:5

  7. 変数の設定
    変数:newRow
    値:2

    *-*-* 以下のように表示されているとOKです! *-*-*
    *-*-*
  8. For each
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    反復処理を行う値:%sendList%
    保存先:CurrentItem

    ※以下は1~5はFor each内に設定します。

    1. 変数の設定
      変数:plan
      値:%CurrentItem[‘テンプレート’]%
    2. ファイルからテキストを読み取ります
      ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
      【全般】
      ファイル パス:メールテンプレートのファイルパスを指定
      ※最後に%plan%.txtとしましょう。

      内容の保存方法:単一のテキスト値
      エンコード:UTF-8
      【生成された変数】
      template

    3. テキストを置換する
      ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
      【全般】
      解析するテキスト:%template%
      検索するテキスト:#NAME#
      検索と置換に正規表現を使う:OFF
      大文字と小文字を区別しない:OFF
      置き換え先のテキスト:%CurrentItem[‘氏名’]%
      エスケープ シーケンスをアクティブ化:OFF
      【生成された変数】
      template

    4. テキストを置換する
      ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
      【全般】
      解析するテキスト:%template%
      検索するテキスト:#MONTH#
      検索と置換に正規表現を使う:OFF
      大文字と小文字を区別しない:OFF
      置き換え先のテキスト:%thisMonth%
      エスケープシーケンスをアクティブ化:OFF
      【生成された変数】
      template
    5. メールの送信
      ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
      ※今回Gmailからのメールを行いますが、Gmailでアプリパスワード発行が必要です。コチラ
      【SMTPサーバー】
      SMTPサーバー :smtp.gmail.com
      サーバーポート :465
      SSL有効 :ON
      SMTPサーバーには認証が必要 :ON
      ユーザー名:送信元メールアドレス
      パスワード :アプリパスワード
      信頼されていない証明書を受け入れます:ON
      【全般】
      送信元 :送信元メールアドレス
      送信者の表示名:○○○株式会社
      送信先 :%CurrentItem[‘メールアカウント’]%
      CC :未入力
      BCC :未入力
      件名 :%thisMonth%月の案件情報
      本文:%template%
      本文はHTML:OFF
      添付ファイル:未入力

      ※メールアドレスの誤り等、メール送信できない場合に、エラー発生時についての処理も必要ですが、今回は割愛させて頂きます。
      *-*-* 以下のように表示されているとOKです! *-*-**-*-*
  9. Excelを閉じる
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    Excelインスタンス:%ExcelInstance%
    Excelを閉じる前:ドキュメントを保存しない

  10. メッセージを表示
    ”パラメーターの選択”の各項目について、それぞれ設定して保存ボタンを押下しましょう。
    【全般】
    メッセージ ボックスのタイトル:メール送信
    表示するメッセージ:OK
    メッセージ ボックス アイコン:いいえ
    メッセージ ボックス ボタン:OK
    既定のボタン:最初のボタン
    メッセージ ボックスを常に手前に表示する:OFF
    メッセージ ボックスを自動的に閉じる:OFF
    【生成された変数】
    ButtonPressed
    *-*-* 以下のように表示されているとOKです! *-*-*
    *-*-*

実行

実行ボタンを押しましょう
メールが送られていることを確認ください!

おわり

以上でメールを一括送信するフローのご紹介終了となります。
ぜひ、試していただき、皆様の業務改善に繋がると嬉しいです!

『Android Java』の【ROOM】について 2/2


今回はAndroid開発にてDBを楽に扱える【ROOM】の紹介2/2です。
前回(2022/4/18) ⇒ 『Android Java』の【ROOM】について 1/2

※Android開発には『Kotlin』もあるのですが今回は『Java』を使用しています。

■リポジトリを作成する

DAOを作成すると次に、リポジトリを作成します。
リポジトリとは、複数のデータソースへのRepositoryアクセスを抽象化します。
リポジトリはアーキテクチャコンポーネントライブラリの一部ではありませんが、コードの分離とアーキテクチャのベストプラクティスとして推奨されています。Repositoryクラスは、アプリケーションの残りの部分へのデータアクセスのためのクリーンなAPIを提供します。

package ○○.model;

import android.app.Application;
import android.util.Log;

import androidx.lifecycle.LiveData;

import java.util.List;

import ○○.db.AppDatabase;
import ○○.db.user_table.User;
import ○○.db.user_table.UserDao;

public class UserRepository {
    private UserDao mUserDao;
    private LiveData<User> mLoginUser;
    private int flag = 0;
    //コンストラクタ
    public UserRepository(Application application) {
        AppDatabase db = AppDatabase.getDatabase(application);
        mUserDao = db.userDao();
    }
    //ログインしているユーザーを取得する
    public LiveData<User> getLoginUser(String name, String pass){
        mLoginUser = mUserDao.getLoginUser(name,pass);
        return mLoginUser;
    }
    //ユーザーを追加する
    public void insert(User user){
        AppDatabase.databaseWriteExecutor.execute(() -> {
            mUserDao.insertAcount(user);
        });
    }
}

■View Modelを作成する

リポジトリの次に、View Modelを作成していきます。
UIにデータを提供し、構成の変更に耐えることです。
ViewModelは、リポジトリとUIの間のコミュニケーションセンターとして機能します。ViewModelを使用して、フラグメント間でデータを共有することもできます。
ViewModelは ライフサイクルライブラリの一部です。

package ○○.viewmodel.user;

import android.app.Application;

import androidx.lifecycle.AndroidViewModel;

import ○○.db.user_table.User;
import ○○.model.Common;
import ○○.model.UserRepository;


public class UserDataViewModel extends AndroidViewModel {
    private UserRepository mRepository;

    public UserDataViewModel (Application application) {
        super(application);
        mRepository = new UserRepository(application);
    }

    //リポジトリにユーザー追加の処理を依頼する。
    public void insert(String name,String pass) {
        User user = new User(name,pass);
        mRepository.insert(user);
    }

    public void logout(Common common) {
        common.setId(0);
        common.setName(null);
    }
}

■Viewを作成する

次にViewを作成していきます!
Viewはその名の通り、フロント画面となります。
Viewは好きに自由に作ってください!

■初期データを登録する

最初のアクセスにてDBの中身を作ることもできるんです!
前回の最後に作成したRoomDatabaseに以下を追加していきます。

    private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback(){
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);

            databaseWriteExecutor.execute(() -> {
                UserDao udao = INSTANCE.userDao();

                User userInfo = new User("User","Sample");
                udao.insertAcount(userInfo);
                User userInfo = new User("GustUser","password");
                udao.insertAcount(userInfo);
                User userInfo = new User("abridge","password");
                udao.insertAcount(userInfo);
            });
        }
    };

■Activityを作成する

最後にActivityを作ります。
Activityの中で、LiveModelとの接続すれば完成です!!
(※UserのDBを作成しましたので、ログイン画面の実装をしたいと思います。)

package abridge.example.vocabularybooks.view.login;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import ○○.viewmodel.user.LoginViewModel;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {

    private LoginViewModel loginViewModel;
    private ProgressBar progressBar;
    private Common common;
    Button loginButton;
    Button gustlogin;
    EditText username;
    EditText password;
    TextView errortext;

    //Activityの作成処理
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);//親クラスの実行
        setTheme(R.style.AppTheme_NoTitleBar);//タイトルバーの非表示
        setContentView(R.layout.activity_login);//表示する画面の設定:ログイン画面
        common = (Common) this.getApplication();//APPLICATIONクラスの読み込み
        loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);//LiveDataクラスとの接続

        //UIの読み込み:ボタンやテキスト関連
        loginButton = (Button) findViewById(R.id.loginButton);
        gustlogin = (Button) findViewById(R.id.gustLogin);
        progressBar = findViewById(R.id.progressbar);
        username = (EditText) findViewById(R.id.userName);
        password = (EditText) findViewById(R.id.password);
        errortext = (TextView) findViewById(R.id.errorText);
        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);
        loginButton.setOnClickListener(this);
        gustlogin.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.loginButton://ログインボタン押下時
                String input_name = String.valueOf(username.getText());
                String input_pass = String.valueOf(password.getText());
                //DB接続時にインジケーターの表示
                progressBar.setVisibility(android.widget.ProgressBar.VISIBLE);
                if (textcheck(input_name,input_pass)) {//空欄チェックが通ると下を実施
                    // getUserFlashCard()によって返されるLiveData
                    loginViewModel.getLoginUser(input_name,input_pass).observe(this, loginUser -> {
                        if(loginUser != null){
                            common.setId(loginUser.getUser_id());
                            common.setName(loginUser.getUser_name());
                            // MainActivityに遷移させる
                            Intent intent = new Intent(getApplication(), MainActivity.class);
                            intent.putExtra("Dialogflag",1);
                            startActivity(intent);
                            finish();
                        }else{
                            errortext.setText("※ユーザ名 または パスワードが間違っています");
                        }
                        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);//インジケーターの非表示
                    });
                }
            break;
            case R.id.gustLogin://ゲストログインボタン押下時
                //DB接続時にインジケーターの表示
                progressBar.setVisibility(android.widget.ProgressBar.VISIBLE);
                //getUserFlashCard()によって返されるLiveData
                loginViewModel.getLoginUser("Sample","Sample").observe(this, loginUser -> {
                    if(loginUser != null){
                        common.setId(loginUser.getUser_id());
                        common.setName(loginUser.getUser_name());
                        // MainActivityに遷移させる
                        Intent intent = new Intent(getApplication(), MainActivity.class);
                        intent.putExtra("Dialogflag",1);
                        startActivity(intent);
                        finish();
                        progressBar.setVisibility(android.widget.ProgressBar.INVISIBLE);//インジケーターの非表示
                    }
                });
            break;
        }
    }

    public boolean textcheck(String username,String password){
        if (username.isEmpty() || password.isEmpty()) {
            errortext.setText("※ユーザ名 と パスワードは必須項目です");
            return false;
        } else {
            errortext.setText("");//エラーメッセージ欄のクリア。
            return true;
        }
    }
}

■データに接続する

アプリを起動すると、そのままDBが作られるので、ログインに成功するはずです!

以上で、『Android Java』の【ROOM】について2/2 終了となります。
ぜひ、AndroidのアプリでDBを扱う時がありましたら、【ROOM】を使用してみてください。

cssでチェックボックスとラジオボタンの装飾


よく使うので忘備録を兼ねてご紹介します。

■チェックボックス

See the Pen
checkbox
by matsu (@pochi__2828)
on CodePen.


HTML

  • ラベルをクリックした際もチェックされるように、<input>を<label>で囲む。
  • <input>の後に<span>を追加してクラス名を付与。

CSS

  • display:none;で元のチェックボックスを非表示に。
  • .check::beforeでチェックされる前の枠を装飾。
  • input[type=”checkbox”]:checked + .check::beforeでチェックされた後の枠を装飾。
  • input[type=”checkbox”]:checked + .check::afterでチェックマークを装飾。
  • マークはボーダーで生成。
  • safariは全体が下にずれるので、枠とチェックマークのtopを上方向にずらす。

■ラジオボタン

See the Pen
radio
by matsu (@pochi__2828)
on CodePen.


HTML

  • ラベルをクリックした際もチェックされるように、<input>を<label>で囲む。
  • <input>の後に<span>を追加してクラス名を付与。

CSS

  • display:none;で元のラジオボタンを非表示に。
  • .radio::beforeでチェックされる前の枠を装飾。
  • input[type=”radio”]:checked + .radio::afterでチェックマークを装飾。
  • safariは全体が下にずれるので、枠とチェックマークのtopを上方向にずらす。

新入社員座談会

 



私がエイブリッジを選んだ理由

S.S:就職活動中に求人サイトを見て、初めて「エイブリッジ」を知りました。(すみません^^)
その後、企業研究する中で、沖縄本社を置きながら、海外や県外に拠点があることや、社員に「ナナメを上を目指す」など、社員個々の挑戦を歓迎する社風に惹かれました。

I.S:進路指導の先生に就職について相談させて頂いた際に、「めっちゃ良い企業があるよ!」と薦められ、”めっちゃ”と言う言葉にそこまで推す企業ってどういう企業なのだろうと?コーポ―レートサイトを見て企業研究をしていく中で、興味を持ち、IT企業に進みたい希望があったため、応募しました。
S.Sさんと比較すると志望動機が弱くてすみません^^

U.I:中学生の頃からIT業界で働きたい思いがあり、沖縄県内のIT企業を探している際に、私もI.Sさんと同じく進路指導の先生に奨められました。もしかすると、進路指導の先生ではお薦めしたい企業沖縄No.1(笑)

S.Y:進学せずに就職をすると決め求人票を見ていると、漠然としていますが、幼少の頃から人の役に立つシステムを作りたいという願望があり、「農業 × IT」や海外など幅広く様々な挑戦をしているエイブリッジであれば、その夢を叶えられると思い応募しました。


全員が知らなかった「エイブリッジ」、知れば知るほどその魅力に惹かれたようです。


内定から入社までの気持ち

I.S:採用面接の際に、面接官の方に伝えたいことが伝えられずに、お見送りを覚悟していました(笑)どうして採用して頂いたのか聞いてみたいです^^
そのこともあり、ミスマッチが生じか無いか不安でしたね。ここだけの話、直ぐ辞めると思っていました。

S.Y:皆さん同じかと思いますが、やはり、社会人未経験及び、未知の世界であるIT業界で、これから一生続けられるか不安でした。その時に友人が気にかけてくれて、東京旅行に行きました。(周りから見ても、不安そうだったのかな)
そこで、電車内やカフェなどで技術書を読みながらプログラミング学習や資格試験の勉強をしている高校生などを見て、「不安に思うくらいなら、まずは行動しよう」と思い、それから、自身に何が足りないのかを問うて、社会人スキルについての本を買いました。

S.S:そりゃ、もう不安で不安でした。大学が文系ということもあり、IT知識ゼロで業界に入ることがとってもとっても不安でした。
また、面接から内定までTさん・Sさんのお2人しかお会いしていないため、会社で働いている方々の雰囲気が分からないため不安でした。
ただ、その不安は、入社して3日後程度して解消されました^^その当時の私に「大丈夫!心配しないで!」と言いたいですね。
とにかく親身になって私たちに寄り添って頂きました。研修スペースの隣のスペースでは、経理の皆さんが業務されていらっしゃいますが、皆さん全員でお顔合わせの練習に付き合って下さいました。
改めて、Tさん、Uさん、Oさんありがとうございます!

U.I:不安?無かったです。

S.Y:ないんか~い!

I.S:その自信はどこから。

U.I:悩んでも仕方ないことなので、根拠ないです(笑)


それぞれの不安を抱えながら入社。今現在の4人を見ているとその不安は解消されたように感じます。


エイブリッジの雰囲気

U.I:オフィスの皆さんが優しい!社会人として分からない・知らないことが多い、私たちに対して、「こんなことも分からないの?」ではなく、「なぜ、ダメなのか?」を含め、丁寧にご指摘頂きました。
そのご指摘がなかったら、恐らく、お客様の前で恥をかいたと思います。

I.S:そうですね、「なぜ、それがいけないのか?」と丁寧に指摘して頂けるので理解しやすかったです。また、顔合わせの練習を通常は1日に2時間程度ですが、6時間ほど練習にお付き合いして頂きました。

S.Y:上司のお2人(Tさん・Sさん)は厳しいですが、研修を終えて振り返ると私たちのことを思ってのこと分かり、とても感謝しています。もし、エイブリッジにご入社頂いた際には、真摯に受け止めて改善して欲しいなと思います。
(補足です、お2人は業務終了すると気さくな方なのでご心配には及びません。)

I.S:しっかりフォロー(笑)初めの1ヶ月は怖かったー。

S.S:皆さんと同じで、言葉が正しいのか分かりませんが、ファミリーのように「時に厳しく、時に優しく」でした。


エイブリッジは社員をファミリーとして考えているようですね。初耳です。


就活生の皆さんへ伝えたい

S.S:就職活動は様々な企業を見ることが貴重な機会です。その機会を利用して、企業研究は必ずしてください。その際にご自身がその企業でやりたいこと、成し遂げたいことを見つけて満足の行く将来設計ができるよう頑張ってほしいです。エイブリッジは挑戦し続ける皆さんをサポートします!

S.Y:企業を探すうえで、まずは好きなことを中心に探すことも良いかと思います。会社に入るとやりたくない仕事もやらなければならないケースが出てきます。好きなことであれば、何とか続けることができると私は思っています。

U.I:恥じることを恐れずに、とりあえず挑戦してほしいです。やってしまえば、大したことないことが殆どです。会社訪問などやオンラインインターンシップをエイブリッジは随時開催しておりますので、是非、ご参加頂きたいです。

I.S:私もそうでしたが、なんとなくIT業界で働きたいなど、まだ明確になっていない方もいらっしゃと思います。怒られるかもしれませんが、仕事をしながらどのような人生を送りたいのかで選ぶという方法もあります。エイブリッジに入社して行く行くは起業したいなど、エイブリッジはご自身のステップアップも大歓迎です。

全員:大変ですが、楽しみ・悩みながら悔いのないよう、頑張ってください!

知っていないともったいない!Power Automate Desktopとは?

Windows11から標準搭載されている「Power Automate Desktop」は、これから業務においてドンドン活用されると予測される、便利な無償自動化ツールです。

今回は、その活用方法をご紹介いたします。

Power Automateとは?

Power Automateは、RPA(Robotic Process Automation)と呼ばれる自動化処理サービスです。

RPAのメリットは主に2つが挙げられます。

  1. 人件費の削減
    従来、人が行っていた作業をコンピューター(ロボット)が自動で実行してくれます。例えば、複数人で行っていた作業を1人で対応することが可能となり、その分の人件費を削減することができます。
  2. ミスを防止できる
    コンピューター(ロボット)が決められた処理に処理に従って作業を実行するため、ヒューマンエラーを防ぐことができます。手動で業務を行うと、抜け漏れのミスが発生しやすくなります。また、ダブルチェックなども不要となるため、業務における無駄を解消するきっかけになるかもしれません。

RPAのデメリットは、自動で実行してくれるため、RPAのコンピューター(ロボット)に指示した内容に誤りがあった場合、途中で止まることなく作業を実行し続けてしまいます。そのため、必ず検証を行い問題がないか確認したり、定期的なメンテナンスで改善をすることが重要です。

Power Automate Desktopとは?

Power Automate Desktopは、Power Automateの中のデスクトップのサービスです。2021年3月にMicrosoft社よりWindows10であれば無償提供することが発表されて以降、一気に注目を集めています。

Power Automate Desktopでできること

Power Automate Desktopでできることは、次のようなものが自動化できます。

  1. 顧客リストから請求書作成
  2. 毎月リマインドメールを一斉送信
  3. 経費精算における入力順作業
  4. OCR(画像から文字列抽出)

弊社活用事例

弊社ではこれまで100人以上を超えるスタッフに給与明細を手作業によるメールで送信していました・・・。(3人5時間)

そこで、Power Automate Desktopを活用することで、1時間でメール送信することで、大幅な作業削減となりました。

Power Automate Desktopは難しい?

他のRPAツールにも同様のことが言えますが、プログラムコードの専門知識は一切不要です。視覚的・直感的にプログラムを作成することができるため、非常に簡単です。

実際の画面を見てみましょう。

例えば、Excelを起動させたい場合、アクション(操作)から「Excel」と検索して、「Excelの起動」をドラッグアンドドロップするのみです。

※動画

また、ブラウザ(例えばChrome)の立ち上げも同様に「新しいChromeを起動する」のアクションを追加することで設定が可能です。

Power Automate Desktopのインストール方法

Microsoftのページを参考にしてください。

まとめ

今回、ご紹介したメール送信以外にも様々なアクションが約340種類以上搭載されており、細かい指示を積み重ねて、処理を作成していきますが、必要なアクションを追加していくのみで、専門的な知識がほとんどありません。

是非、業務改善の1つツールとして利用してはいかがでしょうか。

★沖縄にてお仕事説明会開催中★

お仕事お探しの方 説明会を開催しております 

【日時】

平日 午前10時~11時/午後3時~4時 

20~30代で業界への希望されている方

お問い合わせお待ちしております。
https://abridge-co.jp/contact.html

『Android Java』の【ROOM】について 1/2


今回はAndroid開発にてDBを楽に扱える【ROOM】を紹介したいと思います。
長くなりますので、2回に分けて紹介していきます。2/2は6月27日に更新予定です。
※Android開発には『Kotlin』もあるのですが今回は『Java』を使用します!

Roomとは

Room(ルーム)とはDBの一つであるSQLiteを簡単に扱える便利なライブラリです。
以下、公式サイトから抜粋。
https://developer.android.com/jetpack/androidx/releases/room?hl=ja

Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのより安定したアクセスを可能にし、SQLite を最大限に活用できるようにします。

全体像

最初にRoomがあるプロジェクトの全体像を記載します!(※一部抜粋)
App
┣manifests
┗java
┗{好みのパッケージ名}
   ┣db
     ┣Entityファイル
     ┣DAOファイル
     ┗Databaseファイル
   ┣model
     ┗Repositoryファイル
   ┣view
     ┗ActivityやFragment
   ┣viewmodel
     ┗ViewHolderやViewModel

Roomを使う下準備

最初に準備をします。コンポーネントライブラリをGradleファイルに追加する。
\{project rootフォルダ}\app\build.gradle に以下を追加

dependencies {
def room_ersion
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
androidTestImplementation "androidx.room:room-testing:$room_Version"
}

■Entityを作成する

https://developer.android.com/reference/androidx/room/Entity

準備が終わると、まずはエンティティを作成します。
任意の場所でファイルを作る (例:今回はjava\○○\db\User.java)
ファイルを作成すると中身を書いていきます。

package ○○.db;

import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;

@Entity(tableName="users")
public class User {
@PrimaryKey(autoGenerate = true)
@NonNull
@ColumnInfo(name = "user_id")
private int user_id;

@ColumnInfo(name = "user_name")
private String user_name;

@ColumnInfo(name = "user_pass")
private String user_pass;

public User(String user_name, String user_pass) {
this.user_name = user_name;
this.user_pass =user_pass;
}

public int getUser_id() { return user_id; }
public void setUser_id(int user_id){this.user_id = user_id;}

public String getUser_name() { return user_name; }
public void setUser_name(String name){this.user_name = name;}

public String getUser_pass() {
return user_pass;
}
public void setUser_pass(String pass){this.user_pass = pass;}
}

ここでの@(注釈)を説明していきます。
@Entity(tableName =”users”)にてテーブル名を定義しています。
@PrimaryKey にて主キーとして指定します。※(autogenerate = true にて値を自動追加)
@NonNull にてパラメータ、フィールド、メソッドの戻り値のnull禁止を指定します
@ColumnInfo(name = “user_id”) テーブルの列の名前を指定します。

■DAOを作成する

https://developer.android.com/training/data-storage/room/accessing-data

エンティティの次に、DAOを作成します。
任意の場所でファイルを作る(例):今回はjava\○○\db\UserDAO.java
ファイルを作成すると中身を書いていきます。

package ○○.db.;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;

@Dao
public interface UserDao {

@Query("SELECT * FROM users WHERE user_name IN (:name) AND user_pass IN(:pass)")
LiveData getLoginUser(String name, String pass);

@Query("SELECT user_id FROM users WHERE user_name IN (:name)")
int getUserId(String name);

@Insert(onConflict = OnConflictStrategy.IGNORE)
void insertAcount(User user);
}

@Dao にてこのインターフェイスをRoomのDAOとして定義します。
@Query にて()内のSQL文を実行できます。
@Insert 引数の値をInsert文にして実行します。
@Delete引数の値をDelete文にして実行します。
@Update引数の値をUpdate文にして実行します。
LiveData ・・・ライブデータは次項にて説明します。

■LiveDataクラス

https://developer.android.com/topic/libraries/architecture/livedata?hl=ja

LiveDataはRoomとは別の機能ですが、とても相性がいい機能なんです!
使用するついでに紹介していきたいと思います。

LiveDataとは・・・JetPackのコンポーネントの一つで、ViewModelクラス内のデータの情報をアクティビティやフラグメントが監視して、更新があるとViewの変更ができます。
ざっくり説明すると、LiveDataを通すことで、DBに更新があるとすぐ、自動的にViewに反映できるんです!!!
※ViewModelにてLiveDataの実際の使い方を紹介します。

■RoomDatabaseを作成する

https://developer.android.com/reference/android/arch/persistence/room/RoomDatabase

次にRoomDatabaseを作成します。

package ○○.db.;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;
import ○○.db.user_table.UserDao;

@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

public abstract UserDao userDao();
private static volatile AppDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);

static WordRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "app_db")
.build();
}
}
}
return INSTANCE;
}
}

@Database 注釈を付け、注釈パラメーターを使用して、データベースに属するエンティティを宣言し、バージョン番号を設定します。
getDatabase  シングルトンを返します。Roomのデータベースビルダーを使用して 、クラスRoomDatabaseからアプリケーションコンテキストにオブジェクトを作成し、名前を付けて、最初にアクセスしたときにデータベースを作成します。(AppDatabase”app_db”)

・・・今回はここで終了です!続きの 『Android Java』の【ROOM】について2/2 は6月27日に更新予定です。

次回の内容☟
■リポジトリを作成する
■ViewModelを作成する
■Viewを作成する
■初期データを入力する
■Activityを作成する
■データに接続する

画像フォーマットWebPについて

■WebPとは

WebP (ウェッピー)とは、GoogleがWebサイトの表示速度短縮を目的として開発した画像フォーマットです。
圧縮率が高いためページの読み込み速度が向上し、SEO的な効果も期待できます。

2010年9月に提供が開始されましたが、当時は対応するブラウザが少なく、Photoshop等のソフトウェアがwebp形式に対応していなかったため、普及していませんでした。
2022年現在は主要ブラウザに対応し、Photoshop23.2以降でwebp形式が扱えるようになったため、今後は普及が進むと思われます。

https://caniuse.com/?search=WebP

■WebPの特徴

WebPと他の画像形式を比較表にしました。
JPEGより高い圧縮率で、JPEG・PNG・GIFでできる事を網羅しているフォーマットということがわかります。

画像形式 WebP JPEG PNG GIF
圧縮方式 非可逆圧縮
可逆圧縮
非可逆圧縮 可逆圧縮 可逆圧縮
1670万色以上 1670万色以上 256~
1670万色以上
256色
透過 ×
アニメーション × ×

■WebPの圧縮率

WebPはJPEGに比べて、25~30%くらい容量が軽いと言われています。

①JPEG 822kB

②WebP 18.3kB

上の画像は①のJPEGからPhotoshopで②のWebPに変換したものです。
変換時の設定は以下の通りです。

 

 

 

 

 

 

画質0にも関わらず、拡大しても劣化がわからないですね。
←JPEG WebP→

■WebPのメリット

JPEG・PNG・GIFでできる事を網羅しているため、写真ならJPEG、アニメーションならGIFなど、形式をそれぞれに書き出す必要がありません。
画質を下げることなく軽量化できるため、webサイトの表示速度の改善が期待でき、SEO対策のひとつとして有用です。

■WebPのデメリット

デメリットは扱えるソフトウェアが非常に限られていることです。
現在はPhotoshop23.2以降、GIMP2.10.0以降で編集することができます。
そのため、Googleから変換サイトが提供されています。
https://squoosh.app/

まとめ

WebPは画質を保ったまま軽量化することが可能で、サイトの表示速度を上げたり、SEO対策にも効果的です。
昔と比べて、主要なブラウザも対応しているので、利用してみてはいかがでしょうか。

メールアドレスに⽇本語が使える(Laravel)

laravel

WEBシステム開発でメールアドレスの⼊⼒を求めるケースは多々あるが、テストで異常値の確認を⾏っている際、ふとメールアドレス欄に⽇本語を⼊⼒すると通ってしまう事象が発⽣。
調べてみると約10年前から⽇本語(厳密にはUTF-8)が使えるようになっていた模様。

RFCについて

Request For Comments の略で、インターネット技術の標準化を⾏うIETFが発⾏しており、インターネット関連の技術に関する仕様がまとめられている。

メールアドレスの⽇本語(UTF-8)対応

■ローカル部

RFC 6531(2012年)

■ドメイン部

RFC 6531(2012年)RFC 6532(2012年)

Laravelでのメールアドレスバリデーション

Laravelでは標準でメールアドレス⽤のバリデーションが⽤意されています。

rfc: RFCValidation
strict: NoRFCWarningsValidation
dns: DNSCheckValidation
spoof: SpoofCheckValidation
filter: FilterEmailValidation

 
以下のように組み合わせることで必要なバリデーションをかけることが可能。

'email' => 'email:rfc,dns'

https://readouble.com/laravel/8.x/ja/validation.html

ソーシャル型VRアプリ・プラットフォームについて


今回の記事では、VRの中でもソーシャル型VRアプリ・プラットフォームについて紹介させていただきます。

SNSはみなさま使われている方も多いと思いますが、今から紹介いただくアプリに関しては、まさしくVRの中でSNSのような繋がりを持つ事ができます。
分かりやすく例えると、「ゲーム + SNS + VR」みたいな形です。

以下は、その中でもメジャーなアプリになります。

■VRChat

■Cluster

■Horizon

上記、3つのアプリの共通の特徴としてはVRの世界上で交流を行うことができます。
また、VRの世界上のコンテンツ(アバター・オブジェクト・ワールド)に対してユーザーからも変更を行う事ができます。

また、私の方でVRChatを半年ほど使ってみた感想を以下に述べさせていただきます。

私はオーキュラスクエストでプレイしました。
VRChatの世界の始まりは、部屋から始まります。
文字通りプレイすると、色々なギミックが配置された部屋にいる状態です。
そこから、鏡をみて自分のアバターの容姿を変更したり、ワープ用のギミックから別の空間に移動したりすることができます。
当初は全く何をすればいいか?どこに行けばいいか?などが分からずひたすらワールドを彷徨ってました。
正直この時は、全く楽しくないと思いつつひたすらワールドを練り歩きました。
 
ネットで情報を探すと、どうやら日本人の方が多いワールドがありそこから直接話しかけてコミュニティ(フレンド)を増やしていくと楽しめるとわかりました。
そこから日本人の方に文字通り話しかけ続けました。チャットではなく本当にアバターにボイスチャットで唐突に話かけます。
話しかけた方がVRChat上級者の方の場合は、初心者の私にとても親切にVRChatについて教えていただきました。
 
コミュニケーションを取れるようになり徐々にVRChatが楽しくなっていきました。
VRChatのメインコンテンツは、コミュニケーションだと感じました。
それ以外の要素に関してはあくまでこのコミュニケーションを発展させるための要素でしかないので、コミュニケーションなしでひたすら歩き続けても楽しくないのは当然でした。

 
今回VRChatでは新しいSNSに触れた時に感動した体験を思い出しました。
私でいうと、「初めてインターネットの掲示板で他のユーザーと交流した」時と「Facebookに登録した時に世界中のユーザーと繋がった」時です。

今後VRChatのようなVRによるコミュニティが主流になるかは分かりませんが、物事の仮想体験という場としては絶対的なものになると思いました。