Singlet Delta Oxygen Airflow Sterilization for Building Protection
EPA Contract Number: EPD06082Title: Singlet Delta Oxygen Airflow Sterilization for Building Protection
Investigators: Henshaw, Thomas L.
Small Business: Neuman Information, Inc. d.b.a. Directed Energy Solutions
EPA Contact: Manager, SBIR Program
Phase: II
Project Period: April 1, 2006 through June 30, 2007
Project Amount: $224,667
RFA: Small Business Innovation Research (SBIR) - Phase II (2006) Recipients Lists
Research Category: Hazardous Waste/Remediation , SBIR - Homeland Security , Small Business Innovation Research (SBIR)
Description:
Directed Energy Solutions (DES) proposes to design, fabricate, and test a
basic prototype decontamination device for protecting buildings from chemical
and biological weapons attack and the general enhancement of indoor air quality. The
decontamination device generates metastable singlet delta oxygen (SDO), O2
(a1Δ), a strong oxidant of biological and chemical pathogens, from direct
optical excitation of oxygen in a building’s heating, ventilation, and
air conditioning (HVAC) system. The principal device components consist
of an oxygen source (air), a commercially available optical excitation light
source, and a multi-pass optical cell. The device is integrated into
building ductwork to treat ambient air in situ as it passes through
the HVAC system.
Advantages of the device system include: (1) use of non-hazardous SDO
as a proven oxidant; (2) quick and permanent destruction of the chemical or
biological agent; (3) potential universal utility so the specific chemical
or biological agent need not be known; (4) use of no toxic chemicals such as
ozone, ethylene dioxide, or chlorine dioxide; (5) production of no toxic residuals
such as ozone; (6) operation in both standby (routine purification) and high-power
(attack protection) modes; (7) operation under minimum pressure drop; (8) use
of durable and efficient off-the-shelf components with “set-and-forget” operation
and no personnel training; and (9) no requirement to bring in additional fresh
air with the associated expense of heating/cooling that air.
During Phase I of this research project, DES demonstrated efficient SDO production from direct optical excitation of a flowing stream of oxygen. Measurements of the SDO reaction with an HD (chemical agent) simulant demonstrated the effectiveness of SDO against this simulant. During Phase II, a working prototype decontamination device will be developed, and this device will be tested against chemical and biological simulants for performance verification. Quantitative effectiveness data for SDO against biological and chemical species will be obtained. The optimized prototype design developed during Phase II will be ready for commercialization during Phase III.
The commercial application of this device (Singlet Delta Oxygen Airflow Sterilization for Building Protection) has been assessed by DES and Foresight Science and Technology. The recommended applications include airflow sterilization of biologicals and oxidation of chemicals (including complete oxidation of volatile organic compounds to water and carbon dioxide) in homes and commercial/government office buildings and hospitals. Medical equipment sterilization also is a potential commercial application.


PyroCMS supports themes which allow you to easily change the look and feel of your web-site. The way it works is with a master layout file and multiple partials that share presentation logic between different layouts.


{% import "macros.html" as formmacros with context %} {% macro eventnav(active="details", title="") -%}
{{_('Be aware that this barcamp is public and %(amount)s people already signed up for it. So changing the date might not be the best idea.')|format(amount=event.participants|length)}}
{{_('Because the barcamp is public you can only increase the number of participants. Once you do people on the waiting list will move up to the participant list automatically and an email will be sent out to them.')}}


tuna Pacific fishing fisheries F/F MSY Tuna price data days fish index (). Atlantic \documentclass[pt]{minimal} \setlength{\oddsidemargin}{-pt} \usepackage{amsbsy} \usepackage{amsfonts} \usepackage{amsmath} \usepackage{amssymb} \usepackage{mathrsfs} \usepackage{upgreek} \usepackage{wasysym} fuel stock × change increase management {border-style Ocean px;} seine stocks #ffffff;} changes economic purse time used variables Fisheries model prices ridge Fish North Stock global Indian regression status western HDI IOTC \begin{document}$$\lambda frozen positive set species $$\end{document} Oscillation catch effect effects social value (see ICCAT development effort spatial Longline Southern World countries environmental exploitation fresh marine market soak Development East Figure Table central indices px; skipjack year {font-family Albacore Hooks NAO Purse average climatic converted different fleet fleets font-size food high higher however, i.e. included large line overfishing results significant test tunas variability (Fig. Bluefin Index MSY. Sci South Stocks Sumaila Tropical Western biomass correlation double; human important level longline mortality negative number order predictor relative represent specific website (e.g. (i.e. (number Gear Global Nature Niño Research Skipjack WCPFC Watson Yellowfin analysis associated available based bluefin border-color border-width coefficients correlated diversity dynamics factors feature hooks) increases indicators information lead population regions related represents solid; sustainability sustainable target tropical yellowfin yield {font-style {font-weight (SOI) (the ./j.-...x ./pnas. .–.) Australian Baitboat Bank Bigeye Commons Creative Data Fig. Food Marine Nations Policy Ridge Species Sustainable United [], account and/or area assessment bigeye biological bold climate coastal commercial costs courier; cross-validation drivers economic, em; error estimate exploited fished fishers fit future given grid.. hooks improved key link long material minimum obtained overexploitation potential provide proxy pt;} quantity response result risk risks seafood short-term showed shown study support terms training using variables. versus vulnerability years }$$\end{document}


{% extends "base.html" %} {% block title %}{{ _('Import Data') }} — {{ service_name }}{% endblock %} {% block content %}
{{ _('%(service_name)s can import objects from .eln files exported by other electronic lab notebooks.', service_name=service_name) }} {{ _('Read more.') }}
{% if pending_eln_imports %}{{ _('These files were uploaded before but were not imported completely. They will expire one day after being uploaded.')}}
| {{ _('File Name') }} | {{ _('Uploaded at') }} | |
|---|---|---|
| {{ eln_import.file_name }} {% if eln_import.invalid_reason %} {% endif %} | {{ eln_import.upload_utc_datetime | babel_format_datetime }} |


We live in a Twilight World
In a twilight world of international espionage, an unnamed CIA operative, known as The Protagonist, is recruited by a mysterious organization called Tenet to participate in a global assignment that unfolds beyond real time.


Scale images to always fit on screen. Notice how the content is scaled over the top so it stays in place, exactly how it was designed.


Connect Your AirPods To Any 3.5mm Source With AirFly
by Elliot NashAccessory maker TwleveSouth has launched the follow up to its successful AirFly adapter which allows AirPod users to connect their earbuds any audio source with a 3.5mm headphone jack, including aeroplanes.
The AirFly Pro will cost US$54.99 from the US Apple Store, with its predecessor sold at Officeworks for AU$64.99, so hopefully, we will see the latest model arrive in Australia at some time.
While the device has been built especially for AirPods, the AirFly Pro will work with any set of Bluetooth headphones to wirelessly transmit audio from any 3.5mm audio jack.
Though it’s Pro designation comes from its ability to stream audio out, meaning it can be utilised to stream directly from your phone to a vehicle’s sound system, or stream audio to a speaker system.
Another trick is its audio sharing function, similar to Apple’s audio sharing feature introduced for its AirPods allowing users to connect two pairs of headphones at once to the AirFly Pro dongle.
AirFly promises 16 or more hours of wireless audio playback, with charging via the USB-C port which also allows for USB-C audio playback.
Alongside the AirFly Pro, the Duo and USB-C model of the original AirFly dongle have also been released by TwelveSouth.


Olaf is a landmark based acoustic fingerprinting system. It stands out for three reasons: Olaf is...
Here Olaf runs on an ESP32 microcontroller.
The microcontroller is embedded in a smart costume and is battery powered.
Lights in the costume only react to a single, preditermined song.
Only when that song is played: the costume lights up.
When the music stops, the match is kept for a while to support interruptions.
After a while the lights stop...
....until the song starts again.
Olaf has a CLI interface to store and query audio.
Audio is processed at speeds over 1000xrealtime.


CmdFreak 1.3.0
1. CmdFreak summary
Several information systems and application software suites use a RDBMS (Relational Database Management System) as a persistence mechanism for their own data. The range of RDBMS usage shows a tendency of expansion.
Most RDBMSs are used as a background service for information systems and application software. However, such systems can also be accessed directly for data mining, quicker commercial operation and maintenance.
An appropriate RDBMS can be chosen to match the characteristics of the target information system and application software. As a result, multiple RDBMSs are often used simultaneously in the same business operation and maintenance environment. However, multiple RDBMS usage is characterized by the following problems:
- Different data reference software applications need to be provided, which may increase the learning cost.
- Data reference software needs to be installed on each client-side PC. The cost of introduction is therefore higher with a greater number of client PCs.
CmdFreak is a relational database viewer (data reference software) that provides solutions for the above problems.
- CmdFreak supports the major free RDBMS MySQL, PostgreSQL and MariaDB systems, providing a common user interface for these RDBMSs and enabling data reference as a common operation. It does not need to learn different reference software applications for multiple RDBMSs, which helps to reduce related learning costs.
- CmdFreak works as web application software, and comes with an all-in-one installer incorporating web server software. This eliminates the need for web server pre-configuration and the use of script language. The introduction cost is practically zero.
CmdFreak provides the following functions for database reference:
- List records/paging
- Table selection
- Table information reference
- Column filtering and sorting
- DBMS selection
2. System requirements
CmdFreak works on systems with the following specifications:
- Free disk space: 20 MB or more
- Operating systems/editions supported:
Windows 10 (Only 64 bit edition)
Windows Server 2016
Windows Server 2019
-
Web browsers supported:
Microsoft Internet Explorer 11
Microsoft Edge
Google Chrome
Mozilla Firefox
-
DBMSs supported:
MySQL 5.7 (+ ODBC Driver: MySQL Connector/ODBC 5.3)
MySQL 8.0 (+ ODBC Driver: MySQL Connector/ODBC 8.0)
MariaDB 10.3 (+ ODBC Driver: MariaDB Connector/ODBC 3.0)
MariaDB 10.4 (+ ODBC Driver: MariaDB Connector/ODBC 3.1)
PostgreSQL 9.6 (+ ODBC Driver: psqlODBC 9.6)
PostgreSQL 12.2 (+ ODBC Driver: psqlODBC 12.1)
3. Change history
Version 1.1.0 ---> 1.2.0
- Responsive design has been adopted for smartphone user.
- User management function has been added.
Version 1.0.0 ---> 1.1.0
- Support for displaying unlimited record.
- Performance improvement for multiple user access.
4. Installation
Execute cmdfreak.msi and launch the installer.
Follow the on-screen dialog prompts.
CmdFreak installer performs following steps during the installation.
- Register exceptions of Windows firewall for CmdFreak.
- Register service of CmdFreak to the target system.
- Auto start of CmdFreak service and Web server.
Overwrite installation(Repair) can be performed if cmdfreak.msi is executed after CmdFreak installation. Note that the items shown below for overwrite installation.
- Stop CmdFreak service before overwrite installation. If you perform the overwrite installation without service stop, restart of operating system is required after overwrite installation done.
- During overwrite installation, port numbers which Web server and CmdFreak service use might be changed into default. Confirm the port number after overwrite installation.
5. Upgrade installation
In order to upgrade from CmdFreak 1.2.0, perform installation according to following steps.
- Stop CmdFreak service.
- Copy <Installation folder>\sample.dat file to other folder.
- Uninstall CmdFreak 1.2.0.
- Install CmdFreak 1.3.0.
- Stop CmdFreak service.
- Copy and overwrite to <Installation folder>\sample.dat file from sample.dat which is copied in previous step.
- Modify <Installation folder>\conf\nginx.conf and <Installation folder>sample.conf if necessary.
- Start CmdFreak service.
6. Uninstallation
Select Remove CmdFreak with execution of cmdfreak.msi or perform uninstallation of CmdFreak from Control Panel.
CmdFreak uninstallation performs following things during uninstallation.
- Auto stop of CmdFreak service and Web server.
- Deletion of CmdFreak service from the target system.
- Deletion of Windows firewall exception for CmdFreak.
7. Login to CmdFreak
Connect to the URL shown below by Web browser for use of CmdFreak after installation. If main console is displayed after login sequence of CmdFreak, it shows the installation is successfully completed.
http://<Host name or IP address of CmdFreak>:<Port number of Web server>/cmdfreak.html
In case of specification of default installations parameters : http://localhost/cmdfreak.html
Initial login user name and password are follows.
User name : admin
Password : manager
If main console is not appeared or an error ocurred, confirm the things shown below.
- When host name is specified in the URL for the connection to CmdFreak from browser, confirm that the host name can be solved. In case the host name is not solved, change the host name to other name which can be solved, and then retry.
- Confirm that CmdFreak(nginx.exe) is registered as an exception of Windows firewall. If not, register nginx.exe to the Windows firewall as an exception.
- Confirm that the specified port number is not duplicated from other port numbers. If duplicated, specify the independent port number according to the description shown later.
8. Start/Stop CmdFreak service
Start and stop of CmdFreak service can be performed by Windows start menu.
- [CmdFreak]-[Start CmdFreak service] : Start service
- [CmdFreak]-[Stop CmdFreak service] : Stop service
9. Change IP address/host name and port number
CmdFreak uses two kinds of IP addresses/host names and ports.
- IP address/host name and port of Web server
- IP address/host name and port of CmdFreak service
In order to change the IP address/host name and port number after installation, following steps are required.
- Stop CmdFreak service.
-
Change IP address/host name and port number.
In case you change IP address/host name and port number which CmdFreak service uses:
Specify IP address/host name and port number to servicehost and serviceport properties in <Installation folder>\sample.conf
Specify IP address/host name and port number to proxy_pass of location /api/ section in <Installation folder>\conf\nginx.conf
In case you change IP address/host name and port number which Web server uses:
Change listen and server_name in <Installation folder>\conf\nginx.conf
- CHange firewall setting if necessary.
- Start CmdFreak service.
10. Connection using SSL/TLS
In order to connect to CmdFreak using SSL/TLS from browser, following steps are required.
- Stop CmdFreak service.
-
Add SSL/TLS settings to nginx.conf.
Add followings to server directive in <Installation folder>\conf\nginx.conf
(Regarding certificate and private key, modify the path according to your environment.)
ssl on;
ssl_certificate "D:\\work\\server.crt";
ssl_certificate_key "D:\\work\\server.key";
- Change listen port number into 443 or appropriate HTTPS port number.
- Start CmdFreak service.
11. About ODBC driver
CmdFreak uses ODBC for connecting to RDBMS. Therefore ODBC driver needs to be installed into same server where CmdFreak works. ODBC driver needs to be choosen depending on the type of target RDBMS. For example, If you want to use MySQL, ODBC driver for MySQL is required.
CmdFreak works as a 64-bit application hense ODBC driver has to be 64-bit edition of driver. ODBC driver is provided by the vendor who provides RDBMS. Download it from the vendoer Web site.
12. Management limitations
- Maximum length of table name: 64
- Maximum length of column name: 64
- Maximum length of column value(characters): 63 (64th or later characters are not displayed)
- Maximum number of tables: 300
- Maximum number of columns: 50 (51st or later columns are not displayed)
13. Contact
Please use the E-mail address below for inquiries about this product.
<EMAIL_ADDRESS>https://github.com/s-takeuchi
Shinya Takeuchi


It's a standard EmonTX running the Emontx_single_CT_example_watchdog sketch, and a Emonbase (Nanode RF) running the NanodeRF_singleCT code. The CT is the blue seedstudio, and all the settings in the sketch are the defaults.
The EmonTX has a single CT plugged into the CT2 socket, and a figure is produced on the serial monitor every few seconds which matches the current usage in watts (+- 1W anyway) to a British Gas alertme monitor, so that seems to be as expected. I have now removed the Alertme transmitter (& removed the batt) in case it was causing interference.
When the Emonbase is connected , it picks up an IP correctly from the DHCP server, and is posting to my emonCMS server.
I am getting rf-fail:1 displayed every 30 seconds or so, and a steady RED led lit.
I have transferred Ian Chilton's test_rx script to the Emonbase, and the serial Monitor displays a number every few seconds, which is in perfect sync with the flash of the green LED on the EmonTX, which leads me to believe that the wireless is working. The payload which is being displayed is in the format:
Received: 213910407
Received: 213910410
Received: 213910409
Received: 213910413
Received: 213910405
I have uploaded both test_TX to the emonTX and the 2 devices count up in sync.
I was using a Philips external battery pack with USB supply out - Switching to a Kindle USB adaptor cured it for about 5 hours before the signal was lost again. I have since swapped the USB power on the EmonTX for 2 AA batteries, but that has not made any difference.
Has anyone got any more ideas?
Re: Wireless link not working
Is the Nanode receiving any data? Have you checked that the emonTx is on the correct network group, correct payload and correct frequecy for the module.
Re: Wireless link not working
Both EmonTX and NanodeRF are configured for RF_433Mhz, Group 210. The Nanode is node 35 and the emonTX is node 10.
If I use the test_rx sketch from Ian Chilton's nanode site, I recieve payloads similar to the following everytime the LED on the EmonTX flashes:
Received: 213910410
Received: 213910409
Received: 213910413
Received: 213910405
And these continue on and on if I leave them
With the Emonbase_singleCT sketch loaded, I pick up a DHCP address Ok, and then just rf_fail:1 similar to below
[webClient]
DHCP status: 1
IP: <IP_ADDRESS>
GW: <IP_ADDRESS>
{rf_fail:1}
0
Date: Thu, 23 Feb 2012 21:46:17 GMT
ok recieved
{rf_fail:1}
the NanodeRF is uploading OK to my emonCMS site as I can see the RF_fail input update every 30 seconds or so.
As I said, this all worked for about 4-5 hours on Sunday, before stopping again, and I got all excited!
Re: Wireless link not working
Mm that's strange. The RF is obviously working and so is the Etherent! How far are the units appart?
Re: Wireless link not working
normally about 2 metres apart seperated by a brick wall, but I have had them on the bench next to each other.
The odd thing is I got it all to work last w/e when I powered the emonTX with a Kindle usb adaptor, and it lasted for about 5 hours before failing again. Thought that the Kindle supply may have been more stable but not stable enough so am now powering from a 2 AA battery holder from Maplin and fresh duracells.
I have tried powering the Nanode from a laptop USB port, via the FTDI cable from the same laptop, even with the emonTX USB powered from the same laptop
EmonTX is using the EmonTX single CT watchdog example sketch, and the NanodeRF is using the NanodeRF singleCT example.the EmonTX sketch is unmodified apart from to ensure the wireless settings are correct, and the nanodeRF the same + my web server details.
Re: Wireless link not working
I think/hope I may have sussed this and it appears to have been one or both of two things.
after testing again with the test_rx sketch on the Nanode, I decided to flick though the other sketchs, and loaded up the emonBase_singleCT_RTCrelay_GLCDtemp sketch, and after a minute or so settling down, the Nanode started displayiing data correctly on the serial monitor
Checked my emonCMS , only to discover that it was trying to upload to the openenergyMon demo site - as soon as I put in the internal Ip address for my web server, it bombed, but if I put in the FQDN, then it uploads.
That seems kinda weird to me as it will quite happily upload rf_fail=1 to the website via the IP, but the decode seems to fail - very odd, but it has been workign now for a couple of hours, so fingers crossed!
Re: Wireless link not working
Is the code trying to do a DNS lookup against an IP address? This is likely to fail.
Can you put the NAME of your local server in the code instead?


No. The WindowQuitter
object is registered
with the frame to receive window closing events, not
button click events (the "close button" of the frame is
not a JButton
.
This program has a listener for the "close button" at the top right of the frame. Clicking it halts the program.
You can "copy-paste-save-and-run" the program in the usual way. Name the program ButtonDemo.java.
C:\> javac ButtonDemo.java C:\> java ButtonDemo C:\>
The entire frame is filled with the button! (We will fix this shortly.) You can move the mouse pointer over the button and click on it, and the button will appear to move in and out. But the program does nothing in response to that event.


I HAVE BEEN ASSIGNED BY MY COLLEAGUES TO SEEK FOR A FOREIGN PARTNER WHO WILL ASSIST US IN THE TRANSFER OF THE SUM OF US$27.5M (TWENTY SEVEN MILLION, FIVE HUNDRED THOUSAND UNITED STATES DOLLARS).  MY COLLEAGUES AND I HAVE AGREED THAT IF YOU OR YOUR COMPANY PROVIDES AN ACCOUNT FOR RECEIVING THIS MONEY, THE SHARING RATIO WILL BE THUS: 1. 60% FOR US HERE IN NIGERIA ?THE OFFICERS INVOLVED?. 2.  3. 10% FOR EXPENSES INCURRED BY BOTH PARTIES IN THE COURSE OF THIS TRANSACTION.  TO EFFECT THE TRANSFER OF THE ABOVE SUM, WE REQUIRE THE FOLLOWING FROM YOU: *YOUR NAME OR COMPANY?S NAME, ADDRESS, TELEPHONE, FAX AND TELEX NUMBERS. AND AS SOON AS THESE REQUIREMENTS ARE RECEIVED, THE MONEY WILL BE TRANSFERRED INTO YOUR ACCOUNT OR YOUR COMPANY?S ACCOUNT FOR SAFE KEEPING PENDING OUR ARRIVAL FOR SHARING. EVERY ARRANGEMENT HAS BEEN CONCLUDED FOR A SUCCESSFUL AND HITCH-FREE TRANSFER FOR THIS MONEY INTO YOUR ACCOUNT OR COMPANY?S ACCOUNT. PLEASE KEEP THIS TRANSACTION SECRET.   BEST REGARDS, DR.SULIEMAN SULIE. Email<EMAIL_ADDRESS>___________________________________________________________________________ Con Terra MAIL obtienes 6MB de espacio además de bloqueo ANTISPAM http://terramail.terra.com.mx/TerraMail/ Acceso a Internet 3 x 1, desde ¡$179 pesos al mes! http://www.terra.com.mx/acceso/suscribete/ Encuentra los mejores productos y precios increibles!! Aprovecha nuestra promoción a 12 pagos sin intereses con Banamex y Bancomer http://www.decompras.com/


There is a class called FeatureTypes which you inherit from for creating any kind of feature. You will see various derived classes from them, EdgeFeatures, StartFeatures, etc, etc. In FeatureTypes the num() and setOffset() methods are irrelevant after the FeatureMaps class. Also the ".id" field of FeatureImpl does not need to be set by the FEatureTypes.next() methods.
The FeatureGenerator is an aggregator over all these different feature types. It is responsible for converting the string-ids that the FeatureTypes assign to their features into distinct numbers. It has a inner class called FeatureMap that will make one pass over the training data and create the map of featurenames->integer id and as a side effect count the number of features. You can then just inherit from the FeatureGenImpl class and after calling one of the constructors that does not make a call to (addFeatures()) you can then implement your own addFeatures class. There you will typically add the EdgeFeatures feature first and then the rest. So, for example if you wanted to add some parameter for each label (like a prior), you can create a new FeatureTypes class that will create as many featureids as the number of labels. You will have to create a new class that is derived from FeatureGenImpl and just have a different implementation of the addFeatures subroutine. The rest will be handled by the parent class.
Another important class is the dictionary class that is WordsInTrain class. This is created by FeatureGenTypes and is available for any featureTypes class to use. What it does is provide you counts of the number of times a word occurs in a state. A third class is the various graph class. This allows you to create CRFs where you can have more than one state per label.


Nick guided this project all the way home, from planning to execution.
Dawson Designed and Developed the marketing page and the about page.
Amber worked closesly with the Front-End developers and designers to produce a solid application that is so crucuial to Wunderlist.
Ashton built the API in which the whole system calls to and makes this a fully functional application.
Colin worked closely with the Front-End developers to design and develop this functioning application.


What I like most about managing projects with Jira is the level of organization and filtering I can achieve by tagging tickets. As someone who used to keep his CD collection in alphabetical order by artist (with secondary ordering done by year), the tagging options help me structure projects in a deeply satisfying way—except for labels, which totally bite.
While not everyone uses components or fix versions (though you SHOULD) just about everyone who manages projects in Jira ought to make use of epics. And more over, everyone ought to use epics optimally. I know without a doubt that when I first started using Jira, I leveraged epics embarrassingly poorly. But I don’t blame my past self (or anyone) for “misusing” epics in Jira. Have you ever read Atlassian’s definition of an epic?
An epic captures a large body of work. It is essentially a large user story that can be broken down into a number of smaller stories.
Saying an epic is a large user story is akin to people explaining sprints as “little waterfalls.” I get how those explanations are arrived at—comparison is one of the easiest ways to grasp new concepts—but not moving beyond these distorting definitions can greatly hobble a Jira project.
Agency agile
My use of agile is within a web agency, My product owners are (typically) my clients, and many do not have substantive experience with scrum practices. What’s more, the product owner and the client are often one and the same. While good product owners keep stakeholder expectation inline with reality, clients (or humans as a whole) have tough times saying no, or not right now, to themselves.
Here’s where effective use of epics can pay serious dividends. Rather viewing an epic like a supersized user story, I think of epics as all the things the client wants at the end of the project, laid out like a grocery list. While you won’t have all the epics you will need to get to done at the beginning of the engagement, the bulk of the epics can be plucked right from the SOW deliverables. These come in handy during backlog refinements, since it paints a clearer idea for the client the steps necessary to complete a request fully. And once you have a slew of tickets, being able to visually show the breakdown of what work is needed to complete which deliverable is hugely beneficial. We may refine backlogs at the ticket level, but stepping back to assess at the epic level can put priorities in perspective.
Not so epic epics
When I first started using epics, I would create groupings that made sense to me, but not so much to my clients. I still wince when I think back to epics like CPTs or TinyMCE. Using jargon that works for the dev team but not the client is 100% backwards.
Another mistake I made was having epics that were too large or ambiguous. I would make epics like Templates for front-end markup, or Platform for things related to the admin, database, or hosting environment. Again, this was me drawing lines of demarcation that would help me sort tasks, but to my clients the distinctions were irrelevant at best, confounding at worst.
Instead, when I am fleshing out a new website project in Jira, I add epics for all the stuff the client already knows they want. Homepage and Forms tend to make it into all of my project epic lists. From there, I create epics around any deliverable clearly laid out by the client that isn’t too broad. While Responsive design isn’t epic material, any cool feature (new or refreshed) described in the SOW will definitely be an epic.
The above are all the whizzbang epics within a project. But, without foundational work, a website would just be a seldom visited killer homepage surrounded by search engine trafficked inner pages that act like ugly cul-de-sacs. I always have an epic called Global elements as a catchall for things like the site header, navigation, and footer. It isn’t helpful to have a Header epic and a Footer epic, because there’s no point in prioritizing these against one another. Both are needed, so can share an epic and rely on story summaries to separate the work.
Anyone who is working with a CMS also needs an epic called Standard pages or something similar. The benefit of a CMS is the use of a single, cohesive templating theme across the majority of the site’s pages—for more than just blog posts. A large percentage of any site’s pages are basically the same template, so highlight this fact with a nice, shiny epic.
Often with CMS templates, a template is created that offers myriad options for layouts and other unique elements. This utility template helps site owners make visually and functionally distinct pages on their site with little to no technical know-how. There are lots of ways to name this epic, but some of my favorites are Premium page, Über page, and Super page. These names let the client know that this page does a lot, so might be worth prioritizing highly.
More than a name
While I do love naming my epics, I really get mileage out of them by adding clear summaries to the epic ticket, detailing what it is meant to accomplish. Yes, calling an epic the Awesomeness page might be fun, but without intelligible acceptance criteria documented within Jira, something will get missed. Or, something will be assumed as included that can throw a wrench in the gears down the road.
Epic descriptions are easily reviewed and understood when added in list form. I tend to have these tickets reviewed and approved by every member of the project team during kickoff or sprint 0, so any misaligned expectations are remedied very early on.
The 1-2-3s of epics
When all’s said and done, epics are most useful when they are:
- Based on a single project deliverable;
- Readily understood by all team members, regardless of their technical or business prowess, and;
- Given documentation inside Jira that the team all reviews and agrees upon.
All that being said, no project has all its epics on day one. It’s the nature (and benefit) of agile to allow the space for a project to evolve into the best solution that time, money, and scope will allow. To work best within project constraints, use epics to your (and your team’s) advantage.


#include <result.h>
Inheritance diagram for pqxx::binarystring:
Public Types | |
| typedef size_t | size_type |
Public Member Functions | |
| binarystring (const result::field &F) | |
| Read and unescape bytea field. | |
| size_type | size () const throw () |
| Size of unescaped buffer, including terminating zero. | |
| const unsigned char * | bytes () const throw () |
| Unescaped field contents. |
This class represents a postgres-internal buffer containing the original, binary string represented by a field of type bytea. The raw value returned by such a field contains escape sequences for certain characters, which are filtered out by binarystring. The binarystring retains its value even if the result it was obtained from is destroyed, but it cannot be copied or assigned.
|
|
|
|
|
Read and unescape bytea field. The field will be zero-terminated, even if the original bytea field isn't.
|
|
|
Unescaped field contents.
|
|
|
Size of unescaped buffer, including terminating zero.
|


Widget generates structure of calendar with html attributes (day, month, year, dayOfWeek) at each "day cell" (check it in ChromeBug/FireBug etc.)
Same as above but in horizontal display mode. Middle row can be used for appending custom data, after html structure refresh by OkiCalendar. You can also hide this row in css.
Demo of API methods and events.


One of the greatest things about YouTube is, if you love it there's almost definitely a video about it! Any hobby, sport, music or topic you can find a video about it. Often times those videos lead to a larger community. These communities are what make up the YouTube genres. Some of the most common are Vloggers, people who document their lives. Beauty Gurus, who make makeup, hair and other beauty tips and tutorials. Gamers, who record themselves playing video games for entertainment and insight into the game. DIY or Do it yourself, who make instructional videos on who to make, fix or do really anything at all. The list goes on and on, those are just some of the popular topics.
These genres often are broken down into smaller communities within communities. I recently learned that there are motorcycle vloggers who vlog their day through a gopro on their helmet. That is a unique community many would not think of. The point is, just be yourself and find your niche. That's one of the best things about YouTube, your ability to connect with people all over the world based on common interests. It makes this giant world feel a little smaller.
YouTube consists of billions of users and millions of content creators. It's easy to feel small or lost in the crowd in the YouTube community. In order to not just blend in, you need to brand yourself. You want a catchy and memorable name. You want a channel design, logo or slogan. Often times YouTube channels become their own brand. Try to sway away from common channel names or names with numbers in it.
Another way to brand yourself is to take advantage of other social media outlets. Using sites like Twitter, Facebook, Instagram, Snapchat and more can help you network as well as create a larger online social presence which can only grow your channel more.
(image source CardoneZone.)


This class implements an array of 3D segments. More...
#include <CSegmentArray.h>
Public Member Functions | |
| cSegmentArray (cVertexArrayPtr a_vertexArray) | |
| ~cSegmentArray () | |
| void | clear () |
| This method clears all segments from array. More... | |
| virtual unsigned int | getNumVerticesPerElement () |
| This method returns the number of vertices that compose a segment. More... | |
| cSegmentArrayPtr | copy () |
| This method create a copy of all segment data and returns a new segment array. More... | |
| void | compress () |
| This method compresses the array by removing non used segments. More... | |
| int | newSegment (const unsigned int a_vertexIndex0, const unsigned int a_vertexIndex1) |
| void | removeSegment (const unsigned int a_segmentIndex) |
| void | setVertices (const unsigned int a_segmentIndex, const unsigned int a_vertexIndex0, const unsigned int a_vertexIndex1) |
| unsigned int | getVertexIndex0 (const unsigned int a_segmentIndex) const |
| unsigned int | getVertexIndex1 (const unsigned int a_segmentIndex) const |
| virtual unsigned int | getVertexIndex (const unsigned int a_elementIndex, const unsigned int a_vertexNumber) const |
| cVector3d | getTexCoordAtPosition (const unsigned int a_segmentIndex, const cVector3d &a_localPos) |
| void | render () |
| virtual bool | computeCollision (const unsigned int a_elementIndex, cGenericObject *a_object, cVector3d &a_segmentPointA, cVector3d &a_segmentPointB, cCollisionRecorder &a_recorder, cCollisionSettings &a_settings) const |
| This method checks if the given line segment intersects a selected segment from this array. More... | |
| Public Member Functions inherited from chai3d::cGenericArray | |
| cGenericArray (cVertexArrayPtr a_vertexArray) | |
| ~cGenericArray () | |
| virtual unsigned int | getNumElements () |
| This method returns the number of allocated elements. More... | |
| void | compress () |
| This method removes non used elements. This compresses the array. More... | |
| bool | getAllocated (const unsigned int a_index) const |
| cVector3d | getTexCoordAtPosition (const unsigned int a_elementIndex, const cVector3d &a_localPos) |
Static Public Member Functions | |
| static cSegmentArrayPtr | create (cVertexArrayPtr a_vertexArray) |
| Shared cSegmentArray allocator. More... | |
| Static Public Member Functions inherited from chai3d::cGenericArray | |
| static cGenericArrayPtr | create (cVertexArrayPtr a_vertexArray) |
| Shared cGenericArray allocator. More... | |
Additional Inherited Members | |
| Public Attributes inherited from chai3d::cGenericArray | |
| cVertexArrayPtr | m_vertices |
| Vertex array that contains all vertices used to describe the elements of this array. More... | |
| std::vector< unsigned int > | m_indices |
| Element indices to vertices. More... | |
| std::vector< bool > | m_allocated |
| Element allocation flags. More... | |
| bool | m_flagMarkForUpdate |
| If true then element data has been modified. More... | |
| bool | m_flagMarkForResize |
| If true then element array size has changed. More... | |
| GLuint | m_elementBuffer |
| OpenGL Buffer for storing elements. More... | |
| Protected Attributes inherited from chai3d::cGenericArray | |
| std::list< unsigned int > | m_freeElements |
| List of free elements. More... | |
This class defines an array of segments each composed of two vertices.
A segment array is created by first passing a reference to an array of vertices (cVertexArray) from which the segments are composed.
Every segment is described by a set of two vertex indices. The indices point to the vertices that describe the segment.
For graphic rendering purposes and memory efficiency, segments are stored in large arrays. The number of allocated segments in an array can be retrieved by call getNumElements().
New segments can be added or removed by calling newSegment() and removeSegment(). respectively.
When a segment is removed from the array, the vertex indices are set to zero and the segment index number is added to a list of free segments for future allocation. Segments are therefore never removed from memory, but become a point until they are converted to an active segment again.
To avoid accumulating large numbers of free segments, it is possible to compress the array by calling compress(). This method removes all non used segments from memory.
|
inline |
Constructor of cSegmentArray.
| a_vertexArray | Array of vertices used to describe the segments. |
|
inline |
Destructor of cSegmentArray.
|
inlinevirtual |
Reimplemented from chai3d::cGenericArray.
|
inlinestatic |
|
inlinevirtual |
Reimplemented from chai3d::cGenericArray.
| cSegmentArrayPtr chai3d::cSegmentArray::copy | ( | ) |
This method copies all allocated segments. Please note that this method does not copy segments that were previously deallocated.
| void chai3d::cSegmentArray::compress | ( | ) |
This method compresses the segment array by removing all non allocated segments. If many segments are unused, this method can effectively reduce the memory footprint allocated by the array.
IMPORTANT:
After calling this method, it is important to immediately update any collision detector as the collision tree may try to access segments that no longer exist.
|
inline |
This method creates a new segment.
| a_vertexIndex0 | index of vertex 0. |
| a_vertexIndex1 | index of vertex 1. |
|
inline |
This method deallocates a selected segment from the array. The two vertex indices of the segment are set to zero, and the segment is added to the free list for future allocation.
| a_segmentIndex | Index number of selected segment. |
|
inline |
This method sets the vertices of a selected segment by passing their index numbers.
| a_segmentIndex | Index of selected segment. |
| a_vertexIndex0 | Index of vertex 0. |
| a_vertexIndex1 | Index of vertex 1. |
|
inline |
This method returns the index of vertex 0 of a selected segment.
| a_segmentIndex | Index of segment. |
|
inline |
This method returns index of vertex 1 of a selected segment.
| a_segmentIndex | Index of selected segment. |
|
inlinevirtual |
This method returns the index number of a selected vertex for a selected segment. In the case of a segment a_vertexNumber takes either 0 or 1.
| a_elementIndex | Index number of selected segment. |
| a_vertexNumber | Vertex number. |
Reimplemented from chai3d::cGenericArray.
|
inline |
This method returns the texture coordinate at the nearest point on the segment from a location passed as argument.
| a_segmentIndex | Index number of selected segment. |
| a_localPos | Local point along the segment. |
|
inlinevirtual |
This method renders the OpenGL vertex buffer object.
Reimplemented from chai3d::cGenericArray.
|
virtual |
This method checks if the given line segment intersects a selected segment from this array.
If a collision occurs, the collision point is reported through the collision recorder.
| a_elementIndex | Segment index number. |
| a_object | Pointer to the object on which collision detection is being performed. |
| a_segmentPointA | Point from where collision ray starts (in local frame). |
| a_segmentPointB | Direction vector of collision ray (in local frame). |
| a_recorder | Stores collision events |
| a_settings | Collision detection settings. |
Reimplemented from chai3d::cGenericArray.


PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 43439f6. Fixed runtime...
posted on
Tuesday, November 3, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit da3375e. Added apu6...
posted on
Tuesday, September 29, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 81a2f45. Fixed TPM2...
posted on
Monday, August 31, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 8d5cedf. Fixed memory...
posted on
Friday, July 31, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit f183626. New revisions...
posted on
Tuesday, June 30, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 8952d1c. Fixed random...
posted on
Sunday, May 31, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit d6f7ec5. Updated sortbootorder...
posted on
Tuesday, April 28, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 90557f4. Fixed processors...
posted on
Tuesday, March 31, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit e53f8c9. Fixed SD...
posted on
Saturday, February 29, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 98eeb96. Updated sortbootorder...
posted on
Thursday, January 30, 2020
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 536799d. Updated sortbootorder...
posted on
Tuesday, December 31, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 9f56eed. Temperature is...
posted on
Tuesday, December 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 2d90cb1. Added ZIP...
posted on
Friday, November 8, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 64c14b5. Added soft...
posted on
Thursday, October 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 22d66ef. Fixed watchdog...
posted on
Tuesday, September 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 2a20d13. Added ACPI...
posted on
Saturday, August 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit c32ccb7. Added support...
posted on
Wednesday, July 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit 3b4d0e0. Added initial...
posted on
Monday, June 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Rebased with official coreboot repository commit fe80bf2. Fixed MP...
posted on
Friday, May 10, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Added possibility to reboot platform with coldboot path to...
posted on
Tuesday, April 9, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Enabled CPU boost feature in runtime configuration. Some platforms...
posted on
Monday, March 11, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Mainline: Enabled Core Peformance Boost feature. For details how it...
posted on
Tuesday, February 12, 2019
in
Firmware
read more
PC Engines apu coreboot Open Source Firmware v<IP_ADDRESS> Key changes Resolved issues with rebooting on mainline firmware Enabled TPM by...
posted on
Sunday, January 20, 2019
in
Firmware
read more


I prefer to use the JavaScript features availble in modern browser over using different libraries. One thing still missing in JavaScript is Promises. A good library that works in browsers (and also in NodeJS) is promisejs by Forbes Lindesey. Bluebird claims to provide better performance but I'm sticking to promisejs for now. Promises area included in EcmaScript 6 so native support is coming.
You should also have a look at CurryJS if you like to develop in the functional style.
Some helper functions I also often end-up using: source


| Name: | |
| Position: | Period covered: |
| Date: | Appraiser: |
APPRAISAL RATING: Use the following rating in your actual performance,
1. Not yet competent, 2. Developing competence, 3. Competent as required,
4. Competent above required competence, 5. Mastery.
| {{ row.section }} | ACTUAL PERFORMANCE | |||
| Employee Rating | Supver Rating | Mgt Rating | Average Rating | |
| {{row.tasks}} | {{ row.employee_rating }} | {{ row.supver_rating }} | {{ row.mgt_rating }} | {{ row.average_rating }} |
| Section B |
| {{row.topic}} |
Employee's Comments: _________________________________________ _____________________________________________________________ ______________________________
Employee's Signature: ______________________
Supervisor's General Remarks/Comments: _________________________________________ _____________________________________________________________ ______________________________
Supervisor Name and Signature: ______________________
Management General Comments: _________________________________________ _____________________________________________________________ ______________________________
MGT Name and Signature: ______________________
| PERFORMANCE COMPETENCIES | %SCORE |
| Unsatisfactory | <40 |
| Needs improvement | 50% |
| Meets job requirements | 65% |
| Exceeds job requirements | 75% |
| Outstanding | >80% |
| 1. Unsatisfactory | Work performance is inadequate and inferior to the standards of performance required for the position. Performance at this level cannot be allowed to continue. |
| 2. Needs improvement | Work performance does not consistently meet the standards of performance for the position. Serious effort is needed to improve performance. |
| 3. Meets job requirements | Work performance consistently meets the standards of performance for the position. |
| 4. Exceeds job requirements | Work performance is consistently above the standard performance for the position. |
| 5. Outstanding | Work performance consistently superior to standards required for the job. |


Claim ID: 328492
Claim details
Member State Spain |
From date 01 January 2016 |
To date 31 June 2016 |
Customer details
First name John |
Last name Doe |
Gender Male |
Date of birth 20 September 1954 |
National ID JH1243498937 |
Potential Matches
The following are the potential matches for the request. Please select the correct cutomer
| First name | Last name | Gender | Date of birth | National ID | |
|---|---|---|---|---|---|
|
|
Johnathan | Doe | Male | 20 September 1954 | JH1243498937 |
|
|
Johnathan | Doe | Male | 20 September 1954 | XX23948329 |
|
|
John | Doe | Male | 20 September 1954 | YY2343242 |
|
|
John | Doe | Male | 20 September 1954 | ZZ2343566 |
Show more matches or Search manually


Siemens S7-1200 and S7-1500 Web Server Step-By-Step - Web-based Trending
By: Alex Marcy on June 16, 2015
Tagged: Education
Introduction
This series will give you a foundation to build a fully functional, web-based system with HMI, reporting, recipe management, trending, and dashboard components using only an S7-1200 or S7-1500 PLC, some Javascript and jQuery libraries, and a web-browser. One assumption is you already have some experience with web development, or are willing to dive into a few potentially new concepts. We won't be breaking down the fundamentals of web development here, just showing what you need to know to get data into the various formats required for the pages to work properly.
This article, the first of the series, will cover configuring the web server and show you how to implement trends in a custom web page using the S7-1200 and S7-1500's built-in datalogs for historical data.
Why is this useful?
For many OEM systems, using a built-in web server in a PLC can save on hardware costs, software costs, and give you a flexible and powerful way to interact with your equipment. You can avoid the hassle of maintaining a database for storing historical data and still give your users access to the information they need to operate most effectively.
By using web-based development frameworks, you can quickly develop a state-of-the-art, eye-popping system to give you a huge head start on some of the other interface options available to you.
What is a web server?
A web server is simply software you can access with a web-browser. It acts as the gateway between your browser and any underlying systems such as a database, and returns information to you in the form of a web-site. When you access your favorite news site, their web server generates the articles and sends them to your browser. When you configure the web server in your S7-1200 or S7-1500 PLC, it will give you access to datalogs, custom configured web pages you can use for trends, HMI functionality, dashboards, or even recipes.
Let's dive into the process of configuring the web server in your PLC and show you how to use it in some powerful ways.
Enabling the web server
The first step is to enable the web server. After opening your application, go to your PLC's Device Configuration menu, select the Web server item in the tree, and check "Activate Web server on all modules on this device". Compile your project and download to the processor:
After you have enabled the web server and downloaded to the PLC you can access the default page by navigating to your PLC's IP address in your browser.
Using the default website, you can view the Diagnostic Buffer for your PLC:
and you can access any data log files you may have stored in the PLC:
The real power of the web server comes into play when you enable user pages, or custom HTML pages you can use to interact with your PLC data, and generate things like trends and dashboard controls for detailed data analysis in your browser.
Enabling user pages
The first thing you need to do is create a directory to hold your user pages. In this case we are using a folder called S7_1200_Web on the C:\ drive. Create an HTML file in this directory and put some HTML in so we can verify everything is working properly. For testing this can be the following:
Save the HTML file as index.html and go back to your project. Scroll about halfway down to the Web Server menu in the Device Configuration tab to "User-Defined Web Pages" and enter the directory where your user pages are stored. Also enter the name of the default page, in this case we will use index.html. You can also enter your application name which will become part of the URL used to access your user pages.
You will also need to add the file extensions we will be using to the "Advanced" section to enable to PLC to generate the proper program blocks so you can access your pages. Typically these will be either .htm or .html, for html pages and .js for javascript files. Enter these extensions in the "Files with dynamic content" box under "Advanced"
By default the PLC will use DB333 and DB334 and so on to store the contents of your user pages. As you add more pages to the directory it will increment the DB number as necessary. If you would like to use a different DB number you can configure these in the "Advanced" section of the Web server configuration, just below the "User Pages" section.
Once you have filled out these sections, click the "Generate Blocks" button to generate the program blocks the PLC will use to store the HTML from your user pages.
You will then see the program blocks created, in this case DB333 and DB334
The final step to enable user pages is to add the WWW function to your logic. Specify your Web DB number, in this case 333, and a tag for the return value, then compile and download to the processor.
Once you have downloaded your logic with the WWW function, you will see a link to the default user page under "User Pages" on the PLC's default web page. You can also navigate to the page directly with the following URL format: http://{ip address of PLC}/awp/{Application Name}/{User Page}.html, or for our PLC http://<IP_ADDRESS>/awp/WebDev/index.html
Navigating to the page will display the HTML page you requested, in this case we will see a basic trend configured based on a data log file in the PLC. This functionality will be covered later in this article.
Building Powerful User Pages
With user pages enabled in the PLC's web server, we can now expand into a lot of different areas. Dashboards, reports, trends, API's, the list goes on. What you choose to do with your pages is entirely dependent on your needs, and we will cover some of the common use cases we have implemented on most of the web-based systems we have developed over the years.
General Concepts
While it is possible to include all of your HTML and Javascript/jQuery code in your user pages directory and on the PLC itself, you might find it beneficial to host the files on another machine on the network, or use a content delivery network (CDN) to deliver the files you need for client-side functionality. Including these files directly in the PLC can cause to large amounts of memory usage, potentially impacting your data logging capabilities. Hosting this files on a different machine or CDN alleviates these issues and can also speed up the load time of your pages. This article will demonstrate how to use a CDN to deliver the jQuery libraries we will be using.
In line with hosting libraries outside of the PLC, we have found hosting a Javascript file on another machine and updating it during development saves a lot of time compared to generating blocks for user pages, compiling, downloading the processor, and rebooting every time a change is made. Using a different machine allows you to edit the Javascript file on the machine, save it, and simply refresh the browser to update the page with any changes. This results in a significant time savings over the course of developing and testing a full application.
We will cover the various functionality components below, in no particular order. At this point you can jump around the article to find what interests you most and work through the exercise without a whole lot of overlap between sections.
Basic Trending
If you are using the data log functionality of the S7-1200 or the S7-1500, one powerful tool you can use in your user pages is trending. Given the relative simplicity of most web servers, including the one in our PLC, we will focus on implementing client based trending tools through the use of Javascript and jQuery.
There are a variety of frameworks you can use for this, D3, High Charts, Google Charts, or our framework of choice Flot Charts. They all have their pros and cons, some including license ramifications, open-source vs. closed source, and free vs. paid. We have found Flot Charts to work extremely well for our needs, typically trending time-stamped process data. If you have any questions about our experience with any of the tools we have used, please feel free to reach out and ask.
The basic overview of this section is we will generate a date/time range using date/time pickers on the page. When the user selects the date range and clicks the "Update" button we will request a list of data log files and based on their name, including the date/time the logs began, will select the appropriate file, parse its contents into the format required by Flot and will then display the trend to the user with the correct date/time range on the X-Axis.
First we will go through the process of generating a basic trend with fixed data set. From there we will get into dynamic datasets with date range selections. To demonstrate basic trending our PLC has a small log file tracking the run status of two pumps as seen below:
Data logs are stored as .CSV files in the S7-1200 and S7-1500 PLCs. This format defines the value of each column in the first line, with each column separated by a comma. Subsequent lines represent values at a particular timestamp, again with each column separated by a comma. This format, while useful for storage and analysis using a program like Excel, isn't directly useful for the approach we will take to generating a trend. The first step we need to accomplish is to break down the CSV data into something Javascript can deal with more effectively.
To acoomplish this, we will use a jQuery library called jQuery-CSV. This library allows us to break the CSV file down into a list of objects we can easily manipulate to work with using Javascript.
Following the tip to load libraries from a CDN, we will load the library from a CDN in the header of our HTML page. Keep in mind you can use any CDN you prefer, store the file on another machine on the network, or even put it directly in the PLC as necessary. Since we will be using jQuery libraries, we will also include the jQuery library itself:
We will do the same thing for the Flot Charts library, and for development purposes, the development version of the Javascript file we will use for testing. Since we are dealing with time series data, we will also include the Flot Time library, and the Moment.js library to simplify working with different date formats:
For Flot to function properly, we will need to add a <div> element to our page, and specify the width and height for our trend, and give it an ID so we can refer to it later in our Javascript code:
This is the basic format we need to display a single trend on a page, so we are done with our HTML page for now. Save it to your user pages folder, generate blocks, and download to the processor. We will do the rest of the work to generate a trend in the s7_Demo.js file linked to in the header.
Let's go through the code used to generate a trend line by line. If you are familiar with Javascript and jQuery this will be pretty straightforward, if not it will cover the basics of what is required for this piece of functionality, and you can find plenty of resources online to go as in-depth as you like on the language as a whole.
The first line of code tells the browser to execute this code only after the pages has completely loaded. This is to make sure all of the Javascript files and jQuery libraries are ready, and the page itself is loaded and ready for us to interact with it:
The next section defines and AJAX call to our server. This loads data from the specified URL without the user having to interact with the page, and doesn't require the page to be refreshed. We are specifying the specific URL for our datalog file in the URL parameter, telling the server we are requesting or "getting" data, specifying we want expect the data to be returned as text, and are defining the function we will execute when the AJAX call as successfully completed.
The next line begins the code executing once our AJAX call is complete. The first step is to take the results from our AJAX call, in this case the data in the .CSV file, and use the jQuery-CSV library to convert it to a list of objects Javascript can more easily understand. This is accomplished by calling the jQuery function to convert a CSV file into objects as described in the jQuery-CSV documentation. Once this function has executed, we can use the variable "results" to generate the data we will use for the trend.
The next two lines as simply declaring variables we will use to store the data for each of our trend lines.
The meat of our Javascript code, where we take the data from the objects we generated from the CSV file and parse them for our trend comes next. We are using a for loop to iterate over all of the objects. Within this loop we are pushing data onto the arrays we defined previously. This simply adds a new element onto each array for each object in the list.
The format Flot requires for trend data is an array of elements of the form [x value, y value]. For our trend we want the x-axis to display the timestamp, and the y-axis to display the value of each dataset at that time. Flot requires the timestamp data to be in a certain format, so we will have to manipulate the data in our object appropriately.
The innermost portion of this function is adding together the "Date" and "UTC Time" columns from our object, with a space separating them. This gives us a human readable timestamp of the format "Month/Day/Year Hours:Minutes:Seconds". To turn this into the format Flot expects (milliseconds since January 1, 1970, 00:00:00) we use the simply use the parse function of the Date type in Javascript as shown below.
This takes care of the x-axis value, for the y-value we specify the specific data point in our object, in this case Pump1_On or Pump2_On and include it in our elements to be pushed onto the appropriate array.
The final piece of code except for closing brackets/parentheses is to generate the plot itself. To accomplish this we call the .plot() function of the Flot library. We pass the ID value of the div we created in our HTML file as the container for the trend to be put in to, specify an array of the variables we want to use for trend lines, in this case the variables we worked with in the previous section of code, and specify a mode of "time" for the x-axis.
This generates a basic trend on our page:
Advanced Trending
With the basics of trending covered, let's dive into some more advanced functionality. For our purposes the next step is to add a couple of date/time pickers to our page so we can select a start and end time for our trend. This lets your users narrow down the amount of data they are viewing at any given time and allows them to easily view historical data.
Much like trend tools, there are a ton of options for date, time, and both date and time selection options. These can be simple HTML dropdown controls, or more complex jQuery components with additional functionality. For this tutorial we will use a jQuery date/time picker we have found to be very mobile friendly:
This date/time picker control is an add-on to an existing library of user interface controls called jQuery-UI. To make it functional we need to include the jQuery-UI library, as well as the files for this partlcular control. For the rest of this article, assume we will be adding the required lines to our existing file, to save some space we won't keep repeating previous lines of code:
Notice we are also including references to two CSS files, these contain all of the styling for the various controls and will start to become more prevalent in later sections.
To place a date/time picker on the page we need to add a div for each date/time picker we want to use, give it an ID so we can access it in Javascript, and then write the Javascript code we need to generate the control. Let's start with the HTML and break it down into further detail from there:
This code is pretty basic, we have an input for each of the datetime pickers, and an update button we will use to trigger a page update when the user changes the date range.
This code will go right below the $(function() call so it is the first thing to be executed when the page loads. This is going to be a little more involved than simply creating the date/time picker to give us additional functionality by pre-populating the pickers.
The first two lines define variables and set them to a value of the current time/date. The next line sets the startDate variable's hour to one hour ago, and the next line is there for posterity in case you wanted to choose a different range than simply the previous hour. The final two lines create the date/time picker and pre-populate their values with the start and end dates, with the correct formatting specified by the Moment.js library. Now when you load the page you will have two date/time pickers, with one at the current time, and one at the current time minus an hour.
With the date/time pickers set up, we can put them to use. This will be one of the more complex portions of the process so far and will cover a lot of different concepts. The basic outline is the page will load with default values for the date/time range, or user will make an adjustment to the range and click the update button. We will get a list of the datalogs and their "last modified" timestamp. We will figure out which datalog best matches with the date range, and load it the same way we did in the previous section. We will leave some items for your own future exploration such as more in-depth interface design and working with date/time ranges spanning multiple data logs.
First we need to know when the user clicks the update button. Using jQuery this is extremely easy using the onClick() function:
This code does a couple of things, it checks to make sure the date/time pickers have a value and if they do, it calls the updateTrendData() function. If they are empty it alerts the user and tells them to make a selection. We can accomplish the same functionality when the page loads by calling the updateTrendData() function after the date/time pickers have been created as in the previous section.
The meat of this section is what happens in the updateTrendData() function. The first portion of this function needs to determine what datalog file we need to use to populate our trend, based on when it was last edited in relation to other datalogs that may exist. We are going to make an assumption to simplify development. The assumption is datalogs will only be modified as data is added to them, and once a new datalog has been created, we will assume its start time is later in time than the previous datalog's last modification. This allows us to use the datalog information available by default to narrow down the file we need to load without having to go into the PLC code and do anything like provide a timestamp as part of the datalog name when it is created. In this case simple is better.
How do we get the timestamp data from the datalogs in the PLC? If you navigate through the built-in pages in the S7 web server you will find a list of the data logs, with an associated timestamp of when they were last modified. What we will do is load this page using an AJAX call like before so the user doesn't need to interact with the page to load the data and no page refresh is required. When the page is accessed using AJAX we can then search through the HTML to find the timestamps based on the CSS class of the table and the corresponding cell within the the table and iterate over those to build our list of timestamps. Once the list is created we can do some simple comparisons to find the closest matching datalog file and call the function to load it the same way as before.
We are going to make some big assumptions for this tutorial. First, we will assume you have datalogs being generated on a regular basis. Second, we will assume your datalogs are only storing a relatively small amount of data, say 1 hour. Lastly, we are assuming you will only want to look at the data contained in one file. It is entirely possible, with some additional code, to view data from multiple files at once, use files for any length of time, and do things like "real-time" updates. Functionality in those areas is something we can discuss further, but are out of this article's scope.
The first step is to get a list of the datalog files stored in the PLC. We will use AJAX again to accomplish this task. Navigating through the standard webpages, we find a list of data log files and the URL we can use to access the list:
Using this URL in our AJAX call:
Upon successfully loading the page, we will return its contents as text to our AJAX function for further parsing and manipulation. First we will declare a variable, set it equal to the response text, and wrap it up with <html> tags so we can manipulate the data with jQuery:
Next we will declare variables to hold our start and end timestamps from the datetimepickers.
The datalog file information is stored in a table. We will simply copy this to our page to simplify the code for this tutorial, and hide the table so it doesn't clutter up the page:
Next we will iterate through the rows of the table, checking to see if the row contains a timestamp. If it does, we will parse it into the Javascript format and compare it to our start and end timestamps to see if it is in our desired range. If it is in the range we will get the filename and generate the trend, if it is not in our range we will simply move to the next row in the table. Most of this code is similar to what we have seen previously, the main difference is navigating the table.
This function is called in two places. First it will be called when the page loads, and should load the latest datalog and display it on the trend. The second place it is called is when the user clicks on the "Update" button next to the datetimepickers. In this function we are iterating through the rows of a table. By viewing the page source in our browser, we can see what the various IDs and CSS classes each cell in the table has applied to it. Using this information we can easily find the timestamp and filename in the row using jQuery. First we will use the .find() method to determine if the timestamp cell has a valid timestamp using CSS classes, and the length of the text in the cell:
If we do have a valid timestamp we wlll parse it as before and check to see if it is in our desired range. If it is, we will navigate to the filename cell in this row and pass the filename to our function to generate the trend.
In the previous section we demonstrated loading a single datalog file. In this section we moved this functionality into a separate function, including variables for our date range to limit the amount of data we are loading from the datalog. This is the same code as before, wrapped up in a function, with a check on the timestamp in the datalog to see if we need to include it in our trend. We are calling this function from the updateTrend() function in the previous section.
Wrapping Up
Now you have the functionality in place for you to load datalogs onto your trend using a user-selectable date range. Simply changing the date range and clicking "Update" will go through the datalogs in the PLC, find the appropriate file and display it on the trend.
Where can you go from here? One option would be to simplify the process by removing the date range selection, instead generating a table of the datalogs and allowing the user to click on a particular file to display it on the trend. Another option giving you more flexibitly along with more backend complexity would be to load data from multiple datalogs to fill your date range with any data in the PLC. A third option would be the addition of "real-time" trending, allowing users to see the most recent data as it is written to the PLC. The Flot website has excellent examples of this functionality, and if you have any questions on how to implement any of these ideas or any you have, we are always happy to help.
Recent Posts:
MES Essentials Webinar Wrap-Up
07/17/15
MES Essentials Webinar
07/10/15
Tweets by @CorsoSystems


Having recently completed the Post-Secondary degree program in Chemical Engineering at McMaster University, I am well-prepared to meet and exceed your expectations in the provided opening. Confident I will quickly prove myself as a vital member of your team, I have enclosed my resume for your review. Equipped with highly transferrable experience in coordinating engineering projects and generating cost estimates, I am ready to hit the ground running. I know what it takes to navigate business challenges, overcome obstacles, and deliver results in key areas including cost control, process control and optimization, and safety improvements. If given the opportunity, I will leverage my extensive background to drive the achievement of your ambitious business goals. Please consider the following highlights of my qualifications: ** Chemical Engineering graduate specializing in process control with strengths in following written procedures, developing projects, and managing multiple priorities simultaneously. ** Strong organizational and planning abilities as well as utilizing new technology to improve safety efficiencies, cost controls, and environmental protection. ** Additional technical skills with Microsoft Excel and drafting skills using AutoCAD. In me, your company will gain a diligent and focused professional with a tireless work ethic and relentless drive to achieve the goals set before me. As such, I believe I would be a great addition to your team and I would welcome the chance to meet in person. Until then, thank you for your consideration. Sincerely, Padam Sandhu


{% extends "base.html" %} {% block title %}WattTime{% endblock %} {% block content %}
We could not find a user with the email address {{ email }}. Please check to see that your information was entered correctly. Or you could create an account.


Supply people and technology on the Digital Marketplace
All public sector organisations can use the Digital Marketplace to find people and technology for digital projects.
You can find:
- cloud hosting, software and support, for example content delivery networks or accounting software
- physical datacentre space for legacy systems
- digital specialists, for example developers and content designers
- digital outcomes, for example a booking system beta or an accessibility audit
- user research participants and labs
Suppliers on the Digital Marketplace are already on either the G-Cloud, Digital Outcomes and Specialists or Crown Hosting Data Centres framework.
on the Digital Marketplace
Before you start
The buying process differs according to which agreement between government and supplier (framework) you’re using.
Buying services through frameworks is faster and cheaper than entering into individual procurement contracts.
Find out how to:


{% extends "base.html" %} {% block main %} {% include "_title.html" %}
We could not fetch the token from the provider for any of the following reasons:


Auto Retweet Queue
Auto Retweet page link
Delete Selected
Add links
Add to Queue
State
Settings
username:
Save


* From their futurist-inspired satirical pop-musical to a hip-hop infused adaptation of the 1962 French short film ‘La Jetee’, Borscht Corporation
today’s Very Short List:
tech 3 Mar 2014
Jared Earley, memory maker, merges penchants for food, film, and music, through professional stints and personal indulgences. Twitter
Subscribe
* As well-mannered as the name suggests, Vinyl Me, Please
* A lighthearted screening series designed for archaeologists of the home entertainment system variety, playbackthetape
http://link.nyobserver.com/516ca68465217dc6e1b9a3a61gngc.bpa/UQvKZm-oa4SYFKEqC68a5 very short list is a
delightful e-mail that shares
cultural gems from a
different curator every day.
If you have any problems reading this e-mail, click here
http://link.nyobserver.com/516ca68465217dc6e1b9a3a61gngc.bpa/Tyk4O_EdCBvgSTIZC4294
Subscribe
Forward
My Account
Unsubscribe
food 28 Feb 2014
Karyn Campbell reveals the farmer in all of us.
culture 26 Feb 2014
Tina Essmaker on writers moving from web to print.
tech 26 Feb 2014
Ryan Jacoby on people who play, for serious.
Editorial Policy
Privacy Policy
Contact Us
Press
Terms + Conditions
very fine print: ©2014
Observer VSL LLC.
321 West 44th Street, 6th Floor
New York, NY 10036 USA
All rights reserved.
Questions?<PHONE_NUMBER>.
This message was intended for<EMAIL_ADDRESS>If you believe this has been sent to you in error, please safely unsubscribe


?
Calls:
?
Total Duration
?
(inc)
?
(exc)
Average Duration
?
(inc)
?
(exc)
Instantaneous Duration
?
(inc)
?
(exc)
Stream Offset Modes
silhouette
wiggle
zero
Stream Interpolation Modes
linear
step
basis
cardinal
monotone
Depth:


This is heading 1 within an article This is a paragraph in the article. Next comes a abbreviation: WHO. Heading 2 within a section This is a paragraph in the section. It contains a link to an anchor. Heading 3 Next you see an address Example.com Box 564, Disneyland USA And an aside content This is heading 5 Text can be bold


Deleting a group should not be done lightly. If you're really sure you want to do this, then confirm the name of the group below:


When you create a new "Empty" web application, you get just 4 code lines in Program.cs:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
There is a new cut-down lambda syntax for endpoints, suitable for simple microservices. There is no routing and no controllers.
It's the new .net 6 no-class single-file philosophy. As I discussed before, it's nice for demos and teaching, but I'm sceptical for real-world professional development. You don't have to religiously adhere to SRP etc to recognise that 100s of lines of code in a single file is bad news.
There is also the risk of confusion- we already have asp MVC, web api, Razor pages and Blazor. You can mix these types, even in a single website, but that leaves an even heavier learning curve. You can start with one approach and over time the requirements change, forcing a rewrite.
The theory is that this is useful for microservices, doing simple and focussed tasks which are not going to evolve and grow. Of course, in practice everything becomes more complex over time.
If it looks familiar, it's an evolution of the .net 3 endpoints, which you often ignore because you just do endpoints.MapControllers.
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
Under the covers, it is still calling UseRouting() and UseEndpoints(), they are just hidden.
app.UseRouting();
Let's take a semi-realistic microservice- a monitoring service. Other services ping it to say they are alive; the monitoring services tracks the pings and can show a list of services that are out-of-date, possibly hung or stopped.
I'm using Swashbuckle.AspNetCore and EntityFrameworkCore.Sqlite here.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<MonitorDb>(opt => opt.UseSqlite("Data Source=Monitors.db;"));
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
//this endpoint just to create the empty db without doing a migration
app.MapGet("/", async (MonitorDb db) =>
await db.Database.EnsureCreatedAsync());
//all monitors
app.MapGet("/list", async (MonitorDb db) =>
await db.Monitors
.OrderBy(m => m.Name)
.ToListAsync());
//all monitors more than 5 minutes old
app.MapGet("/listOld", async (MonitorDb db) =>
await db.Monitors
.OrderBy(m => m.Recorded)
.Where(m => m.Recorded <= DateTime.Now.AddMinutes(-5))
.ToListAsync());
//ping from a named service
app.MapPost("/ping", async (string name, MonitorDb db) =>
{
var monitor = await db.Monitors.FirstOrDefaultAsync(x => x.Name == name);
if (monitor == null)
{
monitor = new Monitor { Name = name };
db.Monitors.Add(monitor);
}
monitor.Recorded = DateTime.Now;
await db.SaveChangesAsync();
return Results.Accepted($"/ping/{monitor.Name}", monitor);
});
app.Run();
//The model/table
class Monitor
{
public int Id { get; set; }
public DateTime? Recorded { get; set; }
public string? Name { get; set; }
}
//The EF DbContext
class MonitorDb : DbContext
{
public MonitorDb(DbContextOptions<MonitorDb> options)
: base(options) { }
public DbSet<Monitor> Monitors => Set<Monitor>();
}
That's 64 lines, not bad. You could reduce it by moving the DbContext and model class to their own files, and not doing the sketchy database creation, but you would add configuration of connection string, perhaps a database migrateAsync initialization, validation (which is lacking, see below), authorization etc
- Routing is via http action handlers- MapGet/MapPost/MapPut/MapDelete. The methods are lambdas, but you can create a method (returning IResult). The same MVC/API binding is being used for arguments, plus DI properties (see below)
- There is an implicit app.UseRouting() called before everything else (so you can app.UseAuthorization() anywhere- usually the order is critical)
- You can add .WithName("routeName") to help with routing redirects.
- Whereas controllers have IActionResult, minimal API lambdas return IResult (eg from static Results.Ok(), Results.BadRequest(), etc).
- DI cannot be via constructor args, so it has parameter DI (and standard HttpContext, HttpRequest, ClaimsPrincipal).
- There is no built-in model validation. You don't have MVC's controller.ModelState.IsValid() or the [ApiController] attribute. You have to do it manually.
- You can add authorization:
app.MapGet("/auth", () => Results.Ok).RequireAuthorization();
If you are confident your microservice will be small, simple and won't change, it looks ok, but it won't take much additional requirements to make good old controllers look easier.


Shehbaz Sharif rejects US criticism on CPEC
by Web DeskPakistan Muslim League-Nawaz (PML-N) President Shehbaz Sharif criticized US envoy Alice Wells’ statement from the previous day, stating that her statement about the China-Pakistan Economic Corridor (CPEC) showed her ignorance of the project.
Taking to Twitter, Shehbaz said “Amb. Alice Wells’ statement on CPEC reflects her ignorance of the design of the project. PMLN categorically rejects her criticism & dubs it ill-founded. As someone who was closely associated with negotiation process, I must say that CPEC envisions a community of shared interests”.
“There were 4 components of CPEC during 1st phase: energy projects, infrastructure dev, industrial zones & Gwadar port. Money poured into building power projects was mostly investment & grants. There is a minuscule share of loans & that too at the lowest possible interest rates”, he added.
“At a time when Pakistan was enveloped by darkness owing to the worst energy crisis, China came forward with generous assistance program, the largest in Pakistan’s history. Elimination of energy crisis alone, thanks to Chinese help, has benefited Pakistan’s economy tremendously”.
“I believe President Xi’s Belt & Road Initiative, based on the idea of win-win partnerships, shows the way forward & is an incredible model of interstate relations. Pakistanis will remain grateful to their Iron Brother for not only CPEC but also being an ally & all-weather friend”, he maintained.


Selects a subset of items from array
and returns it as a new array.
Note: This function is used to augment the Array
type in Angular expressions. See
angular.module.ng.$filter
for more information about Angular arrays.
{{ filter_expression | filter:expression }}
$filter('filter')(array, expression)
array – {Array} –
The source array.
expression – {string|Object|function()} –
The predicate to be used for selecting items from
array
.
Can be one of:
string
: Predicate that results in a substring match using the value of expression
string. All strings or objects with string properties in array
that contain this string
will be returned. The predicate can be negated by prefixing the string with !
.
Object
: A pattern object can be used to filter specific properties on objects contained
by array
. For example {name:"M", phone:"1"}
predicate will return an array of items
which have property name
containing "M" and property phone
containing "1". A special
property name $
can be used (as in {$:"text"}
) to accept a match against any
property of the object. That's equivalent to the simple substring match with a string
as described above.
function
: A predicate function can be used to write arbitrary filters. The function is
called for each element of array
. The final result is an array of those elements that
the predicate returned true for.

 Search: <input ng-model="searchText">

Name	Phone

 {{friend.name}}	 {{friend.phone}}

 Any: <input ng-model="search.$">
 Name only <input ng-model="search.name">
 Phone only <input ng-model="search.phone"å>

Name	Phone

 {{friend.name}}	 {{friend.phone}}

it('should search across all fields when filtering with a string', function() { input('searchText').enter('m'); expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). toEqual(['Mary', 'Mike', 'Adam']); input('searchText').enter('76'); expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). toEqual(['John', 'Julie']); }); it('should search in specific fields when filtering with a predicate object', function() { input('search.$').enter('i'); expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). toEqual(['Mary', 'Mike', 'Julie']); });


Note: This is not my actual resume
<EMAIL_ADDRESS>Objective
To take a position as a software engineer.
Experience
Junior Developer, Software Company (2010 - Present)
- Designed and implemented end-user features for Flagship Product
- Wrote third-party JavaScript and Ruby libraries
Skills
Languages: C#, JavaScript, Python, Ruby
Frameworks: .NET, Node.js, Django, Ruby on Rails
Education
BS, Economics, My University
- Award for best senior thesis
- GPA: 3.8


AMAZING PEOPLE ARE MAKING DESIGNS IN A FUN ENVIRONMENT
When you work with us,you are part of a team of committed collaborators.All aspects pf our software development process are intergrated,interactive and agile.
Our approach unifies development and product management to create exceptional products.
We start each project by understranding your bussiness goals,the user's needs and product requirements
Then we help translate them into effective and elegant solutions.
Before we sign a contract or write a line of code our team will spend the necessary time needed to understand your product vision
The outcome of this scoping session is proposal or high-level statement of work.
based on your requiments,we can provide acomplete offering or just the pieces you need.
Our design practice offers a full range of services including brand strategy, interaction and visual design and user experience testing. Throughout your project, our designers create and implement visual design and workflows, solicit user feedback and work with you to make sure what gets built is what is needed.
All engineers are fluent in the latest enterprise, mobile and web development technologies. They collaborate with your team to write, and improve code on a daily basis, using proven practices such as test-driven development and pair programming.
Planning and development is iterative. Because we are constantly coding and testing, the products we build are always ready to go live. This iterative process allows for changes as business requirements evolve.
Animation
Orange App
Security App
Black App
Tours and travell
Calculater
Mock-up
Silver spring
DELANI STUDIO
2019


{% extends "base_12.html" %} {% load breadcrumbs feature_tag %} {% block page_title %}Unexpected Error{% endblock %} {% block breadcrumbs %} {{ block.super }} {% breadcrumb_url pages-root 'Home' %} {% breadcrumb 'Site Operation Error' %} {% endblock %} {% block page_content %}
The computer software that runs this website experienced an unexpected error.
The details of the error have been safely logged and a site operator will look into the cause of the problem.
In the meantime, we've shielded you from the nature of the problem to protect the security of you and other users.


Home
About Us
Locations
Sales
Contact Us
Daily Sales Projections
Add a new sale location
Name of Location:
Min. number of customers:
Max. number of customers:
Average number of cookies per sale:
Add Location


fortheyin -- Andy Yin
| fortheyin | [-c | --cell] [-e | --email] [-g | --github] [-l | --linkedin] [-s | --soundcloud] [-p | --projects] [-e | --education] [-m | --misc] [-w | --work] [-t | --technical] |
Making things that don't exist, yet.
Full-stack web developer, designer, music arranger, and hobbyist game developer.
| -c, --cell | +1<PHONE_NUMBER> |
| -e, --email |<EMAIL_ADDRESS>|
| -g, --github | ForTheYin |
| -l, --linkedin | Andy Yin |
| -s, --soundcloud | ForTheYin |
| -p, --projects |
UWork: Smart Scheduling App Clean WaterWorks: Upgrade Your WaterlooWorks TallyPost: Social Polling Platform Frenzno Feakency: Original Unity3D Game |
| -e, --education |
4B Computer Science University of Waterloo, Student ID: 20507203 |
| -m, --misc |
Hack the North Mentor (2015) Winner of Kik Hackathon (2015) |
| -w, --work |
Software Engineer (Internship) @ LimeBike.
Software Engineer (Internship) @ Toast, Inc. Web Developer (Internship) @ Kik Interactive, Inc. CS 135 Instructional Support Assistant (Internship) @ University of Waterloo |
| -t, --technical |
Programming Languages: C, C++, C#, PHP, Lisp, Ruby, Kotlin, Java, Python, JavaScript Frameworks & Other Technical Skills: CSS, HTML, React, Angular, Node.js, Express.js, Flask, Django, Ruby on Rails, Play Framework, MySQL, MongoDB, PostgreSQL, Bootstrap, Sketch, Illustrator, Photoshop, Logic Pro X, Regular Expressions Operating Systems: Windows, OS X, Linux Deployment: AWS EC2, Heroku, Google AppEngine Communication & Languages: English, Mandarin (spoken only) |


Call us!
0112-855-856
(8AM to 11PM)
LKR 0.00
(
0
items)
Empty cart
Home
Site Links
About Us
Contact Us
Privacy Policy
Terms of Use
Site Links
About Us
Contact Us
Privacy Policy
Terms of Use
Follow Us On...
Facebook
Twitter
Linkedin
Google Plus
Subscribe Newsletter
To get latest updates and food deals every week


2021 Mercedes-Maybach GLS 600 Takes Luxury To New Heights
Maybach’s super posh first SUV won’t come cheap.
by Karl FurlongThere's a new boss in the full-size SUV segment in the form of the Mercedes-Maybach GLS 600, the first-ever SUV to wear the coveted Maybach badge. Representing the ultimate in luxury, technology, refinement, and comfort that have been highlights of the Mercedes-Maybach S sedan, the GLS 600 blends these qualities with the elevated seating position and the robust profile of an SUV. Yesterday, we got a teaser of the Maybach SUV's face, and now we get to see it in all its glory as it debuts at the Auto Guangzhou in China today.
Powering the ultra-lavish Maybach is a 4.0-liter twin-turbo V8 with EQ Boost and a 48-volt onboard electrical system. The V8 on its own is good for 550 horsepower and 538 lb-ft of torque, with the EQ Boost adding up to 21 hp and 184 lb-ft.
Effortless performance is the order of the day, with the Mercedes-Maybach GLS 600 hitting 60 mph in a claimed 4.8 seconds on its way to a top speed of 130 mph. Not bad for a 204.9-inch hulk of an SUV with massaging seats and a Burmester high-end 3D surround sound system that effectively shuts out any hint of what's happening in the outside world.
Still, it's not quite performance on the level of the Bentley Bentayga W12, but the Mercedes-Maybach is more about ultimate comfort and status than outright power. It takes just one look at the bespoke cabin to confirm this, with tasteful finishes and Maybach-specific touches that set this beauty apart from the standard GLS.
To ensure that passengers are fully isolated from the utter inconvenience of road scars, the GLS 600 gets a clever e-active body control suspension system that's partially powered by the 48V onboard electrical system. Not only are the spring and damping forces individually controlled at each wheel, but Road Surface Scan and a Curve inclination function also work together to provide superlative comfort for the driver and fortunate passengers.
The sumptuous rear quarters can be specified with individual Executive Rear Seats, turning the GLS 600 into a four-seater.
As owners exit their private jets and board this luxury yacht for the road, they'll take pride in noticing that this Maybach doesn't look like an ordinary GLS. Two-tone paintwork, a Maybach-exclusive grille, fully retracting Maybach running boards, and 22-inch light-alloy wheels all scream grandeur.
The 2021 Mercedes-Maybach GLS 600 is set to go on sale in the US in the second half of 2020. Pricing is still to be announced, but considering that the top-line Mercedes-Maybach S sedan goes for over $200,000, don't expect to pay any less than that for this grand SUV.


Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, maiores!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis optio neque consectetur consequatur magni in nisi, natus beatae quidem quam odit commodi ducimus totam eum, alias, adipisci nesciunt voluptate. Voluptatum.
To blog or not to blog. Right now, my blog is a work in progress. It doesn't necessarily present coherent themes at this point. However, I hope this blog allows me to keep up-to-date with events in the news and to learn more about different topics of interest to the public through writing. Writing faciliates my understanding of different concepts and topics. My blog not only holds me accountable for what I am learning, but is also an attempt to organize and structure my thouhgts.
This section is an attempt to work out my understanding of various concepts in computer coding and programming.
I have provided links to coding projects on which I have worked. You can view some samples of my work. I believe posting links to my projects will help me to improve and provide me with the motivation to perform better in this area that requires continuous learning. Practice makes perfect. Or, hopefully, close to perfect. necessitatibus neque.