2015/09/25


動作に必要なのは HTTP::Server::TinyDigest::MD5HTTP::Server::Tiny は安心の tokuhirom プロダクツ。

tokuhirom/p6-HTTP-Server-Tiny - GitHub
https://github.com/tokuhirom/p6-HTTP-Server-Tiny

そしてコード

mattn/p6-gyazo - GitHub

You signed in with another tab or window. Reload to refresh your session. You signed out in another ...

https://github.com/mattn/p6-gyazo
use v6;

use Crust::Request;
use Digest::MD5;

my $page = q:heredoc/END/.encode('utf-8');
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>俺ぎゃぞ</title>
    <link href='http://fonts.googleapis.com/css?family=Skranji' rel='stylesheet' type='text/css'>
<style type="text/css">
#content {
    text-align: center;
}
.big {
    font-family: 'Skranji', cursive;
    font-size: 170px;
}
.small {
    font-family: 'Skranji', cursive;
    font-size: 70px;
}
</style>
</head>
<body>
    <div id="content">
        <span class="big">OreGyazo</span><br />
    <div>
</body>
</html>
END

sub app($env) {
    my $req = Crust::Request.new($env);
    if $req.method eq 'POST' {
        my $image = $req.uploads.values.[0];
        my $md5 = Digest::MD5.md5_hex(slurp($image.path, :bin));
        rename $image.path, "images/{$md5}.png";
        return [200, ['Content-Type' => 'text/html; charset=UTF-8'], ["{$req.base}{$md5}.png".encode('utf-8')]];
    }
    if $req.path-info eq '/' {
        return [200, ['Content-Type' => 'text/html; charset=UTF-8'], [$page]];
    }
    if $req.path-info ~~ m{^^ '/' (\w+ '.png') $$} {
        my $content = try slurp("images/{$0}", :bin);
        if $content {
            return [200, ['Content-Type' => 'image/png'], [$content]];
        }
    }
    return [404, ['Content-Type' => 'text/plain'], ["Not Found".encode("utf-8")]];
}

# vim:set ft=perl6 et:

全く使い物にならないと思ってるアナタ、Perl6 そろそろ来るで。


2015/09/24


追記 perl もでした。。。

随分前の話だけど

t○kuhirom

と言われたので纏めておきます。

Javascript

console.log("".split(",").length); // 1

Perl

my @a = split /,/,"";
warn length @a# 1

Python

print len("".split(",")) # 1

Ruby

puts "a".split(/,/).size # 1

そうそう

puts "".split(/,/).size # 0

えっ

この辺の動きが言語毎に違うと困ったりしないんだろうか。

追記

すいませんすいません。perl も同じでした。。。

my @a = split /,/"";
warn scalar @a# 0


1日1個 golang のクイズを出す @DailyGolangQuiz という twitter アカウントを見つけたので既存の質問に答えてみた。

golang の string は len でバイト列数が返ります。スマイル絵文字は 4 バイトです。

golang の range-for はバインド変数を1つ取る時はインデックスが返ります(2つの場合は2つ目が実値)。for が2回実行されます。よって 0 + 1 で答えは 1 です。

golang の string は添え字を使うとバイトが、sliceでバイト列が返ります。文字として扱うには rune でキャストする必要があります。

package main
import."fmt"
func main(){Println("Go home!"[0:1]);Println(string(([]rune)("🏠🚴")[0:1]))}

golang のレシーバはメソッド呼び出し時にコピーされます。Do を呼び出してレシーバ t をそのまま扱うには Do の宣言でレシーバをポインタで宣言する必要があります。アスタリスク1文字だけ足します。

package main
import . "fmt"
type T struct { V int }
func (t *T) Do() { t.V=1 }
func main() { t := T{}; t.Do(); Println(t.V); }

一見リファレンスしていない様に見えますが、実際には C 言語でいう t->V = 1 と同じ働きとなります。

golang の switch は引数を取らない記述が可能です。この場合の switch は評価値を持っていません。実際には以下と同じ意味となります。

package main

import . "fmt"

func main() {
    switch ok := false; {
    case true:
        Println("1", ok)
    case false:
        Println("0", ok)
    }
}

実際に発言のコードを golang playground で Format すると上記のコードに変換されるのが分かるはずです。