C++幼女先輩

プログラミング成分多め

最近の読書

実は私は本が嫌いで全く読みません
実際にプログラムにおいてはWeb情報の方が早いし
でも、最近 仕事で海外と行き来する機会が増え、移動時間に本を読む機会が増えたので
すごくいいかげんな書評を

人工知能xVRについての話題だが、技術的な話ではなく、投資家的な視線のお話
期待していなかったわりには 面白い内容であった
筆者は VRに関してとても大きなマーケットになると期待している
筆者はFacebook等のお友達申請大歓迎のようなので
VR案件を持っている人は投資をお願いしてもいいかも

プレゼン資料(PowerPoint)のコツがすごくわかりやすく書いてある
内容はどれも至極当たり前の事であるが、自分のプレゼン資料を見直すと
意外に出来ていない事が多い
もちろん 新社会人におすすめだが、新人を教育する立場の人も 論理的に教えれるので おすすめ
普段プレゼンを書かない技術者にも おすすめ

記憶術。といっても そんな魔法ではなく 一般的な方法
ただし、人間の記憶のメカニズムと 記憶するための手法が、ステップバイステップで説明されており
理解しやすいと思う

ブロックチェインのビジネス的な事
ブロックチェイン1.0と2.0について おおざっぱに
スマートコントラクトですよ
ただし、この手の本は今同じ内容のものが大量に出版されてる

仮想通貨とWebGLとVirtualYoutuber

今の会社の方向

経営者としては全くダメです。適当
とりあえず分かったのは、金になる事業するのが私のスタイルだと

ってことで、今最も熱いのが仮想通貨です
CoinCheck騒動でわかったのは、仮想通貨取引所がえらい儲かるって話
そんだけ利益でればセキュリティに金かけれるし

ってことで、今の事業の柱の一つ

仮想通貨技術

個人的に MONA Coinの開発にジョインしました
まだ何の成果も出せてないのだけど、勉強しながら色々な機能を強化していこうと思います
みなさんご存知の通り MONA Coinは事実上開発が止まってる
今一番必要な事は わたしが開発をする事より、次の開発者が入ってきやすい情報のまとめかなーって

今から書くものはGoになるのかnodeになるのかわからないけど、もともとは仮想通貨はC++で書かれている
ので、私との相性も良いのです

そして 元々のゲームや3Dの繋がりが強いので

WebGL

私の知人 emadurandalの GLBoostを中心にして、WebGL案件をガンガンとやっていこうと思います
そのうち GLBoostのコミッターにもなろうかねー
この案件は営業もかけられたらいいなー

そして 今はやりの

VirtualYoutuber

まだ詳細は話せないけど、最大手の技術的な顧問をしようかなーって 思ってます
なんだかんだ ゲーム業界のコネや知識は大きいので、100% 仮想通貨にいくにはもったいないと
人材的にも知人が何人かいるので 彼らに手伝ってもらえば回せる!

はてなブログのアクセス

何もしなくても1日最低50アクセスを目標にしていたけど
今月の最低は33アクセスでした
全くダメだね。 50アクセス目指すよ!

さいごに

ベトナムと仕事をすることになりました。月の半分ぐらいベトナムにいくかも
最近、自分の会社を経営しつつ 大きな会社の社員になるという選択肢があると知りました
是非お客さんに気に入られて そのような形になり、うちの人間が安定して 好きな仕事が出来るようにしていきたいものです

事務所を飯田橋付近にかまえようと思ってますが、物件を即探すの大変なので、しばらく友達の会社間借りします
仮想通貨、WebGLや UNITYでVirtualYoutuber そのサーバ、興味ある方いれば 是非に

今更だけどAWS Lambdaのnode(Javascript)で Promiseしてみた

はじめに

node書いてるとコールバック地獄やですよね!
async/await使いたかったんだけど、AWS Lambdaなので、おとなしくPromiseしてみました

コールバック地獄

普通に書くとコールバック地獄になってしまう

'ues strict';
const AWS = require('aws-sdk');
const DDB = new AWS.DynamoDB();
const DDBDC = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context, callback) {
  DDBDC.get( { TableName: "table1", Key:{"id": 1}} , (err1, data1) => {
    if (err1) {
      callback(err1);
      return;
    }
  
    DDBDC.get( { TableName: "table2", Key:{"id": 1}} , (err2, data2) => {
      if (err2) {
        callback(err2);
        return;
      }
      
      DDBDC.get( { TableName: "table3", Key:{"id": 1}} , (err3, data3) => {
        if (err3) {
          callback(err3);
          return;
        }

          // data1,data2,data3を使い データを操作
      });
    });
  });
}

おなじみのコールバック地獄
table1の検索後にtable2、table3と同期的に処理を行い結果を得られます
まず コールバック地獄辛い
そして table1、table2、table3 の処理を非同期で同時に行ってもよい
ただし、データを使う時には全部が終了していなければならない

ぱっと知ってる技術では 考えつかなかった

'ues strict';
const AWS = require('aws-sdk');
const DDB = new AWS.DynamoDB();
const DDBDC = new AWS.DynamoDB.DocumentClient();

exports.handler = function(event, context, callback) {
  DDBDC.get( { TableName: "table1", Key:{"id": 1}} , (err1, data1) => {
    if (err1) {
      callback(err1);
      return;
    }
  });
  
  DDBDC.get( { TableName: "table2", Key:{"id": 1}} , (err2, data2) => {
    if (err2) {
      callback(err2);
      return;
    }
  });
      
  DDBDC.get( { TableName: "table3", Key:{"id": 1}} , (err3, data3) => {
    if (err3) {
      callback(err3);
      return;
    }
  });

  // data1,data2,data3の同期を待ち データを操作

}

table1、table2、table3の検索が全て終わったのはどうやって調べましょうか(誰か教えて)

それ、Promise使えばいいよ

Promiseを使えば非同期関数を綺麗に(階層深くせず)コールバックを隠蔽できます
例えば最初の 各テーブルの読み込みを同期する場合は

'ues strict';
const AWS = require('aws-sdk');
const DDB = new AWS.DynamoDB();
const DDBDC = new AWS.DynamoDB.DocumentClient();


var get1 = (id) => {
    return DDBDC.get( { TableName: "table1", Key:{"id": id}}).promise();
};
var get2 = (id) => {
    return DDBDC.get( { TableName: "table2", Key:{"id": id}}).promise();
};
var get3 = (id) => {
    return DDBDC.get( { TableName: "table3", Key:{"id": id}}).promise();
};


exports.handler = function(event, context, callback) {

  get1(1)
  .then(get2(1))
  .then(get3(1))
  .then(()=>{
    // data1,data2,data3を使い データを操作
  })
  .catch( (err) => {
      callback(err);
  });

}

こんな感じで(動かしてないから間違えてるかもしれないけど) table1をまちtable2、table3と同期して
実行可能です

細かい実装はみてないけど、ぱっと見でいうと
AWSのライブラリにはだいたい promise()メソッドがある
中身は new Promise()で 関数からPromiseを作る便利メソッド
Promiseのメソッド thenは、関数の実行を待ち、終了後に引数の関数を呼び出す
結果的に get1の終了後にget2が呼ばれ、その後 get3が呼ばれる

では、お互いの終了を待たず get1、get2、get3を並列で実行し、全てが終了するのを待つ場合はどうだ?
並列で実行されるため、こっちの方が圧倒的にパフォーマンスが良い

promise all 使おう

'ues strict';
const AWS = require('aws-sdk');
const DDB = new AWS.DynamoDB();
const DDBDC = new AWS.DynamoDB.DocumentClient();


var get1 = (id) => {
    return DDBDC.get( { TableName: "table1", Key:{"id": id}}).promise();
};
var get2 = (id) => {
    return DDBDC.get( { TableName: "table2", Key:{"id": id}}).promise();
};
var get3 = (id) => {
    return DDBDC.get( { TableName: "table3", Key:{"id": id}}).promise();
};


exports.handler = function(event, context, callback) {


  Promise.all([get1(1), get2(1), get3(1)])
  .then ((results) => {
    var data1 = results[0];
    var data2 = results[1];
    var data3 = results[2];

    // data1,data2,data3を使い データを操作
   }).catch((err)=>{
        callback(err);
   });

}

Promise.all に配列としてpromiseを返す関数を渡せば
thenにて全ての終了を同期出来る
そして結果は 配列として帰ってくる
とてもすばらしい!

これでコールバックとはおさらば!

AWS Lambdaで使えるnodeのバージョンがあがれば、さらに綺麗にかける async/awaitも使えるんだけどね・・

最近の関心毎

最近関心のあるテックはずばり

  • AI (DeepLearning)
  • ブロックチェイン
  • VR、AR、MR

なぜか共通点は GPU

その中でも、ブロックチェインに関しては絶賛勉強中
すごいものを作るポテンシャルあるんだけど、まだキラーサービスが出ていない

そんななか 今やりたいことが3個あります

  • 英語勉強
  • 越境EC(まずは台湾の商品を売りたい)
  • 仮想通貨を投げ銭できるGithub

投げ銭。そう OSSに対して投げ銭できるようなシステム
動画もYoutuberとか利益をもらうシステムがあり、絵やブログも投げ銭できるんですが
OSSプログラマには もちろんヘッドハントとか大きな利益あるけど、目の前の利益が無い
それに 優秀なプログラマは企業に飼われて、技術を隠蔽するより
オープンソースで生活できるようになれば、世界の技術革新は今より速いものになる
そのためには、OSS投げ銭するシステムが必要である
そして issueに対して投げ銭する事で、プライオリティもつけられるしモチベーションにも

Githubのようなサービスを作ればいいけど、Githubプラグインで実装できないかな・・・  ちょっと考えてみよう

越境ECは、台湾が好きすぎて、台湾に原住民のママさんの友達も出来たし
まずは台湾の商品を売るところから始めたいです
この間 花蓮地震があったので、その応援に! 加油
ゆくゆくは、日本の商品を世界に売りたい

そして英語は昔から苦手だけど、自分は技術勉強より英語を出来るようになる方が圧倒的に技術力つくので
3月からオンラインサービス色々ためしてみます

そんなわけで、3月からがんばるぞい!

AWS Dynamoのメモ

前提

Dynamo初めて触る人向けのDynamoのまとめ
多分これだけ知ってればDynamoチョトデキル

About

DynamoはNoSQLにジャンルされる KVSである。当然RDBより速い
機能的には、Redisより少し出来る事が多く、MongoDBより少ない
速度的には Redisに劣るので、必要に応じてAPI CacheでRedisを建てる
従量課金なので常時起動するコストがない

メリット

フルマネージドなので、設定もデプロイも不要でオートスケーリングする
死活監視も不要なので、夜もゆっくり寝ることができる

テーブル仕様

Indexが2個しか指定できない(後述GlobalSecondaryIndexで追加は可能だが制限がある)
Indexは PartitionKey(PK)のみか、PartititionKey+SortKey(SK) のどちらかを設定する必要がある
Index以外のフィールドは自由(レコード毎にフィールドが違っても問題ない)
PK(PK+SK)で一意性が保たれる必要がある(Indexが同じレコードはエラー)

フィールド(アトリビュート

基本的には数字か文字列
日付は文字列なりUNIX Timeにして・・
バイナリも入る(未使用)
それらの配列も入れることができる Booleanもある
Mal、List、Nullもあるが未使用

クエリー

PKは =判定しか出来ない(完全一致オンリー) Indexはテーブル作成時に設定し、以降変更することが出来ない
IndexにSKを含めて作成した場合でも PKのみのクエリが可能
SKでクエリーする場合はかならず PKと併用する必要がある(SK単体のクエリは不可能)
SKは =、<、<=、>、>=、Betweer、BeginWith(前方一致) が出来る SK指定時はソートすることが可能

スキャン

全件取ってくるので遅いのでなるべく使わない
Indexでクエリかけられない場合は後述のGSIも検討すべき

フィルタ

クエリやスキャンの後、条件でレコードを除外することが出来る
Indexに指定していないフィールドでも条件一致させられる
でもクエリ後なので、ヒット件数が多い場合は遅い

Update、Insert

Dynamoではアップサートである(同じIndexの項目があればUpdate、なければインサート) Update時はフィールドの即値指定以外に計算式が入るため f = f+5 のようなアトミック計算も可能
またUpdate時に update if f == 5 のような条件指定も可能
アトミックカウンタも存在するので、トランザクションが無くてもそれなりの事ができる

GlobalSecondaryIndex(GSI)

Indexとは別に 検索用のIndexを作成することが出来る
Indexと同じく PKあるいはPK+SK で作成することが出来る
クエリもIndexと同じ
内部実装は同じテーブルをレプリケーションしているため、GSIを増やすとデータ容量増えるので注意
投影フィールド(レプリケーションするフィールド)を指定できるので必要なものだけにすること
Indexと違い キーの一意性は必要ない(PK+SKが同じレコードも作成可能)

バッチオペレーション

ReadやInsert、Delete等をまとめることができる
Dynamoの料金体系は基本的に Read/Write単位で課金されるため(もちろんデータ量もあるが)バッチ処理出来る時はしたほうがお得
ただし Updateはバッチ処理できません!

トリガー

Dynamoでレコードの変更があったさい Lambda関数を呼ぶことが可能
ただし、1秒間に4回ポーリングして変更があったさい起動するようなので、重いかもしれない

トランザクション

ない。楽観的なトランザクション
が、Updateの条件式などを使えば ロックフリー的なことは可能 dynamodb-transactions というのが簡易トランザクション機能を提供する

バックアップ

通常S3等に退避させることが多いと思う
特定リージョンでは オンデマンドバックアップが可能
テーブルやレコードを削除しても、バックアップから復元することが可能(未使用のため詳細不明)

グローバルテーブル

他のリージョンとも自動的にレプリケーションされるテーブルを作成することが可能

DocumentClient(ライブラリ)

AWS.DynamoDB.DocumentClient を使うとほんの少し楽になる
具体的には、素でDynamoDBライブラリを使うと すべてのフィールドにたいして "N" や "S" といった型情報が必要だが、それを省略可能

"Key": {
  "PK": {"S":"pk"},
  "SK": {"N":1} 
},

"Key": {
  "PK":"pk",
  "SK": 1 
},

と出来る。地味にありがたい

TOEIC360点が1年で800点を目指す(ry

最近気になったQiitaです

qiita.com
qiita.com

来年の目標として英語学習したいな・・・

計画

ルール

2018年2月13日~2019年3月のTOEICまでにTOIECスコアを800点以上にする
TOEICは、WebでTOEIC模試もあるので、それとの併用も考え、結果をブログで報告する
上記のQiitaの人たちは月100時間。1日平均3時間と 結構勉強している・・
私はせいぜい月30時間しかさく気がないので大丈夫か?

モチベーション

洋書なにを読むか考えてないが、とりあえずAWSKindle本を何個か手に入れた
そしてネタとして ウラジーミル・ナボコフのLolitaを読んでみようと思う
一応 5000万冊売れたミリオン だからね!露リコンじゃないよ!

学習方法

素晴らしいことに、シェアハウスにオーストラリア人がいて疑問があれば聞ける
もちろんインターネットでも色々とサービスあるので便利
とりあえず発音を先にしろと言われているので、何も考えず発音勉強する
そして、私はボキャブラリをとにかく詰め込もうと思う
単語覚えるだけでは片手落ちなので短い文章も
あとはやりながら考える

予定教材等

おすすめされているものを順に試していこうと思う

発音

英語耳 https://www.amazon.co.jp/%E8%8B%B1%E8%AA%9E%E8%80%B3-%E6%94%B9%E8%A8%82%E3%83%BB%E6%96%B0CD%E7%89%88-%E7%99%BA%E9%9F%B3%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%83%AA%E3%82%B9%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B-%E6%9D%BE%E6%BE%A4%E5%96%9C%E5%A5%BD/dp/4048688634/ref=sr_1_1?ie=UTF8&qid=1518493303&sr=8-1&keywords=%E8%8B%B1%E8%AA%9E%E8%80%B3

ボキャビル

キクタン [All-in-One] TOEIC® Test Score 600+800+990合本版
play.google.com

瞬間英作文

どんどん話すための瞬間英作文トレーニング
Amazon CAPTCHA

まずはこの3つを読みつつ、英語のドキュメントを仕事で読みつつ・・
先は厳しいけど頑張る

AWS Lambdaでトリガーが削除できなくなった時

例えば API GatewayからLambdaを連携させた後、連携を削除したい場合は
Lambdaのトリガーを削除したあとに API Gatewayから連携を削除すればよいのですが
逆をやってしまうと。 先に API Gatewayから削除した場合は Lambdaにトリガーが残ったまま削除できないという不具合がおこります

どう見ても AWS管理画面の不具合ですが、システム的には消せるので

AWS Clientでコマンドをうてば消せます

aws lambda remove-permission を使えば消せるのですが、sidを手に入れるため aws lambda get-policyを使います

$ aws lambda get-policy --function-name LambdaのARN

ARNはLambda管理画面の右上に arn:aws:lambda:ap-northeast-1:ほげほげ・・ の形で表示されています
このコマンドを実行すると Jsonが返ってきます
そこで消したいものの sidを探し

$ aws lambda remove-permission --function-name LambdaのARN --statement-id 取得したsid

これで消える