Program 2020
This was the program for Airflow Summit 2020.
2020-07-06T16:00:00.000Z
Host: London
Keynote: Airflow then and now
by Bolke de Bruin Maxime Beauchemin
Airflow at Société Générale : An open source orchestration solution in a banking environment
by Mohammed Marragh Alaeddine Maaoui
This talk covers an overview of Airflow as well as lessons learned of its implementation in a banking production environment which is Société Générale. It will be the summary of a two-year experience, a storytelling of an adventure within Société Générale in order to offer an internal cloud solution based on Airflow (AirflowaaS).
Scheduler as a service - Apache Airflow at EA Digital Platform
by Nitish Victor Preethi Ganeshan Xiaoqin Zhu
In this talk, we share the lessons learned while building a scheduler-as-a-service leveraging Apache Airflow to achieve improved stability and security for one of the largest gaming companies. The platform integrates with different data sources and meets varied SLA’s across workflows owned by multiple game studios. In particular, we present a comprehensive self-serve airflow architecture with multi-tenancy, auto-dag generation, SSO-integration with improved ease of deployment.
2020-07-07T16:00:00.000Z
Host: NYC
Keynote: How large companies use Airflow for ML and ETL pipelines
by Kevin Yang Dan Davydov Tao Feng
In this talk, colleagues from Airbnb, Twitter and Lyft share details about how they are using Apache Airflow to power their data pipelines.
Data DAGs with lineage for fun and for profit
by Bolke de Bruin
Let’s be honest about it. Many of us don’t consider data lineage to be cool. But what if lineage would allow you to write less boilerplate and less code, while at the same time make your data scientists, your auditors, your management and well everyone more happy? What if you could write DAGs that mix between tasks based and data based?
Airflow on Kubernetes: Containerizing your workflows
by Michael Hewitt
At Nielsen Digital we have been moving our ETLs to containerized environments managed by Kubernetes. We have successfully transferred some of our ETLs to this environment in production. In order to do this we used the following technologies: Helm to easily deploy Airflow on to Kubernetes; Airflow’s Kubernetes Executor to take full advantage Kubernetes features; and Airflow’s Kubernetes Pod Operator in order to execute our containerized Tasks within our DAGs. To automate a lot of the deployment process we also used Terraform. Lastly, Kubernetes features were used to gain much more fine grained control of Airflows infrastructure.
2020-07-08T04:00:00.000Z
Host: Bangalore
Data flow with Airflow @ PayPal
by Aishwarya Sankaravadivel
Democratised data workflows at scale
by Mihail Petkov Emil Todorov
Financial Times is increasing its digital revenue by allowing business people to make data-driven decisions. Providing an Airflow based platform where data engineers, data scientists, BI experts and others can run language agnostic jobs was a huge swing. One of the most successful steps in the platform’s development was building our own execution environment, allowing stakeholders to self deploy jobs without cross team dependencies on top of the unlimited scale of Kubernetes. In this talk we share how we have integrated and extended Airflow at Financial Times.
Migrating Airflow-based Spark jobs to Kubernetes - the native way
by Roi Teveth Itai Yaffe
2020-07-08T16:00:00.000Z
Host: Bay Area
Keynote: Future of Airflow
by Jarek Potiuk Kaxil Naik Tomasz Urbaszek Ash Berlin-Taylor Kamil Bregula Daniel Imberman
Run Airflow DAGs in a secure way
by Rafal Biegacz
In the contemporary world security is important more than ever - Airflow installations are no exception. Google Cloud Platform and Cloud Composer offer useful security options for running your DAGs and tasks in a way so you effectively can manage a risk of data exfiltration and access to the system is limited.
Airflow as the next gen of workflow system at Pinterest
by Yulei Li Dinghang Yu Ace Haidrey
2020-07-09T16:00:00.000Z
Host: Seattle
Keynote: Making Airflow a sustainable project through D&I
by Aizhamal Nurmamat kyzy Griselda Cuevas
Improving Airflow's user experience
by Ry Walker Maxime Beauchemin Viraj Parekh
Astronomer is focused on improving Airflow’s user experience through the entire lifecycle — from authoring + testing DAGs, to building containers and deploying the DAGs, to running and monitoring both the DAGs and the infrastructure that they are operating within — with an eye towards increased security and governance as well. In this talk we walk you through some current UX challenges, an overview of how the Astronomer platform addresses the major challenges, and also provide sneak peek of the things that we’re working on in the coming months to improve Airflow’s user experience.
Airflow CI/CD: Github to Cloud Composer (safely)
by Jacob Ferriero
Deploying bad DAGs to your Airflow environment can wreak havoc. This talk provides an opinionated take on a mono repo structure for GCP data pipelines leveraging BigQuery, Dataflow and a series of CI tests for validating your Airflow DAGs before deploying them to Cloud Composer.
Workshop: Getting started with Apache Airflow
by Fokko Driesprong
2020-07-10T04:00:00.000Z
Host: Bangalore
Advanced Apache Superset for Data Engineers
by Maxime Beauchemin
Superset is the leading open source data exploration and visualization platform. In this talk, we’ll be presenting Superset with a focus on advanced topics that are most relevant to Data Engineers. The presentation will be largely a live demo of the product, with a deeper dive into advanced topics for Data Engineers.
Teaching an old DAG new tricks
by QP Hou
Scribd is migrating its data pipeline from an in house system to Airflow. It’s a one big giant data pipeline consisting of more than 1,500 tasks. In this talk, I would like to share couple best practices on setting up a cloud native Airflow deployment in AWS. For those who are interested in migrating a non-trivial data pipeline to Airflow, I will also share how Scribd plans and executes the migration.
Ask me anything with Airflow members
2020-07-10T16:00:00.000Z
Host: Warsaw
Demo: Reducing the lines, a visual DAG editor
by Traey Hatch
In this talk I will introduce a DAG authoring and editing tool for Airflow that we have built. Installed as a plugin, this tool allows users to author DAGs compose existing operators and hooks with virtually no Python experience. We walk through a demo of DAG authorship and deployment, and spend time reviewing the underlying open-source standards used and the general approach that was taken to develop the code.
AIP-31: Airflow functional DAG definition
by Gerard Casas Saez
Airflow does not currently have an explicit way to declare messages passed between tasks in a DAG. XCom are available but are hidden in execution functions inside the operator. AIP-31 proposes a way to make this message passing explicit in the DAG file and make it easier to reason about your DAG behaviour.
Using Airflow to speed up development of data intensive tools
by Blaine Elliot
In this talk we review how Airflow helped create a tool to detect data anomalies. Leveraging Airflow for process management, database interoperability, and authentication created an easy path forward to achieve scale, decrease the development time and pass security audits. While Airflow is generally looked at as a solution to manage data pipelines, integrating tools with Airflow can also speed up development of those tools.
Workshop: Best Practices for running Airflow on Kubernetes
by Daniel Imberman Greg Neiheisel
2020-07-13T16:00:00.000Z
Host: London
Autonomous driving with Airflow
by Amr Noureldin Michal Dura
This talk describes how Airflow is utilized in an Autonomous driving project, originating from Munich - Germany. We describe the Airflow setup, what challenges we encountered and how we maneuvered to achieve a distributed and highly scalable Airflow setup.
From cron to Airflow on Kubernetes: A startup story
by Adam Boscarino
Learn how Devoted Health went from cron jobs to Airflow deployment Kubernetes using a combination of open source and internal tooling.
Airflow in Airbnb
by Kevin Yang Ping Zhang Yingbo Wang Cong Zhu Conor Camp
Go over the yesterday, today and tomorrow for Airflow in Airbnb. Share our learnings and vision in Airflow core and around Airflow in its eco system.
2020-07-14T04:00:00.000Z
Host: Tokyo
Pipelines on pipelines: Agile CI/CD workflows for Airflow DAGs
by Victor Shafran
How do you create fast and painless delivery of new DAGs into production? When running Airflow at scale, it becomes a big challenge to manage the full lifecycle around your pipelines; making sure that DAGs are easy to develop, test, and ship into prod. In this talk, we will cover our suggested approach to building a proper CI/CD cycle that ensures the quality and fast delivery of production pipelines.
Production Docker image for Apache Airflow
by Jarek Potiuk
Airflow as an elastic ETL tool
by Hendrik Kleine Vicente Ruben del Pino Ruiz
In search of a better, modern, simplistic method of managing ETL’s processes and merging them with various AI and ML tasks, we landed on Airflow. We envisioned a new user friendly interface that can leverage dynamic DAG’s and reusable components to build an ETL tool that requires virtually no training.
2020-07-14T16:00:00.000Z
Host: NYC
How do we reason about the reliability of our data pipeline in Wrike
by Alexander Eliseev
Achieving Airflow observability with Databand
by Josh Benamram
While Airflow is a central product for data engineering teams, it’s usually one piece of a bigger puzzle. The vast majority of teams use Airflow in combination with other tools like Spark, Snowflake, and BigQuery. Making sure pipelines are reliable, detecting issues that lead to SLA misses, and identifying data quality problems requires deep visibility into DAGs and data flows. Join this session to learn how Databand’s observability system makes it easy to monitor your end-to-end pipeline health and quickly remediate issues.
From S3 to BigQuery - How a first-time Airflow user successfully implemented a data pipeline
by Leah Cole
BigQuery is GCP’s serverless, highly scalable and cost-effective cloud data warehouse that can analyze petabytes of data at super fast speeds. Amazon S3 is one of the oldest and most popular cloud storage offerings. Folks with data in S3 often want to use BigQuery to gain insights into their data. Using Apache Airflow, they can build pipelines to seamlessly orchestrate that connection. In this talk, Leah walks through how they created an easily configurable pipeline to extract data.
2020-07-15T16:00:00.000Z
Host: Amsterdam
Building reuseable and trustworthy ELT pipelines (A templated approach)
by Nehil Jain
To improve automation of data pipelines, I propose a universal approach to ELT pipeline that optimizes for data integrity, extensibility, and speed to delivery. The workflow is built using open source tools and standards like Apache Airflow, Singer, Great Expectations, and DBT.
Testing Airflow workflows - ensuring your DAGs work before going into production
by Bas Harenslak
How do you ensure your workflows work before deploying to production? In this talk I’ll go over various ways to assure your code works as intended - both on a task and a DAG level.
Adding an executor to Airflow: A contributor overflow exception
by Vanessa Sochat
Engaging with a new community is a common experience in OSS development. There are usually expectations held by the project about the contributor’s exposure to the community, and by the contributor about interactions with the community. When these expectations are misaligned, the process is strained. In this talk Vanessa discusses a real life experience that required communication, persistence, and patience to ultimately lead to a positive outcome.
Workshop: Contributing to Apache Airflow
by Jarek Potiuk Tomasz Urbaszek
2020-07-16T04:00:00.000Z
Host: Melbourne
Migration to Airflow backport providers
by Anita Fronczak
In this talk Anita showcases how to use the newly released Airflow Backport Providers.
From Zero to Airflow: bootstrapping a ML platform
by Noam Elfanbaum
At Bluevine we use Airflow to drive our ML platform. In this talk, Noam presents the challenges and gains we had at transitioning from a single server running Python scripts with cron to a full blown Airflow setup. This includes: supporting multiple Python versions, event driven DAGs, performance issues and more!
Airflow the perfect match in our analytics pipeline
by Sergio Fandino
For three years we at LOVOO, a market-leading dating app, have been using the Google Cloud managed version of Airflow, a product we’ve been familiar with since its Alpha release. We took a calculated risk and integrated the Alpha into our product, and, luckily, it was a match. Since then, we have been leveraging this software to build out not only our data pipeline, but also boost the way we do analytics and BI.
2020-07-16T16:00:00.000Z
Host: Bay Area
Data engineering hierarchy of needs
by Angel Daz
Data Infrastructures look differently between small, mid, and large sized companies. Yet, most content out there is for large and sophisticated systems. And almost none of it is on migrating a legacy, on-prem, databases over to the cloud. In order to better explain the evolving needs of data engineering organizations, we will review the hierarchy of needs for data engineering.
What open source taught us about business
by Karolina Rosol Maciej Oczko
This talk shares Polidea’s journey from mobile app development studio to an OSS oriented business partner. We will tell you our story towards code leadership throughout the years. We are also going to share the challenges and practical insights into managing open source projects in our company. After this talk, you will know how we approached combining open source, business and team management not forgetting about a human aspect.
Effective Cross-DAG dependency
by Rafael Ribaldo Lucas Mendes Mota da Fonseca
Cross-DAG dependency may reduce cohesion in data pipelines and, without having an explicit solution in Airflow or in a third-party plugin, those pipelines tend to become complex to handle. That is the reason we, at QuintoAndar, have created an intermediate DAG to handle relationships across data pipelines called Mediator, in order for them to be scalable and maintainable by any team.
2020-07-17T16:00:00.000Z
Host: Warsaw
Airflow: A beast character in the gaming world
by Naresh Yegireddi Patricio Garza
Being a pioneer for the past 25 years, SONY PlayStation has played a vital role in the Interactive Gaming Industry. Over 100+ million monthly active users, 100+ million PS-4 console sales along with thousands of game development partners across the globe, big-data problem is quite inevitable. This presentation talks about how we scaled Airflow horizontally which has helped us building a stable, scalable and optimal data processing infrastructure powered by Apache Spark, AWS ECS, EC2 and Docker.
Machine Learning with Apache Airflow
by Daniel Imberman
This talk discusses how to build an Airflow based data platform that can take advantage of popular ML tools (Jupyter, Tensorflow, Spark) while creating an easy-to-manage/monitor
Achieving Airflow Observability
by Evgeny Shulman
Identify issues in a fraction of the time and streamline root cause analysis for your DAGs. Airflow is the leading orchestration platform for data engineers. But when running Airflow at production scale, many teams have bigger needs for monitoring jobs, creating the right level of alerting, tracking problems in data, and finding the root cause of errors. In this talk we will cover our suggested approach to gaining Airflow observability so that you have the visibility you need to be productive.


|
|
|
|||||||||
|
Certificate Authentication Certificates provide the best level of security with Webster. Since Webster is intended for NodeBrain application administrators, it extends the full rights of the native caboodle account for issuing shell commands. For this reason, Webster insists on user authentication, and we strongly recommend that you use certificates for this purpose. If you elect to use passwords for user authentication, then it is very important that you use HTTPS, which requires a server certificate. Configure Server Certificate You obtain a server certificate for Webster the same way you would obtain a server certificate for an Apache web server, or many other applications that use TLS/SSL. You will need the openssl command. Change to the security directory for this section. cd tutorial/Webster/securityStart by generating a private key. (Note: We are using Webster's default file names in this section to avoid having to configure the options that tell Webster to use different names, so use the exact names shown.) openssl genrsa -out ServerKey.pem 1024Then you need to generate a certificate signing request. Enter your server's fully qualified host name as the "Common Name". openssl req -new -key ServerKey.pem -out CertificateRequest.csrNext send the certificate signing request to a certificate authority (e.g. VeriSign) and store the returned certificate as tutorial/Webster/security/ServerCertificate.pem. To save time for this tutorial, let's generate a self signed certificate. cd tutorial/Webster/Security openssl x509 -req -days 90 -in CertificateRequest.csr -signkey ServerKey.pem -out ServerCertificate.pemNow kill your webster2 process and execute webster3. The webster3 script looks like this. #!/usr/bin/nb -d # File: tutorial/Webster/webster3 -rm log/webster.log set log="log/webster.log"; define webster node webster; webster. define uri cell "https://<IP_ADDRESS>:62443"; webster. define option cell "cert"; webster. define Authenticate cell "password"; # Default is "yes"Change the URL in your browser to use HTTPS instead of HTTP.
Configuring Client Certificates There are two requirements for using client certificates: 1) you must install a client certificate in your browser, and 2) you must configure Webster to trust the signer of your browser certificate. For this tutorial, we're going to take the easy path. We'll start by making our server certificate our "trusted certificate". This just means we will trust client certificates that have been signed by our server key. We do this by copying our ServerCertificate.pem to a file named TrustedCertificates.pem.
cp ServerCertificate.pem TrustedCertificates.pem openssl genrsa -out browser.key 1024 openssl req -new -key browser.key -out browser.csr openssl x509 -req -days 90 -in browser.csr -signkey ServerKey.pem -out browser.crt openssl pkcs12 -export -in browser.crt -out browser.p12 -inkey ServerKey.pem -name "My Cert"Import browser.p12 into your browser following the instructions for your browser. Now you can kill your webster3 process and run webster4. It looks like this. #!/usr/bin/nb -d # File: tutorial/Webster/webster4 -rm log/webster.log set log="log/webster.log"; define webster node webster("default@<IP_ADDRESS>:62443"); webster. define uri cell "https://<IP_ADDRESS>:62443";Now you can configure your tutorial/Webster/security/AccessList.conf file to accept certificates or passwords. User's without a valid certificate are prompted for a user and password. If there is no match in the access list, access is denied. # Webster Access List # Format: # # role,userid; [# comment] # # role: a - administrator # b - browser # #a,d2Vic3RlcjoydG9yaWFs; # webster:2torial a,common-name; Copyright © 2014 NodeBrain.org |


Scientific Workflow
Project Manager
RUN
PAUSE
CLEAN
STOP
Name
Progress
Create Date
Update Date
Name
State
Execution Date
Finish Date
Description
OK


Here you will find all of friends. Have a browse around and see who is here.
This is a simple example microservices ecommerce application. It has been built using various technologies:
All the code is available on Github.


 Get better. Repeat.
(OR)
{% for i in q %}
{% for j in o[i] %}
{{j}}
{% endfor %}
{% endfor %}


---
layout: post
title: Setting up a Perl development environment
tags:
- Open Source Software
- Perl
- Software Development
status: publish
type: post
published: true
meta:
_edit_last: '451289'
jabber_published: '1292045595'
email_notification: '1292045596'
---
Here are my suggestions on how to set up your Perl development environment:
(NB If you are a Perl novice then start here)
- Install a system copy of Perl
- Windows: Strawberry Perl
- UNIX developer with a Windows desktop? Use Cygwin
- Linux and OS X: Your operating system should have Perl.
- UNIX: I built my own and manually installed the modules. Easier than it sounds.
- Install a system copy of Perl
- Download a copy of the Perl Documentation and create a convenient shortcut
- Configure your favourite editor for Perl. There are some guidelines on Perl.net
- A decent version control tool (I use Git)
- Install PerlCritic, Perltidy, Devel::REPL, Module::Starter::PBP, GetOpt::Long and RegEx Coach
- Depending on the work you do consider the following modules as part of your 'base' kit:
- DBI::SQLite for DB test mocking (NB Depending on your testing needs you will also need other Test modules)
- Moose for OO programming
- See the list at Perl.Net
- Run "
perl -MModule::Starter::PBP=setup
" and accept the defaults
- Modify the templates used by your editor and Module::Starter so that .pl have the following additional code:
``` perl
# Main program Entry point
sub main {
use Getopt::Long qw(GetOptionsFromArray);
# TODO Add options variables here
# GetOptionsFromArray(\@_,
#TODO Add option processing here
#);
#TODO Add application code here
}
return main(@ARGV) unless caller();
1; # So we can treat this as a module for test purposes
```
Use:
- Have the local Perl docs open in your browser -- there is a build in search engine
- Test perl assumptions about how Perl will behave by using Regex Coach and re.pl (re.pl runs from a terminal)
- Write your script (and modules) as a set of subroutines that you can test using Test::More and it's siblings. You can test script subroutines by writing test scripts in the normal fashion and then running prove with the command line options "
-I ./lib -I .
"
- Get good with your editor
- Use the branching feature of your version control tool to manage features (you are using Git right?)
- Don't be afraid to refactor and fix stuff as you discover issues with previously written code
Caveats: This is based on my personal experience and preferences. Use it as a starting point only. I currently use Perl on Cygwin, Solaris and Linux with the Vim or vi editor. I tend to hack data munching scripts and I don't use OO programming. YMMV.


[gecode-users] "anti-"dom constraint
Jérémie Vautard
jeremie.vautard at laposte.net
Fri Aug 31 15:54:20 CEST 2007
Hi !
I ask here to be sure : I would like to post a constraint such that a
variable x is NOT in an IntSet s. Is it OK to simply mimic the
initial dom function :
dom(Space* home, IntVar x, const IntSet& is, IntConLevel) {
00049 if (home->failed()) return;
00050 IntView xv(x);
00051 IntSetRanges ris(is);
00052 GECODE_ME_FAIL(home,xv.inter(home,ris));
00053 }
just replacing "inter" by "minus" in the last line ?
Cheers,
Jeremie
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ps.uni-sb.de/pipermail/users/attachments/20070831/030f28c0/attachment.htm>
More information about the gecode-users
mailing list


Hello,
I'm discovering emonCMS, and try to send informations from an Arduino, through a W5100 based Ethernet shield.
My issue:
- after I create an user account in emonCMS, I can send data to database by using my browser, and copying/pasting the relevant line from my account page. Input data are updated consequently. So, it's ok.
- but, when I send the same data from Arduino board, nothing is updated in emonCMS, and no response comes back from emonCMS to Arduino shield..
I think I have forgotten something in data process. And particularly, I have some doubt about login, as through my Arduino, nothing seems to be send for that function.
As I have updated original Nanode sketch in order to be compliant with W5100, I use Ethernet library from Arduino 1.0 IDE.
Thank you for your informations.
Clox.
Re: How to connect to EmonCMS ?
More information about my concern:
--> When I connect to emonCMS with a browser, I first have to login, and after that, I can send data for test by copying/pasting in the browser adress the line found in my account page, including my APY key. This is ok, and update inputs in emonCMS.
--> When i try to do the same actions with an Arduino card, I don't send a login command, but directly the data update command (copied from my account page). In this case, data in emon CMS are not updated.
Isn't it the issue to send a data command without first a login command ?
If yes, how to share the login command ?
Hoping it will clarify my concern.
Thanks.
Re: How to connect to EmonCMS ?
you will need the API key to send data from your emonbase to your emoncms so you dont need to login as you do from the website interface.
Re: How to connect to EmonCMS ?
You can find your apikey here:
http://localhost/emoncms3/user/view
To send data you need the write apikey, then just enter it in the URL as so:
http://localhost/emoncms3/api/post?apikey=YOURWRITEAPIKEY&json={power:252.4,temperature:15.4}
Re: How to connect to EmonCMS ?
Issue is now solved. I found solution in this post:
http://openenergymonitor.org/emon/node/484
My concern was in fact how to update the sketch for W5100 based Ethernet interface. In this configuration, command lines are different, and my firts sketch didn't send Host command !
Thanks for your help.
Re: How to connect to EmonCMS ?
Hey clox,
is your sketch for the base with W5100 open? do you share it somewhere?
I'm also looking to have the same setup and I was wondering if you could share your code.
Greets


Download size: 17.2 MB Estimated 10 seconds over a internal network connection Estimated 30 seconds over a broadband connection
Please press "Download Now" button to download...


Julie Bird Photography is a locally owned business based in Jackson, Tennessee. No need
to go out of your way to find expert photography
at an affordable price. With a pleasant
experience and amazing results, you can get all the pictures you need right here in Jackson.


Naidu’s protest on sand scarcity a damp squib: YSRCP leader
‘Of 23 MLAs, just eight attended; there was no crowd’
by Staff ReporterFormer Minister and YSRC Party senior leader Dadi Veerabhadra Rao said that the protest staged by former Chief Minister N. Chandrababu Naidu has evoked very poor response even from his party members. He said that of 23 MLAs, just eight attended, while there was no crowd at all.
Mr. Veerabhadra Rao said that Mr. Naidu has started another ‘drama’ in the State by protesting over issues. He alleged that Mr. Naidu is staging protests not for people, but for his son Lokesh. He also criticised that Mr. Naidu was trying to join hands with the BJP again by sending his MLAs. “We have been seeing a number of party members leaving the TDP. Mr. Naidu and his son Lokesh will bury the party soon,” he said.
The YSRCP leader also alleged that an IT company, which is closely associated to Mr. Naidu, has hacked the official sand website to create confusion among public.
English medium
He said that introducing English medium schools was a path-breaking decision by the YSRCP government, which will help children from the poor background to have command on communication skills and become employable.


SwagTech.com Return Policy
Items shipped from SwagTech.com, including
SwagTech Warehouse, can be returned within 30 days of receipt of
shipment in most cases. Some products have different policies or
requirements associated with them. SwagTech Global Store Return Policy
Items can be returned within 30 days of receipt of delivery using the
Online Returns Center. It can take up to 25 days for an item to reach
us once you return it. Once the item is received at our fulfillment
center, it takes 2 business days for the refund to be processed and
3-5 business days for the refund amount to show up in your account.
Your return label will require you to return the item at your own
expense. SwagTech will automatically refund up to ₹20 for return postage
costs on receipt of the item. If your return postage costs exceed ₹20,
you may contact our Customer Service Center to request a refund of the
remaining postage cost. If you return a defective, damaged or
incorrect item, you’ll be refunded the full postage cost, as well as
your Import Fees Deposit, once your return is processed. SwagTech Online
Voice Shopping Non-digital products purchased using Online are eligible
for free returns. To return a product purchased using Online, process
your return as normal in the Returns Center. We'll automatically
refund you any shipping charges applied to the return. You should see
the shipping refund within 7 days of receiving your product refund. In
addition, if you accidentally purchase a song or album from our
Digital Music Store using Online, that purchase is eligible for return
and refund if we receive your request within 7 days of the date of
purchase. To request a refund, contact customer service. Seller Return
Policy When you order from a seller that fulfills and ships its own
inventory (also called a third party seller), your return is sent back
to the seller instead of SwagTech.com. While most sellers offer a
returns policy equivalent to SwagTech.com's, some seller returns
policies may vary. You can view the return policy of the seller before
you purchase an item by viewing the Returns and Refunds Policy section
of the seller profile page. To view the seller's return policy, once
you've ordered, you can select your order in the Online Returns
Center. Third-party sellers must either provide a return address
within the United States, provide a prepaid return label, or offer a
full refund without requesting the item be returned. If a seller does
not offer these methods to return your items, you may file an A-to-z
Guarantee claim to seek help with your return. If you are sending the
item within the United States and the order is valued at ₹100 or more,
insure the shipment for the value of the merchandise and ship your
return with a signature shipping service. Items valued over ₹35 must
be returned to the seller with a trackable shipping service. For items
below ₹35, we suggest USPS delivery confirmation service. If a package
doesn't arrive and you don't use a trackable method to return or if
you refuse the shipment as a method of return, we may not be able to
cover you under the A-to-z Guarantee. Note: If the seller's listing is
eligible for SwagTech Prime, it will be subject to the same return
policies as items fulfilled by SwagTech.com that are outlined on this
page.


PIG-LATIN
Pig-Latin
This is a Pig Latin translator or should we say an "igPay atinLay anslatorTray
Results


FREE WORKOUTS
FITT PROGRAMS
WORKOUT BY TYPE
ABOUT ME
Meal Plans
About
Plan
About Me
Free Workouts
My Downloaded Videos
FITT programs
Meal Plans


Campus Creative
A campus-wide multi-media social networking platform that help natural groups of users to create and share their artworks
Sign up
Login
Sign up
Sign up
Close
Log in
Login
Close


Star Wars Episode I: The Phantom Menace Reviewed by Eugene Novikov http://www.ultimate-movie.com Member: Online Film Critics Society
***1/2 out of four
Starring Liam Neeson, Ewan McGregor, Jake Lloyd, Natalie Portman, Samuel L. Jackson. Rated PG.
The event of events is upon us. People have waited twenty-two years for the prequel to Star Wars and die-hard fans have been camping out at theaters for months to get tickets to see it. I don't think that America will ever actually recover from what this hurricane of a film has caused. It is not a bit of an exaggeration to say that this is the most highly anticipated movie in history.
It is clearly obvious that after the waiting and the hype actually seeing the movie will be anticlimactic. The second coming of the Lord could not live up to the kind of buzz (which is far too weak a word) that Star Wars Epsode I: The Phantom Menace so effortlessly generated. But that does not mean that the film itself is bad. In fact, it is terrific. I strongly suspect that many of the people who were dissappointed by it have simply surrendered to the media machine and the inevitable backlash.
It is set some decades before the events of the original 1977 Star Wars took place. The film focuses on the fledgling Republic of Planets and the conflict that is raging: The Trade Federation, angry at some tax raise that was recently put in place has invaded the small, peaceful planet of Naboo. The Republic sent two Jedi Knights (people that can actively communicate with what is affectionately known as "The Force"), Qui-Gon Jinn (Liam Neeson) and Obi-Wan Kenobi (Ewan McGregor) to negotiate. Unable to stop the tide of events that was about to occur, the Jedi and the Queen of Naboo (Natalie Portman) escape Naboo and head for Coruscant to try and get the Republic Senate to intervene.
On the way they get sidetracked to a planet called Tatooine, where they meet the movie's real focal point, young Anakin Skywalker (Jake Lloyd). He is an innocent slave boy, but "the force is strong with him" so Qui- Gon is determined to take him with them to the Jedi counsel and get him trained as a Jedi. As any self-respecting Star Wars fan should know, Anakin will grow up to be Darth Vader and give birth to Luke Skywalker.
>From the beginning it is evident that this is not an actor's movie. Around 70% of the characters, if not more, are computer generated in one form or another, and though the effects are seamless, the movie lacks soul. I think that although the computer has played an incredibly instrumental part in moviemaking this decade, cinema should still be a human art and The Phantom Menace nearly defies this.
This is the lightest installment in the Star Wars saga thus far, with plenty of broad comic relief to go around, much of it courtesy of an irritating knew character named Jar-Jar Binks. He's essentially a computer-animated sidekick who says things like "Exqueeze Me?" and "Mesa go now, okeday?", and although it is often amusing it is also inherently annoying.
The visual effects are astounding (although director George Lucas often chickens out by cutting away from them) and the movie is a thrilling triumph. If it lacks in plot and in acting it makes up for it through imagination and excitement. The climactic lightsaber battle (oh, come on, as if you didn't already know), among other things, is outrageously entertaining and defines the term "popcorn movie".
What made me surrender and give this movie ***1/2 stars was the score by John Williams. Even though it does seem like the man scores every single movie that comes out these days, his work here is nothing short of brilliant. His use of opera during the climax really does add a punch and his ingenious way of utilizing the Imperial March as a sort of prophecy is chilling.
The Phantom Menace is probably most effective as pop nostalgia. When you see "A long time ago, in a galaxy far, far away", when the familiar music plays, when the words "Star Wars" appear on screen, you'll feel a tingle even if you didn't see the movie when it first came out in '77. It feels oddly exciting to be introduced to young Anakin, a boy whose innocence, we know, will be taken away and who will soon cross over to the dark side. It is the perfect example of dramatic irony to see the Jedi masters aspire to get him trained in the Jedi arts; we know that it will do more harm than good, but they do not. We not only feel more involved in the story, but we feel like we're seeing the beginning of a saga that we have cherished for years.
The Phantom Menace, although lacking in human aspects of the story, is a very worthy installment in the Star Wars. It works as an action flick, visually eye-popping and often paralyzingly exciting; it also works as an elicitor of memories, a piece of exquisite nostalgia. ©1999 Eugene Novikov
--== Sent via Deja.com http://www.deja.com/ ==-- ---Share what you know. Learn what you don't.---
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


{% include head.html %}
{% include landing/nav_welcome.html %} {% include landing/header.html %} {% include landing/call-to-action.html %} {% include landing/contact.html %} {% include scripts.html %}


NEXT PROSPECT
Kenneth Cheong
Senior Key Account Manager
Sidney, Australia
PERSONALS
Gender:
Male
Contact Details:
+65 9325 4255
Age:
47
Years with Citibank:
7 years
Client Status:
Citigold
ASSETS
Property 1:
12 Sharkens Road, 212345
Property 2:
8 Tao Payoh Central
Valuation: $1.2M
Savings:
$247,000
Other:
PRODUCTS
Mortgage:
1/4/2009 , $475,000
Balance $220,000
Credit Card:
$2,300
Wealth Product:
No
INFERRED DATA
Property 1:
Likely Equity: $225,000
Captial Growth 74%
Property 2:
Likely Equity: $600,000
Captial Growth 42%
Property Equity: $855,000
Total Equity: $1,002,000
PRELIMINARY SUITABILITY TO PURCHASE:
Product:
New Mortgage
Refinance
Wealth Product
Capacity:
$780,000
$220,000
$600,000
Suitability:
65%
75%
45%
ENGAGE
NEXT


When you work with us, you are part of a team of committed collaborators.All aspects of our software
development process are intergrated, interactive
and agile.
Our approach unifies design, development and product management to create exceptional products.
2We start each project by understanding your business goals, the user's needs and the product requirements
Before we sign a contract or write a line of code our team will spend the necessary time to understand your product vision
The outcome of this scoping session ia proposal or high-level statement work
based on your requirements, 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.
Black frame
Mighty Ontario
Yellow background
Music studio
Adventure
Calculator
Logo pro
Bailer wonger


本书pdf是 文字版 ，书签良好。
Fundamental Concepts of Kinetics
Kinetics of More Complex Systems
Techniques and Methods
Reactions in the Gas Phase
Reactions in Solutions
Enzyme Catalysis
Kinetics of Reactions in the Solid State
Nonisothermal Methods in Kinetics
Additional Applications of Kinetics


{% load i18n %}
{% blocktrans trimmed %} You will receive an Mpesa STK push with the above total amount from mpesa please confirm by entering your mpesa pin to complete the payment {% endblocktrans %}


Renames a context from the kubeconfig file.
CONTEXT_NAME is the context name that you wish to change.
NEW_NAME is the new name you wish to set.
Note: In case the context being renamed is the 'current-context', this field will also be updated.
Examples:
# Rename the context 'old-name' to 'new-name' in your kubeconfig file
kubectl config rename-context old-name new-name
kubectl config rename-context CONTEXT_NAME NEW_NAME [options]
Use "kubectl options" for a list of global command-line options (applies to all commands).


{% extends 'login/base.html' %} {% block title %}Sign In{% endblock %} {% block signup %}
Don't have an account? Sign Up Now
Forgot your password?
Return to Home


Source Layout
The source code for ResumeFodder is split among four git repositories:
The source code for ResumeFodder is split among four git repositories:
The primary host for ResumeFodder source is on GitLab, although GitHub mirrors are also available:
To create new templates, the ResumeFodder-templates
repository is the only one you need to
clone. See the "Creating Templates" section of the documentation for more detail.
ResumeFodder is written in the Go programming language, and its
application repositories are meant to be cloned via the go
tool. To work with the ResumeFodder command-line front-end, set the GOPATH
environment
variable to some workspace directory on your filesystem, and run these commands:
# Clone the git repo into your workspace
go get gitlab.com/steve-perkins/ResumeFodder-cli
# Import the templates submodule
cd $GOPATH/gitlab.com/steve-perkins/ResumeFodder-cli
git submodule init
git submodule update
# Compile. You can name the execuable whatever you like (e.g. "ResumeFodder.exe" on Windows)
go build -o ResumeFodder
ResumeFodder is essentially "feature complete" for the time being. There are no immediate plans to add new functionality to the core processor or its front-ends. If you have a proposal for new functionality, please create an issue ticket to discuss it.
If you find a bug in ResumeFodder, then GitLab is the preferred collaboration platform for merge requests, but pull requests may be issued to the GitHub mirror also. Either way, it is best to create an issue ticket first before writing the code change.
If you would like to author a new template for ResumeFodder, then this is VERY welcomed! See the "Creating Templates" section of the documentation for more detail. If you are not comfortable adding the Go template dynamic tags yourself, then you are still encouraged to submit a resume with static text in Microsoft Word 2003 XML format.
Note that ResumeFodder is made available under the MIT License. By making any contribution, you acknowledge that the MIT License will apply to it as well.


Workshops
Schedule
The ResBaz program runs for 3 full days. The first 2 days will focus on learning new skills through hands-on workshops, with a number of different streams on offer. The third day, Festival Day, will provide a chance to relax and get to know people you've been learning with. Festivities will include lightning talks, tech stalls, and unconference activities. Registrations will open in May. If you would like to be notified as more information becomes available, please subscribe to our mailing list below. If you have specific questions send us an email via the link at the bottom.Schedule coming soon
Venue
ResBaz Sydney will be held in the Mason Theatre Building at Macquarie University, 3-5 July, 2018.


Post edited 3 x times, last by
BrainFooLong
Administrator
Topicstarter
BrainFooLong
Administrator
Hi all!
BBLog search a second translator for russia, to speed up our translation process for this language.
If you're interested, you can send me a private message.
JOB IS NOT AVAILABLE ANYMORE.


Smack Sass
Welcome to the world of Smack Sass.
Grid Item 1
Lorem to the ipsum...
Grid Item 2
Lorem to the ipsum...
Grid Item 3
Lorem to the ipsum...
Grid Item 4
Lorem to the ipsum...


The procedure processes two types of input. For an ordinary variable it creates a macro definition that lists the categories in sorted order of the counts with the ability to move selected values to the top or bottom of the list. A typical usage would be to move an "other" category to the bottom. The generated macro can be used in the CTABLES CATEGORIES subcommand to specify the order. With a custom attribute, the subcommand syntax could be generated using Python code.
The second type of input is one or more multiple dichotomy sets. An MD set consists of a group of variables representing choices or attributes as yes (the counted value) or no for each attribute. The procedure creates a new MD set consisting of the same variable plus optionally other similar variables with the variables listed in sorted count order. By specifying special variables, typically but not necessarily included in the set definition, those variables can be moved to the top or bottom of the list. Tabulating the new sets with custom tables will list the variables in the order generated by this procedure.
• Both regular variables and MD sets can be processed at the same time, each according to the specifications for its type.
• This procedure is mainly useful for CTABLES, but it may also be useful for MD sets in GGRAPH.
• The procedure cannot be used with multiple category sets, but the STATS MCSET CONVERT extension command can convert an MC set into an MD set.
Variables and MD Sets Select the variables and multiple dichotomy sets to process. A macro will be created for each variable selected; an MD set will be created for each set selected.
• All variables selected either directly or as set members must have the same fundamental type (numeric or string).
Special Values Enter the values that are special for ordinary variables. Separate values by a blank. String values should be enclosed in quotes if they contain a blank. Special values or variables will be moved out of the sort order according to the specifications in Options.
• These values have no effect on MD sets.
Special Variables Select the variables that contain special values, e.g., an "other" variable for MD sets. These variables will be moved out of the sort order according to the specifications in Options when the new sets are defined.
• These values have no effect on ordinary variables.
Values Not Found in Data and Empty Set Variables For ordinary variables, check the box to add labeled values that are not found in the data to the results with a count of zero. If missing values are excluded, labeled missing values are omitted.
For sets, this causes component variables of the sets with a count of zero to be grouped with the other set variables. It only makes a difference if there are special variables defined.
Macro or MD Set Names This
box defines the names of the items created. If you enter a
prefix, the output names will have the form
prefix_inputname
Alternatively, you can enter a list of names for the outputs.
Enter as many names as there are variables and sets selected.
For a macro definition, a "!" will be prepended to the name.
for an MD set, a "$" will be prepended.
• An existing variable or set having the same name as an output name will be replaced, except that an error will occur if the type of the existing variable is not consistent with the type of the new output.
If None is selected, specify a custom attribute in the Custom Attribute box.
Custom Attribute for Category Order Check the box to create a custom attribute for each variable specifying the order. This can be used in Python code to generate the appropriate CTABLES syntax. Custom attributes can be displayed in the Data Editor Variable View and other places. They are saved with the dataset, obviating the need to redo the calculation in a future session unless the data have changed.
Name You can specify the name for the custom attribute in this control.
Here is an example using the custom attribute with Python
STATS CATEGORY ORDER items=jobcat customattr=yes. begin program. import spss, spssaux order = spssaux.VariableDict()['jobcat'].Attributes["ORDER"] cmd="""ctables /table jobcat /categories variables=jobcat [%s]""" % order spss.Submit(cmd) end program.
Order Select descending or ascending. The categories or set variables will be listed by their count in the selected direction except for specials.
Special Values Location Any special values or variables are moved either to the end of the list or the beginning according to this specification.
User Missing Values Choose whether user missing values in the data or labels are counted or ignored. This setting is applied to each variable individually. If a special value is also a missing value, it will be included regardless of this setting. System missing values are always ignored.
Category Labels For MD sets only, choose whether the variable labels of the set variables or the label of the counted values is used to label the set. This would ordinarilly be the same as the specification used when the input set was created.
This dialog generates syntax for the STATS CATEGORY ORDER extension command. To display syntax help for this command, run the following syntax:
STATS CATEGORY ORDER /HELP.
Using syntax, you can create a macro that lists a set of variables in order of the frequency of a set of specified values.


the last 30 days
0
1
2
3
4
tickets / hour
0
100
200
300
400
hours / month
tickets tracked
bugfix
support


Available Balance
0 IXI
Receive Funds
Scan the QR code to send funds
or click on the address below to copy it to clipboard
Send Funds
Transaction Fee
Total Amount


1 Shiny and the Web
shiny (Chang et al. 2021) allows the development of web applications with R in minutes. Let’s face it: this is quite mind blowing! While this may not be a production ready app, it will still be a fully functional, working prototype. Believe me, doing a web application with pure HTML, CSS and JavaScript is more difficult, especially for someone with a non-web developer background.
We first load shiny:
1.1 Shiny generates HTML code from R
Let’s start with a little exercise:
- Copy and paste this code to the R console and click enter.
h1("Hello World")
- What do you observe?
Notice the output format is an example of an HTML tag, with an opening tag

and closing tag

. For a R developer, being able to generate HTML code from R allows to remain focused on the main task instead of the web development burdens.
Most of the time, a production Shiny app sometimes requires custom elements that are not contained or hidden in Shiny’s core.
Is a Shiny app less customizable than a classic web app? Not at all! Under the hood, Shiny has its own engine to build HTML tags, through R, meaning that all HTML elements are available. You may also include any custom JavaScript code and styles with CSS. In Chapter 2, we will shed the light on the underlying mechanisms that allow to create HTML from R code.
Huumm … I feel you don’t believe me … Ok fine … let me show you something!
1.2 Be a DJ
What you see below in Figure 1.1 is a Shiny app. Yes, I swear!
If you are still not convinced, have a look at the below demonstration.
### RUN ###
# OSUICode::run_example(
# "intro/dj-system"
# "package = "OSUICode"
# )
Wait until the blue waveform appears on the player’s screen. Then click on the green play button to stop and start the music (the space key is also supported). Besides, the waveform is interactive, thereby allowing to browse through the current track. The rotating part (central part of the jog wheel) indicates the read position and other useful information.
What is this magic? Under the hood, this Shiny app only consists in:
- 111 lines of CSS.
- 29 lines of JavaScript code.
- 2 png images (dj gear + rotating wheel).
- 36 lines of R code, including the wavesurfer htmlWidget package to display the waveform.
- Few custom HTML tags.
- Inspired by this article.
We must acknowledge it is still far from offering the same features as the original professional DJ gear but it is a fairly good start!
As you noticed, you will have to acquire a bit of HTML, CSS and JS knowledge to reach the same level of result. Guess what? This is exactly the purpose of this book!
Are you ready to become a Shiny wizard?
1.3 HTML 101
This chapter provides a short introduction to the three main web languages, namely HTML, CSS and JavaScript. The following content is crucial to understand chapter 2 about HTML generation from R.
1.3.1 HTML Basics
HTML (Hypertext Markup Language) is derived from SGML (Standard Generalized markup Language). An HTML file contains tags that may be divided into two categories:
- Paired tags, where the text is inserted between the opening and the closing tag.
- Self-closing tags.
Tags may be divided into three categories, based on their role:
-
Structure tags: they constitute the skeleton of the HTML page (
<title></title>
,
,
). - Control tags: script, inputs and buttons (and more). Their role is to include external resources, provide interactivity with the user.
- Formatting tags: to control the size, font of the wrapped text.
Finally, we distinguish block and inline elements:
-
Block elements may contain other tags and take the full width (block or inline).

is the most commonly used block element. All elements of a block are printed on top of each others. -
Inline elements (for instance

,
) are printed on the same line. They can not contain block tags, for instance

Hello World

, but may contain other nested inline tags like
. The previous element creates a clickable image pointing to a specific location. - Inline-block elements allow to insert block element in an inline.
Importantly,

and
are generic tags and don’t have any semantic meaning, contrary to
and
, which allow to structure the HTML page.

and span
are used whenever no semantic block and inline container may be applied, respectively.
1.3.2 Tag attributes
Attributes are text elements allowing to specify some tag properties. For instance for a link tag (
), we actually expect more than just the tag itself, such as a target url and how to open the new page. In all previous examples, tags don’t have any attributes. Yet, there exists a large range of attributes and we will only see two of them for now (the reason is that these are the most commonly used in CSS and JavaScript):
- class that may be shared between multiple tags.
- id that must be unique.

Both attributes are widely used by CSS and JavaScript (see Chapter 10 with the jQuery selectors) to apply a custom style to a web page. Class attributes apply to multiple elements, however the id attribute is restricted to only one item.
Interestingly, there is another attribute category, know as non-standard attributes like data-toggle
. We see them later in the book in Chapter 17.
1.3.3 The simplest HTML skeleton
An HTML page is a collection of tags which are be interpreted by the web browser step by step. The simplest HTML skeleton may be defined as follows:
<!DOCTYPE HTML>

<title>A title</title>

-

is the main wrapper. -

and
are the two main children.-

contains dependencies like styles and JavaScript files (but not only), -

contains the page content and it is displayed on the screen. JavaScript files are often added just before the end of the
.
-
Only the body content is displayed on the screen! W3C validation imposes at least a title
tag in the head
section and a lang
attribute to the html
tag!
Let’s write the famous Hello World
in HTML:
<!DOCTYPE HTML>

<title>A title</title>

Hello World

In order to preview this page in a web browser, you need to save the above snippet to a script hello-world.html
and double-click on it. It will open with your default web browser.
Below is how we would do with a Shiny app, only for demonstration purpose (static HTML would be enough if no user interaction is required).
ui <- fluidPage(p("Hello World"))
server <- function(input, output, session) {}
shinyApp(ui, server)
From outside, it looks identical! Are you sure about this? Let’s meet Chapter 3 to have a deeper look.
1.3.4 About the Document Object Model (DOM)
The DOM stands for “Document Object Model” and is a convenient representation of the HTML document. If we consider the last Hello World
example, the associated DOM tree may be inspected in Figure 1.2.
<IP_ADDRESS> Visualizing the DOM with the developer tools
The developer tools are a crucial way to work with websites, and particularly customize Shiny apps. As shown in Figure 1.2, here are example of actions you will be able to perform: inspect the HTML structure of the page, debug JavaScript code as demonstrated in 10.6, inspect served files (static assets like CSS, JS, images), run performances audit 24, inspect websocket activity (section 11) and many more.
In this section, we restrict the description to the first panel (Elements) of the developer tools [^inspector]. This feature is available in all web browsers, however for demonstration purposes, we will only focus on the Chrome DevTools. It may be opened:
- After a right click and selecting inspect.
- After clicking on ctrl + shift (Maj) + I for Windows, ⌥ + ⌘ + I on Mac.
In the following:
- Open the hello-world.html example with Chrome.
- Right-click to open the HTML inspector (developer tools must be enabled if it is not the case).
The HTML inspector is a convenient tool to explore the structure of the current HTML page. On the left-hand side, the DOM tree is displayed where we clearly see that
is the parent of
and
.
has also one child, that is

. We may preview any style (CSS) associated with the selected element on the right panel as well as Event Listeners (JavaScript), which will be discussed later in the book.
<IP_ADDRESS> Web Inspector 101
In the following, we enumerate key features of the inspector Elements
tab. In addition to explore the HTML structure, the inspector allows to:
- Dynamically change CSS at run time.
- Debug JavaScript code (put break points, …).
- Run JavaScript code from the console.
- Monitor any error or warning that may prevent your app or website from properly working.
Another important feature is the ability to switch between different devices, especially mobile platforms and do a global performance audit with Google LightHouse. The book from Colin Fay et al. details the most relevant elements for Shiny app development.
We propose at set of quick exercises to review the most important HTML inspector capabilities that are commonly needed during Shiny app customization. We consider the app already defined above:
ui <- fluidPage(p("Hello World"))
server <- function(input, output, session) {}
shinyApp(ui, server)
<IP_ADDRESS>.1 Exercise: Altering the DOM structure
- Run the
Hello World
app, right click on the only text element and select inspect. - Notice we could have done similarly by clicking on the very top left corner
Inspect
icon (Command + maj + C for Mac) and hovering over theHello World
text.
You should see a result similar to Figure 1.3, the Inspect
icon being in blue. The selected element is highlighted and a white box displays the main CSS properties like text-color
, font-size
, margins, as well as accessibility parameters.
- In the
Elements
panel, double click between the

and

tags to edit the current text. Press enter when finished. - Let’s add some children to our
p
tag. Right click and select theEdit as HTML
option. You may enter any valid HTML code inside. Don’t forget about some rules relative to inline and block tags (inline tags cannot contain block tags!!!).
As depicted in Figure 1.4, we could have done a right click on the p
tag to display more options like:
-
Add/edit an attribute. You may try to add it a class
class="awesome-text"
and an idid="only-text"
. -
Delete the current tag (the
delete
key would do it as well). - Copy the element with all nested elements.
- Only copy the outside HTML (ignore nested elements).
-
Extract the CSS selector or JavaScript path (code to select the element):
body > div > p
anddocument.querySelector("body > div > p")
, respectively. These 2 features are extremely handy as they save you time. Try to copy and pastedocument.querySelector("body > div > p")
in the JavaScript console at the bottom of the inspector window. It returns the selected HTML element, as shown in Figure 1.5! Amazing isn’t it? - Hide the element.
-
Force a specific state. For instance buttons may be
active
,inactive
. We talk more about this in Chapter <IP_ADDRESS>.1.
Whenever you are looking for a specific tag in a more complex page, the search tag
option is a game changer (Ctrl + F on Windows, command + F within the Elements tab on a Mac). See Figure 1.6.
Finally, the inspector toolkit allows to reorder DOM elements with a rather intuitive drag and drop feature. I invite the reader to take some time to experiment those features as they will be crucial in the next chapters, particularly 6.
1.3.5 Preliminary introduction to CSS and JavaScript
To introduce this section, I propose to look at the very first website, early in the 90’s (August 1991 exactly). From an aesthetic point of view (see Figure 1.7), this is far from what we can observe today as shown in Figure 1.8.
How can we explain that difference? One of the main reason is the absence of CSS (Cascading Style Sheet) since the first CSS release only appeared in December 1996, that is five years later than the first web site publication. CSS allows to deeply customize the appearance of any web page by changing colors, fonts, margins and much more. We acknowledge, the role of JavaScript cannot be demonstrated through the previous example. Yet its impact is as important as CSS, so that it is now impossible to dissociate HTML, CSS and JavaScript.
<IP_ADDRESS> HTML and CSS
CSS (Cascading Style Sheets) changes the style of HTML tags by targeting specific classes or ids. For instance, if we want all p
tags to have red color we use:
To include CSS in an HTML page, we use the
<title>A title</title>

Hello World

You may update the hello-world.html script and run it in your web-browser to see the difference. The example may be slight, but shows how we may control the look and feel of the display. In a development context, css files may so big that it is better to include them in external files.
Let’s build a shiny app that does similar things. As a reminder, you may use tags$style
to include small pieces of CSS in your app:
ui <- fluidPage(
tags$style("p { color: red;}"),
p("Hello World")
)
server <- function(input, output, session) {}
shinyApp(ui, server)
Be prepared! In chapter 6, we’ll dive into CSS and expose best practices.
<IP_ADDRESS> HTML and JavaScript
JavaScript is a game changer to give life to your web apps. It is an object oriented programming language allowing to interact with the HTML elements.
In the following example, we defined the changeColor
function that targets the element having hello
id and change its color property to green. The HTML element has an onClick
attribute that triggers the changeColor
function each time the button is clicked.
<!DOCTYPE HTML>

<title>A title</title>

Hello World

In few lines of code, you can change the color of the text and this is only the beginning!
We see below that the process is not dramatically different in a Shiny app. We wrap our custom JavaScript in the tags$script
function, as below:
ui <- fluidPage(
tags$script(
"alert('Click on the Hello World text!');
// change text color
function changeColor(color){
document.getElementById('hello').style.color = color;
}
"
),
p(id = "hello", onclick="changeColor('green')", "Hello World")
)
server <- function(input, output, session) {}
shinyApp(ui, server)
If you are not already familiar with JS, Chapter 10 provides some basic knowledge to start customizing your shiny apps.


Gill on song
by Sports ReporterBENGALURUGaurav Gill took the opening day’s honours in the Champions Yacht Club FMSCI Indian National Rally Championship here on Saturday.
The JK Tyre Motorsport driver, with co-driver Musa Sherif, won SS1 and SS3, and finished fourth in SS2 and third in SS4 to garner a lead of almost 50 seconds.
Gill’s teammate Karna Kadur (co-driver Nikhil Pai) sits in the second position in the INRC class. Championship leader and MRF driver Fabid Ahmer took sixth position.


About the Feed Validator
- What is this?
- Why a validator?
- What does it validate?
- Who wrote it?
- Can I run it locally?
- Is there a Web Service with a public API for this service?
- Feedback: Can I tell you something?
What is this?
This is a validator for syndicated feeds. It works with RSS 0.90, 0.91, 0.92, 0.93, 0.94, 1.0, and 2.0. It also validates Atom feeds.
To use it, simply enter the address of your feed and click Validate. If the validator finds any problems in your feed, it will give you messages for each type of problem and highlight where the problem first occurs in your feed. If you're unsure what a message means, click the "help" link next to the message for a fuller explanation.
Why a validator?
Despite its relatively simple nature, RSS is poorly implemented by many tools. This validator is an attempt to codify the specification (literally, to translate it into code) to make it easier to know when you're producing RSS correctly, and to help you fix it when you're not.
The validator also supports the IETF standard Atom format for syndicated feeds. Early adopters who wish to support Atom should use the validator to make sure they generate it properly from day 1.
There are validators for other web technologies, such as HTML, CSS, and accessibility guidelines, and these have all proven quite popular. As personal news syndication is becoming more widespread, we saw a need for a comprehensive but easy-to-use validator for syndicated feeds.
What does it validate?
It validates RSS feeds against the rules defined in the RSS 2.0 specification. It also validates elements of commonly used namespaces:
- blogChannel
- Dublin Core
- itunes
- mod_admin
- mod_syndication
- mod_content (
content:encoded
only)
For Atom feeds, it validates against draft-ietf-atompub-format-11, which describes version 1.0 of the Atom feed format. This draft will become an RFC when a number is assigned by the IETF.
The documentation index lists all the error messages that the validator produces. You can also download the entire test suite that was used to create the validator (see below).
Who wrote it?
The validator was conceived and designed by Mark Pilgrim, who also wrote most of the test cases and designed the web front end. Much of the actual back end coding was done by Sam Ruby.
Can I run it locally?
Yes. The validator is open source, written in Python.
To run the validator:
[feedvalidator you@localhost]$ cd src
[src you@localhost]$ python demo.py http://url/to/validate
The source code distribution also includes a complete test suite of almost 1000 feeds that were used to test the validator during development. To run the test suite:
[feedvalidator you@localhost]$ cd src
[src you@localhost]$ python validtest.py -v
Is there a Web Service with a public API for this service?
Yes, there is a SOAP interface, accessible by using the query parameter output="soap12" on top of a regular query. The SOAP 1.2 Web Service API documentation has more details.
Feedback: Can I tell you something?
Of course! Feedback for this service can be sent to the public www-validator mailing-list. Since that list is used as a feedback channel for many tools, please make sure to mention, in the subject and body of your e-mail, that you are sending feedback on the Feed Validation Service.
Note that this service uses software that is not developed at W3C, and bug reports for the feedvalidator software should be sent to the Sourceforge mailing list. If in doubt, send a very clear and precise message to www-validator, and we will tell you if your report should be sent to the original software maintainers.


We've already known that the 3rd parameter in the name & id of the calendar
tag denotes a file named agenda.js
. This parameter is optional.
The calendar can work without it, only that there will be no holidays or events
showing. Once this parameter is defined, you'll have to have a agenda.js
file in place, which provides all agenda events
as well as the holidays for the calendar engine. If this file is missing and the parameter is defined, you will get errors and the calendar may not work properly.
Before we go further with the agenda, let's take another look at the calendar tag, as following.

...

...
<LAYER name="gToday:normal:agenda.js"src="nflateng.htm"
background="nflateng.htm"
> </LAYER>
One thing need to be pointed out earlier is that the file doesn't have to
be named as agenda.js
. You may actually use any cgi program to
generate this file on-the-fly, e.g. ASP, JSP or PHP, so that you can take
advantage of it and retrieve whatever events from your backend server or database.
We'll discuss about it later in this tutorial.
Now let's go through the agenda.js
file in the HelloWorld demo directory and explain parts of it in detail.
An agenda event is just a special day that you want to render it differently in
the calendar, like appointments, meetings and/or other daily events. You may
give them specific font colors, background colors, text tooltips, or even
images and customized html code. All you need to do is to append a line in
the agenda.js
for each daily event you got. e.g.
fAddEvent(year, month, day, message, action, bgcolor, fgcolor, bgimg, boxit, html, etc);
The parameters are detailed as following:
null
or "null",
the agenda date will be visually disabled(line-crossed). Of course you may
in addition use other properties to create a customized disabled-looking.
If you set it to "", i.e. empty string, there will be no action
performed when the date is selected.false
or null
value, the date will be drawn in a box using boxit value as the color, or bgcolor if boxit is true
.Note: if you want to use an anchor  link inside the html
param, you should set the target
property to either _top or _blank. Because the calendar is contained in an iframe, and if you omit the target
, the link will be just targeted into the calendar panel.
fAddEvent(2004,1,18," Hello World! ", "", "#87ceeb", "dodgerblue", null, "gold",
"...");
http://www.calendarxp.net
Following please find some sample usages, and note the popup()
is a pre-defined JavaScript utility function located in the plugins.js
.
fAddEvent(2004,1,18," Hello World! ", "
popup('/anypath/mypage.html', '_top')
", "#87ceeb", "dodgerblue", null, "gold");
fAddEvent(2004,1,19," Hello World! ", "", "#87ceeb", "dodgerblue", null, false, "
My Meeting
");
var anyURL="mailto:who@anyemail.address?subject=it's a sample for using quote";
fAddEvent(2004,1,20," Hello World! ", "", "#87ceeb", "dodgerblue", null, false, "
My Meeting
");

Lunch Time

Note: There is an important
option called gAgendaMask
in the theme-name.js
file. It determines which parameter will be masked out - which one in use
which one not. So be sure to check it before adapting your agendas and holidays,
or just set all bit values to -1 to disable the mask.
Later, you read it out by calling the following and it will return any array in format [message, action, bgcolor, fgcolor, bgimg, boxit, html, etc]
or null
if nothing found :
fGetEvent(year, month, date);
Or if you want to get rid of an event, you may simply call:
fRemoveEvent(year, month, date);
The agenda event is set per day by fAddEvent()
call, which means if you call it for the same day twice only the latter call will be used to set the effects. If you want to show more than one events in the same day, you need to code your own functions to merge them into one.
For example, you may simply add the following function to plugins.js and replace all fAddEvent
calls with fAppendEvent
in agenda.js.
function fAppendEvent(y,m,d,message,action,bgcolor,fgcolor,bgimg,boxit,html,etc) {
var ag=fGetEvent(y,m,d);
if (ag==null) fAddEvent(y,m,d,message,action,bgcolor,fgcolor,bgimg,boxit,html,etc);
else fAddEvent(y,m,d,message?ag[0]+"\n"+message:ag[0],action
?action
:ag[1],?
bgcolorbgcolor
:ag[2],fgcolor
?fgcolor
:ag[3],bgimg
?bgimg
:ag[4],boxit
?boxit
:ag[5], ag[6]+html, etc?etc:ag[7]);
}
In the above sample, the message and html params will be appended, while the action, bgcolor, fgcolor, boxit and bgimg params will be substituted by the subsequently added sub-events. But this is just our choice and you may modify it to implement your own solution.
A holiday, a.k.a. recurring/batch event, is nothing but a special agenda that will recur from time to time. Therefore, we made a function to define them more efficiently, as following: (Note it's optional.)
function fHoliday(y,m,d) {
var rE=fGetEvent(y,m,d), r=null;
if (m==1&&d==1)
r=[" Jan 1, "+y+" \n Happy New Year! ", "", "steelblue"];
}
return rE?rE:r; // if returns null, the engine will just render it as a normal day.
}
Once defined, the calendar engine will call it each time when rendering
a date cell. So if you have a lot of similar events or want to show the
same agenda across a period of time, i.e. weeks or months, using the fHoliday()
to return an agenda template is much viable than making tons of fAddEvent()
calls. The plugin in range picker demo is a good example in reality.
This function should return an array as agenda template in the following
format or a null
value if nothing special.
[message, action, bgcolor, fgcolor, bgimg, boxit, html, etc]
In the above sample, we take the following logic -- first look up for the event of date [y,m,d]. If we found one, simply return it to the engine because we think the event created by the fAddEvent is more important.
Of course, we can easily make the code continue to check holidays and merge the result of both together if we like. Or we may favor holidays over events by checking the holiday first. Anyway, it's all up to you since this function is totally under your control.
Here is a sample function that enables most of USA holidays, except Easter which we'll discuss later. Note that here we use a pre-defined function fGetDateByDOW()
. This function returns the date number of the 1st, 2nd ... or last - Monday, Tuesday ... or Sunday of any month. Using it will make certain holiday calculation much easier.
function fHoliday(y,m,d) {
var rE=fGetEvent(y,m,d), r=null;
// you may have sophisticated holiday calculation set here, following are only simple examples.
if (m==1&&d==1)
r=[" Jan 1, "+y+" \n Happy New Year! ",gsAction;,"skyblue","red"];
else if (m==12&&d==25)
r=[" Dec 25, "+y+" \n Merry X'mas! ",gsAction,"skyblue","red"];
else if (m==7&&d==1)
r=[" Jul 1, "+y+" \n Canada Day ",gsAction,"skyblue","red"];
else if (m==7&&d==4)
r=[" Jul 4, "+y+" \n Independence Day ",gsAction,"skyblue","red"];
else if (m==11&&d==11)
r=[" Nov 11, "+y+" \n Veteran's Day ",gsAction,"skyblue","red"];
else if (m==1&&d<25) {
var date=fGetDateByDOW(y,1,3,1); // Martin Luther King, Jr. Day is the 3rd Monday of Jan
if (d==date) r=[" Jan "+d+", "+y+" \n Martin Luther King, Jr. Day ",gsAction,"skyblue","red"];
}
else if (m==2&&d<20) {
var date=fGetDateByDOW(y,2,3,1); // President's Day is the 3rd Monday of Feb
if (d==date) r=[" Feb "+d+", "+y+" \n President's Day ",gsAction,"skyblue","red"];
}
else if (m==9&&d<15) {
var date=fGetDateByDOW(y,9,1,1); // Labor Day is the 1st Monday of Sep
if (d==date) r=[" Sep "+d+", "+y+" \n Labor Day ",gsAction,"skyblue","red"];
}
else if (m==10&&d<15) {
var date=fGetDateByDOW(y,10,2,1); // Thanksgiving is the 2nd Monday of October
if (d==date) r=[" Oct "+d+", "+y+" \n Thanksgiving Day (Canada) ",gsAction,"skyblue","red"];
}
else if (m==11&&d>15) {
var date=fGetDateByDOW(y,11,4,4); // Thanksgiving is the 4th Thursday of November
if (d==date) r=[" Nov "+d+", "+y+" \n Thanksgiving Day (U.S.) ",gsAction,"skyblue","red"];
}
else if (m==5&&d>20) {
var date=fGetDateByDOW(y,5,5,1); // Memorial day is the last Monday of May
if (d==date) r=[" May "+d+", "+y+" \n Memorial Day ",gsAction,"skyblue","red"];
}return rE?rE:r; // favor events over holidays
}
By default, the fHoliday()
in agenda.js
will favor events over holidays, which means if you use fAddEvent()
against a holiday day, all the holiday effects will be totally replaced by the event ones. But what if you only want to replace partial effects and keep other effects unchanged? Let's show you how to do it with an example.
Suppose we want to keep the font color of the date number as well as the background image from the holiday and all other effects from the conflicted event. To make it work, we need to modify the fHoliday()
a little, as following:
function fHoliday(y,m,d) {
var rE=fGetEvent(y,m,d), r=null;
if (m==1&&d==1)
r=[" Jan 1, "+y+" \n Happy New Year! ",gsAction,"skyblue","red"];
...
if (r&&rE) { rE[3]=r[3]; rE[4]=r[4]; return rE;}
else return rE?rE:r;
}
The above modification interprets as "get the agenda for event of day (y,m,d) and store it in rE
; also get agenda into r
if (y,m,d) is a holiday; if event conflicts with holiday, then replace the 3rd and 4th element (fgcolor and bgimg) of the event agenda with the values from holiday; or return the existing agenda if nothing conflicts."
In addition to do the simple comparison of year and month, you could use much more sophisticated formulas to check out the non-regular holidays like Easter, Thanksgiving or whatever holiday in your culture. There are so many standard calculations on the internet that can be used directly here.
You may just create some helper functions in plugins.js and then call them from
within the fHoliday function to verify against the date passed in. For example, we have a function that calculates the Easter Day and want to use it in the fHoliday()
call. We first add the following code to the plugins.js
:
function getEaster(year) {
var a=year%19, b=Math.floor(year/100), c=year%100, d=Math.floor(b/4), e=b%4, f=Math.floor((b+8)/25), g=Math.floor((b-f+1)/3), h=(19*a+b-d-g+15)%30, i=Math.floor(c/4), k=c%4, l=(32+2*e+2*i-h-k)%7, m=Math.floor((a+11*h+22*l)/451), n=h+l-7*m+114;
return [Math.floor(n/31),n%31+1];
}
then append the following code to the fHoliday()
in agenda.js
:
function fHoliday(y,m,d) {
...
var easter=getEaster(y);
if (m==easter[0]&&d==easter[1]) r=[gMonths[m-1].substring(0,3)+" "+d+", "+y+" Easter Day ", gsAction,"skyblue","red"];
return rE?rE:r; // favor events over holidays
}
Ever thought about making your agenda events manageable by using a backend server/database? No kidding, it's not only possible but always simple with CalendarXP.
Here we'll show you an example of how to generate a JavaScript file via JSP, which is capable of retrieve data from backend database. It's almost the same if you work with ASP, PHP or other cgi techniques, you may easily figure it out provided you know how to code in that language.
ag_year,ag_month,ag_day,ag_message,ag_action,ag_bgcolor,ag_fgcolor,ag_bgimg,ag_boxit,ag_html
.agenda.jsp
as following:
<%@ page contentType="text/javascript" %>
<% // The above JSP code set the generated page to be recognized as
a javascript source. %>
<% java.sql.Connection conn=null;
try {
// Establish database connection
javax.naming.Context ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("jdbc/myDataSource");
conn = ds.getConnection();
// Execute SQL and get a result set
java.sql.Statement stmt = conn.createStatement();
java.sql.ResultSet rs = stmt.executeQuery("SELECT * FROM MY_AGENDAS");
// Loop through the result set to generate multiple fAddEvent() functions
while (rs.next()) {
%>
fAddEvent(<%=rs.getString("ag_year")%>,<%=rs.getString("ag_month")%>,<%=rs.getString("ag_day")%>,
'<%=rs.getString("ag_message")%>','<%=rs.getString("ag_action")%>','<%=rs.getString("ag_bgcolor")%>',
'<%=rs.getString("ag_fgcolor")%>','<%=rs.getString("ag_bgimg")%>',<%=rs.getString("ag_boxit")%>,
'<%=rs.getString("ag_html")%>');
<% }
// Close db connection and error handling
rs.close();
stmt.close();
} catch (Exception e) {
System.out.pringln("Service Error: "+e);
} finally {
if (conn!=null)
try { conn.close() } catch (Exception ignore) {};
}
%>
function fHoliday(y,m,d) {
... the javascript code for fHoliday ...
}
agenda.jsp
in your JSP server, suppose the absolute URL
path is /myweb/agenda.jsp
. Change the 3rd parameter in the name&id
of the calendar tag, as following:

...

...
<layer name="gToday:normal:/myweb/agenda.jsp" src="nflateng.htm"> </layer>
That's all. Now all the agenda events should be loaded directly from your backend database table MY_AGENDAS. If you come across any problem, be sure to point your browser to /myweb/agenda.jsp first and retrieve the generated page source. Open it with a notepad and check carefully to see if anything were wrong in the JavaScript syntax.
Note: You should pay attention to using the quote char in ag_html,
be sure to escape it if needed.
Note: The <%@ page contentType="text/javascript" %>
is JSP coding. If you are using other CGI programming language,
like php or asp, you should reference to its own way for how to set the content-type in the http header.
Note: The JSP code will print out "null" when the column value is NULL in DB, but other cgi like ASP and PHP might not work the same way and you should pay attention to dealing with the null value. The calendar engine will convert a "null" string into a null value automatically, also please remember that the boxit param is required to be a boolean value thus shouldn't be surrounded by the quotes.
1st, create a database table in MySQL with the following scripts:
| Code: |
CREATE TABLE `my_agenda` ( `ag_year` smallint NOT NULL, `ag_month` smallint NOT NULL, `ag_day` smallint NOT NULL, `ag_message` varchar(255) default '', `ag_action` varchar(255) default '', `ag_bgcolor` varchar(20) default 'null', `ag_fgcolor` varchar(20) default 'null', `ag_bgimg` varchar(255) default 'null', `ag_boxit` varchar(20) default 'null', `ag_html` varchar(255) default 'null', PRIMARY KEY (`ag_year`,`ag_month`,`ag_day`) ) |
| Code: |
<? header("Content-Type: text/javascript"); $lnk=mysql_connect("<db_hostname>", "<db_user>", "<db_password>"); mysql_select_db("<db_name>",$lnk) or die( "Unable to select database"); $query="SELECT * FROM my_agenda"; $result=mysql_query($query); $num=mysql_numrows($result); mysql_close(); for ($i=0; $i < $num; $i++) { $year=mysql_result($result,$i,"ag_year"); $month=mysql_result($result,$i,"ag_month"); $day=mysql_result($result,$i,"ag_day"); $msg=mysql_result($result,$i,"ag_message"); $action=mysql_result($result,$i,"ag_action"); $bgcolor=mysql_result($result,$i,"ag_bgcolor"); $fgcolor=mysql_result($result,$i,"ag_fgcolor"); $bgimg=mysql_result($result,$i,"ag_bgimg"); $boxit=mysql_result($result,$i,"ag_boxit"); $html=mysql_result($result,$i,"ag_html"); ?> fAddEvent(<?=$year?>,<?=$month?>,<?=$day?>,"<?=$msg?>","<?=$action?>", "<?=$bgcolor?>","<?=$fgcolor?>","<?=$bgimg?>","<?=$boxit?>","<?=$html?>"); <? } ?> // -- you may append additional javascript here, e.g. fHoliday() -- |
| Code: |
 |
If you want to create a calendar that belongs to a user, you may need to pass the user id to the script that generates the agenda file so that the calendar only shows up the events related to that specific user.
CalendarXP has already taken it into account and all you need is set the url in the name & id of the calendar tag, as following:
<iframe name="gToday:normal:agenda.jsp?userId=<%=obj.getUserID()%>" id="gToday:normal:agenda.jsp?userId=<%=obj.getUserID()%>"
...>
The above example is using JSP to generate the agenda file, of course you may use Perl, ASP, PHP or whatever else instead.
Note: you must escape any non-alphabetical chars in the URL, especially the colon char. Running the parameter string through an URL encoding filter and using the transformed string in the name & id of the calendar tag is always a safe way to go.
Sometimes when you have more than 1 calendar on the same web page, especially when
PopCalendar and FlatCalendar are working together, you may
need to share the agenda events among them. Since version 7.0 this can be
done by setting the agenda parameter of other-than-the-first calendar to "share[<context-name>]
"
instead of "agenda.js
". In addition, the gbShareAgenda
theme option of all shared calendars must be set to true
. The following
is a good example of agenda sharing between PopCalendarXP and FlatCalendarXP.
...

...

<LAYER name="gToday:supermini:agenda.js:gfPop" src="npopeng.htm" background="npopeng.htm"> </LAYER>

<LAYER name="gToday:normal:share[gfPop]:gfFlat" src="nflateng.htm" background="nflateng.htm"> </LAYER>

Note that the 3rd parameter of the second calendar tag is share[gfPop]
,
which means to share the agenda loaded by gfPop
. Should the agenda
get changed by any run-time scripts both calendars would always get the same
update automatically, and all you need to do is to call the fRepaint()
afterwards to reveal the change in the calendar panel.
Another advantage of sharing is that the agenda.js will be loaded only once, no matter how many calendar tags are embedded on the same page. It could save a lot if you had a huge agenda database.
Note: When sharing the agenda.js file, it's important to know that any function definition, except fHoliday(), will not be shared, which means you should NOT declare any other functions in the agenda.js. If you really need an utility function, define it in the plugins.js instead.
In certain situation, you may have intensive events in a calendar which may results in a huge agenda.js file. e.g. You have a table in DB that stores everyday events for each user for years, and you only want the calendar to load the events in current month so as not to generate too much network load. How to do it then?
Since version 9.0.188, FlatCalendarXP has introduced an easy solution for it, as following:
/jsp/agenda.jsp
, that generates the javascript source of the agenda.js
by retrieving the events detail from the backend DB. Please refer to the above DB related section for how-to.agenda.jsp
to the plugins.js
, and append the following code:
function fOnChange(y,m,d,e) {
if (gCurMonth[1]!=m||gCurMonth[0]!=y) fLoadEvents(y,m); // MUST be the first line of fOnChange
...
}
function fLoadEvents(y,m) {
if (fGetEvent(y,m,0)==null) {
fAddEvent(y,m,0,"Loaded"); // mark the month as loaded
fLoadScript("/jsp/agenda.jsp?year="+y+"&month="+m);
}
}
fHoliday(y,m,d) {...you need to keep everything inside as is...}
...
// The 2 lines below MUST sit at page bottom and be the last 2 lines of the plugins.js !!!
if (gbShareAgenda&&!eval(gsAgShared)) eval(gsAgShared+"=[]");
fLoadEvents(gCurMonth[0],gCurMonth[1]); // load data for the initial month
/jsp/agenda.jsp
you may have your own code to read the year
and month
parameters from the http request, and use them to constraint the result set loaded from the backend DB so that only events of the specific month will get generated.if(fRepaint)fRepaint();
" to /jsp/agenda.jsp
file and make sure it gets generated as the last line of the javascript source. i.e. the generated source (you may test by pointing your browser directly to /jsp/agenda.jsp
and select "view page source" ) should look like the following: fAddEvent(...);
fAddEvent(...);
...
if (fRepaint) fRepaint(); // must be the last line of the generated agenda source

That's it! Now every time you try to switch a month, the Server Page /jsp/agenda.jsp
will be visited with 2 http parameters - year
and month
. And the value of the year
and month
represent the month that the calendar will be switching to. All you need is to parse the month value and then load corresponding events from DB table and generate corresponding fAddEvent()
calls.
This should be easy, isn't it? However, the fLoadScript()
call approach currently is only supported by IE5+(except Mac), NS6+, Mozilla and Opera7+. For those unsupported browsers you may consider using server-side browser detection to set the agenda param in the name & id (hint: name='gToday:normal:<%=isIE4||isNN4?"agendaFull.jsp":""%>:gfFlat'
) so as to load everything at one time.
As XMLHttpRequest
object becomes more and more popular, a new option emerges to load scripts into the calendar engine and it can be used to complement the fLoadScript()
to load events on demand.
All you need is to replace the fLoadEvent() function above with the following code:
var xmlReq = null;
function fLoadEvents(y,m) {
if (fGetEvent(y,m,0)==null)
fAddEvent(y,m,0,"Loaded"); // mark the month as loaded
else
return;
var url = "/jsp/agenda.jsp?year="+y+"&month="+m;
try {
xmlReq = self.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
xmlReq.onreadystatechange=function() {
if (xmlReq.readyState == 4 && xmlReq.status == 200) {
eval(xmlReq.responseText);
}
}
xmlReq.open("GET", url, true);
if (self.XMLHttpRequest)
xmlReq.send(null);
else
xmlReq.send();
} catch (e) {
alert("XMLHttpRequest is not supported.");
}
}
XMLHttpRequest is supported by IE5+, Mozilla and Safari 1.2+, and is not accessible when the page is on local file system - which means you have to put it into a web server to test.
In additional to load script file, we can also code a plugin to load agenda events from xml file.
Suppose we have the following agenda.xml file located in the web root:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<agenda>
<event year="2005" month="4" date="1" bgcolor="#00ff00" fgcolor="black" bgimg="" border="gold">
<tooltip>this is a test</tooltip>
<action>alert(123)</action>
</event>
<event year="2005" month="1" date="1" bgcolor="green" border="null">
<tooltip>this is a new test</tooltip>
<action/>
<![CDATA[

this is a new test
]]>
</event>
</agenda>
To load it, we just need to append the following code in plugins.js :
var _xmlReq;
function loadXMLDoc(url) {
if (window.XMLHttpRequest) {
_xmlReq = new XMLHttpRequest();
_xmlReq.onreadystatechange = processXML;
_xmlReq.open("GET", url, true);
_xmlReq.send(null);
} else if (window.ActiveXObject) {
_xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
if (_xmlReq) {
_xmlReq.onreadystatechange = processXML;
_xmlReq.open("GET", url, true);
_xmlReq.send();
}
}
}
function processXML() {
if (_xmlReq.readyState == 4) {
if (_xmlReq.status == 200) {
var e=_xmlReq.responseXML.getElementsByTagName("event");
for (var i=0; i<e.length; i++) {
fAddEvent(parseAttrib(e[i],"year"), parseAttrib(e[i],"month"), parseAttrib(e[i],"date"),
parseText(e[i], "tooltip"), parseText(e[i], "action"), parseAttrib(e[i],"bgcolor"),
parseAttrib(e[i],"fgcolor"), parseAttrib(e[i],"bgimg"), parseAttrib(e[i],"border"),
parseText(e[i], "html"));
}
fRepaint();
} else {
alert("Please make sure loading agenda.xml from the same web domain, or it won't work due to browser security concern.\n" +
_xmlReq.statusText);
}
}
}
function parseText(root, tag) {
var ns=root.getElementsByTagName(tag);
if (ns.length==0) return null;
ns=ns[0].childNodes;
if (ns.length==0) return null;
else if (ns.length==1) return ns[0].data;
else return ns[1].data;
}
function parseAttrib(root, attr) {
var n=root.getAttributeNode(attr);
return n?n.value:null;
}
Then, we can either use fOnload plugin to load the xml: (check __isAS to prevent redundant loading if you have multiple calendars sharing the same agenda)
////////////////// Calendar fOnload Handler ///////////////////////
// It's triggered when the calendar engine is fully loaded by the browser.
// NOTE: DO NOT define this handler unless you really need to use it.
////////////////////////////////////////////////////////////////////
function fOnload() {
if (!__isAS) loadXMLDoc("/agenda.xml");
}
Or load it externally from the onload event in the body of the containing page: (suppose the calendar context name is gfFlat)

Note: you may still need the agenda.js file, as the only thing left inside is the fHoliday function. All fAddEvent calls can now be represented in XML.
NOTE: If you would like to test the XML loading, please do it on a real web server and place the xml in the same web domain. Trying to load agenda from local file system or another domain will fail because nowadays modern browsers do not allow loading resources from outside the current web domain.


ISBN Search
ISBN-13:<PHONE_NUMBER>937
ISBN-10:<PHONE_NUMBER>
Author: Erik Westra
Edition: 3rd Revised edition
Binding: Paperback
Publisher: Packt Publishing - ebooks Account
Published: May 2016
List Price: $49.99
$41.49
+3.99 shipping
Ready to ship
Notes
$43.02
+3.95 shipping
$49.99
Free shipping
$50.59
$51.14
Ships 2-3 days
$58.07
Ships 3+ Days
$58.31
$60.29
$80.00
+2.99 shipping
$139.02
$45.49
+5.99 shipping