# Less-Pain # Embedded Systems # with Elixir and Nerves ---- ElixirConf US 2018 - 2018-09-04 + 05 Greg Mefford & Tim Mecklem ![GregMefford](img/headshot_glowsticks.jpeg) ![Tim Mecklem](img/tim-mecklem.jpg)
# Thanks, Bleacher Report! ![GregMefford](img/headshot_glowsticks.jpeg) ![Bleacher Report logo](img/BR_Logo_White.png)
# Thanks, Gaslight! ![Tim Mecklem](img/tim-mecklem.jpg) ![Gaslight logo](img/gaslight.jpg)
# 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 * Pre-Burned Firmware! * Project Overview * 10:00 AM - 10:30 AM (0:30) * Break (and help resolve issues)
# Tentative schedule 🕘 * 10:30 AM - 12:00 PM (1:30) * Elixir for Embedded * Nerves Concepts * Streaming Video * Application Structure * Custom Nerves Systems * 12:00 PM - 1:30 PM (1:30) * Lunch (and explore Buildroot)
# Tentative schedule 🕘 * 1:30 PM - 3:00 PM (1:30) * Scanning Barcodes * GraphQL APIs * 3:00 PM - 3:30 PM (0:30) * Break * 3:30 PM - 5:00 PM (1:30) * Adding Phoenix * Phoenix Channels * GraphQL Subscriptions * Play / 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 laptop) * It's technically not fine, but it'll probably be fine * Be gentle with the ribbon cables/connectors
# Eye ![Eye](img/eye.jpg)
# Omni Eye ![Eye](img/omni_eye.jpg)
[https://github.com/GregMefford/omni_eye](https://github.com/GregMefford/omni_eye)
# Streaming Video with *Picam* ![Picam](img/picam.png)
[https://github.com/electricshaman/picam](https://github.com/electricshaman/picam)
# Scanning Barcodes with *Zbar* ![zbar-elixir](img/zbar-elixir.png)
[https://github.com/GregMefford/zbar-elixir](https://github.com/GregMefford/zbar-elixir)
# GraphQL Queries, Mutations # and 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)
# 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.
# *`nerves_init_gadget`* ![USB Gadget Power](img/gadget_power.png)
[https://github.com/nerves-project/nerves_init_gadget](https://github.com/nerves-project/nerves_init_gadget)
# *`nerves_init_gadget`* ![USB Gadget Composite Device](img/gadget_composite.png)
[https://github.com/nerves-project/nerves_init_gadget](https://github.com/nerves-project/nerves_init_gadget)
# *`nerves_init_gadget`* * Config Ethernet and Serial over USB * DHCP Server * mDNS Responder (`nerves.local`) * Manage Erlang Distribution * `mix firmware.push` over SSH * SSH console to IEx prompt
# Try it on your Device ``` bash $ open http://nerves.local/ # Try scanning a barcode (you may need to reload # the browser page after the device boots fully) $ open http://nerves.local/graphiql # Try running a query like: # query { # config { # size { # width # height # } # } # } ```
# 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?
# Elixir 💜 Embedded Notes: * At Code BEAM -> don't need convincing. * Let's talk about _reasons_ BEAM is a good choice, * in case hadn't thought about it * or want to explain it to someone else.
# Elixir 💜 Embedded * *BEAM is Embedded-First* * Baked-In Fault-Tolerance * Light-Weight Concurrency * Binary Pattern-Matching * Integrated IoT Platform
# BEAM is *Embedded-First* ## Ericsson *ADX301* 10 Gbps - 160 Gbps Telecom Switch System ![AXD301](img/ericsson_axd301.png) Notes: * Erlang/OTP born as control plane these telecom switches * Scalable total throughout by adding cards and cabinets * The Erlang part is to control all the ASICs on the data path
# BEAM is *Embedded-First* ## Ericsson *ADX301* Erlang/OTP-powered Control Plane ![AXD301 Control Processor Board](img/ericsson_axd301_cpu.png) Notes: * I wasn't able to find specs on this CPU's speed * I'd guess it's less-powerful than a modern Raspberry Pi * No surprise that we can run powerful embedded systems with Elixir
# Elixir 💜 Embedded * BEAM is Embedded-First * *Baked-In Fault-Tolerance* * Light-Weight Concurrency * Binary Pattern-Matching * Integrated IoT Platform Notes: * OTP brings FT primitives that we don't have to design
![Kevlin Henney](img/kevlin_henney.png) Notes: * Not what they meant by "let it crash." * (fragment): Crash screens c/o Kevlin Henney * There are plenty more where these came from
# Elixir 💜 Embedded * BEAM is Embedded-First * Baked-In Fault-Tolerance * *Light-Weight Concurrency* * Binary Pattern-Matching * Integrated IoT Platform Notes: * BEAM gives us baked-in concurrency primitives * via processes and message-passing
# Light-weight *concurrency* * Lots of tiny processes * Process-level fault-tolerance
4 Cores
96 Cores / 192 Threads
Notes: * Allows us to easily make use of all cores * Whether it's 4 in your Raspberry Pi * Or a bunch of hyper-threaded cores in a server
# Light-weight *concurrency* * Per-Process Garbage-Collection * Immutable Data Structures ![Erlang Memory Model](img/erlang_memory_model.png)
[Hamidreza Soleimani's Blog - Erlang Garbage Collection Details and Why It Matters](https://hamidreza-s.github.io/erlang%20garbage%20collection%20memory%20layout%20soft%20realtime/2015/08/24/erlang-garbage-collection-details-and-why-it-matters.html) Notes: * In particular, I want to look more closely at these two: * Per-process garbage-collection * Immutable data structures
# Elixir 💜 Embedded * BEAM is Embedded-First * Baked-In Fault-Tolerance * Light-Weight Concurrency * *Binary Pattern-Matching* * Integrated IoT Platform Notes: * Binary pattern-mathing is super-cool for embedded
# Elixir 💜 Embedded *Binary* Pattern-Matching ``` elixir def decode(<
>), do: {op, addr, data} # ... decode(<<0b01010101, 0b01010011>>) # => {2, 42, 83} ``` Notes: 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.
# Elixir 💜 Embedded * BEAM is Embedded-First * Baked-In Fault-Tolerance * Light-Weight Concurrency * Binary Pattern-Matching * *Integrated IoT Platform* Notes: * Elixir is also a great choice for an integrated IoT platform.
# Integrated IoT Platform ![Tons of cats](img/cats.png) Notes: This is what it looks like when all your embedded devices decide to connect to your server at once.
# Integrated IoT Platform ![Phoenix Channels](img/channels.png) Notes: * If you want to, you can build a whole stack using Elixir * On the client and the server side
# Integrated IoT Platform ![Phoenix Channels](img/channels_logos.png) Notes: * Using Phoenix and Channels on the back-end * to talk to Elixir and Nerves on a headless device * Or to a JavaScript client running on a kiosk-style device
# Options for Embedding Elixir ![Platform Logos](img/platform_logos.png) Notes:
![Raspbian logo](img/logos_raspbian.png) ![Elixir logo](img/logos_elixir.png) ![Windows logo](img/logos_windows.png) * Well of course that works... * Deployment / Packaging * Administration * Long boot times * Read/Write filesystem Notes:
# GRiSP * Bare-metal BEAM 🤘 * Purpose-built hardware * Real-time ![GRiSP Board](img/grisp_board.png) Notes:
![Nerves Sticker](img/nerves_sticker.png) Craft and deploy bulletproof embedded software in Elixir Notes:
![Nerves Sticker](img/nerves_sticker.png) * Minimal Linux with Buildroot * Commodity or custom hardware * BEAM as "operating system" * Read-only filesystem * Firmware artifacts Notes:
# 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 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.
# Nerves 💜 Elixir ```bash $ mix nerves.new # Start a Project $ mix deps.get # Download Artifacts $ mix firmware # Cross-Compile your Code $ mix firmware.burn # Burn your SD card # ... or ... $ mix firmware.push # Remote Firmware Update ```
# Overwhelmingly # *welcoming* and *helpful* # community ![Welcome to Nerves](img/nerves_welcome.png) Notes: So I decided to focus on building a welcoming and helpful community around Nerves. For example, I started to manually and individually welcome each new person to our Slack channel and invite them to get involved.
Notes: The community has grown a lot. We have over 1500 members in our Slack channel today. I see that as the tip of the iceberg. There are probably many more people that we never hear from because they don't use Slack. We've recently been working on having a stronger presence in other spaces like the Elixir Forum and Stack Overflow so that we can do better at meeting people where they are.
# You *Can* Contribute ![Nerves](img/nerves_sticker.png) Notes:
# Wanted to *get involved* ## Even though I was *new to Elixir* Notes: I really wanted to get more involved in the Nerves project, even though I was pretty new to Elixir at the time.
# Wanted to *get involved* ## ~~Even though I was new to Elixir~~ ## *Because* I was new to Elixir Notes: And when I thought about it, I realized that I had something to contribute to the project _because_ I was new to Elixir.
# 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/)
# Poncho Style ``` bash $ mkdir omni_eye && cd omni_eye $ mix new eye --sup $ mix phx.new eye_ui --no-ecto $ mix nerves.new eye_fw --init-gadget ``` ``` bash omni_eye ├── eye ├── eye_fw └── eye_ui ```
# *Fake Camera* for Dev and Test ``` elixir # eye/config/config.exs config :picam, camera: Picam.FakeCamera ``` ``` elixir # eye_ui/config/config.exs config :picam, camera: Picam.FakeCamera ``` ``` elixir # eye_fw/config/host.exs config :picam, camera: Picam.FakeCamera ```
# *Real Camera* on Target Device ``` elixir # eye_fw/config/rpi0_zbar.exs config :picam, camera: Picam.Camera ```
# `eye` Application in `iex` ![iex barcodes](img/iex_scan_barcode.png)
# `eye_ui` Application in `iex` ![GraphiQL](img/graphiql_mutation.png) ![mutation debug in iex](img/iex_mutation.png)
# Step 1 - Getting Started
# 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 --init-gadget ```
# 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 ```
# Try it in `iex` ``` bash $ cd eye $ mix deps.get $ iex -S mix ``` ![iex camera](img/step1_iex_camera.png)
# *`nerves_init_gadget`* * Config Ethernet and Serial over USB * DHCP Server * mDNS Responder (`nerves.local`) * Manage Erlang Distribution * `mix firmware.push` over SSH * SSH console to IEx prompt
``` 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)
# Try it on your Device ``` bash # Plug in the USB cable and wait about 15 seconds $ open http://nerves.local ``` ![USB cable](img/hardware_assembly_08.jpg) ![Infinity Tunnel](img/eye_tunnel.png)
# SSH to IEx Console ``` bash # This will auth with the SSH key # you configured in your firmware $ ssh nerves.local # To exit, type
~. ```
# Serial IEx Console ``` bash # On OSX: $ picocom /dev/tty.usbmodem
# On Linux (probably): $ picocom /dev/ttyACM0 # To exit, type CTRL-A CTRL-X ```
# RingLogger ``` elixir # Similar to tail -f iex> RingLogger.attach # Similar to cat /var/log/messages iex> RingLogger.tail # Search for something iex> RingLogger.grep(~r/[Nn]eedle/) 16:55:41.614 [info] Needle in a haystack ```
# RingLogger ``` elixir # Process log messages with Elixir iex> RingLogger.get() [ debug: {Logger, "8", {{2018, 2, 5}, {17, 44, 7, 675}}, [ pid: #PID<0.139.0>, application: :example, module: Example, function: "log/1", file: "ring_logger/example/lib/example.ex", line: 11 ]}, # ... ] ```
# Step 2 - 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)
# Scanning Barcodes with *`zbar`* ![zbar-elixir](img/zbar-elixir.png)
[https://github.com/GregMefford/zbar-elixir](https://github.com/GregMefford/zbar-elixir)
# 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 omni_eye directory $ cd ../.. $ git clone https://github.com/nerves-project/nerves_system_rpi0.git $ mv nerves_system_rpi0{,_zbar} $ cd nerves_system_rpi0_zbar $ mix deps.get $ mix nerves.system.shell ``` ![system shell](img/sys_shell_01.png)
``` bash Nerves /nerves/build > make savedefconfig Nerves /nerves/build > exit ```
# 🎶 If you *liked* it then # you should have put # a *tag* on it 🎶 ``` bash $ mix nerves.artifact ``` ![Custom system Artifact](img/custom_system_artifact.png)
# *`rootfs_overlay`* ## Do you Need a Custom System? ``` elixir # eye_fw/config/config.exs config :nerves, :firmware, rootfs_overlay: "rootfs_overlay" ```
# Try it on your Device
``` bash $ cd ../omni_eye/eye_fw $ export MIX_TARGET=rpi0_zbar $ mix deps.get $ mix firmware # Assuming your device is still connected $ mix firmware.push nerves.local ``` ![mix firmware push](img/firmware_push.png)
# Lunch: 12:00 to 1:30 AM * Poke around in the Buildroot menus * Brainstorm projects * How is the pace? * Any questions?
# Step 3 - Let's 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.
# Test images * 1920_1080.jpg * 1280_720.jpg * 640_480.jpg ![test image](img/1280_720.jpg)
# Try it in `iex` If you want to try it on your laptop you'll need `libjpeg` and `zbar` installed. ``` bash # NOTE: the zbar package brings in a bunch of # other stuff, including imagemagick $ brew install libjpeg zbar ```
# 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 nerves.local ```
# SSH to IEx Console ``` bash # This will auth with the SSH key # you configured in your firmware $ ssh nerves.local # To exit, type
~. ```
# Serial IEx Console ``` bash # On OSX: $ picocom /dev/tty.usbmodem
# On Linux (probably): $ picocom /dev/ttyACM0 # To exit, type CTRL-A CTRL-X ```
``` bash $ watch curl -s http://nerves.local/barcodes.json ``` ![watch barcodes](img/step3_watch_barcodes.png)
# Step 4 - 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.
# 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 nerves.local # On OSX: $ picocom /dev/tty.usbmodem
# On Linux (probably): $ picocom /dev/ttyACM0 ```
# Break from 3:00 to 3:30 PM * How is the pace? * Any questions? * Think about a project * Mingle in the hall * Get a snack, maybe?
# Phoenix
# 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)
# 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 $ npm install -g brunch $ 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 nerves.local # On OSX: $ picocom /dev/tty.usbmodem
# On Linux (probably): $ picocom /dev/ttyACM0 ```
# 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.
# 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 nerves.local # On OSX: $ picocom /dev/tty.usbmodem
# On Linux (probably): $ picocom /dev/ttyACM0 ```
# Exercise / Lab Time
## Have Fun with Nerves! 💜 ![GregMefford](img/headshot_glowsticks.jpeg) ![Nerves Logo](img/nerves_logo.png) ![Tim Mecklem](img/tim-mecklem.jpg) Greg Mefford (@ferggo) Tim Mecklem (@tim_mecklem) Nerves (@NervesProject)


Served as teaching assistant leading team of 20+ students in daily
code challenges in JS, Python, React, and Node
Provided daily feedback and issue resolution of all curriculum
through slack help channel or code review
Delivered one-on-one feedback and code review on a weekly basis
Led a team of 20 students that emulates a real work environment
using the agile methodology
Mentored students on how to learn effectively and solve
programming problems.
Led daily standup meetings to build camaraderie, facilitate the
sharing of ideas and work progress, and provide guidance for that
week’s study material
Led a team of 20 students through full product development
lifecycle over 8-week project unit, including product releases,
debugging, code reviews, and stakeholder management
Delivered supplemental lectures on various topics related to
software engineering
Star Nutrition Software-Developer Internship 6/18 - 12/18
Implement responsible web design principles to ensure that our
company website renders well across multiple devices
Monitor website performance, watch for traffic drops related to
site usability problems and rectify the issues
Review app and feature coding and plan future website upgrades
with the development team
Assist in the development of applications and features that will
be put on the website and in internal functions as well
Creating/Maintaining websites using standard HTML/CSS/SCSS
/JS/BootStrap practices
Creating/Maintaining Applications using React
Creating maintaining servers and Data bases with SQL
Department of Defense Combat Medic 10/12 - 10/16
Maintain superior physical condition
Administer emergency medical treatment to battlefield casualties
Assist with outpatient and inpatient care and treatment
Instruct Soldier's on Combat Lifesaver/First Responder training
course
Manage Soldier's medical readiness, medical supplies and equipment
Perform constant readiness TRD's to ensure compliance with all
army standards


Yemen
| million |
| million |
| million |
|
3.20
billion
|
The boundaries and names shown and the designations used on this map do not imply official endorsement or acceptance by the United Nations.


Thank you for creating an account at Questizzle.
Please click the following link to confirm your account.


Django Events 0.6b1 documentation
This view is for displaying meta_data about calendars. Upcoming events, Name, description and so on and so forth. It should be noted that this is probably not the best view for displaying a calendar in a traditional sense, i.e. displaying a month calendar or a year calendar, as it does not equip the context with any period objects. If you would like to do this you should use calendar_by_period.
This is the template that will be rendered
This view is for getting a calendar, but also getting periods with that calendar. Which periods you get, is designated with the list periods. You can designate which date you the periods to be initialized to by passing a date in request.GET. See the template tag query_string_for_date
This is the template that will be rendered
This is a list of Period Subclasses that designates which periods you would like to instantiate and put in the context
this is a dictionary that returns the periods from the list you passed in. If you passed in Month and Day, then your dictionary would look like this
{
'month': <schedule.periods.Month object>
'day': <schedule.periods.Day object>
}
So in the template to access the Day period in the context you simply use periods.day.
This view is for showing an event. It is important to remember that an event is not an occurrence. Events define a set of reccurring occurrences. If you would like to display an occurrence (a single instance of a recurring event) use occurrence.
This is the template that will be rendered
This view is used to display an occurrence. There are two methods of displaying an occurrence.
from here you need a way to distinguish the occurrence and that involves
or it requires a distinguishing datetime as designated by the keywords below. This should designate the original start date of the occurrence that you wish to access. Using get_absolute_url from the Occurrence model will help you standardize this.
This is the template that will be rendered
This view is used to edit an occurrence.
from here you need a way to distinguish the occurrence and that involves
or it requires a distinguishing datetime as designated by the keywords below. This should designate the original start date of the occurrence that you wish to access. Using get_edit_url from the Occurrence model will help you standardize this.
This is the template that will be rendered
This view is used to cancel and occurrence. It is worth noting that canceling an occurrence doesn’t stop it from being in occurrence lists or being persisted, it just changes the cancelled flag on the instance. It is import to check this flag when listing occurrences.
Also if this view is requested via POST, it will cancel the event and redirect. If this view is accessed via a GET request it will display a confirmation page.
from here you need a way to distinguish the occurrence and that involves
or it requires a distinguishing datetime as designated by the keywords below. This should designate the original start date of the occurrence that you wish to access. Using get_cancel_url from the Occurrence model will help you standardize this.
This is the template that will be rendered, if this view is accessed via GET
This is the url you wish to be redirected to after a successful cancelation
This view is used for creating or editing events. If it receives a GET request or if given an invalid form in a POST request it will render the template, or else it will redirect.
This is the template that will be rendered
This view is for deleting events. If the view is accessed via a POST request it will delete the event. If it is accessed via a GET request it will render a template to ask for confirmation.
This is the template that will be rendered
if you want to require a login before deletion happens you can set that here


This section provides the steps required to prepare for debugging with the probe.
Prerequisites
The debugger software is installed.
Procedure
| Note | |
|
The probes can require some time to establish the network connection, especially when using DHCP. The heartbeat LED blinks green when the probe is ready for use. For information on the LED indicators, see LEDs on Sourcery Probe Professional. |
|
You are now ready to begin your debug session. Refer to the debugger documentation for information on using the debugger.


General information about AC/DC converters can be found at the AC/DC converter concept
| Name | Description |
|---|---|
| Control | Control components for rectifiers |
| DiodeBridge2Pulse | Two pulse Graetz diode rectifier bridge |
| ThyristorBridge2Pulse | Two pulse Graetz thyristor rectifier bridge |
| HalfControlledBridge2Pulse | Two pulse Graetz half controlled rectifier bridge |
| DiodeCenterTap2Pulse | Two pulse diode rectifier with center tap |
| ThyristorCenterTap2Pulse | Two pulse thyristor rectifier with center tap |
| DiodeCenterTapmPulse | m pulse diode rectifier with center tap |
| ThyristorCenterTapmPulse | m pulse thyristor rectifier with center tap |
| DiodeBridge2mPulse | 2*m pulse diode rectifier bridge |
| ThyristorBridge2mPulse | 2*m pulse thyristor rectifier bridge |
| HalfControlledBridge2mPulse | 2*m pulse half controlled rectifier bridge |
| DiodeCenterTap2mPulse | 2*m pulse diode rectifier with center tap |
| ThyristorCenterTap2mPulse | 2*m pulse thyristor rectifier with center tap |


COMBO 1
|
Price:
$800.00
Free Installation * For info about how to purchase this item, please contact us from the contact form above. Remember to include the name of this product in your message. All items marked as 'Free Installation' will need to qualify with our conditions * * The area must meet the technician's installation standard requirements. i.e. The area must be easily accessible. For more info and for actual assessment, please contact us using the contact form about. |
Micron Alarm : $800.00 Free Installation (Condition Apply)
Scorpion Z6020C Pac
1x Scorpion Z6020C control & LED keypad
1x Mini micro intelligent siren
1x Piezo
1x 7 A/hr battery
2x iQ60 digital wide angle Pet PIR's
Scorpion Z6020C Pac
1x Scorpion Z6020C control & LED keypad
1x Mini micro intelligent siren
1x Piezo
1x 7 A/hr battery
2x iQ60 digital wide angle Pet PIR's


Zip Code Input
Zips are allowed in one of the following formats
12345
12345 1234
12345-1234
Enter valid zip code:
Zipcode is invalid


---
layout: post
title: IE 8 Filter Style + Heroku Rake Asset Pre-Compile Error
date: 2013-01-21 19:47:00.000000000 -05:00
comments: true
categories: []
published: true
---
If you are getting an error that looks like this:
could not connect to server: Connection refused Is the server running on host "<IP_ADDRESS>" and accepting TCP/IP connections on port xxxx?
...when pushing your Rails 3.2+ app to Heroku, there could be two problems at play.
If that is all that you are seeing, then it likely means that Heroku is trying to initialize your app when it does `rake asset:precompile`. The issue is that there is no DB configured in a `non-initialized` state, so Heroku throws a fit.
To fix that, they have a nice
guide here (which basically involves just adding 1 line to your `config/application.rb` file).
However, if you are seeing something like this:
Running: rake assets:precompile
rake aborted!
Invalid CSS after "...: alpha(opacity": expected comma, was ":0);"
(in /tmp/build_1lypjy898u7o0/app/assets/stylesheets/application.css.scss) (sass):3665
Then it is very likely that you have another issue.
Apparently, the common css style rule that is used to apply an opacity filter to CSS objects in IE8 and below is illegal syntax.
Meaning that: `filter: alpha(opacity:0);` is an illegal CSS rule. As a result of that, SASS throws an error when it's parser comes across these rules - which causes the entire precompile process to fail.
It is apparently a
problem discussed and addressed in Rails before, but given that it is a SASS issue - and also that it involves illegal CSS syntax - the Rails maintainers have decided not to do anything to allow this call (understandably so).
So...the simple fix is to comment out all occurrences of that call in your stylesheets. IE9 allows the regular, `opacity: 0;`, I believe - so you should be fine for all browsers in the future.
An easy way to test this further, locally, is just to create a new git branch and run 'rake asset:precompile'. You will see the errors it generates locally and you can work your way through it like that.
However, I went through many different solutions and commenting them out - turned out to be the easiest.
Let me know if you come up with any other solutions.


TDChangeTracker Class Reference
| Inherits from | NSObject |
| Conforms to | NSStreamDelegate |
| Declared in | TDChangeTracker.h |
Overview
Reads the continuousmode _changes feed of a database, and sends the individual change entries to its client’s -changeTrackerReceivedChange:.
This class is abstract. Instantiate TDConnectionChangeTracker instead.
Tasks
-
– initWithDatabaseURL:mode:conflicts:lastSequence:client:
-
databaseURL
property -
databaseName
property -
changesFeedURL
property -
lastSequenceID
property -
error
property -
client
property -
requestHeaders
property -
authorizer
property -
mode
property -
filterName
property -
filterParameters
property -
limit
property -
heartbeat
property -
– start
-
– stop
-
– retry
Asks the tracker to retry connecting, if it’s currently disconnected but waiting to retry.
This should be called when the reachability of the remote host changes, or when the app is reactivated.
-
changesFeedPath
property -
– setUpstreamError:
-
– failedWithError:
-
– receivedPollResponse:errorMessage:
-
– stopped
Instance Methods
initWithDatabaseURL:mode:conflicts:lastSequence:client:
- (id)initWithDatabaseURL:(NSURL *)databaseURL mode:(TDChangeTrackerMode)mode conflicts:(BOOL)includeConflicts lastSequence:(id)lastSequenceID client:(id<TDChangeTrackerClient>)client
receivedPollResponse:errorMessage:
- (NSInteger)receivedPollResponse:(NSData *)body errorMessage:(NSString **)errorMessage
retry
Asks the tracker to retry connecting, if it’s currently disconnected but waiting to retry.
This should be called when the reachability of the remote host changes, or when the
app is reactivated.
- (void)retry
Discussion
Asks the tracker to retry connecting, if it’s currently disconnected but waiting to retry.
This should be called when the reachability of the remote host changes, or when the
app is reactivated.
Declared In
TDChangeTracker.h


--- layout: post permalink: allpetsconsidered.html Tags: Array NameOfCoupon: All Pets Considered Cash Back Summary: See our All Pets Considered Coupon Code, All Pets Considered Rebate, All Pets Considered Promo Code, All Pets Considered Discount, All Pets Considered Coupon Cash Back Rebate here. MetaKeywords: All Pets Considered Coupon Code, All Pets Considered Rebate, All Pets Considered Promo Code, All Pets Considered Cash Back Rebate, All Pets Considered Discount, All Pets Considered Coupon Image: images/20493.jpg LinkURL: http://www.shareasale.com/r.cfm?b=156726&u=412002&m=20493 affiliate_url_link: http://www.icouponblog.com/jane.php?id=1395 thesis_readmore: See the All Pets Considered Coupon thesis_thumb: http://www.icouponblog.com/tn.php?merchantURL=allpetsconsidered.com Title: Save 6% - All Pets Considered Coupon Code for allpetsconsidered.com. All Pets Considered Rebate & Discount thesis_description: Our All Pets Considered Discount Coupon Code for allpetsconsidered.com. We have the best All Pets Considered Rebate anywhere. thesis_keywords: All Pets Considered, All Pets Considered Coupon Code, All Pets Considered Discount, All Pets Considered Rebate product_name: All Pets Considered hop_url: http://www.icouponblog.com/hop.php?id=1395 ---
Are you looking for great products for your cats or dogs? Visit All Pets Considered online. You will find lots of high quality products for your cats and dogs. All Pets Considered searches tirelessly for superior products for your pets so you don’t have to. Visit All Pets Considered and find hundreds of pet products in one place. You can find beds, pet treats, toys, hand free leashes, flea and tick collars and lots of other useful products. You can also find pet lover presents. Use our discount coupons to get the best deals on All Pets Considered.
All Pets Considered is a great place to look for all cat and dog products. If you are looking for comfortable and luxurious beds for your cats or dogs, apparel, stylish collars, bowls, grooming supplies etc check out All Pets Considered. You will find very good and useful products at a great discount. If you have a cat you will love what you see on All Pets Considered. Buy your cat Rosie the rat a toy that will keep her active and energetic. Get her an easy to use litter box. Get everything in one place at a great place.
All Pets Considered has the perfect products for your cats and dogs. Check it out you and your pets will both be very happy.  Use our cash back rebate coupons for great deals on All Pets Considered.


Vanderbilt Accelerator
Nashville, TNWorked with multiple companies, ranging from Fortune 500 to local small businesses, and their CEOs on large-scale project planning to drastically shift their business paradigm.
Worked with multiple companies, ranging from Fortune 500 to local small businesses, and their CEOs on large-scale project planning to drastically shift their business paradigm.
Helped build sustainable living situations for local residents of Northern Ireland. Worked with civil engineers to find Green solutions for the future.


+91<PHONE_NUMBER>
<EMAIL_ADDRESS>Food Menu
Offers
Near By
Gift Cards
About Us
WARNING: THIS OFFER VALID ONLY FOR 3 DAYS
PIZZA KING COUPON CODES,OFFERS AND DEALS
2 pizza's @ 99/-
Select any two regular pizza's of worth
165/-
99/-
only
Avail Now
2 pizza's @ 108/-
Select any two regular pizza's of worth
199/-
108/-
only
Avail Now
2 pizza's @ 180/-
Select any two medium pizza's of worth
270/-
180/-
only
Avail Now
2 pizza's @ 180/-
Select any two medium pizza's of worth
289/-
180/-
only
Avail Now
2 pizza's @199 /-
Select any two medium pizza's of worth
285/-
199/-
only
Avail Now
2 pizza's @ 199/-
Select any two medium pizza's of worth
299/-
199/-
only
Avail Now
2 pizza's @ 236/-
Select any two large pizza's of worth
380/-
236/-
only
Avail Now
2 pizza's @ 236/-
Select any two large pizza's of worth
399/-
236/-
only
Avail Now
2 pizza's @ 270/-
Select any two large pizza's of worth
420/-
270/-
only
Avail Now
2 pizza's @ 270/-
Select any two large pizza's of worth
439/-
270/-
only
Avail Now


| Opcode | Instruction | Op/En | 64-Bit Mode | Compat/Leg Mode | Description |
|---|---|---|---|---|---|
| NP 0F 77 | EMMS | ZO | Valid | Valid | Set the x87 FPU tag word to empty. |
| Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
| ZO | NA | NA | NA | NA |
Sets the values of all the tags in the x87 FPU tag word to empty (all 1s). This operation marks the x87 FPU data registers (which are aliased to the MMX technology registers) as available for use by x87 FPU floating-point instructions. (See Figure 8-7 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for the format of the x87 FPU tag word.) All other MMX instructions (other than the EMMS instruction) set all the tags in x87 FPU tag word to valid (all 0s).
The EMMS instruction must be used to clear the MMX technology state at the end of all MMX technology procedures or subroutines and before calling other procedures or subroutines that may execute x87 floating-point instructions. If a floating-point instruction loads one of the registers in the x87 FPU data register stack before the x87 FPU tag word has been reset by the EMMS instruction, an x87 floating-point register stack overflow can occur that will result in an x87 floating-point exception or incorrect result.
EMMS operation is the same in non-64-bit modes and 64-bit mode.
x87FPUTagWord ← FFFFH;
void _mm_empty()
None
| #UD | If CR0.EM[bit 2] = 1. |
| #NM | If CR0.TS[bit 3] = 1. |
| #MF | If there is a pending FPU exception. |
| #UD | If the LOCK prefix is used. |
Same exceptions as in protected mode.
Same exceptions as in protected mode.
Same exceptions as in protected mode.
Same exceptions as in protected mode.


United Auto Workers approve new 4-year contract with Ford
by EndPlayDETROIT (AP) - Members of the United Auto Workers union at Ford Motor Co. voted Friday to approve a new contract with the company.
The union said in a statement that 56.3% of workers who voted were in favor of the deal.
The four-year agreement reached Oct. 31 gives workers a mix of pay raises and lump-sum payments as well as a $9,000 ratification bonus. The company also promises $6 billion in U.S. factory investments. Ford gets to close an engine factory near Detroit but its 600 workers there will get jobs at a nearby plant.
Acting Union President Rory Gamble called the agreement "life changing" for workers and said it eliminates perpetual temporary employees and different wage tiers for workers doing the same jobs. Ford said the deal increases its competitiveness, keeping its cost structure similar to its U.S.-based competitors. It also secures 8,500 U.S. hourly jobs.
The contract will cost Ford $700 million in the fourth quarter, mainly to pay ratification bonuses to its 55,000 hourly workers.
Union spokesman Brian Rothenberg said Friday night he did not have vote totals.
The deal is similar to one ratified by General Motors workers after a bitter 40-day strike this fall.
On Monday, the union will focus bargaining on Fiat Chrysler, the last of the Detroit Three automakers to settle.


The jQuery Youtube Player plugin builds a custom youtube video player, toolbar and playlist area.
If you notice the plugin is working as expecting, or would like to request new features, please use the issue tracker.
Tested on: FF3.6; IE 6, 7 and 8; Chrome 7; Safari 5
View the source files on github.
Send emails to willis.rh@gmail.com


Regular expression for matching file names, with or without extension.
Install with npm:
$ npm install --save filename-regex
var regex = require('filename-regex');
'a/b/c/d.min.js'.match(regex());
//=> match[0] = 'd.min.js'
'a/b/c/.dotfile'.match(regex());
//=> match[0] = '.dotfile'
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
(This project's readme.md is generated by verb, please don't edit the readme directly. Any changes to the readme must be made in the .verb.md readme template.)
To generate the readme, run the following command:
$ npm install -g verbose/verb#dev verb-generate-readme && verb
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
$ npm install && npm test
Jon Schlinkert
Copyright © 2017, Jon Schlinkert. Released under the MIT License.
This file was generated by verb-generate-readme, v0.4.3, on April 28, 2017.


Davis Cup camp in Delhi from November 21
The tie between India and Pakistan is to be held at Nur Sultan in Kazakhstan
by Special CorrespondentThe Indian Davis Cup team will assemble at the DLTA Complex here for three days of training from November 21, before departing on November 24 for the Asia-Oceania tie against Pakistan to be hosted by Kazakhstan at Nur Sultan on November 29 and 30.
The International Tennis Federation (ITF) had confirmed that the tie would be held at a neutral venue, which had been decided as Kazakhstan earlier itself.
The tie will be played on indoor hard courts. The Indian team will have physiotherapists Anand Dubey and Yash Pandey, with Sunder Iyer as the manager.
As announced earlier, Rohit Rajpal will be the non-playing captain and Zeeshan Ali will continue as the coach.
Sumit Nagal, Ramkumar Ramanathan, Saketh Myneni, Sasi Kumar Mukund, Leander Paes and Jeevan Nedunchezhiyan will be travelling for the tie, along with Sidharth Rawat as the reserve.
Even though he will not be travelling for the tie, Sriram Balaji may assist the team during the three-day training camp in Delhi.
Since, Sasi Kumar Mukund has entered the €46,600 Challenger in Mai, Portugal, this week, he may join the team later, while the rest are scheduled to assemble in the Capital by Wednesday evening.


| Package | Description |
|---|---|
| org.apache.sysds.hops | |
| org.apache.sysds.hops.codegen | |
| org.apache.sysds.parser | |
| org.apache.sysds.parser.dml | |
| org.apache.sysds.runtime.controlprogram |
| Modifier and Type | Class and Description |
|---|---|
class |
AggBinaryOp |
class |
AggUnaryOp |
class |
BinaryOp |
class |
DataGenOp
A DataGenOp can be rand (or matrix constructor), sequence, and sample -
these operators have different parameters and use a map of parameter type to hop position.
|
class |
DataOp
A DataOp can be either a persistent read/write or transient read/write - writes will always have at least one input,
but all types can have parameters (e.g., for csv literals of delimiter, header, etc).
|
class |
DnnOp |
class |
FunctionOp
This FunctionOp represents the call to a DML-bodied or external function.
|
class |
Hop |
class |
IndexingOp |
class |
LeftIndexingOp |
class |
LiteralOp |
class |
MultiThreadedHop
Optional hop interface, to be implemented by multi-threaded hops.
|
class |
NaryOp
The NaryOp Hop allows for a variable number of operands.
|
class |
ParameterizedBuiltinOp
Defines the HOP for calling an internal function (with custom parameters) from a DML script.
|
class |
QuaternaryOp
Note: this hop should be called AggQuaternaryOp in consistency with AggUnaryOp and AggBinaryOp;
however, since there does not exist a real QuaternaryOp yet - we can leave it as is for now.
|
class |
ReorgOp
Reorg (cell) operation: aij
Properties:
Symbol: ', rdiag, rshape, rsort
1 Operand (except sort and reshape take additional arguments)
Semantic: change indices (in mapper or reducer)
NOTE MB: reshape integrated here because (1) ParameterizedBuiltinOp requires name-value pairs for params
and (2) most importantly semantic of reshape is exactly a reorg op.
|
class |
TernaryOp
Primary use cases for now, are
quantile (<n-1-matrix>, <n-1-matrix>, <literal>): quantile (A, w, 0.5)
quantile (<n-1-matrix>, <n-1-matrix>, <scalar>): quantile (A, w, s)
interquantile (<n-1-matrix>, <n-1-matrix>, <scalar>): interquantile (A, w, s)
Keep in mind, that we also have binaries for it w/o weights. |
class |
UnaryOp |
| Modifier and Type | Method and Description |
|---|---|
void |
Hop.setParseInfo(ParseInfo parseInfo)
Set parse information.
|
| Modifier and Type | Class and Description |
|---|---|
class |
SpoofFusedOp |
| Modifier and Type | Class and Description |
|---|---|
class |
AssignmentStatement |
class |
BinaryExpression |
class |
BooleanExpression |
class |
BooleanIdentifier |
class |
BuiltinFunctionExpression |
class |
ConditionalPredicate |
class |
ConstIdentifier |
class |
DataExpression |
class |
DataIdentifier |
class |
DoubleIdentifier |
class |
Expression |
class |
ExpressionList |
class |
ForStatement |
class |
ForStatementBlock |
class |
FunctionCallIdentifier |
class |
FunctionStatement |
class |
FunctionStatementBlock |
class |
Identifier |
class |
IfStatement |
class |
IfStatementBlock |
class |
ImportStatement |
class |
IndexedIdentifier |
class |
IntIdentifier |
class |
IterablePredicate |
class |
MultiAssignmentStatement |
class |
OutputStatement |
class |
ParameterizedBuiltinFunctionExpression |
class |
ParForStatement
This ParForStatement is essentially identical to a ForStatement, except an extended
toString method for printing the 'parfor' keyword.
|
class |
ParForStatementBlock
This ParForStatementBlock is essentially identical to a ForStatementBlock, except an extended validate
for checking/setting optional parfor parameters and running the loop dependency analysis.
|
class |
PathStatement |
class |
PrintStatement |
class |
RelationalExpression |
class |
Statement |
class |
StatementBlock |
class |
StringIdentifier |
class |
WhileStatement |
class |
WhileStatementBlock |
| Modifier and Type | Method and Description |
|---|---|
static ParseInfo |
ParseInfo.ctxAndFilenameToParseInfo(org.antlr.v4.runtime.ParserRuleContext ctx,
String fname) |
| Modifier and Type | Method and Description |
|---|---|
static DataExpression |
DataExpression.getDataExpression(String functionName,
ArrayList<ParameterExpression> passedParamExprs,
ParseInfo parseInfo,
CustomErrorListener errorListener) |
void |
Statement.setParseInfo(ParseInfo parseInfo)
Set parse information.
|
void |
Expression.setParseInfo(ParseInfo parseInfo)
Set parse information.
|
void |
StatementBlock.setParseInfo(ParseInfo parseInfo)
Set parse information.
|
| Modifier and Type | Method and Description |
|---|---|
void |
CustomErrorListener.validationError(ParseInfo parseInfo,
String msg) |
| Modifier and Type | Class and Description |
|---|---|
class |
BasicProgramBlock |
class |
ForProgramBlock |
class |
FunctionProgramBlock |
class |
IfProgramBlock |
class |
ParForProgramBlock
The ParForProgramBlock has the same execution semantics as a ForProgamBlock but executes
the independent iterations in parallel.
|
class |
ProgramBlock |
class |
WhileProgramBlock |
| Modifier and Type | Method and Description |
|---|---|
void |
ProgramBlock.setParseInfo(ParseInfo parseInfo)
Set parse information.
|
Copyright © 2021 The Apache Software Foundation. All rights reserved.


A quick glimpse of my anxious mind
What must I do now?
What more must I overcome?
What still is unseen?
Lately I spent a lot of time learning guitar. I used to not know a single thing about playing. But I got my hands on one and now I spend a good 20 minutes a day practicing.
Reading is always a good hobby. But for me the book has to be entertaining or I risk falling asleep. I had to have a glass of water while reading "Richest Man in Babylon" or I would've clocked out
I love to travel. I've been to Japan, Korea, China, the Philippines, England, France, and Italy. I do want to go to Africa and a Safari someday
| Monday | Tuesday | Wednesday | Thursday | Friday | ||
|---|---|---|---|---|---|---|
| 11:00 | ART 1350 | ART 1350 | ||||
| 11:30 | CS 3240 | CS 3240 | ||||
| 12:00 | ||||||
| 12:30 | ||||||
| 1:00 | CS 2550 | CS 2550 | ||||
| 1:30 | ||||||
| 2:00 | ||||||
| 2:30 | BIOL-101H | |||||
| 3:00 | Workout | |||||
| 3:30 | ||||||
| 4:00 | HONR 100R | |||||
| 4:30 | ||||||
| 5:00 | ||||||
| 5:30 | ||||||
| 6:00 | ||||||
| 6:30 | ||||||
| 7:00 | ||||||
| 7:30 | ||||||
| 8:00 | HONR 150R | |||||
| 8:30 | Guitar Practice | |||||
| 9:00 |


Testing one of the builds (check URL or page title for which).
The Reset button should move the slider to the middle.
Moving this slider should update the label.
This slider should have a matching axis.
This is a date slider!
The handle should be on top of the axis
This slider has a massive channel and a small handle
This slider has a small channel and a massive handle
This slider has the same handle size and channel height, and generous margins for its start and end labels
Same as above but with start and end labels positioned below
This slider is effectively a toggle switch
This slider is drawn in an existing SVG
This slider has a rectangular channel
The channel and handle colours change when you toggle the switch


Some versions of the Python interpreter support editing of the current input line and history substitution, similar to facilities found in the Korn shell and the GNU Bash shell. This is implemented using the GNU Readline library, which supports various styles of editing. This library has its own documentation which we won’t duplicate here.
Completion of variable and module names is
automatically enabled
at interpreter startup so that the Tab key invokes the completion
function; it looks at Python statement names, the current local variables,
and the available module names. For dotted expressions such as
string.a
, it will evaluate the expression up to the final
'.'
and then suggest completions from the attributes of the
resulting object. Note that this may execute application-defined code if
an object with a
getattr()
method is part of the expression. The default configuration also saves
your history into a file named .python_history
in your user
directory. The history will be available again during the next interactive
interpreter session.
This facility is an enormous step forward compared to earlier versions of the interpreter; however, some wishes are left: It would be nice if the proper indentation were suggested on continuation lines (the parser knows if an indent token is required next). The completion mechanism might use the interpreter’s symbol table. A command to check (or even suggest) matching parentheses, quotes, etc., would also be useful.
One alternative enhanced interactive interpreter that has been around for quite some time is IPython, which features tab completion, object exploration and advanced history management. It can also be thoroughly customized and embedded into other applications. Another similar enhanced interactive environment is bpython.
15. Floating Point Arithmetic: Issues and Limitations
©
Copyright
2001-2021, Python Software Foundation.
The Python Software Foundation is a non-profit corporation.
Please donate.
Last updated on May 30, 2021.
Found a bug?
Created using Sphinx 2.4.4.


Nigerians React As Mompha Sues EFCC
by Oladipo AbiolaMompha Sues EFCC
The news of the human rights suit filed by Mompha against the Economic and Financial Crimes Commission (EFCC) has generated a lot of buzz on the social media space.
Instagram celebrity, Mompha, whose real name is Ismaila Mustapha was arrested by the EFCC in October for alleged internet fraud and money-laundering, Naija News recalls.
He was arrested on Friday, October 18, 2019, at the Nnamdi Azikiwe International Airport, Abuja, Nigeria’s capital, on his way to Dubai, United Arab Emirates, following series of intelligence reports received by the Commission and has remained in custody since then.
However, as earlier reported by this online medium, Mompha on Thursday, slammed a fundamental human rights enforcement suit against the EFCC for detaining him beyond the constitutionally stipulated days.
This development has attracted a lot of reactions from Nigerians, particularly on social media. See some Twitter reactions below:


{% load staticfiles %}
Walk the red planet alongside your favorite little robots. Get ready for some fun in the sun and the dirt and the dust... the dust goes on in every direction forever. Mars is devoid of life!
Github: https://github.com/WillWeatherford
LinkedIn: https://www.linkedin.com/in/willweatherford1
Email<EMAIL_ADDRESS>Github: https://github.com/muniri92
LinkedIn: https://www.linkedin.com/in/muniribrahim
Email: mibrah04@gmail.com


- What is this service?
- How do I use this service?
- Is there another way to contact Congress?
- What are some tips on communicating with Congress?
- Why can I only select the three titles: Mr., Mrs. and Ms.?
- Why isn't my message being sent?
- Who made this?
- How can I get involved?
What is this service?
Members of Congress don’t have official emails for the public to use, but they do have forms. This service makes navigating their complex contact forms as easy as emailing them. It allows you to contact them via email after you fill out your information just once.
How do I use this service?
Get started simply by sending a message to your representatives to<EMAIL_ADDRESS>You'll get a confirmation email with a link to sign up.  From then on, you'll be able to continue writing to them by email instead of going through their contact forms.
Is there another way to contact Congress?
Yes! You can call, fax or mail a message and show up to their offices in person to discuss issues that are important to you. Look up how to contact them on usa.gov.
What are some tips on communicating with Congress?
{% include 'partials/faq_tips.html' %}Why can I only select the three titles: Mr., Mrs. and Ms.?
Many congressional webforms require a title, but there is no standard list across offices. Some include honorifics from medical, military and other professional fields, but the three options we provide are the minimum selection that spans all webforms.
Why isn't my message being sent?
Message failures can occur for many reasons, some outside of your or our control.
Messages can fail when there are issues on the congressional webforms we're passing your message through, or our system may need to be updated to reflect changes.
Sometimes errors in the information from the message can cause issues, such as a lengthy message that exceeds the limit on webforms, which is set individually be each congressional office.
If the address you entered does not fall in the congressional district you're trying to send your message to (or is not recognized by the congressional web form), it can result in an unsent message.
Who made this?
The Sunlight Foundation, a nonpartisan nonprofit dedicated to government transparency and accountability, built this project to help connect citizens to their representatives in Congress. We're not affiliated with government.
The open source code for this project is available on GitHub.
How can I get involved?
Please join our email list to keep up with our latest work. You can also make a donation if you found this tool useful!


phruta
?The phruta
R package is designed to simplify the basic phylogenetic pipeline. Specifically, all code is run within the same program and data from intermediate steps are saved in independent folders. Furthrmore, all code is run within the same environment which increases the reproducibility of your analysis. phruta
retrieves gene sequences, combines newly downloaded and local gene sequences, and performs sequence alignments.
phruta
is also able to perform basic phylogenetic inference under RAxML
on the resulting sequence alignments. The current release allows users to conduct tree dating based on secondary calibrations. phruta
is essentially a wrapper for alternative R packages and software.
phruta
?phruta
simplifies the phylogenetic pipeline, increases reproducibility, and helps organizing information used to infer molecular phylogenies.
phruta
phruta
is currently only available through GitHub
. It can be easily installed using the following code.
library(devtools)
install_github("cromanpa94/phruta")
My package is dedicated to my mom and every single Black woman. I still have lots of things to learn from you. You will always have all my admiration and respect.
The logo features a Palenquera in Cartagena (Colombia). For many folks, Palenqueras are just the Black woman ones who sell fruits in particular Colombian turistic areas. However, palenqueras and Palenque are central to Black identity in Colombia, Latin America, and America. “Palenque was the first free African town in the Americas”.
Fruta is the Spanish word for Fruit. English ph sounds the same as F in Spanish. In phruta
, ph is relative to phylogenetics. I pronounce phruta
as fruta in Spanish.
More details about the functions implemented in phruta
can be found in the different vignettes associated with the package or in our website.
Please see our contributing guide.
Please see the package DESCRIPTION for package authors.


バージョン 1.3 で追加.
By default, Fabric executes all specified tasks serially (see Execution strategy for details.) This document describes Fabric’s options for running tasks on multiple hosts in parallel, via per-task decorators and/or global command-line switches.
Because Fabric 1.x is not fully threadsafe (and because in general use, task functions do not typically interact with one another) this functionality is implemented via the Python multiprocessing module. It creates one new process for each host and task combination, optionally using a (configurable) sliding window to prevent too many processes from running at the same time.
For example, imagine a scenario where you want to update Web application code on a number of Web servers, and then reload the servers once the code has been distributed everywhere (to allow for easier rollback if code updates fail.) One could implement this with the following fabfile:
from fabric.api import *
def update():
with cd("/srv/django/myapp"):
run("git pull")
def reload():
sudo("service apache2 reload")
and execute it on a set of 3 servers, in serial, like so:
$ fab -H web1,web2,web3 update reload
Normally, without any parallel execution options activated, Fabric would run in order:
With parallel execution activated (via -P – see below for details), this turns into:
Hopefully the benefits of this are obvious – if update took 5 seconds to run and reload took 2 seconds, serial execution takes (5+2)*3 = 21 seconds to run, while parallel execution takes only a third of the time, (5+2) = 7 seconds on average.
Since the minimum “unit” that parallel execution affects is a task, the functionality may be enabled or disabled on a task-by-task basis using the parallel and serial decorators. For example, this fabfile:
from fabric.api import *
@parallel
def runs_in_parallel():
pass
def runs_serially():
pass
when run in this manner:
$ fab -H host1,host2,host3 runs_in_parallel runs_serially
will result in the following execution sequence:
One may also force all tasks to run in parallel by using the command-line flag -P or the env variable env.parallel. However, any task specifically wrapped with serial will ignore this setting and continue to run serially.
For example, the following fabfile will result in the same execution sequence as the one above:
from fabric.api import *
def runs_in_parallel():
pass
@serial
def runs_serially():
pass
when invoked like so:
$ fab -H host1,host2,host3 -P runs_in_parallel runs_serially
As before, runs_in_parallel will run in parallel, and runs_serially in sequence.
With large host lists, a user’s local machine can get overwhelmed by running too many concurrent Fabric processes. Because of this, you may opt to use a moving bubble approach that limits Fabric to a specific number of concurrently active processes.
By default, no bubble is used and all hosts are run in one concurrent pool. You can override this on a per-task level by specifying the pool_size keyword argument to parallel, or globally via -z.
For example, to run on 5 hosts at a time:
from fabric.api import *
@parallel(pool_size=5)
def heavy_task():
# lots of heavy local lifting or lots of IO here
Or skip the pool_size kwarg and instead:
$ fab -P -z 5 heavy_task
Fabric’s default mode of printing to the terminal is byte-by-byte, in order to support Interaction with remote programs. This often gives poor results when running in parallel mode, as the multiple processes may write to your terminal’s standard out stream simultaneously.
To help offset this problem, Fabric’s option for linewise output is automatically enabled whenever parallelism is active. This will cause you to lose most of the benefits outlined in the above link Fabric’s remote interactivity features, but as those do not map well to parallel invocations, it’s typically a fair trade.
There’s no way to avoid the multiple processes mixing up on a line-by-line basis, but you will at least be able to tell them apart by the host-string line prefix.
ノート
Future versions will add improved logging support to make troubleshooting parallel runs easier.


|
MICC
Mobile Internet Chess Client Main page |
|
MICC
is an internet chess client written for mobile devices
supporting the Java MIDP 2.0 platform. The current version of
MICC is 1.0 and supports playing onthe Free Internet Chess Server (FICS). Later versions of MICC will support the Internet Chess Club (ICC). Go to the Download section and download the MICC.jad and MICC.jar files for installation on your mobile device. Also read the Help section to learn how to use MICC and find out about its features and supported functions. Enjoy! |
News060925 Pages initiated |


Twitter loads new ammo to fire at Malema after Burna Boy concert cancelled
Last week's Twitter fire against the EFF and its leader, Julius Malema, has not yet been extinguished after vocal supporters continued to bash the party leader for supporting a Nigerian artist.
On Thursday, Malema's name was the top trending topic on the social media platform once again.
Malema, who took to Twitter last week and proclaimed his support for Nigerian artist Burna Boy, following major public outrage against his performance at the Africans Unite concert, had seemingly loyal EFF supporters questioning their commander-in-chief's stance on the matter.
This time, Twitter came out guns blazing, criticising Malema's character as a politician in particular, and labelling him a "sellout".
The original reasons behind Thursday's flare-up remain a mystery. However, the recent cancellation of the Africans Unite concert on Wednesday may have given Twitter fresh ammunition.
Recent tweets from apparent EFF supporters went as far as "cancelling" the EFF, saying the party "is just Malema's pet project".
But some still defended him.
Last week, Malema tweeted that "there's no mascot that can stop [Burna Boy] from performing, he's one of our own and we will protect him".
Following seeming backlash, he tweeted again: "I won't be intimidated or blackmailed by bed wetting boys, welcome home @burnaboy.
Malema often uses his account to respond to current affairs, but also previously admitted in court papers against the South African National Editors' Forum (SANEF) that the social media platform did not reflect the real world.
"I also hasten to point out that Twitter is entirely divorced from reality: I know for a fact that the EFF won nearly every 'poll' conducted on Twitter in the run-up to the elections. It ultimately lost the elections and came third," News24 reported previously quoting Malema.
- Compiled by Lauren Klaasen


yourRestaurant was created in 2017. Our mission is to help provide discounts, reviews & all relevant restaurant information to make finding your favourite restaurants that much easier.yourRestaurant for business We are here to help grow small and large businesses, advertising through our app, website and social media to reach a larger customer base, we send monthly reports tracking your success.


Class Theme
This theme class provides utilities for introducing advanced functionality (such as ajax faceting) to your theme.
Namespace: elasticsearch
License: http://opensource.org/licenses/MIT
Author: Paris Holley<EMAIL_ADDRESS>Version: 4.0.1
Located at Theme.php
License: http://opensource.org/licenses/MIT
Author: Paris Holley<EMAIL_ADDRESS>Version: 4.0.1
Located at Theme.php
public static
|
#
enableAjaxHooks( )
Tells wordpress to detect when ?esajax=1 is in the URL and remove header/footer so content can be replaced on page with AJX |
public static
|
|
public static
|


{% extends "base.html" %} {% block heading %}
You can now access this server from {{ ip }} by ssh.
When done, please remove this IP by going to {{ PREFIX }}/bye/


Arriving in Vietnam
First we needed to get there, fortunately only 2 planes were involved in this trip
but we still arrived pretty late at night in Vietnam. At least this time, we manage
to leave during the day and even if it was late we didn't had to pull an all
nighter. The flights themselves went pretty smoothly (Here more information about
getting from Puerto Princesa to Hanoi vietnam) the hard part for us was to
wait at
the vietnamese customs. For the first time in our trip, we didn’t get an automatic
30 days visa upon arrival. (Witch is a pretty good score board for the canadian
passport) We needed to request a visa prior to our arrival (fortunately we knew
that, Yep they may let you take a plane to vietnam without the proper papers...) So
we requested our visa online. (Here’s more information about visa in vietnam) Once
we arrived at the airport, we went straight to the custom office to get our visa (We
had the confirmation online but not the actual visa)
There’s a separate office but it’s pretty obvious since most tourists need to get
there before passing through the custom line. At this point, we needed to withdraw
money since the vietnamese visa isn’t free and they don’t take credit card payment.
From there we went to the counter, filled out the form they gave us and waited….
eventually they called up our name gave us back our passport with a fresh vietnamese
visa in it and we were good to go! We were fortunate enough that at the time of our
arrival the airport was practically empty so the wait wasn’t too long but if 4 other
planes arrived at the same time, your should arm yourself with patience, you are
going to be there for a while.
SCAM ALERT
Once we got out of the airport, we proceeded to call a Grab which is normally what
we do. But a few second earlier a guy came up to us with a bright green “GRAB”
application on his phone and says “I am on grab I will give you the same price but
if we don’t use the application, I am sure to get you as my passenger” (This
happened on multiple occasion in Vietnam) Our late night and 8 hour of travel brain
thought it was a good idea and we hopped in. Only once we were on the highway that
my brain reconnected with the rest of my body and start thinking about organ
trafficking…. But the driver conduct us to the propers location without any problem.
(We were also tracking where we were going with our phone, kind of an insurance in
case he was going in the wrong direction,
(Here some safety tips)) My brains
wasn’t
complete wrong to panic, there was a
scam included in the procedure but my
organs weren’t the end goal. Once we arrived at our destination the price suddenly
changed but in a clever way! The driver tried to argue that the price was for one
person and since we were two we had to pay double. Unfortunately for the driver
Alexis was having none of it and start arguing with him. I think the driver got
scared since he was barely tall enough to come up to my armpits… let alone Alexis
armpit… We did pay a little more since we didn’t have change for our bill and of
course he didn’t either. Afterall, we arrived safely to our hotel. Our lesson was
learn, always, always , always use the app to order grab, don’t trust strangers. We
saw that scam again in another airport which lead Alexis to yell and tell other
people around that they were a scam…. They ran away pretty fast and at least no
other tourist got caught that day!
SCAM ALERT
We were only staying one day in Ha Noi, therefore the next day we woke up and
started visiting the city.
Before going anywhere, Alexis had to test the local coffee which was delicious. I
loved wandering around in this town there was small business everywhere from
halloween décoration only shop to flower shop.
We even found a huge market with an endless amount of spice!
The best part about
this day was the Phò. We were walking across the town and started to get hungry so
we stop at something that look like a restaurant. Once we got in someone ask us if
we wanted the Phò with everything in it, so we said Yes, and then where guide to a
table behind the kitchen. Yes behind, it pretty much look like the family’s living
room.
That was the best Pho we have ate in all of our travel including the rest of ours
stay in vietnam!
The next day we were back at the airport to fly to Da Nang. The second city on our
list for vietnam.


Generating a Playlist
Generating a Playlist involves the following general steps.
- Create a new Playlist collection summary.
- Populate the collection summary with unique identifiers and GDOs.
- (Optional) Store the collection summary.
- (Optional) Load the stored collection summary into memory in preparation for Playlist results generation.
- Generate a playlist, using the More Like This function with a seed.
- Access and display playlist results.
To generate a custom playlist, use the Playlist Definition Language. For more information, see Playlist PDL Specification.
Creating a Collection Summary
To create a collection summary, call the following function:
gnsdk_playlist_collection_create("sample_collection", &playlist_collection);
This creates a new and empty collection summary. The function returns a pointer to a collection handle, which can be used in subsequent calls.
Note: Each new collection summary that you want to save must have a unique name, or the previously saved summary with the same name will be overwritten.
Populating a Collection Summary
The main task in building a Playlist collection summary is to provide all possible data to the Playlist for each specific media item. The API to provide data for a collection summary is gnsdk_playlist_collection_add_gdo(). This API takes a media identifier (any unique string determined by the application) and a GDO to acquire data from. The GDO should come from a recognition event from the other GNSDK modules (such as MusicID or MusicID-File).
Enabling Playlist Attributes
When creating a MusicID or MusicID-File query to populate a playlist, you must set the following query options with the appropriate function (for example, gnsdk_musicid_query_option_set() for the MusicID module) to ensure that the appropriate Playlist attributes are returned (depending on the type of query):
- GNSDK_MUSICID_OPTION_ENABLE_SONIC_DATA or GNSDK_MUSICIDFILE_OPTION_ENABLE_SONIC_DATA
- GNSDK_MUSICID_OPTION_ENABLE_PLAYLIST or GNSDK_MUSICIDFILE_OPTION_ENABLE_PLAYLIST
Adding Data to a Collection Summary
You can add an identifier to a collection using gnsdk_playlist_collection_add_ident(). This function creates an empty entry in the collection summary for the given identifier. An application provides an identifier that allows the application to identify referenced physical media. Identifiers are not interpreted by Playlist, but are only returned to the application in Playlist results. Identifiers are application dependent. For example, a desktop application might use a full path to a file name, while an online application might use a database key. Once you have added an identifier, an application can add data to it using the other gnsdk_playlist_collection_add_*() APIs.
For example, after retrieving GDOs with a query, use the gnsdk_playlist_collection_add_gdo() function to add the GDOs to the collection summary. As shown below, you might call the function with an album or track GDO (or both), depending on your use case:
gnsdk_playlist_collection_add_gdo(playlist_collection, unique_ident, album_gdo);
gnsdk_playlist_collection_add_gdo(playlist_collection, unique_ident, track_gdo);
Note: You can add multiple GDOs for the same identifier by calling the gnsdk_playlist_collection_add_gdo() API multiple times with the same identifier value. The data gathered from all the provided GDOs is stored for the given identifier. The identifier is a user generated value that should allow the identification of individual tracks (for example, path/filename) or an ID that can be externally looked up.
When adding an album GDO to Playlist that resulted from a CD TOC lookup, Gracenote recommends adding all tracks from the album to Playlist individually. To do this, call gnsdk_playlist_collection_add_gdo() twice for each track on the album. The first call should pass the album GDO for the identifier (to allow Playlist to gather album data), and the second call should pass the respective track GDO from the album using the same identifier used in the first call. This will ensure Playlist adds full album and track data to the collection summary for each track on the album, which supports querying the Playlist Collection with both track and album level attributes.
How Playlist Gathers Data
When given an album GDO, Playlist gathers any necessary album data and then traverses to the matched track and gathers the necessary data from that track. This data is stored for the given identifier. If no matched track is part of the album GDO, no track data is gathered. Playlist also gathers data from both the album and track contributors as detailed below.
When given a track GDO, Playlist gathers any necessary data from the track, but it is not able to gather any album-related data (such as album title). Playlist also gathers data from the track contributors as detailed below.
When given a contributor GDO (or traversing into one from an album or track), Playlist gathers the necessary data from the contributor. If the contributor is a collaboration, data from both child contributors is gathered as well.
For all other GDOs, Playlist attempts to gather the necessary data, but no other specific traversals are done automatically.
Adding List Elements to Collection Summaries
You can use genre and other list data (origin, era, and tempo) to add media items to playlists, by matching by string and adding the result to a collection summary. To search for list elements by string, use the gnsdk_manager_list_get_element_by_string() function. This API returns a gnsdk_list_element_handle_t, which can be passed to the gnsdk_playlist_collection_add_list_element() function to add the value to a collection summary.
Note: When searching for a genre list element, the SDK can match many different genre variations in many different languages, regardless of the language specified when loading a locale.
Working with Local Storage
You can store and manage collection summaries in local storage. To store a collection summary, use the following function:
gnsdk_playlist_storage_store_collection(playlist_collection);
To retrieve a collection summary from local storage, use the gnsdk_playlist_storage_count_collections() and gnsdk_playlist_storage_enum_collections() functions to retrieve all collections.
Before Playlist can use a collection summary that has been retrieved from storage, it must be loaded into memory:
gnsdk_playlist_storage_load_collection(collection_name,&playlist_collection);
Generating a Playlist Using More Like This
You can streamline your Playlist implementation by using the gnsdk_playlist_generate_morelikethis() function, which uses the "More Like This" algorithm to generate optimal playlist results and eliminates the need to create and validate Playlist Definition Language statements.
You can set the following options when generating a More Like This Playlist, by using the gnsdk_playlist_morelikethis_option_set() function:
| Option | Description |
|---|---|
| GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_TRACKS |
The maximum number of track results returned. Default is 25. |
| GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_PER_ARTIST | The maximum number of results per artist returned. Default is 2. |
| GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_PER_ALBUM | The maximum number of results per album returned; the value for this key must evaluate to a number greater than 0. Default is 1. |
| GNSDK_PLAYLIST_MORELIKETHIS_OPTION_RANDOMSEED | The randomization seed value used in calculating a More Like This playlist. The value for this key must evaluate to a number greater than 0 (the recommended range is 1 - 100, but you can use any number from 1 to<PHONE_NUMBER>. This number will be the seed for the randomization. You can re-create a playlist by choosing the same number for the randomization seed; choosing different numbers will create different playlists. Default is 0. |
The following example demonstrates setting the More Like This options:
/* * Change the possible result set to contain a maximum of 30 tracks */ gnsdk_playlist_morelikethis_option_set( playlist_collection, GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_TRACKS, "30" ); /* * Change the possible result set to contain a maximum of 10 tracks per artist */ gnsdk_playlist_morelikethis_option_set( playlist_collection, GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_PER_ARTIST, "0" ); /* * Change the possible result set to contain a maximum of 5 tracks per album */ gnsdk_playlist_morelikethis_option_set( playlist_collection, GNSDK_PLAYLIST_MORELIKETHIS_OPTION_MAX_PER_ALBUM, "5" ); /* * Change the random result to be 1, so that there is no randomization */ gnsdk_playlist_morelikethis_option_set( playlist_collection, GNSDK_PLAYLIST_MORELIKETHIS_OPTION_RANDOMSEED, "1" );
To generate a More Like This playlist, call the gnsdk_playlist_generate_morelikethis() function with a user handle, a playlist collection summary, and a seed GDO. A seed GDO can be any recognized media GDO, for example, the GDO of the track that is currently playing.
gnsdk_playlist_generate_morelikethis( user_handle, playlist_collection, h_gdo_seed, &playlist_results );
Accessing Playlist Results
Once you have generated a playlist, you can iterate through the results using the gnsdk_playlist_results_count() and gnsdk_playlist_results_enum() functions. The results consist of a set of unique identifiers, which match the identifiers given to Playlist during the population of the collection summary. The application must match these identifiers to the physical media that they reference.
Working with Multiple Collection Summaries
Creating a playlist across multiple collections can be accomplished by using joins. Joins allow you to combine multiple collection summaries at run-time, so that they can be treated as one collection by the playlist generation functions. Joined collections can be used to generate More Like This and PDL-based playlists.
For example, if your application has created a playlist based on one device (collection 1), and another device is plugged into the system (collection 2), you might want to create a playlist based on both of these collections. This can be accomplished using the gnsdk_playlist_collection_join() function:
gnsdk_playlist_collection_join(collection_handle1, collection_handle2);
Calling this function joins collection 2 into collection 1. The collection 1 handle now represents the joined collection, and can be used to generate the playlist.
You can also enumerate identifiers across joined collections by using the gnsdk_playlist_collection_ident_count() and gnsdk_playlist_collection_ident_enum() functions.
Joins are run-time constructs for playlist generation that support seamless identifier enumeration across all contained collections. They do not directly support the addition or removal of GDOs, synchronization, or serialization across all collections in a join. To perform any of these operations, you can use the join management functions to access the individual collections and operate on them separately.
To remove a collection from a join, call the gnsdk_playlist_collection_join_remove() function.
Join Performance and Best Practices
Creating a join is very efficient and has minimal CPU and memory requirements. When collections are joined, GNSDK internally sets references between them, rather than recreating them. Creating, deleting, and recreating joined collections when needed can be an effective and high-performing way to manage collections.
The original handles for the individual collections remain functional, and you can continue to operate on them in tandem with the joined collection, if needed. If you release an original handle for a collection that has been entered into a joined collection, the joined collections will continue to be functional as long as the collection handle representing the join remains valid.
A good practice for managing the joining of collections is to create a new collection handle that represents the join, and then join all existing collections into this handle. This helps remove ambiguity as to which original collection is the parent collection representing the join.
Synchronizing Collection Summaries
Collection summaries must be refreshed whenever items in the user's media collection are modified. For example, if you've created a collection summary based on the media on a particular device, and the media on that device changes, your application must synchronize the collection summary.
To synchronize a collection summary to physical media:
- Iterate the physical media — Add all existing (current and new) unique identifiers using the gnsdk_playlist_collection_sync_ident_add() function, which Playlist collates.
- Process the collection — Call gnsdk_playlist_collection_sync_process() to process the current and new identifiers and using the callback function to add or remove identifiers to or from the collection summary.
Iterating the Physical Media
The first step in synchronizing is to iterate through the physical media, calling the gnsdk_playlist_collection_sync_ident_add() function for each media item. For each media item, pass the unique identifier associated with the item to the function. The unique identifiers used must match the identifiers that were used to create the collection summary initially.
Processing the Collection
After preparing a collection summary for synchronization using gnsdk_playlist_collection_sync_ident_add(), call gnsdk_playlist_collection_sync_process() to synchronize the collection summary's data. During processing, the callback function gnsdk_playlist_update_callback_fn() will be called for each difference between the physical media and the collection summary. So the callback function will be called once for each new media item, and once for each media item that has been deleted from the collection. The callback function should add new and delete old identifiers from the collection summary. For more information on adding items, see Populating a Collection Summary. To remove items, use the gnsdk_playlist_collection_ident_remove() function.
Example: Implementing a Playlist
This example demonstrates using the Playlist APIs to create More Like This and custom playlists.


Salary Calculator
Add Employee
Submit
Employees
First Name
Last Name
ID
Title
Annual Salary
Monthly Total:


General Usability
For this assigment, I analyzed the usability of the Seattle Colleges website. The criteria used in this analysis include:
- Is the purpose of the site apparent?
- Does the navigation let the user know where they are?
- Is there a clear visual hierarchy to the site?
- Is the site set up for scanning?
- Is the site free of visual distractions?
Purpose: What is this site for?
The purpose of the site is immediately apparent from the title and main menu choices. Visitors to the site can see from the title and logo in the top left-hand corner that this site provides information about the "Seattle Colleges". The menu choices in the horizontal navigation bar also let users know at a glance what kind of information this site provides.
The left-hand vertical menu includes many more options. There is also a search option in the top right corner which would be helpful if looking for an employee, a certain class or program, or if a user otherwise knows the term for what they are looking for.
Navigation: Do I know where I am?
There are 8 choices in the horizontal navigation bar. On hover, these links change color and are underlined. Most users would know these are links due to conventional placement, the visual clues that occur on hover further emphasizes that these are links.
The menu bar does not change as you move through the pages. The title for each Page is duplicated on the page (although not always exactly). A user might not always know where they are. It would helpful if the menu bar indicated location by color/font change.
There are many more options avaible in the left-hand menu bar. The background color changes on hover, but otherwise these stay the same as different pages are visited. Elipses indicate when a category has more options behind it, and a pop-up menu appears on hovering over these links. There is a link to the HOME page at the top of the left-hand menu that I did not immediately notice. Having this stand out by using a different color/background color would be helpful.
Hierarchy: Is the order of importance clear?
There is so much information that creating a hierarchy for this kind of organization must be a challenge. Everything looks to be of equal importance and there are many options on the home page which means too much thinking is needed.
Headings are used throughout the site but there does not seem to be enough variety in size and weight to aid significantly in visually organizing the information by importance.
Having less options on the home page and categorizing by user (current students, prospective students, business/community members, faculty/staff) might help. The Maricopa Community College district home page does not display as many options on the top-level menu and seems easier to sort through.
Scannability: Can I find what I need at a glance?
There are many words and not much white space on this website. One way that the site keeps the amount of text visible at one time to a minimum is seen on the page for "Working Adults". Tabs are used to organize the information and allow users to know at a glance what information is available. The tabs also change color to let users know what section they are in. Use of tabs seems to be limited to this page.
Visual Distractions: Is the site free of visual distractions?
This site includes enough images to add interest and is otherwise free of distractions. The Working Adults page was the only page where I saw photos scrolling. This drew my attention to the "Request More Information" link which I had not noticed so I think it serves its purpose. Too much of this would be distracting.
Conclusion
This site is huge with a vast amount of information. The main usability issue I see with this website is the amount of menu options on the main page. If these options could be grouped into categories, the amount of user thinking required could be decreased. Although the amount of clicking needed would increase, the clicking would ideally be mindless.
The navigation is consistent and helpful for the most part. Adding a few visual indications of location would enchance navigation. The site seems to follow standard conventions for placement and identification of links. A few links took me to a new website, International Students, for example, which could be intentional. Otherwise the new websites opened in a new window so I could easily return to the main website.
Creating more categories for the information on individual pages (as well as the main page) could help reduce the amount of text on pages. If all the information needs to be included, breaking the information down and requiring more clicking would be better than having so many words on one page. With less words, there would be room to add more white space and headings, which would help with scannability.


| MPI_COMM_FREE(comm) | |
| INOUT comm | communicator to be destroyed (handle) |
int MPI_Comm_free(MPI_Comm *comm)
MPI_COMM_FREE(COMM, IERROR)
INTEGER COMM, IERROR
void MPI::Comm::Free()
This collective operation marks the communication object for
deallocation. The handle is set to MPI_COMM_NULL.
Any pending operations that use this communicator will complete normally;
the object is actually
deallocated only if there are no other active references to it.
This call applies to intra- and inter-communicators. The delete callback
functions for all cached attributes (see Section Caching
) are
called in arbitrary order.
Advice
to implementors.
A reference-count mechanism may be used: the reference count is incremented by each call to MPI_COMM_DUP, and decremented by each call to MPI_COMM_FREE. The object is ultimately deallocated when the count reaches zero.
Though collective, it is anticipated that this operation will normally
be implemented to be local, though
a
debugging version of an MPI library might
choose to synchronize.
( End of advice to implementors.)


Enter ETH amount in wei
Enter ETH and address
Get all money back
Current status
check
Plasma works fine
Contract address:
desktop_windows
Amount of verifiers
view_module
Latest block
Additional information
Total plasma balance:
WEI
Total Plasma balance:
WEI
My Ethereum balance:
WEI
My operations history
| Date | Type | Sum |
|---|


{% extends 'base.html' %} {% block content %}
| Sno | Title | Date | Uploaded By | Action |
|---|---|---|---|---|
| {{ forloop.counter }}. | {{ document.name }} | {{ document.uploaded_on|date:'d M, Y H:i' }} | {{ document.uploaded_by.get_full_name|default:'NA' }} | Share Delete |
You don't have any documents uploaded.
{% endif %}


{% extends "bootstrap_layout.html" %} {% set active_page = "home" %} {% block content %}
Welcome to the Team Dashboard
Follow the instructions below to get started:
1) Choose your league
2) Choose your team
3) Check out the latest standings and scores!
{% endblock %}


{% load i18n %} {% comment %} This template is used for the html alternative of the activation email if you use a django-registration backend that looks for it. e.g. https://github.com/huseyinyilmaz/django-registration-extended-backend {% endcomment %} {% url 'registration_activate' activation_key as activation_key_url %} {% blocktrans with sitename=site.name sitedomain=site.domain%}
You (or someone pretending to be you) have asked to register an account at
{{ sitename }}.
If this wasn't you, please ignore this email and your address will be removed
from our records.
To activate this account, please click the following link within the next
{{ expiration_days }} days:
http://{{ sitedomain }}{{ activation_key_url }}
Sincerely,
{{ sitename }} Management


Kiss The Girls (1997) A movie review by Serdar Yegulalp (C) 1997 by Serdar Yegulalp
CAPSULE: Not the narrative juggernaut that SE7EN was, but a smart and well-wired thriller nonetheless, with sterling performances all around.
KISS THE GIRLS had many people muttering "SE7EN knock-off" when the trailers ran for it. It's understandable: Both films feature Morgan Freeman on the trail of a serial killer of fiendish intelligence and cleverness. There, the similarities end. KISS THE GIRLS is not the monster that SE7EN was, but is a well-made and intelligently assembled movie that packs a good deal of power.
>From the moment Morgan Freeman appeared on the screen, no convincing is needed to tell us that Alex Cross, his character in GIRLS, is not Detective Somerset from SE7EN. He is not rehashing the role; this is a new character built from the ground up, and it's a testament to Freeman's skill as an actor that we can sense this instantly, just from the way he sizes up a roomful of evidence and talks down a suicidal woman.
Cross's niece has gone missing, and he journeys to North Carolina, fearful that the girl may have become the victim of a serial killer who bills himself as "Casanova". He is right, and he also makes a slew of educated guesses as to the killer's m.o.: Casanova isn't so much a killer as a collector, and is hard at work throwing the cops off the trail with deceptive murders.
Then there's a huge break in the case: a doctor, Kate McTiernan (Ashley Judd, her best role so far), manages to escape from the lair where she and several other kidnapped girls are being held. She is full of guilt over not having been able to free the other girls, but Cross is determined to find Casanova as well. They're a nice team; they break out of the one-up/one-down dynamic that so many movies like this set up.
There's a great deal more to the plot than would be fair to reveal in a review. I will say that the movie has one piece of deception in store that seems out of keeping with its ambitions. For most of the way, KISS THE GIRLS is content to give us a solid story that springs out of the motivations of the characters, known or unknown -- in other words, it's not critical that we know who the killer is. Then in the final act, we find out that it's someone we've already been introduced to, and that slightly undermines what came before. It's not a fatal mistake, and there are probably many people who won't object to it, but it seems somewhat tacked-on.
Despite this, KISS THE GIRLS makes a fine addition to a small list of movies that intelligently explore the concept of obsessives and serial murder, and that do it with characters that are no less compelling and interesting than the one being chased.
Three and a half out of four violin strings.
<EMAIL_ADDRESS>EFNet IRC: GinRei http://www.io.com/~syegul another worldly device... you can crush me as I speak/write on rocks what you feel/now feel this truth =smilin' in your face, all the time wanna take your place, the BACKSTABBERS=
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


There are many types of startup tools and startup resources to use to boost give your business a good start.
Domain name registration is one of the most important startup tools that your business will use. The domain name is your business card and must suit your business. Domain names can be brought online for a low as $.99 on sites like Godaddy.com and 1&1.com. These sites double as web hosting sites as well. It’s a great all-in-one package.
When it comes to naming your company, you must be sure to research the perspective name before you go slapping it on all of your promo merchandise. Company names must be registered if they are not already trademarked. It is wise to do so before opening your doors, online or in person. You can register your business online or in person with your state's Department of Revenue Services. Trademarking your business can be done at The United States Patent and Trademark Office. Look online in their database to see if your business name is already taken.
Spread the work around by managing your team or hiring on demand assistants. These can be virtual assistants or a traditional employee. Pass along the tedious and time-consuming work that can be safely handled by a third party to your new temp worker.
Don’t be afraid to bother your customers with fun surveys from the likes of Survey Monkey, a great survey building website.
Web design has been made easy for the novice with startup tools such as Canva and Designer to design beautiful graphics for your website. For the site, it’s self you can use sites such as Wordpress or Wix. No coding required.
Invest time and energy in product and business development.
Sites like Shopify, eBay and Amazon are great for setting up e-commerce in a snap. Just list and sell.
How do you want to get paid! This may be the most important part. Use reliable resources such as PayPal and Stripe to process secure transactions on your site.
Boost your sales and popularity with social media. Use Instagram and Facebook to your best advantage with product tagging and direct sales.
Stay in the track of money with QuickBooks and TurboTax resources. No accountant necessary.
Track how your website is performing with built-in analytics on WordPress. Or add your own with Google Analytics. Startup tools has a large list of available web analytics and other tools for startups.
Streamline problems that arise with a bug tracking software that follows through.


Excel processor
Select the Excel file, and the output folder, Excel Processor will handle the rest.
Drag & Drop
your excel files, or
click here to browse
Progress:
0%


val idNumber: String?
The person’s ID number, as appropriate for their country. For example, a social security number in the U.S., social insurance number in Canada, etc. Instead of the number itself, you can also provide a PII token.
person.id_number


Progressive Web Apps
101
Home
About me
Contact
Source Code
github profiles viewer
Web hero
followers
255
following
255
repositories
255