カテゴリー
aws C#

C# で簡単に AWS S3 にファイルをアップロードするソースコード

C# でAmazon AWS S3 に ファイルをアップロードする方法はいろいろありますが、シンプルに簡単にファイルをアップロードするソースコードを紹介します。

using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Transfer;
using System;

namespace autocbk
{
    class FAmazonS3
    {
        private static readonly Amazon.RegionEndpoint bucketRegionEndPoint = Amazon.RegionEndpoint.APNortheast1;
        private static IAmazonS3 s3Client;

        public static int UploadFile(string bucketName, string filePath)
        {
            try
            {
                s3Client = new AmazonS3Client(bucketRegionEndPoint);

                TransferUtility fileTransferUtility = new TransferUtility(s3Client);
                fileTransferUtility.Upload(filePath, bucketName);

                return 0;
            }
            catch(Exception e)
            {
                return 9;
            }
        }

    }
}

必要なNuGetパッケージ

AWSSDK.S3 が必要です。これをインストールすると、AWSSDK.Core が自動的についてきます。

aws s3 nuget package

ソースコード説明

  1. リージョンエンドポイントの指定
private static readonly Amazon.RegionEndpoint bucketRegionEndPoint = Amazon.RegionEndpoint.APNortheast1;

このコードで、リージョンを「APNothEast1」に指定します。

2. アップロード関数の定義

public static int UploadFile(string bucketName, string filePath)

この関数は、 bucketName と filePath を引数に持ち、int型でリターンコードを返却します。

3. S3にファイルをアップロード

fileTransferUtility.Upload(filePath, bucketName);

TransferUtility オブジェクトのUpload 関数でアップロードを行います。TransferUtility クラスの公式ドキュメントは以下にあります。

https://docs.aws.amazon.com/sdkfornet/latest/apidocs/items/TS3TransferTransferUtilityNET45.html

カテゴリー
RPA

RPAを導入する意味ってなに?RPAを導入するメリットを考えてみた

この数年でRPAに関するニュースが増えてきました。RPAを導入することで年間で数千時間の労働時間を削減したとか、数千社への導入実績をもつRPA製品のニュースなど、話題に事欠かないプロダクトです。

この記事では、RPAを導入する意味について書いてみました。

人が行う作業時間を削減できる。作業ムラがなくなり、スピードが早くなる

RPAは人間が行う作業を代わりに実施するロボットのことです。今まで人の手作業で行っていたデータ入力やメール送信、ドキュメント作成を、ロボットに作業させるのがRPAです。RPAが活躍してくれると、その分だけ人間が行う作業が少なくなっていきますので、人が行う作業時間が短縮されます。

RPAを導入する意味の1つ目は、人の作業時間を減らすことです。人ではなくロボット(ソフトウェア)が作業してアウトプットしますので、作業ムラがなくなります。担当者が休みでも問題なく仕事してくれるようになります。また、人の手でやるよりもロボット(ソフトウェア)が作業するほうがスピードが早いです。

労働力不足の問題を解決する

これからの日本は人口が減少します。15歳~64歳の人口は、2030年で6,875万人になり2065年には4,529万人にまで減少すると予測されています。

https://www.mhlw.go.jp/file/05-Shingikai-11601000-Shokugyouanteikyoku-Soumuka/0000062121_1.pdf

2065年というと今から約45年後(2019年時点)ですので、2019年に生まれた子なら45歳になっています。順調にいけば課長クラスになる年代でしょうか。 この年代では労働人口が2,000万人も減少しますので、人手が足らなくなるのは確実です。

そのためにも、人間ではなくロボット(ソフトウェア)にやってもらう仕事を今のうちに増やしておく必要があります。私たちの年代で作業の自動化を推進してノウハウをしっかり貯めておき、少ない人数でほかの国々との競争力を高める努力をしないといけません。

自由で余裕をもった働き方を実現できる

人間が行わないといけない作業がなくなりますので、自由な時間が増えていきます。そうすると、勤務時間が今より自由になるかもしれません。例えば、8:30~17:30までの8時間勤務だったのが、10:30~15:30など、勤務時間そのものが減ることが考えられます。

実際、週休3日制に移行した企業もあれば、オフィスをなくして全従業員が在宅で仕事をしている企業もあります。これからは、人間の作業時間がますます減っていく時代に突入するのです。

そうすると、余った時間は自由に使うことができます。旅行に行ったりスポーツしたり。自由で余裕をもった働き方を実現できるようになります。

ロボット(ソフトウェア)を手早く簡単に実現できる

これらの自動化は、ロボットソフトウェアがあれば実現できますので、極論を言えばRPAがなくても実現可能です。Excelなどのマイクロソフトオフィス製品の自動化であればVBAがありますし、EdgeやChromeの自動化はSeleniumやウェブスクレイピングなど、既に確立した手法でプログラミングを行えば誰でもソフトウェアを開発できます。

ただし、コーディングするということはそれなりに時間がかかります。例えば、導入までの作業工程が以下のとおりだったとします。

  1. 要件定義
  2. 基本設計/詳細設計
  3. ロボット作成/コーディング
  4. テスト
  5. 運用トライアル
  6. 業務適用

この場合、「1」「2」「5」「6」の部分はRPAでもプログラミングでも同じく必要な作業だと考えられますが、「3」「4」はコーディングするよりもドラッグ&ドロップで簡単に構築できるほうがスピーディです。既に実装済みの機能をマウスだけでつなげて構築するほうが、単体テストも不要ですぐにロボットソフトウェアを構築できます。

RPA製品は安いもので年間100万円のコストがかかります。これが高いか安いかは、導入によってどれだけ効果が出るか予測すれば自ずと答えが出ると思います。このコストを導入効果でペイでき、かつ、業務にフィットしたRPA製品が見つかれば、導入する意味は十分にある製品です。

カテゴリー
ライフ

やる気が出ないときは、とりあえず5分だけやってみる

勉強とか仕事とか、やる気が出ないことがたくさんあります。

そんなやる気が出ないときの対処方法は、とりあえず5分だけやってみることが重要です。

5分だけやってみるとやる気が自然に出てくる

部屋の掃除したくないけど、始めてみると色んなところが気になって気付いたら30分も続けていたって経験はありませんか?

作業を始めると気分がのってくることがありますが、心理学的にも認められています。心理学者のクレペリンは、これを「作業興奮」と呼びました。

https://ja.m.wikipedia.org/wiki/エミール・クレペリン

いわゆる「やる気スイッチ」というやつですね。

アセチルコリンが分泌されると気分がのってくる

引用元: https://commons.wikimedia.org/wiki/File:Acetylcholine-cation-3D-spacefill.png

アセチルコリンは、副交感神経の興奮、交感神経の抑制、運動神経の伝達物質としての役割を持っています。交感神経がアクセルとすれば、副交感神経はブレーキです。アドレナリンが分泌されて興奮した交感神経を、アセチルコリンでブレーキをかけるイメージです。

アセチルコリンをコントロールできると、「仕事がはかどる」「ひらめきを得る」といったメリットが得られます。

ブログを書くやる気が出ないときは、タイトルだけ書いてみる

ブログを書くことは、自分の知識の整理だったり、副収入を得るきっかけになったり、様々なメリットがあります。しかし、いざ書くとなると、どんな構成にしようか悩んだり、既にいろんなブログで書かれている内容だったり、やる気が無くなる要素がたくさんあります。

そういう時は、まずはブログのタイトルだけ書いてみましょう。タイトルを書くと、概要をイメージすることができます。

タイトルが書けたら、次は目次や見出しを書いてみましょう。これが書けると構成明確になりますので、あとは見出しに沿って文章や画像で肉付けしていくだけです。

プログラミングのやる気が出ないときは、一行だけ書いてみる

個人開発でプログラミングしている人は少なくないと思います。私もその一人で、ペットの画像を投稿するSNSを作ろうと画策しています。しかし、書き方がわからなくて調べるのが面倒だったり、気分がのらない日があったりして、毎日やる気マックスで取り組めているわけではありません。

そんなときは、一行だけ書いてみるようにしています。一行だけ書いたら、次は書いた行をテストしてみましょう。テストが通ればこれを繰り返して、1機能を完成させてみましょう。そうすれば、その日の進捗としては十分なものになっていると思います。

一日の達成率を80%程度に抑えておく

120%の達成率までやってしまうと、明日何しようか分からなくなってしまい、明日の To Do を考える必要が出てきます。明日の宿題を明確にしておくことで、次のステップにすぐに着手することができます。

カテゴリー
ライフ

幸せになる方法を脳から考えてみる

ここ最近、「脳を最適化すれば能力は2倍になる」という本を読んでいますが、この中で幸せになる方法のヒントが少し書かれていましたので、紹介します。

ここで言う幸せになる方法とは

幸せになる方法とは、お金持ちになったり社長になったり、ということではなく、脳のドーパミンを分泌させることで幸せになる、ということになります。

幸せになる方法=ドーパミンを出す方法

ドーパミンはモチベーションの源です。一言でいうと幸福物質であり、幸福や快感といった感情に影響します。そのため、ドーパミンが分泌される=幸せだと感じる ということが成り立つそうです。

ドーパミンを分泌する方法としては、以下があります。

①明確な目標を設定する

②目標を達成した自分をイメージする

③目標を繰り返し確認する

④楽しみながら実行する

⑤目標達成したら、自分にご褒美を与える

⑥すぐに新しい高い目標を設定する

⑦目標達成のプロセスを繰り返す

適度な難易度の目標が一番モチベーションが上がります。簡単すぎると張り合いがありませんし、難しすぎるとかえってやる気がでません。

またドーパミンは工夫と変化を好みます。ちょっと難しい課題に対して自分なりに試行錯誤している時間はドーパミンがたくさん分泌されます。

リフレーミングで物事の枠組みを切り替える

リフレーミングとは、ネガティブなことをポジティブに考えたり、ピンチだと思ってしまうことをチャンスだと思えるように表現を切り替えることをいいます。

具体的には、

①あと15分しかない → あと15分もある!

②自分の不得意なことをしないといけない → 不得意を克服するチャンスだ!

③仕事の内容が自分に合っていない → 新しいジャンルへの挑戦だ!

リフレーミングが心理学的な手法です。習慣的にリフレーミングができるようになるには、日頃から練習が必要になりますので、ネガティブな考えが浮かんだらすぐにポジティブな表現に置き換えるような努力をしてみましょう。

 

ドーパミンはマンネリを嫌い、工夫と変化を好む

同じ仕事でも、いつもと違った手法でやったり、いつもとは違うアプローチで検証してみたりするとドーパミンが分泌されます。ドーパミンは工夫が大好きです。部下に仕事をお願いするときも、「自分なりにアレンジしてやってみて」と一言加えるとやる気が出て仕事をこなしてくれるかもしれません。

運動でもドーパミンは出る

トレーニングの後の脳は疲れて切っている疲れてきっていると思われるかもしれませんが、実際にはその逆で、非常にスッキリしているのです。少々ハードなトレーニングをすれば、集中力や想像力を高めるあせちるこりアセチルコリン、セロトニンも分泌されます。やる気が出ない、モチベーションが上がらないという人は運動不足の可能性も考えられます。

努力して成長を感じているときが一番幸せ

幸せは、努力の先にあるものではありません。日々の努力の中で自己成長を感じるときが一番幸せなのです。毎日のしごとの中で、自分がワクワクする瞬間にフォーカスをあて、目標を設定し、自己成長の階段を駆け上がっていきましょう。

カテゴリー
インフラ 仕事効率化

ウェブサービス個人開発の初期にレンタルサーバーとPHPを選択する理由

個人開発の中でも、ウェブサービスを開発するという前提になりますが。開発初期段階では、レンタルサーバーとPHPという選択肢はかなり有効だと考えています。

この記事では、なぜレンタルサーバーとPHPの組み合わせが有効なのか、及び、おすすめのレンタルサーバーを紹介します。

1. ランニングコストが安い

なんと言っても、レンタルサーバーはランニングコストが安いですね。クラウドで仮想サーバーを構築した場合、1ヵ月あたり1,000円から場合によっては10,000円を超えることもあります。

一方で、レンタルサーバーは1ヵ月130円から1,500円など、とても安く済みます。MySQLなどのデータベースも使用できますので、一般的な開発に十分使えるサービスになっています。

2. PHPの開発効率は高い

PHPは厳格な型定義がなく、比較的簡単なプログラム言語です。htmlと同じファイルの中にPHPスクリプトを直接書き込むことができ、簡単にサーバーサイドの処理を実装することができます。

また、PHPは情報量が多いので、インターネットで検索すればすぐに情報を得ることができます。CMSシステムとして良く知られているWordpressなど、PHPが使われているウェブシステムは数多くありますので、実績も情報も十分です。

PHPファイルをウェブサーバーに配置するだけで実行できますので、テストや環境構築も簡単です。

3. 開発初期は、早く稼働させて自分のアイデアが正しいのか検証するべき

自分の中で良いアイデアが浮かんだとしても、それが世間に受け入れられるかは分かりません。世間に受け入れてもらえるかどうかは、動くものを作って公開することが重要です。スライド資料や画像による説明ではなく、プロトタイプのウェブサービスを構築して一般公開して、意見をもらうことが重要です。

そのためにも、素早くウェブサービスを構築できるインフラとプログラム言語を持っていることが非常に重要になります。PHPとレンタルサーバーの組み合わせだと、PHPファイルをコーディングしてサーバーに配置するだけですぐに実行することができます。

PHPを使って開発されたウェブサービス

有名どころでは、Facebookの初期の頃にPHPを使用していました。これ以外にもブログシステムとして利用されているWordpressでも使われています。また、動画学習サイトのSchoo、クラウドファンディングのCAMPFIREでもPHPが使われています。

4.おすすめなレンタルサーバー

  • さくらインターネットのレンタルサーバー

さくらインターネットのレンタルサーバーはかれこれ3年以上使用しています。

https://www.sakura.ne.jp/?_ga=2.37923171.1101151846.1565477533-1651816086.1560945349

44万件がさくらインターネットのレンタルサーバーを利用しています。プランは6種類あり、最安値で月額129円(年間1,543円)

から利用可能です。SSHやMySQLを利用するには、スタンダード(月額515円)以上が必要です。

各プランの比較は以下のページにあります。

https://www.sakura.ne.jp/plans.html

カテゴリー
C#

[C#]ODBC 接続したテーブルのレコード件数を取得する

ODBC で接続したデータベースのテーブルに対して、レコード件数を取得するメソッドを照会します。
このメソッドは、Where文の指定も可能です。

App.config に ODBC 接続文字列を設定する

<configuration>

  <connectionStrings>
    <add name="...DB名..."
         connectionString="...ODBC 接続文字列..."/>
  </connectionStrings>

</configuration>

<connectionStrings> で接続文字列を定義します。

<add> タグ の name でDB名を定義し、 connectionString で接続文字列を定義します。

C# GetODBCRecordCount メソッド

/// <summary>
/// ODBC経由でテーブルレコード件数を取得する
/// </summary>
/// <param name="DBName">ODBC接続文字列DB名称</param>
/// <param name="SqlFrom">テーブル名</param>
/// <param name="SqlWhere">Where文</param>
/// <returns>テーブルレコード件数(異常時:0)</returns>
public static int GetODBCRecordCount(string DBName, string SqlFrom, string SqlWhere)
{

    int recordCount = 0;

    try
    {

        //App.config のconnectionStrings から接続文字列を取得する
        string cnstr = ConfigurationManager.ConnectionStrings[DBName].ConnectionString;

        //ODBCConnection オブジェクトを生成して、オープンする
        OdbcConnection cn = new OdbcConnection(cnstr);
        cn.Open();

        //レコード件数カウントSQLを組み立てる
        string sqlstr = "";
        sqlstr = sqlstr + "SELECT  COUNT(*)  AS  CNT  FROM  " + SqlFrom;

        //引数に Where が設定されていれば、Where文を付与する
        if (SqlWhere != "")
        {
            sqlstr = sqlstr + "  WHERE  " + SqlWhere;
        }

        // ODBCコマンドをセットする
        OdbcCommand oc = new OdbcCommand(sqlstr, cn);

        // ODBCクエリを実行する
        OdbcDataReader odr = oc.ExecuteReader();

        // レコードが読込める間ループする
        while (odr.Read() == true)
        {
            //レコード件数を取得し、Int32型に変換する
            recordCount = Convert.ToInt32(odr["CNT"]);
        }

        //クローズする
        odr.Close();
        cn.Close();

    }
    catch(Exception ex)
    {
        throw;
    }

    return recordCount;
}

引数

  • 引数に DBNmae, SqlFrom, SqlWhere を指定します。

  • DBName は、さきほど App.config に指定した接続文字列の DBName を指定します。

  • SqlFrom にテーブル名を指定します。 SQLのFROM文に相当します。

  • SqlWhere にWhere条件を指定します。SQLのWhere文に相当します。

件数カウントSQLの組み立て

このメソッドでは、以下のSQL文を組み立てます。

SELECT  COUNT(*)  AS  CNT  FROM  <SqlFrom:テーブル名>  WHERE  <SqlWhere:Where文>

接続文字列の取得

string cnstr = ConfigurationManager.ConnectionStrings[DBName].ConnectionString;

ConfigurationManager クラスを用いて、App.config に記入した接続文字列を取得します。

DB接続オープン

cn.Open();

OdbcCommand.Connection メソッドで接続をオープンします。

SQL文のセットと実行

// ODBCコマンドをセットする
OdbcCommand oc = new OdbcCommand(sqlstr, cn);

// ODBCクエリを実行する
OdbcDataReader odr = oc.ExecuteReader();

OdbcCommand に SQL文と接続情報(OdbcConnection)を指定します。

クエリの実行は、OdbcCOmmand.ExecuteReader()メソッドを使用し、OdbcDataReaderクラスにセットします。

レコードを取得する

// レコードが読込める間ループする
while (odr.Read() == true)
{
    //レコード件数を取得し、Int32型に変換する
    recordCount = Convert.ToInt32(odr["CNT"]);
}

レコード件数が終端に達するまでループします。

取得したレコードから レコード件数 CNT の値を取得します。この項目は Double型ですので、Int32型に変換します。

クローズ処理

odr.Close();
cn.Close();

OdbcDataReaderOdbcConnection をクローズします。

レコード件数の返却

return recordCount;

最後に、レコード件数を返却して終了します。

カテゴリー
C#

[C#]ODBCでデータベースに接続してテーブルを更新する

ODBCで接続したデータベースに対して、INSERT・UPDATE・DELETEなど、テーブルを更新する方法を紹介します。

App.config に ODBC 接続文字列を設定する

<configuration>

  <connectionStrings>
    <add name="...DB名..."
         connectionString="...ODBC 接続文字列..."/>
  </connectionStrings>

</configuration>

<connectionStrings> で接続文字列を定義します。

<add> タグ の name でDB名を定義し、 connectionString で接続文字列を定義します。

C# UpdateODBCDatabase メソッド

/// <summary>
/// ODBCデータベースのレコードを更新します。
/// </summary>
/// <param name="DBName">ODBC接続文字列DB名称</param>
/// <param name="sqlList">SQL文リスト(INSERT/UPDATE/DELETE)</param>
/// <returns>リターンコード(0:正常、9:異常)</returns>
public static int UpdateODBCDatabase(string DBName, List<string> sqlList)
{
    //App.config のconnectionStrings から接続文字列を取得する
    string cnstr = ConfigurationManager.ConnectionStrings[DBName].ConnectionString;

    // OdbcConnection クラスを使用
    using (OdbcConnection cn = new OdbcConnection(cnstr))
    {
        OdbcCommand command = new OdbcCommand();
        OdbcTransaction trans = null;

        command.Connection = cn;

        try
        {
            //DB接続オープン
            cn.Open();

            //トランザクションを開始
            trans = cn.BeginTransaction();

            //接続とトランザクション情報をセット
            command.Connection = cn;
            command.Transaction = trans;

            //List<String>型に格納しているSQLを foreach でループ
            sqlList.ForEach(delegate(String sqlstr)
            {
                //SQLを設定し、クエリを実行
                command.CommandText = sqlstr;
                command.ExecuteNonQuery();
            });

            //トランザクションをコミット
            trans.Commit();

        }
        catch(Exception ex)
        {
            //エラーが発生した場合はロールバック
            trans.Rollback();
            return 9;
        }

    }

    return 0;

}

引数

  • 引数に DBNamesqlList を指定します。

  • DBName は、さきほど App.config に指定した接続文字列の DBName を指定します。

  • sqlList は、List<string>型の変数で、INSERT文やUPDATE文などのSQLを指定します。

接続文字列の取得

string cnstr = ConfigurationManager.ConnectionStrings[DBName].ConnectionString;

ConfigurationManager クラスを用いて、App.config に記入した接続文字列を取得します。

DB接続オープン

cn.Open();

OdbcCommand.Connection メソッドで接続をオープンします。

トランザクションを開始

trans = cn.BeginTransaction();

OdbcCommand.Connection.BeginTransaction() メソッドで、トランザクションを開始します。

SQL を実行

//List<String>型に格納しているSQLを foreach でループ
sqlList.ForEach(delegate(String sqlstr)
{
    //SQLを設定し、クエリを実行
    command.CommandText = sqlstr;
    command.ExecuteNonQuery();
});

List<string> 型の変数 sqlListForEachメソッドで1行ずつ取得します。

その後、OdbcCommand.CommandText にSQL文をセットします。

OdbcCommand.ExecuteNonQuery メソッドでSQL文を実行します。

トランザクションをコミット

trans.Commit();

OdbcTransaction.Commit() メソッドでコミットを実行します。

カテゴリー
JavaScript

[NodeJS] 警告の発生場所が特定できない場合は、trace-warnings で実行しよう

TypeScript で TCP サーバーを構築していたのですが、MaxListenersExceededWarning のワーニングが
発生しており、原因が分からずにいました。

(node:1396) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGHUP listeners added. Use emitter.setMaxListeners() to increase limit

発生場所を特定する方法の1つに、--trace-warning オプションをつけて実行する方法があります。

d:\work\@node\tcpserver>node --trace-warnings build\PastDataDelete.js
(node:13644) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGHUP listeners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:243:17)
    at process.addListener (events.js:259:10)
    at fileAppender (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\file.js:77:11)
    at Object.configure (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\file.js:88:10)
    at clustering.onlyOnMaster (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\index.js:59:27)
    at Object.onlyOnMaster (d:\work\@node\tcpserver\node_modules\log4js\lib\clustering.js:74:50)
    at createAppender (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\index.js:57:21)
    at Object.keys.forEach (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\index.js:73:25)
    at Array.forEach (<anonymous>)
    at setup (d:\work\@node\tcpserver\node_modules\log4js\lib\appenders\index.js:71:33)

これをみると、log4js まわりで発生しているように見えます。

私の場合の原因

私の場合は、log4js でのログファイル定義を、ログ出力の都度行っていたことが原因でした。

const log4js = require('log4js');
log4js.configure({
appenders : {
    app : {type : 'file', filename : "./log/app.log"}
},
categories : {
    default : {appenders : ['app'], level: 'debug'},
}
});
const logger = log4js.getLogger('app');

これを外に出して、問題解決でした。

カテゴリー
仕事効率化

実験思考を読んでみました

CASH を開発した 光本勇介 さんの著書 実験思考を読んでみました。

電子書籍版は無料で読めますので、ぜひ読んでみてください。

CASH って?

モノの写真を撮るとすぐに査定されて、お金が振り込まれるアプリです。

https://cash.jp

一時期話題になったのでご存知の方も多いと思いますが、簡単に言うと買い取りアプリです。少し違うのが、お金が振り込まれる早さです。

まずお金が振り込まれて、2週間以内にアイテムを発送します。普通はアイテムを送って、発送してしばらくしてから振込みですが、CASH の場合は、先にお金が振り込まれます。

さらに、宅配業者が集荷に伺ってくれますので、手間もかかりません。

CASH をローンチして24時間で 3.6億円 のキャッシュ支払われたそうです。ローンチした翌日には、百科事典のような伝票を持った運送業者の方が、トラック3台分のアイテムを持って来られたと書かれていました。

失敗は自分だけの価値なる。

大切なのは、とにかくやってみよう、の精神です。自分がやってみたいと思ったことは、とにかくやってみることです。この本の中でも、「実験結果こそが唯一無二の財産になる」と書かれています。

お金は早く払うだけで喜んでもらえる

STORES.jp という名前でオリジナルのネットショップを持てるサービスがありました。そこでは、売り上げは翌々月まで待たないと振り込まれないのですが、手数料をいただくことで翌月に振込むサービスを始めたところ、多くのユーザー利用したそうです。

マスが使うサービスを作りたければ、マスの感覚を知る

女子高生からサラリーマンまで多くの人に使ってもらえるサービスを開発したければ、マス感覚を知ることが重要だと書かれていました。具体的には、ヤフーニュースをチェックしたり、App Store のトップ10を日々チェックしてインストールして使ってみる、ということです。

アイデアメモを書き、こんなサービスがあったら、どんな反応が起こるか考える

世の中不便なことだらけです。実体験で困ったことや、こんな風になったらいいのに、と思ったことを大切にして、アイデアメモとして残しているそうです。その中で、こんなサービスが実現したらこんな風に世の中が変わるだろうと予想して、実際に作って実験してみる、という思考を繰り返しているそうです。

思考停止の時代がくる

人間はそもそも、面倒くさがり屋です。そのため、便利なものが作られると、必ず便利な方に流れます。AIが開発されて職が奪われるといった議論がありますが、必ずそういった方向に時代は流れます。

そのときどんなサービスを提供できるか?どんな体験を提供できるか、について書かれていましたが、その中で、考えなくても旅行に行けるサービスのことが書かれていました。行きたい日にちと場所を入力するだけで、予約や手続きを全て自動化してくれるサービスです。

その他にも、AI化が進んでベーシックインカムが実現すると、エンタメが強くなるとも書かれていました。朝10時に出社して昼3時に仕事が終わると、あとは全てエンタメの時間。それだけ、これからはエンタメが強くなると予想されています。

他にも面白いアイデアがたくさん書かれています。

電子書籍版は無料で読めますので、ぜひ読んでみてください。

カテゴリー
JavaScript

gulp ejs で The following tasks did not complete: ejs が出たときの対処法

gulp ejs ジョブで以下のエラーメッセージに遭遇することがあります。

[21:04:35] The following tasks did not complete: ejs
[21:04:35] Did you forget to signal async completion?

処理の末端まで実行されたのに、終了したと検知されないことが原因です。

対処方法

明示的に終了を宣言します。

具体的には、コールバック関数を実行します。

var gulp = require('gulp');
var ejs = require('gulp-ejs');
var rename = require('gulp-rename');
var outdir = "../public/"

gulp.task('ejs', function(cb) {
    gulp.src(
        [
            '../ejs/*.ejs' //入力ソースパターン&path
            ,'!' + "../../ejs/_*.ejs" //入力除外ソースパターン&path
        ]
    )
        .pipe(ejs())
        .pipe(rename({extname: '.html'})) //出力ファイル名パターン
        .pipe(gulp.dest(outdir)); //出力path

        cb();

});

このように、

gulp.task('ejs', function(cb) {

cb()というコールバックを引数にとってタスクを定義します。

タスクの最後で、

cb();

コールバックを実行します。

こうすることで、

[21:06:50] Starting 'ejs'...
[21:06:50] Finished 'ejs' after 28 ms

ちゃんと終了してくれます。