鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Parserについて勉強したい

Bool用Parserに変えて見る

下記のような真偽値をパースするパーサを作って見る。

1 | 1 & 0

ほぼ、元の四則演算そのものなんですが・・
&の優先順位が|よりも高いので、除算のところを&にして、加算のところを|にして見ました。
あとは0の扱いに注意が必要でundefだとエラーにしました。
計算する部分も実装して見ました。

use 5.018000;

package Calc {
    use Carp ();

    sub parse {
        local $_ = $_[1];

        _parse_expr();
    }

    sub err {
        my ($msg) = @_;
        my $ret = join('',
            $_, "\n",
            (" " x pos()) . "^\n",
            $msg, "\n",
        );
        Carp::croak $ret;
    }

    sub _parse_expr {
        my @nodes;
        until (/\G\s*\z/gc) {
            my $m = _parse_add()
                or do {
                err "Syntax error";
            };
            push @nodes, $m;
        }
        return ['expr', @nodes];
    }

    sub _parse_add {
        my $mul = _parse_mul()
            or return undef;
        while (m{\G\s*(\|)}gc) {
            my $op = $1;
            my $lhs = _parse_mul()
                // die "Cannot parse mul after '$op' : " . pos();
            $mul = [$op, $mul, $lhs];
        }
        return $mul;
    }

    sub _parse_mul {
        my $node = _parse_term()
            // return undef;
        while (m{\G\s*(\&)}gc) {
            my $op = $1;
            my $lhs = _parse_term() // 
                die "Cannot parse expr after '$op' : " . pos();
            $node = [$op, $node, $lhs];
        }
        return $node;
    }

    sub _parse_term {
        if (/\G\s*([01])/gc) {
            return $1;
        } elsif (/\G\s*\(/gc) {
            my $expr = _parse_add();
            /\G\s*\)/gc
                or err "No closing paren after opening paren.";
            return $expr;
        }
        return undef;
    }

    sub execute {
        $DB::single = 1;
        my $node = $_[1][1];
        if (ref($node)) {
            return _execute($node);
        } else {
            return $node;
        }
    }

    sub _execute {
        my $node = shift;
        my $ope = $node->[0];
        my $left = $node->[1];
        my $right = $node->[2];
        if (ref($right)) {
            my $right = _execute( $right );
        }
        if ( $ope eq "&" ) {
            if ( $left == 1 && $right == 1 ) {
                return 1;
            }
            return 0;
        } else {
            if ( $left == 1 || $right == 1 ) {
                return 1;
            }
            return 0;
        }
    }
}

my $node = Calc->parse('1|1&0');
use Data::Dumper; warn Dumper($node);
warn Calc->execute($node);

vue-cli(Webpack)のサーバーサイドを8080ポートnode(express)で3000ポートで開発したいのですが404

vueのajax部分(axios)

      this.canvas.toBlob(function (blob) {
        axios.post('./api',
          {data: blob},
          {
            headers: { 'content-type': 'multipart/form-data' },
            params: {
            }
          }
        )
      })

vueのindex.js(リバースプロキシの設定)

    proxyTable: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true
      }
    },

なぜかpostで投げると404,getにすると200が帰る。
getでもデータ送れるのかな?

# 結局原因は・・・
express側の記述がgetだったので、postを受け取れなかっただけでした。
情けない・・

格安心拍計を試す

AliexpressでXD-58Cと検索すると最安値1.8$で売っていた心拍センサーが届いたので
早速試して見た。

f:id:kechiya:20180616202443j:plain

スケッチ>ライブラリをインクルード>ライブラリを管理を開いて、
検索をフィルタのテキストボックスにPulseSensorと入力して
インストール。

ファイル>スケッチの例>PulseSensor PlayGroud>PulseSensor_BPMを開いて、
loop関数を以下のように書き換える

void loop() {
  delay(20);
  Serial.print("test");
  Serial.print("\t");
  Serial.println(pulseSensor.getBeatsPerMinute());
  Serial.flush();
}

github.com

問題

値は取れたのでOKだけれども。基盤むき出しで、指に巻きつけるものも何もついていないので
なんとかしないと。

五反田.pmに参加しました

6月11日に六本木開催の五反田PMに参加しました。

open関数にはファイルを開くという機能だけでなく、実行する機能もあるとのこと。
straceでどんなシステムコールが発行しているかわかること。(man2でシステムコールについては学べる)

シェルを介してはいけないよ。
パイプの話シェルを解するとinjectionがある
外部プログラムにシグナルを送ったつもりが、シェルにシグナルが送られて悲しい
空白文字はクオートしなくてはいけない

シェルを起動しないのが一番
indirect記法
fork分身  execへんげ

Mishima.pm #3 を開催しました

今日は三島.pm#3 でした。
connpass.com

f:id:kechiya:20180603082614j:plain

4年ぶりの開催でした。
参加者は4名でしたが、ゆったりと時は流れ
時間はたっぷりあったので、発表後のディスカッションなど濃密にできました。

コードリーディングは1回やってみたかった企画でした。
モジュールのオーサー@karupaneruraさんにお願いしてAnikiを読みました。
約1時間みっちりと脱線しながら、解説していただけました。
非常に参考になりました。

  • forkした場合、子が死んだ時もいい感じに扱う必要がありなど。
  • 毎回接続に行くか?あたりの話。要件やDBの接続コストなどを考慮に入れて変わる。
  • Anikiのリレーションの判断ロジックについての説明。リレーション先のプライマリキーやユニークを持つで判断など。
  • 薄くラップして、キャッシュしたり、必要な部分は付け足している感じの説明。

反省点としてはTypeC接続ができないことを事前に通知していなかったところですね。
HDMIはありました。

さて、懇親会ではうなぎ(すみの坊本町店)で盛り上がりつつ、懇親できました。
私的には、最初の骨がカリカリで塩の加減もいい感じでした。
f:id:kechiya:20180603130033j:plain

うなぎの後、ジャストタイムで、竹倉温泉行きのバスに乗れて、竹倉温泉まで行きました。
最初行ったところが今年3月で営業終了というアクシデントで焦りました。
その後、違うところを見つけて、赤湯を堪能しました。
朝から営業しているのでハッカソンにも行けそうですねという話になりました。
f:id:kechiya:20180603160224j:plain
f:id:kechiya:20180603155923j:plain
遠路来ていただきありがとうございました。

次回実施時期は、未定ですが、ご要望があれば開催しますので
こっそり声かけてください。
目標は年1回くらいで開催したいですね。