# Less-Pain # Embedded Systems # with Elixir and Nerves ---- LoneStar ElixirConf - 2018-02-22 Greg Mefford (@ferggo) ![GregMefford](img/GregMefford.jpg) ![Le Tote](img/lt_logo.png)
# Code of Conduct 💜 http://lonestarelixir.com/2018/code-of-conduct
# Tentative schedule 🕘 * 7:30 AM - 8:30 AM (1:00) * Registration/Breakfast * 8:30 AM - 10:00 AM (1:30) * Welcome / Overview * Build some Hardware * Elixir for Embedded * Nerves Concepts * Phoenix for Embedded * Pre-Burned Firmware! * 10:00 AM - 10:30 AM (0:30) * Break (and help resolve issues)
# Tentative schedule 🕘 * 10:30 AM - 12:00 PM (1:30) * Streaming Video * Custom Nerves Systems * Scanning Barcodes * 12:00 PM - 1:30 PM (1:30) * Lunch (and Play with `eye` firmware)
# Tentative schedule 🕘 * 1:30 PM - 3:00 PM (1:30) * GraphQL APIs * Adding Phoenix * Phoenix Channels * GraphQL Subscriptions * 3:00 PM - 3:30 PM (0:30) * Break * 3:30 PM - 5:00 PM (1:30) * Exercises * Build / Lab time
# For Today * Raspberry Pi Zero W + case * Pi camera v2 * Zero-size camera ribbon cable * Lens adjustment tool * 16 GB class 10 MicroSD card * MicroSD card reader * Male USB to MicroUSB cable * QR codes and Stickers!
# For Later * MicroUSB OTG cable * HDMI to Mini HDMI cable * Standard-size camera ribbon cable * 5V 2.5A MicroUSB AC power adapter * 40-pin header * Heatsink
# Electronics Safety * Touch some grounded metal (like your MacBook) * It's technically not fine, but it'll probably be fine * Be gentle with the ribbon cables/connectors
# Elixir 💜 Embedded Light-weight *concurrency* * Tons of tiny processes * Process-level fault-tolerance * Per-Process Garbage-Collection * Immutable Data Structures Notes: Due to its Erlang roots, Elixir was born to be embedded. Today's low-cost embedded platforms are yesterday's supercomputers, so it's unsurprising that the BEAM would work well there. But I want to talk for a minute about this one-two punch: Garbage-collection happens per-process, and data structures are immutable.
# Elixir 💜 Embedded *Binary* pattern-matching ``` elixir def decode(<
>), do: {op, addr, data} # ... decode(<<0b01010101, 0b01010011>>) # => {2, 42, 83} ``` Notes: Another thing that's really great about Elixir for embedded development is binary pattern-matching. Let's pretend that we have an data sheet for an electronics component that says we need to decode these 16 bits into * a 3-bit operation code, * a 6-bit address value, * and a 7-bit data value. It's really easy to just pattern-match like this, and you're done.
# Elixir 💜 Embedded *Binary* pattern-matching ``` elixir def decode(<<0::2, op::1, addr::9, data::4>>), do: # ... def decode(<< op::3, addr::6, data::7>>), do: # ... # ... decode(<<0b00010101, 0b01010011>>) # => {0, 341, 3} decode(<<0b01010101, 0b01010011>>) # => {2, 42, 83} ``` Notes: But oh, by the way, the data sheet also says that if the first two bits are zeros, then you're in "extended address" mode, so you should interpret the rest of the data as: * a 1-bit operation code, * a 9-bit address value, * and a 4-bit data value. No problem, just add another function head. This example is obviously contrived, but it's so nice to be able to do this instead of procedural bitwise operations.
![Nerves Logo](img/nerves_sticker.png) Craft and deploy bulletproof embedded software in Elixir Notes: But I don't recommend you do that, because that's what Nerves is for.
# Nerves Platform App-level fault-tolerance with *Shoehorn* > Get your boot on! * Configure network * Start management tooling * Format storage partitions * ... Then start your app Notes: We also have Bootloader, which can be used to ensure the device comes up to a known-working state before trying to start your application. This allows for some limited remote diagnostics or firmware update, even if your application fails to start for some reason.
# Nerves Platform App-level fault-tolerance with *Shoehorn* > *Shoehorn* used to be called *Bootloader*. > That was confusing because it's not actually a bootloader.
# Support for *Lots of Targets* ![rpi0](img/rpi0.png) ![rpi1](img/rpi1.png) ![rpi2](img/rpi2.png) ![rpi3](img/rpi3.png) ![bbb](img/bbb.png) ![ev3](img/ev3.png) Notes: Nerves currently supports a bunch of popular and readily-available target hardware, like the Raspberry Pi and Beaglebone families, and the Lego EV3, which is really neat.
# Nerves 💜 Elixir ```bash $ mix nerves.new # Generate a Project $ mix deps.get # Download Pre-Compiled Infrastructure $ mix firmware # Cross-Compile your Project $ mix firmware.burn # Burn your SD card # ... or ... $ mix firmware.push # Update your Firmware over the Network ```
# Phoenix 💜 "IoT" ![Tons of cats](img/cats.png) Notes: Next, let's talk about Phoenix. This is your server on IoT.
Avoid hard CS problems if you can ![The Road to 2M Websocket Connections](img/the_road_to_2m_websockets.png)
[Gary Rennie - The Road to 2 Million Websocket Connections in Phoenix](https://youtu.be/c6JcVwbOGXc) Notes: It turns out that Phoenix is pretty good at handling that without much special tuning or architecture. In this presentation, Gary describes how they were able to get a single server to host 2M websocket connections. That wasn't the limit of what's possible, it was more of an arbitrary point at which they ran out of time and motivation to keep going with the test.
Use all your
Cores
4 Cores
96 Cores / 192 Threads
# Pretty secure by default ![Phoenix Security](img/phoenix_security.png) [Griffin Byatt - Plugging the Security Holes in Your Phoenix Application](https://youtu.be/w3lKmFsmlvQ) Notes: Phoenix is also pretty secure by default. In this presentation, Griffin presented his findings from analyzing a lot of Phoenix-based web applications in the wild. My main take-away from his presentation was that, unless you're doing something unusual, Phoenix has your back and does the right thing by default.
# Embedded web server (configuration, HMI, API) ![Process Controls](img/process_controls.png) Notes: Phoenix also makes a great embedded web server, whether you need a configuration page, a human-machine interface, or just a JSON API.
# Phoenix Channels ![Channels](img/channels.png) Notes: Phoenix Channels also offer a great way to easily connect your devices to a server, whether it's an app running in a browser or a headless sensor device in the field.
# GraphQL Subscriptions ![Live APIs with GraphQL Subscriptions - Bruce Williams and Ben Wilson](img/graphql_subscriptions.png)
[Live APIs with GraphQL Subscriptions - Bruce Williams and Ben Wilson](https://youtu.be/PEckzwggd78)
# Break from 10:00 to 10:30 AM * How is the pace? * Any questions? * Play with your shiny new hardware * Mingle in the hall * Get a snack, maybe?
# Eye ![Eye](img/eye.jpg)
# Omni Eye ![Eye](img/omni_eye.jpg)
[https://github.com/GregMefford/omni_eye](https://github.com/GregMefford/omni_eye)
# Let's Stream some Video ## with *Picam* ![Picam](img/picam.png)
[https://github.com/electricshaman/picam](https://github.com/electricshaman/picam)
# Shortcut Check out the `step1` branch from the `omni_eye` repo. ``` bash $ git clone https://github.com/GregMefford/omni_eye.git $ cd omni_eye $ git checkout step1 ``` The following slides show how we arrived there step-by-step. [https://github.com/GregMefford/omni_eye](https://github.com/GregMefford/omni_eye)
# Getting Started ``` bash $ mkdir omni_eye $ cd omni_eye $ mix new eye --sup $ mix nerves.new eye_fw ```
# Getting Started ``` bash omni_eye ├── eye │ ├── README.md │ ├── config │ ├── lib │ ├── mix.exs │ └── test └── eye_fw ├── README.md ├── _build ├── config ├── deps ├── lib ├── mix.exs ├── mix.lock.host ├── rel └── test ```
# Poncho Project ![Poncho Projects](img/poncho_projects.png)
[http://embedded-elixir.com/post/2017-05-19-poncho-projects/](http://embedded-elixir.com/post/2017-05-19-poncho-projects/)
``` elixir # eye/mix.exs defp deps do [ {:picam, "~> 0.2.0"}, {:cowboy, "~> 1.0.0"}, {:plug, "~> 1.0"} ] end ```
``` elixir # eye_fw/mix.exs defp deps do [ {:nerves, "~> 0.10.0", runtime: false}, {:distillery, "~> 1.5"}, {:eye, path: "../eye"} ] ++ deps(@target) end defp deps("host"), do: [] defp deps(target) do [ {:shoehorn, "~> 0.2"}, {:nerves_runtime, "~> 0.5"}, { :nerves_init_gadget, github: "nerves-project/nerves_init_gadget", ref: "dhcp" }, ] ++ system(target) end ```
![nerves_init_gadget](img/nerves_init_gadget.png)
[https://github.com/nerves-project/nerves_init_gadget/tree/dhcp](https://github.com/nerves-project/nerves_init_gadget/tree/dhcp)
![nerves_init_gadget_deps](img/nerves_init_gadget_deps.png)
``` elixir # eye_fw/mix.exs defp system("rpi0") do [{:nerves_system_rpi0, "~> 0.21.0", runtime: false}] end defp system(target) do Mix.raise "Unsupported MIX_TARGET: #{target}" end ```
``` elixir # eye/lib/eye/application.ex defmodule Eye.Application do use Application def child_spec_no_args(module) do %{id: module, start: {module, :start_link, []}} end def start(_type, _args) do children = [ child_spec_no_args(Picam.Camera), Plug.Adapters.Cowboy.child_spec(:http, Eye.Router, [], [port: 80]) ] opts = [strategy: :one_for_one, name: Eye.Supervisor] Supervisor.start_link(children, opts) end end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do use Plug.Router plug :match plug :dispatch # ... end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do # ... get "/" do markup = """
Eye - Video Stream
""" conn |> put_resp_header("Content-Type", "text/html") |> send_resp(200, markup) end #... end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do #... forward "/video.mjpg", to: Eye.JPEGStreamer match _ do send_resp(conn, 404, "Oops. Try /") end end ```
``` elixir # eye/lib/eye/jpeg_streamer.ex defmodule Eye.JPEGStreamer do import Plug.Conn @behaviour Plug @boundary "w58EW1cEpjzydSCq" def init(opts), do: opts def call(conn, _opts) do Eye.Camera.configure() conn |> put_resp_header("Age", "0") |> put_resp_header("Cache-Control", "no-cache, private") |> put_resp_header("Pragma", "no-cache") |> put_resp_header("Content-Type", "multipart/x-mixed-replace; boundary=#{@boundary}") |> send_chunked(200) |> send_pictures end # ... end ```
``` elixir # eye/lib/eye/jpeg_streamer.ex defmodule Eye.JPEGStreamer do # ... defp send_pictures(conn) do conn |> send_picture() |> send_pictures() end defp send_picture(conn) do jpg = Eye.Camera.next_frame size = byte_size(jpg) header = "------#{@boundary}\r\nContent-Type: image/jpeg\r\nContent-length: #{size}\r\n\r\n" footer = "\r\n" with {:ok, conn} <- chunk(conn, header), {:ok, conn} <- chunk(conn, jpg), {:ok, conn} <- chunk(conn, footer), do: conn end end ```
``` elixir # eye/lib/eye/camera.ex defmodule Eye.Camera do require Logger def configure do Logger.info("Configuring camera") Picam.set_quality(10) Picam.set_size(1280, 720) Picam.set_fps(30) end def next_frame do Picam.next_frame() end end ```
``` elixir # eye_fw/config/config.exs config :shoehorn, init: [:nerves_runtime, :nerves_init_gadget], app: Mix.Project.config()[:app] # VVV Make sure you actually have an SSH key generated VVV config :nerves_firmware_ssh, authorized_keys: [ File.read!(Path.join(System.user_home!, ".ssh/id_rsa.pub")) ] # ^^^ Before you burn your firmware to your SD card ^^^ config :nerves_init_gadget, address_method: :static ```
``` bash $ cd eye_fw $ export MIX_TARGET=rpi0 $ mix deps.get $ mix firmware # Extract your SD card from the Zero # Connect it to your laptop $ mix firmware.burn # Put it back into your Zero ``` ![zero retention tab](img/hardware_assembly_07.jpg) ![tilt up the zero](img/hardware_assembly_06.jpg)
# Scanning Barcodes with *`zbar`* ![zbar-elixir](img/zbar-elixir.png)
[https://github.com/GregMefford/zbar-elixir](https://github.com/GregMefford/zbar-elixir)
# Custom Nerves Systems ![custom system docs](img/custom_system_hexdocs.png)
[https://hexdocs.pm/nerves/systems.html#customizing-your-own-nerves-system](https://hexdocs.pm/nerves/systems.html#customizing-your-own-nerves-system)
# Shortcut Check out the `step2` branch from the `omni_eye` repo. ``` bash $ git checkout step2 ``` The following slides show how we arrived there step-by-step.
``` bash # Leave the eye_fw directory $ cd .. $ git clone https://github.com/nerves-project/nerves_system_rpi0.git $ mv nerves_system_rpi0 system_rpi0_zbar $ cd system_rpi0_zbar $ mix deps.get $ mix nerves.system.shell Nerves /nerves/build > make menuconfig ``` ![system shell](img/sys_shell_01.png)
``` bash Nerves /nerves/build > make save-defconfig Nerves /nerves/build > exit $ git diff ```
``` bash $ cd ../omni_eye/eye_fw $ export MIX_TARGET=rpi0_zbar ``` ``` elixir # eye_fw/mix.exs defp system("rpi0_zbar") do [{:nerves_system_rpi0_zbar, path: "../../system_rpi0_zbar", runtime: false}] end defp system(target) do Mix.raise "Unsupported MIX_TARGET: #{target}" end ``` ``` bash $ mix firmware ```
``` bash $ mix firmware.push <IP_ADDRESS> ``` ![mix firmware push](img/firmware_push.png)
# Let's Actually # Scan some Barcodes! ![watch barcodes](img/step3_watch_barcodes.png)
# Shortcut Check out the `step3` branch from the `omni_eye` repo. ``` bash $ git checkout step3 ``` The following slides show how we arrived there step-by-step.
``` elixir # eye/mix.exs defmodule Eye.MixProject do # ... defp deps do [ {:picam, "~> 0.2.0"}, {:zbar, "~> 0.1.0"}, {:cowboy, "~> 1.0.0"}, {:plug, "~> 1.0"}, {:poison, "~> 3.1.0"} ] end # ... end ```
``` elixir # eye/config/config.exs config :eye, port: 4000 config :picam, camera: Picam.FakeCamera config :logger, level: :debug, utc_log: true config :logger, :console, level: :debug, format: "$dateT$time [$level] $message\n" ``` ``` elixir # eye_fw/config/config.exs config :eye, port: 80 config :picam, camera: Picam.Camera config :logger, level: :info, utc_log: true config :logger, :console, level: :info, format: "$dateT$time [$level] $message\n" ```
``` elixir # eye/lib/eye/application.ex defmodule Eye.Application do # ... def start(_type, _args) do port = Application.get_env(:eye, :port) picam_camera = Application.get_env(:picam, :camera) children = [ child_spec_no_args(picam_camera), Eye.BarcodeScanner, Plug.Adapters.Cowboy.child_spec(:http, Eye.Router, [], [port: port]) ] opts = [strategy: :rest_for_one, name: Eye.Supervisor] Supervisor.start_link(children, opts) end # ... end ```
``` elixir # eye/lib/eye/barcode_scanner.ex defmodule Eye.BarcodeScanner do use GenServer alias Eye.Camera # BarcodeScanner API def next_scan(timeout \\ 10_000) do GenServer.call(__MODULE__, :next_scan, timeout) end # ... end ```
``` elixir # eye/lib/eye/barcode_scanner.ex defmodule Eye.BarcodeScanner do # ... # GenServer API def start_link(opts \\ []) do GenServer.start_link(__MODULE__, opts, name: __MODULE__) end def init(_opts) do send(self(), :scan_next_frame) {:ok, []} end def handle_call(:next_scan, from, state) do {:noreply, [from | state]} end # ... end ```
``` elixir # eye/lib/eye/barcode_scanner.ex defmodule Eye.BarcodeScanner do # ... def handle_info(:scan_next_frame, state) do {:ok, symbols} = Camera.next_frame() |> Zbar.scan() dispatch(symbols, state) send(self(), :scan_next_frame) {:noreply, []} end # Helpers defp dispatch(symbols, requests) do Enum.each(requests, & GenServer.reply(&1, symbols)) end end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do # ... forward "/video.mjpg", to: Eye.JPEGStreamer get "/barcodes.json" do response = Eye.BarcodeScanner.next_scan() |> format_symbols() |> Poison.encode!() conn |> put_resp_header("Age", "0") |> put_resp_header("Cache-Control", "no-cache, private") |> put_resp_header("Pragma", "no-cache") |> put_resp_header("Content-Type", "text/json") |> send_resp(200, response) end # ... end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do # ... defp format_symbols(nil), do: [] defp format_symbols(symbols) do Enum.map(symbols, & format_symbol/1) end defp format_symbol(%Zbar.Symbol{} = symbol) do symbol |> Map.delete(:__meta__) |> Map.update!(:points, & format_points/1) end defp format_points(points) do Enum.map(points, & format_point/1) end defp format_point({x, y}), do: %{x: x, y: y} end ```
# Test images ![test image](img/1280_720.jpg)
# Try it in `iex` ``` bash $ cd ../eye $ mix deps.get $ iex -S mix ``` ![iex barcodes](img/step3_iex_scan_barcode.png)
# Push a firmware update ``` bash $ cd ../eye_fw $ mix deps.get $ mix firmware $ mix firmware.push <IP_ADDRESS> ```
# Serial console ``` bash # On OSX: $ picocom /dev/tty.usbmodem
-b 115200 # On Linux (probably): $ picocom /dev/ttyACM0 -b 115200 ``` ![picocom](img/step3_picocom.png)
``` bash $ watch curl -s http://<IP_ADDRESS>/barcodes.json ``` ![watch barcodes](img/step3_watch_barcodes.png)
# Break from 12:00 to 1:30 AM * How is the pace? * Any questions?
# GraphQL ![GraphiQL](img/step4_graphiql_query.png) ![GraphiQL](img/step4_graphiql_mutation.png)
# Shortcut Check out the `step4` branch from the `omni_eye` repo. ``` bash $ git checkout step4 ``` The following slides show how we arrived there step-by-step.
``` elixir # eye/lib/eye/configuration.ex defmodule Eye.Configuration do @moduledoc """ This camera configuration struct holds on to the current state of each `Picam` camera setting that the `Eye` application supports: * `size`: The image resolution as a map of `%{width: w, height: h}`. """ defstruct [ size: %{width: 1280, height: 720} ] @typedoc @moduledoc @type t :: %__MODULE__{ size: dimensions() } @type dimensions :: %{width: non_neg_integer(), height: non_neg_integer()} end ```
``` elixir # eye/lib/eye/camera.ex defmodule Eye.Camera do use GenServer alias Eye.Configuration require Logger # Public API def get_config(), do: GenServer.call(__MODULE__, :get_config) def set_size(width, height) do GenServer.call(__MODULE__, {:set_size, width, height}) end defdelegate next_frame(), to: Picam # ... end ```
``` elixir # eye/lib/eye/camera.ex defmodule Eye.Camera do # ... # GenServer API def start_link(opts \\ []) do GenServer.start_link(__MODULE__, opts, name: __MODULE__) end def init(_opts) do Logger.info("Configuring camera") conf = %Configuration{} Picam.set_size(conf.size.width, conf.size.height) {:ok, conf} end # ... end ```
``` elixir # eye/lib/eye/camera.ex defmodule Eye.Camera do # ... def handle_call(:get_config, _from, conf), do: {:reply, conf, conf} def handle_call({:set_size, width, height}, _from, conf) do case Picam.set_size(width, height) do :ok -> conf = %{conf | size: %{width: width, height: height}} {:reply, :ok, conf} err -> {:reply, err, conf} end end end ```
``` elixir # eye/lib/eye/application.ex defmodule Eye.Application do # ... children = [ child_spec_no_args(picam_camera), Eye.Camera, Eye.BarcodeScanner, Plug.Adapters.Cowboy.child_spec(:http, Eye.Router, [], [port: port]) ] # ... end ```
![remove camera config from streamer](img/step4_remove_camera_config_from_streamer.png)
``` elixir # eye/mix.exs defmodule Eye.MixProject do # ... defp deps do [ {:picam, "~> 0.2.0"}, {:zbar, "~> 0.1.0"}, {:cowboy, "~> 1.0.0"}, {:plug, "~> 1.0"}, {:absinthe, "~> 1.4"}, {:absinthe_plug, "~> 1.4"}, {:poison, "~> 3.1.0"} ] end end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do use Plug.Router plug Plug.Logger plug Plug.Parsers, parsers: [ :urlencoded, :multipart, :json, Absinthe.Plug.Parser ], pass: ["*/*"], json_decoder: Poison plug :match plug :dispatch # ... end ```
``` elixir # eye/lib/eye/router.ex defmodule Eye.Router do # ... forward "/graphql", to: Absinthe.Plug, init_opts: [schema: Eye.Schema] forward "/graphiql", to: Absinthe.Plug.GraphiQL, init_opts: [ schema: Eye.Schema, interface: :simple ] match _ do send_resp(conn, 404, "Oops. Try /") end ```
``` elixir # eye/lib/eye/schema.ex defmodule Eye.Schema do use Absinthe.Schema import_types Absinthe.Type.Custom import_types Eye.Schema.CameraTypes # ... end ```
``` elixir # eye/lib/eye/schema.ex defmodule Eye.Schema do # ... alias Eye.Resolvers query name: "Query" do @desc "Get current camera configuration" field :config, :camera_config do resolve &Resolvers.Camera.get_config/3 end end mutation name: "Mutation" do @desc "Set camera resolution" field :size, :camera_config do arg :width, non_null(:integer) arg :height, non_null(:integer) resolve &Resolvers.Camera.set_size/3 end end end ```
``` elixir # eye/lib/eye/schema/camera.ex defmodule Eye.Schema.CameraTypes do use Absinthe.Schema.Notation @desc "Camera configuration" object :camera_config do field :size, :dimensions end @desc "Image dimensions" object :dimensions do field :width, :integer field :height, :integer end end ```
``` elixir # eye/lib/eye/resolvers/camera.ex defmodule Eye.Resolvers.Camera do def get_config(_parent, _args, _resolution) do {:ok, Eye.Camera.get_config()} end def set_size(_parent, args, _resolution) do Eye.Camera.set_size(args[:width], args[:height]) {:ok, Eye.Camera.get_config()} end end ```
# Try it in `iex` ``` bash $ cd ../eye $ mix deps.get $ iex -S mix ```
![graphiql](img/step4_graphiql_query.png) ![iex](img/step4_iex_query.png)
![graphiql](img/step4_graphiql_mutation.png) ![iex](img/step4_iex_mutation.png)
![test image](img/fake_640_480.jpg)
# Try it on your Device ``` bash $ cd ../eye_fw $ mix deps.get $ mix firmware $ mix firmware.push <IP_ADDRESS> # On OSX: $ picocom /dev/tty.usbmodem
-b 115200 # On Linux (probably): $ picocom /dev/ttyACM0 -b 115200 ```
# Phoenix ![Phoenix](img/phoenix_is_not_your_application.jpg)
# Shortcut Check out the `step5` branch from the `omni_eye` repo. ``` bash $ git checkout step5 ``` The following slides show how we arrived there step-by-step.
``` bash # Go back to the omni_eye directory # to make a new Phoenix application $ cd ../ # If you don't already have the Phoenix archive installed: $ mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez $ mix phx.new eye_ui --no-ecto ```
Phoenix includes a lot of stuff we won't be using. Let's remove it all to reduce the noise. ``` bash ✅ eye_ui ✅ ├── assets ✅ │ ├── brunch-config.js ✅ │ ├── css ✅ │ │ ├── app.css ✅ │ │ └── phoenix.css ✅ │ ├── js ✅ │ │ ├── app.js ✅ │ │ └── socket.js ✅ │ ├── node_modules ✅ ├── config ✅ │ ├── config.exs ✅ │ ├── dev.exs ✅ │ ├── prod.exs ✅ │ ├── prod.secret.exs ✅ │ └── test.exs ```
Phoenix includes a lot of stuff we won't be using. Let's remove it all to reduce the noise. ``` bash ✅ eye_ui ✅ ├── lib ✅ │ ├── eye_ui ✅ │ │ └── application.ex ✅ │ ├── eye_ui.ex ✅ │ ├── eye_ui_web ✅ │ │ ├── channels ❌ │ │ ├── controllers ✅ │ │ ├── endpoint.ex ✅ │ │ ├── gettext.ex ✅ │ │ ├── router.ex ❌ │ │ ├── templates ❌ │ │ └── views ✅ │ └── eye_ui_web.ex ✅ ├── mix.exs ```
Phoenix includes a lot of stuff we won't be using. Let's remove it all to reduce the noise. ``` bash $ cd eye_ui $ rm -rf lib/eye_ui_web/controllers $ rm -rf lib/eye_ui_web/templates $ rm -rf lib/eye_ui_web/views ```
![ui config base](img/step5_eye_ui_config_dev.png) ![ui config base](img/step5_eye_ui_config_test.png)
![fw config](img/step5_eye_fw_config_1.png) ![fw config](img/step5_eye_fw_config_2.png)
# Try it in `iex` ``` bash $ cd ../eye $ mix deps.get $ iex -S mix ``` ![eye in iex](img/step5_eye_in_iex.png)
# Try it in `iex` ``` bash $ cd ../eye_ui/assets $ npm install $ brunch build $ cd ../ $ iex -S mix phx.server ``` ![graphql mutation](img/step4_graphiql_mutation.png)
# Try it on your Device ``` bash $ cd assets $ brunch build --production $ cd ../ # to the eye_ui directory $ mix phx.digest $ cd ../eye_fw $ mix deps.get $ mix firmware $ mix firmware.push <IP_ADDRESS> # On OSX: $ picocom /dev/tty.usbmodem
-b 115200 # On Linux (probably): $ picocom /dev/ttyACM0 -b 115200 ```
# Phoenix Channels and # GraphQL Subscriptions ![JavaScript](img/programming_people_js.png)
[Programming People - JavaScript](http://leftoversalad.com/c/015_programmingpeople/)
# Shortcut Check out the `step6` branch from the `omni_eye` repo. ``` bash $ git checkout step6 ``` The following slides show how we arrived there step-by-step.
![css](img/step6_css_1.png) ![css](img/step6_css_2.png)
# Try it in `iex` ``` bash $ cd ../eye_ui/assets $ npm install $ brunch build $ cd ../ $ iex -S mix phx.server ``` ![graphql mutation](img/step4_graphiql_mutation.png)
# Try it on your Device ``` bash $ cd assets $ brunch build --production $ cd ../ # to the eye_ui directory $ mix phx.digest $ cd ../eye_fw $ mix deps.get $ mix firmware $ mix firmware.push <IP_ADDRESS> # On OSX: $ picocom /dev/tty.usbmodem
-b 115200 # On Linux (probably): $ picocom /dev/ttyACM0 -b 115200 ```
# Break from 3:00 to 3:30 PM * How is the pace? * Any questions? * What should we do next? * Mingle in the hall * Get a snack, maybe?
# Exercise / Lab Time
## Have Fun with Nerves! 💜 ![GregMefford](img/GregMefford.jpg) ![GregMefford](img/nerves_logo.png) Greg Mefford (@ferggo)


Live Blogging: getting started with Erlang and Nitrogen
Note
This is an experiment where I try "live blogging": I blog as I get along further in the process... Feel free to comment/tweet during the process...
Trying a new concept: "Live blogging: getting started with Erlang and Nitrogen" - feel free to comment during the post corebvba.be/blog/post/Live…
— Tom * suǝssuɐſ (@ToJans) September 13, 2012
Introduction
As I had yet another idea for a startup, I fired up Visual Studio and started implementing a small demo...
Flexing my idea muscle; trying to build a POC for another startup idea #startup10 #ElliottWave twitter.com/ToJans/status/…
— Tom * suǝssuɐſ (@ToJans) September 6, 2012
However, the main feature that would elevate my example requires a lot of interaction, and quite frankly, interaction is a pain in web apps IMO, as there is still a mental shift between frontend and backend. For this particular thing I needed the distance to be as small as possible, so I started searching and found Erlang...
One more last video before I go to bed vimeo.com/8258045 #erlang #nitrogen #riak
— Tom * suǝssuɐſ (@ToJans) September 12, 2012
I will not go into the details why this looks like a perfect match, because I would like to build an MVP first, but I can tell you that it resembles the bee's knees at this current moment to me... So how do I get started? This is a walkthrough where I will post my progress... This post will evolve as I manage to get further....
Installation
Well, I still work on windows, so I downloaded the binary erlang package from here: https://www.erlang-solutions.com/downloads/download-erlang-otp
I downloaded the win x64 binary and ran it, as simple as that; mission #1 accomplished; a few more to go.
The web framework
Well, I decided to go for nitrogen, as it looks pretty neat IMO, so I created a nitrogen folder and downloaded the windows package from https://nitrogenproject.com/downloads and unzipped it.
#2 accomplished
Hello world
I copied the whole nitrogen package to a new folder called HelloWorld - how original - opened a cmd window in the folder, and this is what I typed and the result..
So I opened up Windows explorer and checked... Aha!
I copied the bin path, went back to my hello-world folder, right-clicked start.cmd and chose for edit, and assumed replacing 5.7.5 (the Erlang version in the nitrogen package) with 5.9.2 would be enough, but then I noticed: there is also and erts-5.7.5 subfolderfolder in the hello world project, which looks like it contains the whole erlang version...
So I decided to look a bit closer...
When running the commands from the batch file manually with the installed erlang (i.e. the one from c:\program files) I get a crash on the execution of the last line, so it compiles, but refuses to run. So I decide to uninstall erlang, as I assume it is some kind of a version conflict, and I probably do not need the installation anyway.
So I removed the installed Erlang, and also found out I had another (32-bit) version installed, so I removed that one as well...
However, when I try to compile using the following statement I still get an error:
C:\blah\nitrogen\helloworld>"erts-5.7.5\bin\erl.exe" -pa %PA% -make
Could not load module C:\Program Files\erl5.7.5\erts-5.7.5\bin\erlexec.dll.
So I decided to go looking for erlang 5.7.5 for windows.... But then it hit me; google to the rescue: https://groups.google.com/forum/?fromgroups=#!topic/nitrogenweb/0vXvXwLvBOM
So I should probably reinstall the Erlang binaries I first installed and try to build nitrogen myself...
Let's try again....
Ok, installed the initial erlang version again (had to kill an apparently still running erlang proces).
Now I went looking into a nitrogen tutorial (https://nitrogenproject.com/doc/tutorial.html) and pulled in the nitrogen source code from github.
I browsed a bit further in the git project, and found this document mentioned on the readme: "Compiling Nitrogen on Windows"... There they advise to install Erlang for win R15B02 for windows and install it in the folder "c:\erl5.9", so I installed yet another erlang (5.9.2), but now in the recommended folder, and tried running nitrogen again; here's what happened:
As it still does not work, I assume it is time to try and compile the thing...
So I add c:\erl5.9\bin to the path in my environment settings.
Now I install msysgit using the netinstaller, not the regular one, and install into the default c:\msysgit
You need to use this version, as this downloads the source for git and enables you with a complete mingw build environment, which allows you to build the nitrogen source code as well...
Building git apparently seems to take a few minutes...
... And some more...
And we're finally there!!!
Now time to clean up the folders and pull in the sourcecode and build it...

So I am now digging into the rebar mailing lists: https://lists.basho.com/pipermail/rebar_lists.basho.com/2011-September/001074.html
Aha, found it; I simply have to make sure c:\msysgit\bin is contained in the PATH environment variable; it now fetches all dependencies....
Crap... Now I get a compile error in nitrogen itself...
So I checked to see if there was any Erlang feedback available on twitter...
Well, the live blogging experiment is certainly a challenge: still not able to run nitrogen on windows #erlang #help corebvba.be/blog/post/Live…
— Tom * suǝssuɐſ (@ToJans) September 13, 2012
In the mean time I'll start looking at the source over at github; maybe I have a stable branch or similar...
Aha, I found an open issue regarding the mimetypes library on github, but apparently there's not a lot of response there.... https://github.com/spawngrid/mimetypes/issues/10
Currently in the process of digging in the source code of the mimetypes lib, and I also received a good tip from Neil:
@tojans top tip - buy a mac :)
— Neil Robbins (@NeilRobbins) September 13, 2012
Ok; I took a small break; looks like the problem is actually in the post_compile script for the mimetypes; currently debugging erlang script!!!
My understanding of erlang is growing slowly ... Looks like this file just extracts all method definitions, since these have not changed, there is no need to change it, so I just commented the whole enchilada (gist here: https://gist.github.com/3714046) et voila, it compiles!
AAAAAAAAAAAAAAAAAAAAARGH !
Still no go; I'll call it a day for today, as I have some other stuff to do as well, and this took way longer then I hoped.... Laters!
Put the Live Blog on hold, as it took to much of my time already... To be continued #erlang #nitrogen corebvba.be/blog/post/Live…
— Tom * suǝssuɐſ (@ToJans) September 13, 2012
I'm back
... with a vengeance, I hope...
Time to resume my Live Blogging: getting started with Erlang and Nitrogen corebvba.be/blog/post/Live…
— Tom * suǝssuɐſ (@ToJans) September 14, 2012
A new day, new ideas, so I started looking at the google groups, and apparently I'm not the first one having this problem: https://groups.google.com/d/msg/nitrogenweb/KoBJCXr5SEI/UhgkWWTp09wJ .
So let us try that....
Uninstalled all erlang..
Removed original folder
Now downloading and installing windows release from https://www.erlang.org/download_release/6 in "C:\Program Files\erl5.7.5", not the (x86) folder.
Double click start.cmd in the nitrogen folder, it should open up the erlang console. surf to https://localhost:8000 et voila !!! FINALLY !!!
Finally
I wrote a small follow-up post.


| Top |
Functions
Object Hierarchy
GObject ╰── NcmSpline2d ├── NcmSpline2dBicubic ├── NcmSpline2dGsl ╰── NcmSpline2dSpline
Description
This class comprises all functions to provide a NcmSpline2d, get its properties and evaluate it given an interpolation method.
Functions
ncm_spline2d_set ()
void ncm_spline2d_set (NcmSpline2d *s2d
,NcmVector *xv
,NcmVector *yv
,NcmMatrix *zm
,gboolean init
);
This funtion sets xv
and yv
vectors and zm
matrix to s2d
.
Parameters
s2d |
||
xv |
a NcmVector of knots |
|
yv |
a NcmVector of knots |
|
zm |
a NcmMatrix of the values of the function, to be interpolated, computed at |
|
init |
TRUE to prepare the NcmSpline2d or FALSE to not prepare it |
ncm_spline2d_set_function ()
void ncm_spline2d_set_function (NcmSpline2d *s2d
,NcmSplineFuncType ftype
,gsl_function *Fx
,gsl_function *Fy
,gdouble xl
,gdouble xu
,gdouble yl
,gdouble yu
,gdouble rel_err
);
This function automatically determines the knots of s2d
in the intervals [xl
, xu
] and
[yl
, yu
] given a ftype
and rel_error
.
The functions Fx
and Fy
are the bidimensional function given at specific values of y and x, respectively.
These x and y values must be in the the intervals [xl
, xu
] and [yl
, yu
].
[skip]
Parameters
s2d |
||
ftype |
||
Fx |
function of x variable to be approximated by spline functions |
|
Fy |
function of y variable to be approximated by spline functions |
|
xl |
lower knot of x-coordinate |
|
xu |
upper knot of x-coordinate |
|
yl |
lower knot of y-coordinate |
|
yu |
upper knot of y-coordinate |
|
rel_err |
relative error between the function to be interpolated and the spline result |
ncm_spline2d_prepare ()
void
ncm_spline2d_prepare (NcmSpline2d *s2d
);
This function prepares the bi-dimensional spline s2d
such that one can evaluate it (ncm_spline2d_eval),
as well as to compute its integration in x, y or both directions.
ncm_spline2d_copy_empty ()
NcmSpline2d *
ncm_spline2d_copy_empty (const NcmSpline2d *s2d
);
This function copies the bidimensional spline s2d
into an initialized
empty NcmSpline2d of a specific type.
ncm_spline2d_copy ()
NcmSpline2d *
ncm_spline2d_copy (NcmSpline2d *s2d
);
This function copies the two NcmVector and the NcmMatrix of the bidimensional
spline s2d
into those two NcmVector and NcmMatrix of a new NcmSpline2d.
ncm_spline2d_new ()
NcmSpline2d * ncm_spline2d_new (const NcmSpline2d *s2d
,NcmVector *xv
,NcmVector *yv
,NcmMatrix *zm
,gboolean init
);
This function returns a new NcmSpline2d, where the knots of this new spline are given
in the NcmVector xv
and yv
. The values of the function, at those knots, to be interpolated are
given in the NcmMatrix zm
.
Parameters
s2d |
a constant NcmSpline2d |
|
xv |
NcmVector of knots |
|
yv |
NcmVector of knots |
|
zm |
NcmMatrix of the values of the function, to be interpolated, computed at |
|
init |
TRUE to prepare the new NcmSpline2d or FALSE to not prepare it |
ncm_spline2d_ref ()
NcmSpline2d *
ncm_spline2d_ref (NcmSpline2d *s2d
);
Atomically increases the reference count of s2d
by one.
ncm_spline2d_free ()
void
ncm_spline2d_free (NcmSpline2d *s2d
);
Atomically decrements the reference count of s2d
by one. If the reference count drops to 0,
all memory allocated by s2d
is released.
ncm_spline2d_clear ()
void
ncm_spline2d_clear (NcmSpline2d **s2d
);
Atomically decrements the reference count of s2d
by one. If the reference count drops to 0,
all memory allocated by s2d
is released. Set pointer to NULL.
ncm_spline2d_use_acc ()
void ncm_spline2d_use_acc (NcmSpline2d *s2d
,gboolean use_acc
);
Whether to use accelerated bsearch to find the right knots. When enabled evaluation functions are not reentrant.
ncm_spline2d_integ_dx ()
gdouble ncm_spline2d_integ_dx (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
,gdouble y
);
This function computes the integration in x over the interval [xl
, xu
] and
at y
.
[virtual int_dx]
ncm_spline2d_integ_dy ()
gdouble ncm_spline2d_integ_dy (NcmSpline2d *s2d
,gdouble x
,gdouble yl
,gdouble yu
);
This function computes the integration in y over the interval [yl
, yu
] and
at x
.
[virtual int_dy]
ncm_spline2d_integ_dxdy ()
gdouble ncm_spline2d_integ_dxdy (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
,gdouble yl
,gdouble yu
);
This function computes the integration in both x and y directions over the intervals
[xl
, xu
] and [yl
, yu
].
[virtual int_dxdy]
ncm_spline2d_integ_dx_spline ()
NcmSpline * ncm_spline2d_integ_dx_spline (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
);
This function computes the integral in x of the bidimensional interpolated function
over the range [xl
, xu
] resulting in a one dimensional function.
ncm_spline2d_integ_dy_spline ()
NcmSpline * ncm_spline2d_integ_dy_spline (NcmSpline2d *s2d
,gdouble yl
,gdouble yu
);
This function computes the integral in y of the bidimensional interpolated function
over the range [yl
, yu
] resulting in a one dimensional function.
ncm_spline2d_integ_dx_spline_val ()
gdouble ncm_spline2d_integ_dx_spline_val (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
,gdouble y
);
This function calls ncm_spline2d_integ_dx_spline and evaluates the resulting
NcmSpline at y
.
ncm_spline2d_integ_dy_spline_val ()
gdouble ncm_spline2d_integ_dy_spline_val (NcmSpline2d *s2d
,gdouble x
,gdouble yl
,gdouble yu
);
This function calls ncm_spline2d_integ_dy_spline and evaluates the resulting
NcmSpline at x
.
ncm_spline2d_integ_dxdy_spline_x ()
gdouble ncm_spline2d_integ_dxdy_spline_x (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
,gdouble yl
,gdouble yu
);
This function calls ncm_spline2d_integ_dx_spline and integrates the resulting
NcmSpline over the interval [yl
, yu
].
ncm_spline2d_integ_dxdy_spline_y ()
gdouble ncm_spline2d_integ_dxdy_spline_y (NcmSpline2d *s2d
,gdouble xl
,gdouble xu
,gdouble yl
,gdouble yu
);
This function calls ncm_spline2d_integ_dy_spline and integrates the resulting
NcmSpline over the interval [xl
, xu
].
ncm_spline2d_deriv_dzdx ()
gdouble ncm_spline2d_deriv_dzdx (NcmSpline2d *s2d
,gdouble x
,gdouble y
);
[virtual dzdx]
ncm_spline2d_deriv_dzdy ()
gdouble ncm_spline2d_deriv_dzdy (NcmSpline2d *s2d
,gdouble x
,gdouble y
);
[virtual dzdy]
ncm_spline2d_deriv_d2zdxy ()
gdouble ncm_spline2d_deriv_d2zdxy (NcmSpline2d *s2d
,gdouble x
,gdouble y
);
[virtual d2zdxy]
ncm_spline2d_deriv_d2zdx2 ()
gdouble ncm_spline2d_deriv_d2zdx2 (NcmSpline2d *s2d
,gdouble x
,gdouble y
);
[virtual d2zdx2]
ncm_spline2d_deriv_d2zdy2 ()
gdouble ncm_spline2d_deriv_d2zdy2 (NcmSpline2d *s2d
,gdouble x
,gdouble y
);
[virtual d2zdy2]
Property Details
The “init”
property
“init” gboolean
boolean whether to prepare the NcmSpline2d.
Owner: NcmSpline2d
Flags: Read / Write
Default value: FALSE
The “spline”
property
“spline” NcmSpline *
NcmSpline object used internally.
Owner: NcmSpline2d
Flags: Read / Write / Construct Only
The “use-acc”
property
“use-acc” gboolean
Use accelerated bsearch.
Owner: NcmSpline2d
Flags: Read / Write
Default value: FALSE


The circular orientation data are plotted in a histogramm. Three types of diagrams can be drawn:
1.) Block diagrams
2.) Star diagrams
3.) Diagrams with floating intervals
The interval describes the width of the classes, i.e. the sector angle, in which the data are put together.
For floating intervals, the inkrement describes the angle of overlap of classes or sectors. It should be a devisor of the interval angle.
The menu Fill the diagram decides whether the diagram will be filled with the chosen colour or not.
In the menu ‚colour‚ the drawing colour is chosen.
All settings will be saved in the file Fabric7.ini.
In the menu ‚graphik‚ various options for treatment of the plot can be chosen:


I am a technology-minded individual with a passion for Front End Web Development. Inspired by design and performance - I am able to build fluid, attractive and responsive websites for any need. I have a multi-disciplinary background in research and entrepreneurship, backed with creativity and drive.
As a recent graduate from George Washington University’s Full Stack Web Development, I have honed skills in the following:


sequencing data reads NanoSPC pipeline Nanopore :â€". {border-style metagenomic px;} #ffffff;} analysis cloud genome high viral reference using clinical Oxford consensus human influenza nanopore (). Genome University analysis. complete individual interface quality web Docker assembly data. images multiple px; sequence variants virus viruses {font-family (Figure Biomedical NIHR Research computing font-size generated nucleotide pathogen read run sequences sequences. single species transmission variant Nat. ONT analyzing characterization control detect double; enables fast format identify including mapped mode potentially reads. samples. signal used (â€"). Web based border-color border-width cloud-based comprehensive database elastic flow genomes mapping pathogenic portable provide rapid reads, resistance scalable, solid; species, {font-style {font-weight Acids Centre, Department Medicine, Metagenomic Nextflow Nuffield OxfordUK[], Users analyze applies assemble bacteria bacterial barcode bold calling compatible courier; data, demultiplexing diagnosis efficiency em; enabling fastq implement infection long long-read manager mean novel number pathogens pipeline. pipelines present prevention processing provided pt;} range real-time reproducible scalable throughput total users


Carbon Footprint Timeline
Ways to Reduce
Huffington Post
National Geographic
The Guardian
Mashable
Carbon Fund


Pundit tells Jose Mourinho to make ‘dream’ Tottenham signing
Tottenham Hotspur boss Jose Mourinho should consider a swoop to sign Zlatan Ibrahimovic, according to Danny Mills
by Transfer AgentJose Mourinho should look to bring Zlatan Ibrahimovic to Tottenham Hotspur, according to pundit Danny Mills.
Tottenham appointed Mourinho as their new manager on Wednesday morning less than 12 hours after Mauricio Pochettino’s dismissal.
Mourinho’s arrival heralds a new era at the north London side after Pochettino had steered Spurs to a their first-ever Champions League final last term.
The former Real Madrid manager has inherited a Tottenham side in 14th position in the Premier League table.
Ibrahimovic became a free agent earlier this month after the former FC Barcelona striker ended his spell at Major League Soccer outfit LA Galaxy.
The Swedish striker has been linked with a return to the Premier League amid reports Manchester United could re-sign the prolific goal-scorer.
Ibrahimovic has worked with Mourinho at Manchester United and Inter Milan.
However, former Manchester City defender Mills believes Mourinho should consider a swoop to sign the 38-year-old striker.
“How about Zlatan to Tottenham? Who’s the backup striker to Harry Kane? They haven’t got one,” Mills told Football Insider, as quoted by Metro.
“He’s unattached, he’s left the MLS, he’s a free agent and as ludicrous as it sounds, think of the experience that he’s got and everybody talks about when he went to Manchester United, what he added to the dressing room, the work ethic that he’s got.
“I’m not saying he’s going to go in and replace Harry Kane, but he would be one hell of an option as almost a player-coach role type scenario.
“He’s obviously revered all over the world, I think he’s got enough confidence to pull it off.
“From Tottenham’s point of view he’s a marketing dream, he’s going to sell a lot of shirts very, very quickly, he loves Mourinho to bits.
“You just start to think, is it a possibility to bring a player like that in to give them a bit of a boost?”
Tottenham are in 14th position in the Premier League table and 11 points behind fourth-placed Manchester City in the race to secure a Champions League spot.
Spurs have only managed to win one of their last six Premier League games, losing twice and drawing three times.
Mourinho has a proven record in the Premier League after winning three titles as well as FA Cup and League Cup crowns during two spells at Chelsea FC.


--- layout: default title: Ariana's Site ---
If you want more clarification on any writeup or have some correction, feel free to drop me a message or an email!
| Date | CTF | Challenge | Category | Points | Solves |
| {{ writeup.date | date: "%B %e, %Y" }} | {{ writeup.ctf }} | {{ writeup.chal }} | {{ writeup.category }} | {{ writeup.points }} | {{ writeup.solves }} |


Add Kiosk Form
Location:
Minimum Customers:
Maximum Customers:
Average Pounds:
Average Cups:
Add Kiosk
Beans Needed By Location Each Day
Barista Hours Needed By Location Each Day


How can we help you?
General
To know which all courses we offer, click on the button below and head on over to our home page.
HomeOur Policies
Click the button below to review our privacy policies and Terms and Conditions.
Terms and Conditions Privacy PolicyContact Us
Our customer service executives work 24x7 to provide you with great service. Click the button below to know how to reach us.
Contact Us


Before Change
groups=num_branches,
activation=(lambda: nn.PReLU(mid_channels)))
self.spp_dw = nn.ModuleList()
for i in range(num_branches):
dilation = dilations[i]
self.spp_dw.append(conv3x3(
in_channels=mid_channels,
After Change
self.branches = HierarchicalConcurrent()
for i in range(num_branches):
self.branches.add_module("branch{}".format(i + 1), conv3x3(
in_channels=mid_channels,
out_channels=mid_channels,
stride=stride,
padding=dilations[i],
dilation=dilations[i],
groups=mid_channels))
self.merge_conv = conv1x1_block(
in_channels=out_channels,
out_channels=out_channels,


World Wide Web Access Statistics
File Accesses by Domain for IUSOCS
April 1999
Requests Received During Summary Period 15
Bytes Transmitted During Summary Period 36602
Average Requests Received Daily 8
Average Bytes Transmitted Daily 18301
Requests Received During Summary Period 8
Bytes Transmitted During Summary Period 14616
Average Requests Received Daily 4
Average Bytes Transmitted Daily 7308
Requests Received During Summary Period 248
Bytes Transmitted During Summary Period 567877
Average Requests Received Daily 11
Average Bytes Transmitted Daily 24690
Requests Received During Summary Period 9
Bytes Transmitted During Summary Period 36865
Average Requests Received Daily 4
Average Bytes Transmitted Daily 18433
Requests Received During Summary Period 63
Bytes Transmitted During Summary Period 188294
Average Requests Received Daily 4
Average Bytes Transmitted Daily 10461
Requests Received During Summary Period 9
Bytes Transmitted During Summary Period 50921
Average Requests Received Daily 3
Average Bytes Transmitted Daily 16974
Requests Received During Summary Period 41
Bytes Transmitted During Summary Period 140527
Average Requests Received Daily 5
Average Bytes Transmitted Daily 17566


Issue 134
Welcome to another issue of Haskell Weekly!  This is a weekly summary of what’s going on in its community.
Featured
-
2018 state of Haskell survey results by Taylor Fausak
This post will graph the answers to the multiple-choice questions. I will not attempt to summarize the answers to free-response questions. I encourage any interested parties to download the raw results, do their own analysis, and share their results.
-
Hakyll part 2: Generating a sitemap XML file by Robert Pearce
This is part 2 of a multipart series where we will look at getting a website / blog set up with Hakyll and customized a fair bit.
-
Function totality: Abstraction tool in programming by Marko Dimjašević
Abstraction is a cornerstone of programming a complex software system. Without it, a complex software system is a complicated software system. In this article I will explore an important tool in achieving abstraction in programming: function totality.
-
A low-latency garbage collector for GHC by Ben Gamari
As real-time and distributed systems become common-place, latencies associated with memory management begin to limit the usability of garbage collected languages.
-
A new course begins by Julie Moronuki
This week has brought some changes that we’re pretty excited about. I’ve planned a whole course on all the functors in Haskell, called Functortown: A Map of the Territory.
-
Ex-Hack: A Haskell example-based documentation by Félix Baylac-Jacqué
Ex-Hack is an example-based documentation automatically generated using the packages posted on Stackage.
-
IHaskell on Windows! by Arvind Devarajan
The obvious advantage of using IHaskell on WSL is the fact that it looks very natural on a Windows system, not to forget that you have no need to depend on third-party solutions like VirtualBox to get your Linux on.
-
Stack(age): History, philosophy, and future by Michael Snoyman
Both the Stackage and Stack projects originated many years ago. At the time they started, they had specific goals geared at solving problems at the time. Some of those problems remain, some have changed. Also, as the projects have continued, some goals have morphed as well.
-
State monad comes to help sequential pattern matching by Dmitrii Kovanikov
Let’s try to solve one specific problem using the State monad and monad transformers to see how pure stateful computations work in Haskell and how they can be used to write better interfaces.
-
Termonad: A terminal emulator configurable in Haskell by Dennis Gosnell
Termonad is similar to other popular terminal emulators, but it is completely configurable in Haskell. It aims to be the “XMonad of terminal emulators”. Termonad is aimed at Haskellers who want a highly configurable terminal emulator.
Jobs
-
Data engineer at Lumi in Los Angeles
Are you ready to build and maintain an extensive database for a high-growth startup? Lumi is looking for a Data Engineer who can manage the design and implementation of a highly structured database of information relating to every facet of our business.
-
Software engineer at AlasConnect in Anchorage
Act as a trusted software expert within the organization. Design and develop new software products and architectures, coordinate maintenance activities. Coaching and mentoring junior team members.
In brief
- Elm series + PureScript coming up!
- Functional architecture: A definition
- Keeping formal verification in bounds
- Lambda World Seattle 2018
- MuniHac 2018 keynotes
- Raft: Adjoint’s implementation of the Raft consensus algorithm
- Some things about Yesod
- The state of Haskell 2018 survey: Take 2
- Upcoming Stackage LTS 13 snapshot with GHC 8.6.2
- VoidSpace: Well-typed typing tutor where you type types… in space
- What is your least favorite thing about Haskell in 2018?
- Why (I believe) Stackage succeeded
Package of the week
This week’s package of the week is Clash, a functional hardware description language. The CλaSH compiler transforms these high-level descriptions to low-level synthesizable VHDL, Verilog, or SystemVerilog.
Call for participation
- LambdaHack: Create the machinery to randomly generate human character backstories
- purebred-email: add IsString instance for Mailbox
Events
North America
- 2018-11-22 in Raleigh, NC, USA by Raleigh Haskell Meetup: (hack . yack)
- 2018-11-24 in Chilliwack, BC, Canada by ChilliHask Haskell User Group: Weekly Haskell Coding Meetup
- 2018-11-24 in Boston, MA, USA by Weekly Functional Programming Meetup: Hang out, chat FP, work on some code
- 2018-11-26 in Irvine, CA by Orange Combinator - Functional Programming In OC: Combinating - The Weekly Function
- 2018-11-26 in Plano, TX, USA by Dallas Functional Programmers: Scheme/Racket with Brian Mirambeau
- 2018-11-27 in Vancouver, BC, Canada by Vancouver Functional Programmers: Haskell Lunch Study Group • Fall ’18 Cohort
- 2018-11-27 in Carmel, USA by Indy FP: Programs as Values - Fun with Free Monads
- 2018-11-27 in Cambridge, USA by Boston Haskell: Worlds of Logging in Haskell
- 2018-11-28 in Portland, OR, USA by Portland Functional Programming Study Group: PDX Func Theory Track - Logic and Proof
- 2018-11-28 in Arlington, VA, USA by Elm DC: Using Recursion to Loop in Elm & Comparing OO with FP
- 2018-11-28 in Asheville, NC, USA by Asheville Coders League: Tech Talks: Mike Storey presents “Cloud Transformation”
- 2018-11-29 in Raleigh, NC, USA by Raleigh Haskell Meetup: (hack . yack)
- 2018-11-29 in Las Vegas, NV, USA by Las Vegas Functional Programming User Group: Functional Programming Meetup
- 2018-11-29 in Chicago, IL, USA by The Project Euler Sprint: Project Euler Sprint
- 2018-11-29 in Calgary, AB, Canada by Functional Programmers YYC: Unconf (YYC.FP)
- 2018-12-04 in Tempe, AZ, USA by Functional First Phoenix: Go serverless with ReasonML and Amazon Lambda
Europe
- 2018-11-24 in Berlin, Germany by Study Haskell: Weekly Haskell-studying session
- 2018-11-26 in Karlsruhe, Germany by Karlsruhe Haskell Meetup: Haskell Monday
- 2018-11-27 in Regensburg, Germany by Regensburg Haskell Meetup: Late November Meetup
- 2018-11-27 in Bristol, United Kingdom by CodeHub Bristol: Hack Night + Haskell Study Group
- 2018-11-27 in Copenhagen, Denmark by Mødegruppe for F#unktionelle Københavnere: [Brian Hjøllund] F# at Unity
- 2018-11-28 in Berlin, Germany by Berlin Haskell Users Group: Haskell Wednesday
- 2018-11-28 in Tallinn, Estonia by Tallinn Serverless Computing Meetup: Intro to NodeServerless
- 2018-11-28 in London, United Kingdom by Skills Matter - X Matters Series - Free Developer Events: Skills Matter Open House | November
- 2018-11-28 in London. EC1V 4PB, United Kingdom by London Haskell: Live Coding with a safety net
- 2018-11-29 in Zürich, Switzerland by HaskellerZ: Beth Aitman - A practical guide to making good documentation
Asia
- 2018-11-24 in Bengaluru, India by The Bangalore Haskell User Group: Brian McKenna on Haskell + Nix and Vijay Anant on GADTs
- 2018-11-27 in Tokyo, Japan by Tokyo Haskell Meetup: Haskell Hamburger Night
- 2018-11-27 in Auckland, New Zealand by Functional Programming Auckland: Learn Haskell Hands-on
- 2018-11-29 in Melbourne, Australia by Melbourne Haskell Users Group: Melbourne Haskell Users Group Meetup
South America
- 2018-11-28 in Quito, Ecuador by Quito Lambda: Vue.js: Adaptando un enfoque funcional


Stop! Wait...
No such lobby could be found. Maybe you made a mistake with the pin. If not then it might be worth creating it?
{% load static %}
No such lobby could be found. Maybe you made a mistake with the pin. If not then it might be worth creating it?


Googli.eth
googli.ee things
can be conveyed in a link.
type here – and then share!
Link copied to clipboard.
qr code
menu
copy link
----
share via
twitter
----
new site


Carrying a heavy bag causes back pain. Here's how to avoid it
by News DeskStanding cramped inside a bus full of strangers can be depressing, but the 5 kilograms on your back can make it even worse.
From gadgets, to reading materials and packed lunch, daily commuters toss everything into their bags, lift them up and then carry them. Lugging all that for hours can have a painful effect on back muscles and the spine, especially in the long run.
“Your bag is one of the easiest things to modify about your environment,” Dr. Charla Fischer, a spine surgeon at NYU Langone’s Spine Center, told the New York Post.
Fischer recommends 1.3 kg as the maximum weight to carry while commuting.
“Anything more than 1.3 kg can wreak havoc on your back by putting pressure on spine discs, leading to repetitive-stress injuries, muscle strain and even chronic pain,” she suggests.
People who work in Jakarta spend an average of four hours commuting every day, as reported by kompas.com. It gets even worse in rush hours.
There are, however, ways to make commuting more comfortable, aside from waiting for a less crowded bus:
Sort your bag regularly
Tossing in everything for the whole week might seem less troublesome, but a large number of lightweight items still leads to a heavy overall load. Swap a big pack of wet tissues for a smaller one for the day, and reconsider whether to bring that extra makeup.
Another handy tip is to half fill your water bottle and refill it at work.
Read also
Eliminate items in your wallet
Reconsider whether to bring things like extra credit cards and coins as you won’t need them on a daily basis. A smaller wallet with one debit card, some emergency cash, ID and your travel card will probably be enough.
E-wallets might come in handy as well.
Backpacks over tote bags
Bags with only one strap can hinder your spine’s alignment, causing soreness in your shoulder. Backpacks are your best choice. Two straps distribute equal weight on your shoulders and support your lumbar area. Larger straps also maximize comfort.
Also go for lightweight fabrics, like neoprene or canvas. Some fabrics like leather are heavier than others and will contribute to your total weight, which we want to keep under 1.3 kg.
Aim for a straight back
Carrying the bag too high up can pinch muscles, but too low can lead to poor distribution of weight.
“The top of the backpack should line up with the top of the shoulder blades,” Fischer explains.
Arranging your heavy items evenly between the left and right side can further maintain equal weight distribution.
Stretch it out
After a long day, find time to stretch and do a spinal twist. This can protect your back muscles from soreness and painful cramps.
“Five minutes at the end of day would do a lot for your tension,” Fischer says. (vel/kes)


Hunt rejects health premium rise: paper
Health Minister Greg Hunt has written to private health insurers to tell them their proposed premium rises for 2020 are too high, a media report says.
It's believed the industry is asking for a rise of 3.5 per cent, up from the 3.25 per cent they were allowed for 2019.
"I have written to private health insurers, asking them to deliver lower premium changes for consumers," Mr Hunt told The Sunday Telegraph.
"Their proposed changes for premiums in their first applications were too high. Our reforms have delivered the lowest premium changes in 17 and 18 years consecutively. I am determined to deliver the lowest average premium changes in 19 years."
However, private health insurers have warned that claims are growing faster than revenue and they may be forced to cut costs, including provision for some medical devices and payments to doctors.


In CSS each attribute has its own syntax describing its legal value(s). In ScalaCSS most CSS attributes have their value syntaxes encoded, but not all.
You can browse defined attributes in Attrs.scala.
To use an attribute that doesn't have a typed value syntax yet,
use the :=
operator.
Example:
font := "monochrome"
font := "'Times New Roman', Times, serif"
font := ^.auto // The DSL provides ^ as a shortcut for Literal.
That's all there is to it.
Most attributes have their value syntax encoded.
These attributes are objects
that extend TypedAttrBase
.
They have methods that facilitate legal values in a type-safe manner.
To use, simply explore their methods.
Example:
margin.auto
margin.inherit
margin.`0`
margin(12 px)
margin(12 px, auto)
margin(12 px, auto, 16 px, 4 ex)
textDecorationLine.overline
textDecorationLine.underline
textDecorationLine.underline.overline
The following DSL is available for specifying colours.
| DSL | Example | Description |
|---|---|---|
c"<literal>" |
c"#37b" c"#ffcc99" |
Specify a literal colour and have the compiler verify that it is a valid #RGB , #RRGGBB , or {rgb,hsl}{,a} function with valid arguments. |
<name> |
red black |
A colour literal, specified in the CSS spec. |
rgb(int x 3) |
rgb(0, 128, 0) |
Combines red, green and blue values [0-255]. |
rgb(percentage x 3) |
rgb(0.%%, 50.%%, 0.%%) |
Red, green and blue percentages. |
rgba(int x 3, double) |
rgba(0, 128, 0, 0.5) |
Red, green and blue values [0-255] with an alpha component [0-1]. |
hsl(int, percentage x 2) |
hsl(300, 50.%%, 10.%%) |
Hue [0-360], saturation and lightness. |
hsla(int, percentage x 2, double) |
hsla(300, 50.%%, 10.%%, 0.5) |
Hue [0-360], saturation, lightness and alpha [0-1]. |
grey(int) |
grey(224) |
A greyscale colour [0-255] with the specified amount of red, green and blue. |
<keyword> |
transparent currentColor inherit |
Any other keywords that are legal as, or in place of colours in the CSS spec can be used as is. |
Color("<literal>") |
Color("i break you css!") |
Specify a literal colour without any compiler validation. |
Using the c"<literal>"
syntax, invalid colours will result in compiler errors.
Example:
backgroundColor(red) // ok
backgroundColor(c"#ffcc99") // ok
backgroundColor(c"#ffcc9o") // compiler error: o is not hex
backgroundColor(c"#ffcc9") // compiler error: 5 digits
backgroundColor(c"hsl(200, 20%, 10%)") // ok
backgroundColor(c"rgb(0%, 20%, 10%)") // ok
backgroundColor(c"rgba(0, 0, 0, 0.5)") // ok
backgroundColor(c"rgb(30, 30, 300)") // compiler error: 300 is too large
backgroundColor(c"rbg(32, 128, 32)") // compiler error: typo in rbg
You can bypass type-safety and provide a manual value.
Similar to the untyped attribute syntax of attr := value
,
for typed attributes the syntax is
attr :=! value
You can use :=
but it will generate compiler warnings.
This mechanism means that when an untyped attribute becomes typed in a ScalaCSS
upgrade, you'll be alerted to all the cases where you're accidently bypassing
type-safety.
Example:
margin := "12px auto" // Compile warns there's a type-safe alternative
margin :=! "auto\\9" // The ! means you know what you're doing
If your favourite attribute doesn't have typed values, please patch it and submit a pull request.
Typing all values is a lot of work for one person and automation only gets one so far. Most are done but not all. If different users contribute a small amount of time to get a few attributes done then they'll all be typed in no time.
This is what an untyped attribute looks like:
val alignItems =
Attr.real("align-items", Transform keys CanIUse.flexbox)
This is what a typed attribute looks like:
object alignItems extends TypedAttrBase {
override val attr = Attr.real("align-items", Transform keys CanIUse.flexbox)
def baseline = av(L.baseline)
def center = av(L.center)
def flexEnd = av(L.flexEnd)
def flexStart = av(L.flexStart)
def stretch = av(L.stretch)
}
There are classes that help with common value syntaxes.
This example uses TypedAttrT1[Len]
to get a 1-arg apply()
method accepting
anything that be considered a length (eg. 12 px
), and ZeroLit
to gain a
`0`
method to indicate a length of 0.
object letterSpacing extends TypedAttrT1[Len] with ZeroLit {
override val attr = Attr.real("letter-spacing")
def normal = av(L.normal)
}


This application emphasizes the use of Javascript to generate a video player, that doesn't play ads, and also allows you to translate words. It contains an English to Spanish and Spanish to English translator where it allows for the user to write a word in the comment box and see the result.
Please enable Javascript to get the best use out of this application.
To get started, please select a country you'd like to look up, and click Search.


Roger Patiño
Android, Tester and Backend DeveloperNueva Esparta, Venezuela.
Backend developer and Tester + Developer of mobile applications on Android.
I love Electronics, JetBrains, Java + Kotlin, Instagram, Beer and Pizza.


Probably the most famous Shogi variant in Japan. The word Hasami means sandwiching. The game is played on a Shogi board (9x9 squares). Each player has 18 stones as shown in the initial setup.
|
This type of capture is called custodian capture.
| An example
If it's Black turn, he may capture the white central stones by moving to [1]. The same happens to White, if he moves into [2]. |
A similar game is Mak-yek played in Siam (and
Malaysia under the name Apit-sodok) with the same goal, on the same
board, but the 18 stones of each player are placed on the first and third
row. The moves are the same, but the capture is custodian and also by
intervention. Intervention capture is the opposite of custodian. If a stone
moves between two enemy stones, it captures both stones.


|
QuantLib: a free/open-source library for quantitative finance
Fully annotated sources - version 1.30
|
#include <ql/experimental/credit/distribution.hpp>
Public Member Functions | |
| Distribution (int nBuckets, Real xmin, Real xmax) | |
| Distribution ()=default | |
| void | add (Real value) |
| void | addDensity (int bucket, Real value) |
| void | addAverage (int bucket, Real value) |
| void | normalize () |
| Size | size () const |
| Real | x (Size k) |
| std::vector< Real > & | x () |
| Real | dx (Size k) |
| std::vector< Real > & | dx () |
| Real | dx (Real x) |
| Real | density (Size k) |
| Real | cumulative (Size k) |
| Real | excess (Size k) |
| Real | cumulativeExcess (Size k) |
| Real | average (Size k) |
| Real | confidenceLevel (Real quantil) |
| Real | cumulativeDensity (Real x) |
| Real | cumulativeExcessProbability (Real a, Real b) |
| Real | expectedValue () |
| Real | trancheExpectedValue (Real a, Real d) |
| template<class F > | |
| Real | expectedValue (F &f) |
| void | tranche (Real attachmentPoint, Real detachmentPoint) |
| int | locate (Real x) |
| Real | expectedShortfall (Real percValue) |
Private Attributes | |
| int | size_ |
| Real | xmin_ |
| Real | xmax_ |
| std::vector< int > | count_ |
| std::vector< Real > | x_ |
| std::vector< Real > | dx_ |
| std::vector< Real > | density_ |
| std::vector< Real > | cumulativeDensity_ |
| std::vector< Real > | excessProbability_ |
| std::vector< Real > | cumulativeExcessProbability_ |
| std::vector< Real > | average_ |
| int | overFlow_ |
| int | underFlow_ |
| bool | isNormalized_ |
Friends | |
| class | ManipulateDistribution |
Definition at line 37 of file distribution.hpp.
| Distribution | ( | int | nBuckets, |
| Real | xmin, | ||
| Real | xmax | ||
| ) |
Definition at line 33 of file distribution.cpp.
|
default |
| void addDensity | ( | int | bucket, |
| Real | value | ||
| ) |
| void addAverage | ( | int | bucket, |
| Real | value | ||
| ) |
| void normalize | ( | ) |
| Size size | ( | ) | const |
Definition at line 50 of file distribution.hpp.
| std::vector< Real > & x | ( | ) |
| std::vector< Real > & dx | ( | ) |
Definition at line 53 of file distribution.hpp.
Definition at line 56 of file distribution.hpp.
Definition at line 72 of file distribution.hpp.
Definition at line 151 of file distribution.cpp.
Definition at line 220 of file distribution.cpp.
Definition at line 204 of file distribution.cpp.
| Real expectedValue | ( | ) |
Definition at line 174 of file distribution.cpp.
| Real expectedValue | ( | F & | f | ) |
Transform the loss distribution into the tranche loss distribution for losses L_T = min(L,D) - min(L,A). The effects are: 1) shift the distribution to the left by A, then 2) cut off at D-A, Pr(L_T > D-A) = 0 3) ensure Pr(L_T >= 0) = 1, i.e. a density spike at L_T = 0
Definition at line 236 of file distribution.cpp.
| int locate | ( | Real | x | ) |
Definition at line 55 of file distribution.cpp.
Definition at line 328 of file distribution.cpp.
|
friend |
Definition at line 39 of file distribution.hpp.
|
private |
Definition at line 110 of file distribution.hpp.
|
private |
Definition at line 111 of file distribution.hpp.
|
private |
Definition at line 111 of file distribution.hpp.
|
private |
Definition at line 112 of file distribution.hpp.
|
private |
Definition at line 115 of file distribution.hpp.
|
private |
Definition at line 115 of file distribution.hpp.
|
private |
Definition at line 120 of file distribution.hpp.
|
private |
Definition at line 120 of file distribution.hpp.
|
private |
Definition at line 121 of file distribution.hpp.
|
private |
Definition at line 121 of file distribution.hpp.
|
private |
Definition at line 123 of file distribution.hpp.
|
private |
Definition at line 125 of file distribution.hpp.
|
private |
Definition at line 125 of file distribution.hpp.
|
private |
Definition at line 126 of file distribution.hpp.


Senior Web DeveloperCompany Inc. |
Bangalore |
Full Time | Apply | ||
UX DesignerCompany Inc. |
Chennai |
Freelance | Apply | ||
Web DesignerCompany Inc. |
Hyderabad |
full time | Apply | ||
Project ManagerCompany Inc. |
Mumbai |
full time | Apply | ||
Design TechnologistCompany Inc. |
Pune |
Part Time | Apply | ||
Front End DeveloperCompany Inc. |
Delhi |
full Time | Apply |


%StreamName_0% %StreamName_1% %StreamName_2%
Play on startup
OFF
MINIMAL
NORMAL
EXTREME
Select Accesspoint


Coupon Balance
#
Name
Address
Coupons
Select Member
Add
Select Member
Number:
Transfer
Number:
Spend


Example Headline in Microdata
Author:
A Smith
Published On:
2019-01-01
Article text…
Second Headline in Microdata
Author:
B Smith
Published On:
2019-02-01
Article text…
Author:
A Smith
Example Headline in RDFa
Author:
B Smith
Published On:
2019-01-01
Article text…


home
import webp_enc from "
https://github.com/GoogleChromeLabs/squoosh
"
webp_enc demo
Input picture format:jpeg、jpg、png、gif、webp、svg、ico、bmp、avif。Multiple files can be selected


{{ block title }}Survey{{ endblock }} {{ block content }}
Thank you for your willingness to participate in this survey. Please kindly answer the following questions.


Your ideal vacation destination is out there...
Tell us about yourself!
How far do you want to get away?
When you travel, where do you
prefer to sleep
?
in a hostel, or maybe a bed and breakfast
in a hotel near major attractions and transportation
anywhere safe and snug
When do you
sleep best
?
with some background sound, maybe the hum of a city
with white noise, like surf or rain
with earplugs in, if it's not quiet enough
Tomorrow you have
a day to yourself
. How might you spend it?
hanging out at your favorite cafe, people watching
exploring your neighborhood, maybe finding new places and meeting new people
experiencing nature
pushing your limits
surfing online, watching movies, etc
What will you talk about with your
grandchildren
?
all the amazing places you've seen in your life
all the interesting people you've met in your life
all the funny things you've realized about life and happiness
Which of these adventures sounds
most fun
to you?
walking a jungle path to find a volcano
playing games in a casino
eating unusual, local cuisine
whale watching from a ship
sharing stories around a campfire
getting lost in a strange new city
Where To?
You really ought to visit
Qaqortoq
for a great vacation getaway!
You really ought to visit
Kauai
for a great vacation getaway!
You really ought to visit
Monaco
for a great vacation getaway!


Ocala events
-
debenhams department stores lincoln
How Did Beethoven Die - Ask Community
The official recorded cause of death for Ludwig Beethoven was liver failure. However, after his death there were test done that speculation cause of death to be .
http://www.ask.com/answers/96965081/how-did-beethoven-dieLudwig van Beethoven - Wikipedia, the free encyclopedia
His mother died shortly thereafter, and the father lapsed deeper into alcoholism. . Beethoven did not immediately set out to establish himself as a composer, but .
http://en.wikipedia.org/wiki/Ludwig_van_Beethoven
noz to noz x series kennels Upcoming events in Ocala
- Sponsored event
like all get out
Apr 6 - Dance It Studio
industrial revolution factory owners body moving foward knees lock
attack force movie download Hottest Tickets
-
Apr 11archives washington historical society
Amway Center -
Apr 28the cliffs in princville hawaii
Amway Center -
Jun 25daido 1k6 vs 440c
Bob Carr Performing Arts Center -
Mar 30royal omni new orleans
Amway Center -
Aug 27how to make a psychogram
Amway Center -
Jun 21colonial food recipes 1700
Amway Center -
Sep 13tree frogs with blak spos
Francis Field -
Mar 17sending email server 2003 vb
St Augustine Amphitheatre -
Oct 8ground transportation newark nj to brooklyn
Amway Center -
May 4title service business va
Bob Carr Performing Arts Center
Ocala's best venues
-
Ludwig van Beethoven - A Profile of Beethoven
In 1792, Beethoven moved to Vienna. His father died in December that same year. He studied with Haydn for less than a year; their personalities did not mix well .
http://classicalmusic.about.com/od/biographies/p/beethoven.htm -
BEETHOVEN and HIS NEPHEW - Awesome Stories
Karl van Beethoven died in 1815. Thereafter . If adults were never able to measure-up to Beethoven's high standards, what chance did Karl have? How could .
http://www.awesomestories.com/biographies/beethoven/beethoven-nephew -
Beethoven's death and funerals in Vienna. The History of Beethoven.
On March 24th Beethoven signed his last will and testament, leaving everything . That is how he was, how he died and how he will always remain for eternity.
http://www.all-about-beethoven.com/beethovenlastyears1.htmlarlene's closet merrick ny
98 people's favorite
-
Beethoven - Pianonoise!
What did Beethoven Really look like? . as usual, but it should be noted that well before he died in March of 1827 Beethoven had achieved celebrity status.
http://www.pianonoise.com/Composer.Beethoven.htm -
here - PSC Partners Seeking a Cure
liver failure Beethoven died of in 1827 may have been caused by Primary Sclerosing Cholangitis (PSC). This article did not however provide any strong .
http://www.pscpartners.org/sites/default/files/files/pdfs/PSC-Beethoven.pdf


You can shop online NOW for all of the great deals printed in our catalogs plus hundreds of online only deals!
In most cases, you will receive our most recent catalog within the next 2 weeks. You can also request a catalog by speaking to one of our agents by calling<PHONE_NUMBER>.


News Web
Navigation Links
Economic Events
Environmental Event
This is the grade we all want.
This is how we get there.
CompanyName
Example
The video tag is not supported by your current browser.