Skip to content

Instantly share code, notes, and snippets.

@hayajo
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hayajo/da35d970d095710e8ec8 to your computer and use it in GitHub Desktop.
Save hayajo/da35d970d095710e8ec8 to your computer and use it in GitHub Desktop.
Lua入門 - オンシャヘイシャ勉強会

Lua入門 第2回 「コルーチンとオブジェクト指向」

ちなみに第1回は「Lua入門 (全17回) - プログラミングならドットインストール」でした。

コルーチン

コルーチン - Wikipedia

関数の途中で呼び出し元に処理を戻し、再度呼び出された時は続きから再開出来る。

co = coroutine.create(function()
  coroutine.yield("Hello");
  coroutine.yield("Lua");
  coroutine.yield("!!!");
end)

print (coroutine.resume(co))
print (coroutine.resume(co))
print (coroutine.resume(co))

coroutine.createでコルーチンを作成します。これはハンドルを返すだけで実行はしません。

コルーチンはcoroutine.resumeで実行します。 コルーチンを実行すると、そのコルーチンが終了するかcoroutine.yieldを呼び出すまで実行します。

coroutine.yieldを呼ぶと、コルーチンは中断されて直ちに呼び出し元のcoroutine.resumeに戻ります。 中断されるとtruecoroutine.yieldに渡された引数を返します。

function hello()
  coroutine.yield("Hello");
  coroutine.yield("Lua");
  coroutine.yield("!!!");
  return "END"
end

hello_co = coroutine.wrap(hello)

print(hello_co())
print(hello_co())
print(hello_co())
print(hello_co())

既存の関数をコルーチンにするにはcoroutine.wrapを使います。

coroutine.createと違い、コルーチン自信ではなくコルーチンを再開する関数を返します。 この関数を実行するとcoroutine.resumeの返り値の、最初の最初のブーリアン以外をすべて返します。

ちなみにgolangでの簡単な実装はこんな感じです。

ジェネレータ

ジェネレータ (プログラミング) - Wikipedia

コルーチンを利用してジェネレータとして使用する例です。

function fib()
  local a = 0
  local b = 1
  
  coroutine.yield(a)
  coroutine.yield(b)
  
  while true do
    local v = a + b
    a = b
    b = v
    coroutine.yield(v)
  end
end

fib_co = coroutine.wrap(fib)

for i = 1, 10 do
  print(fib_co())
end

ちなみにgolangでの簡単な実装はこんな感じです。

オブジェクト指向

資料をまとめるのが間に合いませんでした...ごめんなさい!!!

Lua入門 第3回 「ダイナミックリバースプロキシ」

検証環境の準備

$ vagrant up

(いろいろすっとばして)実行

$ vagrant ssh
vagrant$ cd ndsmeetup2-docker/multi-hosting
vagrant$ docker-compose up
vagrant$ for h in hoge fuga piyo; do
vagrant$ docker run -d --name $h -P multihosting_webapp
vagrant$ done

確認

$ open http://hoge.192.168.33.10.xip.io
$ open http://fuga.192.168.33.10.xip.io
$ open http://piyo.192.168.33.10.xip.io
#!/bin/sh
echo "Asia/Tokyo" | sudo tee /etc/timezone
dpkg-reconfigure --frontend noninteractive tzdata
apt-get update
apt-get install -y curl vim-nox git language-pack-ja
# docker
apt-get install -y apt-transport-https
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-get update
apt-get install -y lxc-docker
usermod -a -G docker vagrant
# listen on both TCP and a Unix socket
test ! -e /etc/default/docker.bak && cp /etc/default/docker /etc/default/docker.bak
sed -i -e 's|#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"|DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"|' /etc/default/docker
service docker restart
# docker-compose
curl -s -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose; chmod +x /usr/local/bin/docker-compose
docker pull redis
docker pull ubuntu:trusty
docker pull golang:1.3.3-onbuild
sudo -u vagrant git clone https://github.com/hayajo/ndsmeetup2-docker.git /home/vagrant/ndsmeetup2-docker
apt-get clean
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu-14-04-x64-virtualbox"
config.vm.box_url = "https://dl.dropboxusercontent.com/u/167540/Vagrant/ubuntu-14-04-x64-virtualbox.box"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provision "shell", path: "setup.sh"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment