Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

はじめに

こんにちは、白瀬です.
はじめに断りを入れておきますが実はcrystal書いたことないです.
あとrubyも実はあまり書いたことないです.
ruby多少触ったことは有りますがシンタックスを忘れるレベルで書いていないです.
ふだんはgoとかc++とかjavaを書いています.

さて今回の内容ですが 自分は普段新しい言語を始めるときはだいたい画像処理から始めます.
なので今回も画像処理をやろうと思ってました.
いろいろ頑張ってみたんですがちょっとまだ出来なかったので思ったこと書いていきます.

とりあえず触った

今回インストールするところから始めたわけだが他の*env系がある言語同様簡単にインストールできた.
crenv作ってくれたぴねたんありがとう.

とりあえずHello world

puts "hello world"

とりあえずFizzBuzz

def fizzbuzz (n)
    if (n % 15 == 0) then
        "FizzBuzz";
    elsif (n % 3 == 0) then
        "Fizz";
    elsif (n % 5 == 0) then
        "Buzz";
    else
        n;
    end
end

for n in 1..100 do
    puts fizzbuzz(n);
end

とりあえずこんな感じで書いた実行したらなんかおこれた

Syntax error in ./test.cr:2: unexpected token: then
    if (n % 15 == 0) then

thenをはずすとまた怒られた

Error in ./test.cr:13: undefined method 'in'
for n in 1..100 do

ひょっとしてforない?
"For" Loop support そもそも実装される予定がないみたい.
というわけでeachで

def fizzbuzz (n)
    if (n % 15 == 0)
        "FizzBuzz";
    elsif (n % 3 == 0)
        "Fizz";
    elsif (n % 5 == 0)
        "Buzz";
    else
        n;
    end
end

(1..100).each {|n|
  puts fizzbuzz(n)
};

とりあえずシンタックスはなんとなく理解した.
ここで本題の画像処理をやろうと思い想像した.
go言語だとjpegのDecodeは

file, _ := os.Open(fileName)
img, _ := jpeg.Decode(file)

だいたいこんな感じでできる.
crystalもそういう感じでできるかなと思って調べたら.
そもそも画像系のclassなかった・・・
これは自作しろということか!!
まぁAPI見る感じサーバー立てたりとかする機能が多いのでそういう使い方は想定されてないのかなという感じがする.
これは弱ったなと思いつつ更に調べていたらCのバインディング機能が存在しているということがわかった.
ということはjpeglib.hとかlibjpeg-turbo.hとかが使える.
というわけでここらへん見ながら頑張ってcrystal-jpegを作ろうとしています.
昨夜あたりからCbinding機能触りだしたんですがまだ理解できてないのでちょっと辛いですが・・・
引数に対して構造体が入る奴とか戻り値で構造体が出てくるやつとかそういうのをcrystalでどう扱うのかよくわかってないです.
なのでゆっくり作っていきます.

あとついさっき知ったんだけどインラインアセンブラもあつかえるのね.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment