Announcing the Release of Apache Flink 1.17
March 23, 2023 - Leonard Xu (@Leonardxbj)The Apache Flink PMC is pleased to announce Apache Flink release 1.17.0. Apache Flink is the leading stream processing standard, and the concept of unified stream and batch data processing is being successfully adopted in more and more companies. Thanks to our excellent community and contributors, Apache Flink continues to grow as a technology and remains one of the most active projects in the Apache Software Foundation. Flink 1.17 had 172 contributors enthusiastically participating and saw the completion of 7 FLIPs and 600+ issues, bringing many exciting new features and improvements to the community.
Towards Streaming Warehouses #
In order to achieve greater efficiency in the realm of streaming warehouse, Flink 1.17 contains substantial improvements to both the performance of batch processing and the semantics of streaming processing. These improvements represent a significant stride towards the creation of a more efficient and streamlined data warehouse, capable of processing large quantities of data in real-time.
For batch processing, this release includes several new features and improvements:
- Streaming Warehouse API: FLIP-282 introduces the new Delete and Update API in Flink SQL which only works in batch mode. External storage systems like Flink Table Store can implement row-level modification via this new API. The ALTER TABLE syntax is enhanced by including the ability to ADD/MODIFY/DROP columns, primary keys, and watermarks, making it easier for users to maintain their table schema.
- Batch Execution Improvements: Execution of batch workloads has been significantly improved in Flink 1.17 in terms of performance, stability and usability. Performance wise, a 26% TPC-DS improvement on 10T dataset is achieved with strategy and operator optimizations, such as new join reordering and adaptive local hash aggregation, Hive aggregate functions improvements, and the Hybrid Shuffle Mode enhancements. Stability wise, Speculative Execution now supports all operators, and the Adaptive Batch Scheduler is more robust against data skew. Usability wise, the tuning effort required for batch workloads has been reduced. The is now the default scheduler in batch mode. The Hybrid Shuffle Mode is compatible with Speculative Execution and the Adaptive Batch Scheduler, next to various configuration simplifications.
- SQL Client/Gateway: Apache Flink 1.17 introduces the “gateway mode” for SQL Client, allowing users to submit SQL queries to a SQL Gateway for enhanced functionality. Users can use SQL statements to manage job lifecycles, including displaying job information and stopping running jobs. This provides a powerful tool for managing Flink jobs.
For stream processing, the following features and improvements are realized:
- Streaming SQL Semantics: Non-deterministic operations may bring incorrect results or exceptions which is a challenging topic in streaming SQL. Incorrect optimization plans and functional issues have been fixed, and the experimental feature of PLAN_ADVICE is introduced to inform of potential correctness risks and optimization suggestions to SQL users.
- Checkpoint Improvements: The generic incremental checkpoint improvements enhance the speed and stability of the checkpoint procedure, and the unaligned checkpoint has improved stability under backpressure and is production-ready in Flink 1.17. Users can manually trigger checkpoints with self-defined checkpoint types while a job is running with the newly introduced REST interface for triggering checkpoints.
- Watermark Alignment Enhancement: Efficient watermark processing directly affects the execution efficiency of event time applications. In Flink 1.17, FLIP-217 introduces an improvement to watermark alignment by aligning data emission across splits within a source operator. This improvement results in more efficient coordination of watermark progress in the source, which in turn mitigates excessive buffering by downstream operators and enhances the overall efficiency of steaming job execution.
- StateBackend Upgrade: The updated version of FRocksDB to 6.20.3-ververica-2.0 brings improvements to RocksDBStateBackend like sharing memory between slots, and now supports Apple Silicon chipsets like the Mac M1.
Batch processing #
As a unified stream and batch data processing engine, Flink stands out particularly in the field of stream processing. In order to improve its batch processing capabilities, the community contributors put in a lot of effort into improving Flink’s batch performance and ecosystem in version 1.17. This makes it easier for users to build a streaming warehouse based on Flink.
Speculative Execution #
Speculative Execution for sinks is now supported. Previously, Speculative Execution was not enabled for sinks to avoid instability or incorrect results. In Flink 1.17, the context of sinks is improved so that sinks, including new sinks and OutputFormat sinks, are aware of the number of attempts. With the number of attempts, sinks are able to isolate the produced data of different attempts of the same subtask, even if the attempts are running at the same time. The FinalizeOnMaster interface is also improved so that OutputFormat sinks can see which attempts are finished and then properly commit the written data. Once a sink can work well with concurrent attempts, it can implement the decorative interface SupportsConcurrentExecutionAttempts so that Speculative Execution is allowed to be performed on it. Some built in sinks are enabled to do Speculative Execution, including DiscardingSink, PrintSinkFunction, PrintSink, FileSink, FileSystemOutputFormat and HiveTableSink.
The slow task detection is improved for Speculative Execution. Previously, it only considered the execution time of tasks when deciding which tasks are slow. It now takes the input data volume of tasks into account. Tasks which have a longer execution time but consume more data may not be considered as slow. This improvement helps to eliminate the negative impacts from data skew on slow task detection.
Adaptive Batch Scheduler #
Adaptive Batch Scheduler is now used for batch jobs by default. This scheduler can automatically decide a proper parallelism of each job vertex, based on how much data the vertex processes. It is also the only scheduler which supports speculative execution.
The configuration of Adaptive Batch Scheduler is improved for ease of use. Users no longer need to explicitly set the global default parallelism to -1 to enable automatically deciding parallelism. Instead, the global default parallelism, if set, will be used as the upper bound when deciding the parallelism. The keys of Adaptive Batch Scheduler configuration options are also renamed to be easier to understand.
The capabilities of Adaptive Batch Scheduler are also improved. It now supports evenly distributing data to downstream tasks, based on fine-grained data distribution information. The limitation that the decided parallelism of vertices can only be a power of 2 is no longer needed and therefore removed.
Hybrid Shuffle Mode #
Various important improvements to the Hybrid Shuffle Mode are available in this release.
- Hybrid Shuffle Mode now supports Adaptive Batch Scheduler and Speculative Execution.
- Hybrid Shuffle Mode now supports reusing intermediate data when possible, which brings significant performance improvements.
- The stability is improved to avoid stability issues in large scale production.
More details can be found at the Hybrid-Shuffle section of the documentation.
TPC-DS Benchmark #
Starting with Flink 1.16, the performance of the Batch engine has continuously been optimized. In Flink 1.16, dynamic partition pruning was introduced, but not all TPC-DS queries could be optimized. In Flink 1.17, the algorithm has been improved, and most of the TPC-DS results are now optimized. In Flink 1.17, a dynamic programming join-reorder algorithm is introduced, which has a better working, larger search space compared to the previous algorithm.. The planner can automatically select the appropriate join-reorder algorithm based on the number of joins in a query, so that users no longer need to care about the join-reorder algorithms. (Note: the join-reorder is disabled by default, and you need to enable it when running TPC-DS.) In the operator layer, dynamic hash local aggregation strategy is introduced, which can dynamically determine according to the data distribution whether the local hash aggregation operation is needed to improve performance. In the runtime layer, some unnecessary virtual function calls are removed to speed up the execution. To summarize, Flink 1.17 has a 26% performance improvement compared to Flink 1.16 on a 10T dataset for partitioned tables.
SQL Client / Gateway #
Apache Flink 1.17 introduces a new feature called “gateway mode” for the SQL Client, which enhances its functionality by allowing it to connect to a remote gateway and submit SQL queries like it does in embedded mode. This new mode offers users much more convenience when working with the SQL Gateway.
In addition, the SQL Client/SQL Gateway now provides new support for managing job lifecycles through SQL statements. Users can use SQL statements to display all job information stored in the JobManager and stop running jobs using their unique job IDs. With this new feature, SQL Client/Gateway now has almost the same functionality as Flink CLI, making it another powerful tool for managing Flink jobs.
SQL API #
Row-Level SQL Delete & Update are becoming more and more important in modern big data workflows. The use cases include deleting a set of rows for regulatory compliance, updating a set of rows for data correction, etc. Many popular engines such as Trino or Hive have supported them. In Flink 1.17, the new Delete & Update API is introduced in Flink, which works in batch mode and is exposed to connectors. Now external storage systems can implement row-level modification via this new API. Furthermore, the ALTER TABLE syntax is extended to include the ability to ADD/MODIFY/DROP columns, primary keys, and watermarks. These enhanced capabilities provide users with the flexibility to maintain their table schema metadata according to their needs.
Hive Compatibility #
Apache Flink 1.17 brings new improvements to the Hive table sink, making it more efficient than ever before. In previous versions, the Hive table sink only supported automatic file compaction in streaming mode, but not in batch mode. In Flink 1.17, the Hive table sink can now automatically compact newly written files in batch mode as well. This feature can greatly reduce the number of small files. Also, for using Hive built-in functions via HiveModule, Flink introduces several native Hive aggregation functions including SUM/COUNT/AVG/MIN/MAX to HiveModule. These functions can be executed using the hash-based aggregation operator and then bring significant performance improvements.
Streaming Processing #
In Flink 1.17, difficult Streaming SQL semantics and correctness issues are addressed, checkpoint performance is optimized, watermark alignment is enhanced, Streaming FileSink expands ABFS(Azure Blob Filesystem) support, Calcite and FRocksDB have been upgraded to newer versions. These improvements further enhance the capabilities of Flink in the field of stream processing.
Streaming SQL Semantics #
In terms of correctness and semantic enhancement, Flink 1.17 introduces the experimental feature PLAN_ADVICE that detects potential correctness risks and provides optimization suggestions. For example, if a NDU (Non-deterministic Updates) issue is detected by EXPLAIN PLAN_ADVICE, the optimizer will append the advice at the end of the physical plan, the optimizer will then tag the advice id to the relational node of related operations, and recommend that users update their configurations accordingly. By providing users with this specific advice, the optimizer can help them improve the accuracy and reliability of their query results.
== Optimized Physical Plan With Advice ==
...
advice[1]: [WARNING] The column(s): day(generated by non-deterministic function: CURRENT_TIMESTAMP ) can not satisfy the determinism requirement for correctly processing update message('UB'/'UA'/'D' in changelogMode, not 'I' only), this usually happens when input node has no upsertKey(upsertKeys=[{}]) or current node outputs non-deterministic update messages. Please consider removing these non-deterministic columns or making them deterministic by using deterministic functions.
The PLAN_ADVICE also helps users improve the performance and efficiency of their queries. For example, when a GroupAggregate operation is detected and can be optimized to a more efficient local-global aggregation. By providing users with this specific advice for optimization, the optimizer enables users to easily improve the performance and efficiency of their queries.
== Optimized Physical Plan With Advice ==
...
advice[1]: [ADVICE] You might want to enable local-global two-phase optimization by configuring ('table.optimizer.agg-phase-strategy' to 'AUTO').
In addition, Flink 1.17 resolved several incorrect plan optimizations which led to incorrect results reported in FLINK-29849, FLINK-30006, and FLINK-30841.
Checkpoint Improvements #
Generic Incremental Checkpoint (GIC) aims to improve the speed and stability of the checkpoint procedure. Some experimental results in the WordCount case are shown as below. More details can be found in this blog post.
Table1: Benefits after enabling GIC in WordCount case
Table2: Costs after enabling GIC in WordCount case
Unaligned Checkpoints (UC) greatly increase the completed ratio of checkpoints under backpressure. The previous UC implementation would write many small files which may cause high load for the namenode of HDFS. In this release, this problem is resolved to make UC more usable in the production environment.
In 1.17, a REST API is provided so that users can manually trigger checkpoints with a self-defined checkpoint type while a job is running. For example, for a job running with incremental checkpoint, users can trigger a full checkpoint periodically or manually to break the incremental checkpoint chain to avoid referring to files from a long time ago.
Watermark Alignment Support #
In earlier versions, FLIP-182 proposed a solution called watermark alignment to tackle the issue of data skew in event time applications caused by imbalanced sources. However, it had a limitation that the source parallelism had to match the number of splits. This was because a source operator with multiple splits might need to buffer a considerable amount of data if one split emitted data faster than another. To address this limitation, Flink 1.17 introduced FLIP-217, which enhances watermark alignment to align data emission across splits within a source operator while considering watermark boundaries. This enhancement ensures more coordinated watermark progress in the source, preventing downstream operators from buffering excessive data and improving the execution efficiency of streaming jobs.
Streaming FileSink Expansion #
Following the addition of ABFS support, the FileSink is now able to function in streaming mode with a total of five different filesystems: HDFS, S3, OSS, ABFS, and Local. This expansion effectively covers the majority of main filesystems, providing a comprehensive range of options and increased versatility for users.
RocksDBStateBackend Upgrade #
This release has updated the version of FRocksDB to 6.20.3-ververica-2.0 which brings improvements for RocksDBStateBackend:
- Support build FRocksDB Java on Apple Silicon chipsets, such as Mac M1 and M2.
- Improve the performance of compaction filter by avoiding expensive ToString()
- Upgrade ZLIB version of FRocksDB to avoid memory corruption
- Add periodic_compaction_seconds option to RocksJava
Please see FLINK-30836 for more details.
This release also widens the scope of sharing memory between slots to TaskManager, which can help to increase the memory efficiency if the memory usage of slots in a TaskManager is uneven. Furthermore, it can reduce the overall memory consumption at the expense of resource isolation after tuning. Read more about state.backend.rocksdb.memory.fixed-per-tm configuration.
Calcite Upgrade #
Flink 1.17 is upgraded to Calcite version 1.29.0 to improve the performance and efficiency of the Flink SQL system. Flink 1.16 uses Calcite 1.26.0 which has severe issues with RexNode simplification caused by the SEARCH operator. This leads to wrong data from query optimization as reported in CALCITE-4325 and CALCITE-4352. By upgrading the version of Calcite, Flink can take advantage of its improved performance and new features in Flink SQL processing. This resolves multiple bugs and leads to faster query processing times.
Others #
PyFlink #
The Flink 1.17 release includes updates to PyFlink, the Python interface for Apache Flink. Notable improvements include support for Python 3.10 and execution capabilities on Apple Silicon chipsets, such as the Mac M1 and M2 computers. Additionally, the release includes minor optimizations that enhance cross-process communication stability between Java and Python processes, enable the specification of data types of Python UDFs via strings to improve usability, and support access to job parameters in Python UDFs. This release focuses on improving PyFlink’s functionality and usability, rather than introducing new major features. However, these enhancements are expected to improve the user experience and facilitate efficient data processing.
Daily Performance Benchmark #
In Flink 1.17, daily performance monitoring has been integrated into the #flink-dev-benchmarks Slack channel. This feature is crucial in quickly identifying regressions and ensuring the quality of the code. Once a regression is identified through the Slack channel or the speed center, developers can refer to the guidance provided in the Benchmark’s wiki to address the issue effectively. This feature helps the community take a proactive approach in ensuring system performance, resulting in a better product and increased user satisfaction.
Subtask Level Flame Graph #
Starting with Flink 1.17, Flame Graph provides “drill down” visualizations to the task level, which allows users to gain a more detailed understanding of the performance of their tasks. This feature is a significant improvement over previous versions of Flame Graph, as it empowers users to select a subtask of interest and see the corresponding flame graph. By doing so, users can identify specific areas where their tasks may be experiencing performance issues and take steps to address them. This can lead to significant improvements in the overall efficiency and effectiveness of their data processing pipelines.
Generalized Delegation Token Support #
Previously, Flink supported Kerberos authentication and Hadoop based tokens. With FLIP-272 being finalized, Flink’s delegation token framework is generalized to make it authentication protocol agnostic. This will allow contributors in the future to add support for non-Hadoop compliant frameworks where the authentication protocol is not based on Kerberos. Additionally, FLIP-211 was implemented which improves Flink’s interactions with Kerberos: It reduces the number of requests that are necessary to exchange delegation tokens in Flink.
Upgrade Notes #
The Flink community tries to ensure that upgrades are as seamless as possible. However, certain changes may require users to make adjustments to certain parts of the program when upgrading to version 1.17. Please refer to the release notes for a comprehensive list of adjustments to make and issues to check during the upgrading process.
List of Contributors #
The Apache Flink community would like to express gratitude to all the contributors who made this release possible:
Ahmed Hamdy, Aitozi, Aleksandr Pilipenko, Alexander Fedulov, Alexander Preuß, Anton Kalashnikov, Arvid Heise, Bo Cui, Brayno, Carlos Castro, ChangZhuo Chen (陳昌倬), Chen Qin, Chesnay Schepler, Clemens, ConradJam, Danny Cranmer, Dawid Wysakowicz, Dian Fu, Dong Lin, Dongjoon Hyun, Elphas Toringepi, Eric Xiao, Fabian Paul, Ferenc Csaky, Gabor Somogyi, Gen Luo, Gunnar Morling, Gyula Fora, Hangxiang Yu, Hong Liang Teoh, HuangXingBo, Jacky Lau, Jane Chan, Jark Wu, Jiale, Jin, Jing Ge, Jinzhong Li, Joao Boto, John Roesler, Jun He, JunRuiLee, Junrui Lee, Juntao Hu, Krzysztof Chmielewski, Leonard Xu, Licho, Lijie Wang, Mark Canlas, Martijn Visser, MartijnVisser, Martin Liu, Marton Balassi, Mason Chen, Matt, Matthias Pohl, Maximilian Michels, Mingliang Liu, Mulavar, Nico Kruber, Noah, Paul Lin, Peter Huang, Piotr Nowojski, Qing Lim, QingWei, Qingsheng Ren, Rakesh, Ran Tao, Robert Metzger, Roc Marshal, Roman Khachatryan, Ron, Rui Fan, Ryan Skraba, Salva Alcántara, Samrat, Samrat Deb, Samrat002, Sebastian Mattheis, Sergey Nuyanzin, Seth Saperstein, Shengkai, Shuiqiang Chen, Smirnov Alexander, Sriram Ganesh, Steven van Rossum, Tartarus0zm, Timo Walther, Venkata krishnan Sowrirajan, Wei Zhong, Weihua Hu, Weijie Guo, Xianxun Ye, Xintong Song, Yash Mayya, YasuoStudyJava, Yu Chen, Yubin Li, Yufan Sheng, Yun Gao, Yun Tang, Yuxin Tan, Zakelly, Zhanghao Chen, Zhenqiu Huang, Zhu Zhu, ZmmBigdata, bzhaoopenstack, chengshuo.cs, chenxujun, chenyuzhi, chenyuzhi459, chenzihao, dependabot[bot], fanrui, fengli, frankeshi, fredia, godfreyhe, gongzhongqiang, harker2015, hehuiyuan, hiscat, huangxingbo, hunter-cloud09, ifndef-SleePy, jeremyber-aws, jiangjiguang, jingge, kevin.cyj, kristoffSC, kurt, laughingman7743, libowen, lincoln lee, lincoln.lil, liujiangang, liujingmao, liuyongvs, liuzhuang2017, luoyuxia, mas-chen, moqimoqidea, muggleChen, noelo, ouyangwulin, ramkrish86, saikikun, sammieliu, shihong90, shuiqiangchen, snuyanzin, sunxia, sxnan, tison, todd5167, tonyzhu918, wangfeifan, wenbingshen, xuyang, yiksanchan, yunfengzhou-hub, yunhong, yuxia Luo, yuzelin, zhangjingcun, zhangmang, zhengyunhong.zyh, zhouli, zoucao, 沈嘉琦


The Attendant $$
Located in the heart of the Shoreditch Triangle, The Attendant prides itself in catering to every type of brunch customer from the on-the-go take-away customer to the hearty breakfast savorer. Visit this place to also find out about its decor that pays homage to its history as an abandoned public toilet.
Farmacy $$
Need a place to help you transition into the vegan, clean eating self you always wanted to be? Look no further as this ultra chic eatery up in Notting Hill takes 'juice shots' and 'salads' to a whole new level
26 Grains $
British porridge is reimagined at this Scandinavian-style courtyard café in Covent Garden's health-food hotspot Neal's Yard. Oats are cooked in a variety of milks (coconut, cashew, almond) or juice, and flavoured with cardamom, ginger, nutmeg and star anise. Our favorite is the scrumptious banana and cacao nib porridge.


All Classes
Communication
Coordinate
Drink
Game
InterfaceG
Item
Kind_Items
Player
Population
Population_Sim
Region
Simulation
ThreadSimu


This is the lightest pfe-card and a link, and a visited link with
pfe-border
.
This is the lightest pfe-card and a link, and a visited link.
This is the darker pfe-card and a link, and a visited link.
This is the darkest pfe-card and a link, and a visited link.
This is the complement pfe-card and a link, and a visited link.
This is the accent pfe-card and a link, and a visited link.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quaerat porro similique saepe tempora vel! Facilis, porro?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quaerat porro similique saepe tempora vel! Facilis, porro?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta rerum tempore natus alias! Cumque illum provident corrupti voluptates.
Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta rerum tempore natus alias! Cumque illum provident corrupti voluptates.


Contact
FOR JUNIOR FRONT END DEVELOPER JOB OFFERS OR OTHER INQUIRIES:
Name
*
First Name
Last Name
Email Address
*
Subject
Message
*


Home
# Created by Tom Laudeman
# All files of this package are Copyright 2011 University of Virginia
# All files of this package are licensed under the Apache License.
# Licensed under the Apache License Version 2.0 (the "License"); you
# may not use these files except in compliance with the License. You
# may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
Table of Contents
-----------------
Introduction
Change notes
Data preparation notes
Ss_converter Methods
Introduction
------------
This package is a standard Rails application. Only files which differ
from what you get with a stock Rails application have been checked
into the repository. There are also two command line scripts as
well. The main purpose of uva_ss2ead is to convert .xlsx with a
certain column layout into EAD XML. EAD xml.
The blank spreadsheet is in public/ead_template.xlsx.
show_ss.rb exists to display a spreadsheet as name-value pairs. I
often prefer to view spreadsheets this way because it avoids
line-wrapping issues that come up with a normal row/column/cell
tabular ascii-art view.
render_ss.rb is a command line to convert a spreadsheet to EAD.
The utility class Ss_convert is in lib/util.rb. Rails specific
bookkeeping/rendering code (the controller) is in
app/controllers/ss_conv_controller.rb. The .erb HTML templates are in
the standard location app/views/ss_conv/.
<%= dsc %> in pre_dsc_header_t.erb comes from the content hash value
in the list of hashes generated during processing the spread sheet
rows.
Due to the entities and DTD referenced in the EAD XML template, the
following URLs and servers must remain active, and kept up to date.
stylesheet http://ead.lib.virginia.edu/vivaead/published/document.xsl
EAD DTD http://text.lib.virginia.edu/bin/dtd/eadVIVA/eadVIVA.dtd
logo http://ead.lib.virginia.edu/vivaead/logos/uva-sc.jpg
conditions http://www.lib.virginia.edu/speccol/vhp/conditions.html
address http://ead.lib.virginia.edu/vivaead/add_con/uva-sc_address.xml
contact http://ead.lib.virginia.edu/vivaead/add_con/uva-sc_contact.xml
Data preparation notes
----------------------
Some data coming out of the spreadsheet via the Excelx class in the
roo gem have issues. roo is prone to change strings with digits into
numbers. The method fix_our_hash() cleans up various problems.
Cols "num", "component", and "unitdate" are converted to strings via method
unintegerize().
If col "container" is empty or undefined it is converted to a zero
length string "".
If "c0x level" is "series", then "series_flag" is set to true,
otherwise "series_flag" defaults to false.
"container_label" is capitalized "container".
"container_type" is downcase'd "container".
If "container" is empty then "container_flag" is set to false,
otherwise "container_flag" is true.
The chars &, <, and > are HTML encoded. & is only encoded if it is not
part of a character entity.
Several columns have one or more newlines converted to
"
\n
". The first opening p and final closing p are part of the
template which accounts for why the substitution is a closing p
newline opening p. Fields effected: bioghist, guide_scope,
access_restrict, use_restrict, process_info, related_mats,
arrangement, scopecontent. The method newline_to_p() performs the
substitution.
Ss_converter Methods
--------------------
Change notes
------------
x Documentation for both end users and developers is all in this file
(readme.html) and this is linked from the site home page.
x Include a link to the empty spreadsheet so people can download the
correct, current version. Include the file modification time in the
link text.
x rename render_csv.rb to render_ss.rb, show_csv.rb to show_ss.rb
because both can do more than just csv.
x <ead id="#{coll_hr['num']}"> vui is the num. vui also occurs in file name.
x show_csv.rb add printf max width formatting for name and add ability
to read xlsx.
Q If an element is empty must we render it as <empty/> or can we use
<empty></empty> ?
A xmllint seems to change empty elements into the self-closing variant.
x add "num" to Accession # in prefercite
x fix both instances of <num> to use collection_num column
x add Conents List as first line of <dcs>
x put sample input and output from "steady" ruby and nokogiri converter into ./steady/
x simple erb text template_1.erb
x copy EADExample.csv to first_example.csv for tab-complete sanity
x show_csv.rb to show csv as name-value pairs where the name is the column name.


Opportunities
Find a Tender lists high value contracts (usually above £118,000) in the UK’s public and utilities sectors. It also provides links to relevant UK public procurement regulations.
Contracts Finder lets you search for information about contracts worth over £10,000 with the UK government and its agencies.
The devolved nations of the UK (Scotland, Wales and Northern Ireland) also run their own separate procurement portals:
Other domain-specific procurement portals include:


Wilkins, Jackson lift Drake over Kennesaw State 86-55
DES MOINES, Iowa (AP) - D.J. Wilkins had 19 points to lead five Drake players in double figures as the Bulldogs routed Kennesaw State 86-55 on Thursday night.
Jonah Jackson added 15 points for the Bulldogs. Garrett Sturtz chipped in 14, Anthony Murphy scored 11 and Roman Penn had 10. Sturtz also had six rebounds for the Bulldogs, while Murphy posted seven rebounds.
Tyler Hooker had 12 points for the Owls (0-2). Armani Harris added 10 points and seven rebounds. Terrell Burden had 10 points.
Danny Lewis, who led the Owls in scoring coming into the contest with 15 points per game, scored only 2 points. He failed to make a shot from behind the arc (0 of 5). Bryson Lockley, whose 12 points per game coming into the matchup ranked second on the Owls, shot only 14% in the game (1 of 7).
Drake (1-0) matches up against Cincinnati on the road on Monday. Kennesaw State takes on Mercer on the road on Monday.
For more AP college basketball coverage: https://apnews.com/Collegebasketball and http://twitter.com/AP_Top25
This was generated by Automated Insights, http://www.automatedinsights.com/ap, using data from STATS LLC, https://www.stats.com
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


Hi, I am James. I just finished my 3rd year in HKUST studying Computer Science and General Business Management. I was enrolled in the dual degree program, which offers me a degree in engineering as well as a degree in business administration. So, I got the chances to take courses from both the business and engineering school. I quite like the program as it allows me to explore different areas and connect different ideas across disciplines. The wide exposures also allows me to make sure the way I would like to go for my career. At the same time, I can drill down to one engineering major, which I chose to be Computer Science.
I think Computer Science is fun, palying around with logics and solving difficult puzzles give me a sense of accomplishment. Among the topics in Computer Science, in particular, I love the topics related to data analysis, mining, visualisation and artificial intelligence. Therefore, both research projects I joined was related to these fields.
 MBTI is a theory constructed by Katharine Cook Briggs and her daughter Isabel Briggs Myers to describe the order of each person’s preference and choice in 4 areas. A person will be described using a 4-letter acronym, which comes from:
So, I am of the type ESFJ, that means I am Extraversion, Sensing, Feeling and Judging. In general, ESFJ people, including me, are extraordinarily caring, social and popular people, always eager to help.
In workplace, I have strong sense of responsibility and loyalty. In my past working experience, I constantly completed my tasks in time and was well-prepared for future jobs. Besides, I am a fast-learner, I pick things up fast. In my undergraduate research project I was able to learn new tools and skills and apply it in the project within short time.
In social life, I am warm, caring and good at connecting with others. When working with others, I will seek harmony about other people’s feeling and strive for win-win situations for everyone. This personality allows me to be a strong team player and make a lot of good friends.
Through understanding my personality I learnt to adjust myself to collaborate with others. In some group projects, I invited my teammates taking the test and getting to knwo each other personalities. It turned out that we work really well.
To know more about ESFJ personality, you can click here.
Click here to try out the amazing MBTI test.
I played piano since I was 8, and I also knew some basics of other instruments like guitar and flute. Recently, I am preparing for my diploma exame for piano. Sometimes I perform in private concerts and also as an accompanist. In highschool I was the chairman of the school wind orchestra; in University, I am a member of the band society and orchestra. Despite actually playing the music, I enjoy attending concerts regularly in Hong Kong or overseas of all genres, ranging from classical, jazz to contemporary music.
Performance by Hong Kong Philharmonic
Performing in Private Concert
Opera House in Venice
Banding
“You only live once.” When I got into the University, I started thinking what I want to accomplish in my life. Despite gaining academic awards and working experiences, I wanted to do something solely for fun when I am still young.
Last year, there was a chance for me traveling to Europe, the experience was great. I enjoyed the amazing architectures and nature scenes from different countries. Among the places I visited, I love Venice the most. The waterways are beautiful and the life is relaxing. By the way, my next target is Iceland since many of my friends told me the view in Iceland is stunning and cannot be found in other places. Before my graduation, I wish I can travel to more places and try different new things. Below is some snapshots during my trips.
Pisa
Rome
Vantican
Berlin
Berlin
Copenhagon
Venice
Stockholm


| Interface | Description |
|---|---|
| AsyncInvoker |
Uniform interface for asynchronous invocation of HTTP methods.
|
| Client |
Client is the main entry point to the fluent API used to build and execute client
requests in order to consume responses returned.
|
| ClientRequestContext |
Client request filter context.
|
| ClientRequestFilter |
An extension interface implemented by client request filters.
|
| ClientResponseContext |
Client response filter context.
|
| ClientResponseFilter |
An extension interface implemented by client response filters.
|
| CompletionStageRxInvoker |
Reactive invoker based
CompletionStage . |
| Invocation |
A client request invocation.
|
| Invocation.Builder |
A client request invocation builder.
|
| InvocationCallback<RESPONSE> |
Callback that can be implemented to receive the asynchronous processing
events from the invocation processing.
|
| RxInvoker<T> |
Uniform interface for reactive invocation of HTTP methods.
|
| RxInvokerProvider<T extends RxInvoker> |
RxInvoker provider. |
| SyncInvoker |
Uniform interface for synchronous invocation of HTTP methods.
|
| WebTarget |
A resource target identified by the resource URI.
|
| Class | Description |
|---|---|
| ClientBuilder |
Main entry point to the client API used to bootstrap
Client
instances. |
| Entity<T> |
Encapsulates message entity including the associated variant information.
|
| Exception | Description |
|---|---|
| ResponseProcessingException |
Client-side runtime processing exception thrown to indicate that
response processing has failed (e.g.
|
plain HTTP communication API
as well as integration with extension
providers, in order to enable concise and efficient implementation of
reusable client-side solutions that leverage existing and well
established client-side implementations of HTTP-based communication.
The Client API encapsulates the Uniform Interface Constraint –
a key constraint of the REST architectural style – and associated data
elements as client-side Java artifacts and supports a pluggable architecture
by defining multiple extension points.
ClientBuilder
that is used to bootstrap Client
instances -
configurable
, heavy-weight objects
that manage the underlying communication infrastructure and serve as the root
objects for accessing any Web resource. The following example illustrates the
bootstrapping and configuration of a Client
instance:
Client client = ClientBuilder.newClient(); client.property("MyProperty", "MyValue") .register(MyProvider.class) .register(MyFeature.class);
text/plain
representation of the resource identified by
"http://example.org/hello"
:
Client client = ClientBuilder.newClient(); Response res = client.target("http://example.org/hello").request("text/plain").get();Conceptually, the steps required to submit a request are the following:
Client
instanceWebTarget
pointing at a Web resourcebuild
a requestInvocation
for later submissionWebTarget
instance is bound to a
concrete URI, e.g. "http://example.org/messages/123"
,
or a URI template, e.g. "http://example.org/messages/{id}"
.
That way a single target can either point at a particular resource or represent
a larger group of resources (that e.g. share a common configuration) from which
concrete resources can be later derived:
// Parent target for all messages WebTarget messages = client.target("http://example.org/messages/{id}"); // New target for http://example.org/messages/123 WebTarget msg123 = messages.resolveTemplate("id", 123); // New target for http://example.org/messages/456 WebTarget msg456 = messages.resolveTemplate("id", 456);
Invocation
is a request that has been prepared
and is ready for execution.
Invocations provide a generic interface that enables a separation of concerns
between the creator and the submitter. In particular, the submitter does not
need to know how the invocation was prepared, but only whether it should be
executed synchronously or asynchronously.
Invocation inv1 = client.target("http://example.org/atm/balance") .queryParam("card", "111122223333").queryParam("pin", "9876") .request("text/plain").buildGet(); Invocation inv2 = client.target("http://example.org/atm/withdrawal") .queryParam("card", "111122223333").queryParam("pin", "9876") .request().buildPost(text("50.0"))); Collectioninvs = Arrays.asList(inv1, inv2); // Executed by the submitter Collection ress = Collections.transform(invs, new F () { public Response apply(Invocation inv) {return inv.invoke(); } });


Nynaeve pressed Elayne back into the narrow alleyway between a cloth merchant’s shop and a potter’s works as the pair of women linked by a silvery leash passed by, heading down the cobblestone street toward Falme harbor. They did not dare allow that pair to come too close. The people in the street made way for those two even more quickly than they did for Seanchan soldiers, or the occasional noble’s palanquin, thickly curtained now that the days were cold. Even the street artists did not offer to draw them in chalks or pencils, although they pestered everyone else. Nynaeve’s mouth tightened as her eyes followed the sul’dam and the damane through the crowd. Even after weeks in the town, the sight sickened her. Perhaps it sickened her more, now. She could not imagine doing that to any woman, not even Moiraine or Liandrin.
Well, maybe Liandrin, she admitted sourly. Sometimes, at night, in the small, smelly room the two of them had rented above a fishmonger, she thought of what she would like to do to Liandrin when she got her hands on her. Liandrin even more than Suroth. More than once she had been shocked at her own cruelty, even while she was delighted at her inventiveness.
Still trying to keep the pair in sight, her eyes fell on a bony man, well down the street, before the shifting throng hid him again. She had only a flash of a big nose in a narrow face. He wore a rich bronze velvet robe of Seanchan cut over his clothes, but she thought that he was no Seanchan, though the servant following him was, and a servant of high degree, with one temple shaved. The local people had not taken to Seanchan fashions, particularly that one. That looked like Padan Fain, she thought incredulously. It couldn’t be. Not here.
“Nynaeve,” Elayne said softly, “could we move on, now? That fellow selling apples is looking at his table as if he’s thinking he had more a few moments ago, and I would not want him wondering what I have in my pockets.”
They both wore long coats made of sheepskin, with the fleece turned in and bright red spirals embroidered across the breast. It was country garb, but it passed well enough in Falme, where many people had come in from the farms and villages. Among so many strangers the two of them had been able to sink in unnoticed. Nynaeve had combed out her braid, and her gold ring, the serpent eating its own tail, now nestled under her dress beside Lan’s heavy ring on the leather cord around her neck.
The large pockets of Elayne’s coat bulged suspiciously.
“You stole those apples?” Nynaeve hissed quietly, pulling Elayne out into the crowded street. “Elayne, we don’t have to steal. Not yet, anyway.”
“No? How much money do we have left? You have been ‘not hungry’ very often at mealtimes the last few days.”
“Well, I am not hungry,” Nynaeve snapped, trying to ignore the hollow in her middle. Everything cost considerably more than she had expected; she had heard local people complaining about how prices had risen since the Seanchan came. “Give me one of those.” The apple Elayne dug out of her pocket was small and hard, but it crunched with a delicious sweetness when Nynaeve bit into it. She licked the juice from her lips.  “Did you . . . ? Did you . . . ?” She could not think of a way to say it with so many streaming by, but Elayne understood.
“Only a little. I made that stack of old melons with the soft spots fall, and when he started putting them back . . . ” She did not even have the grace, as Nynaeve saw it, to blush or look embarrassed. Unconcernedly eating one of the apples, she shrugged. “There is no need to frown at me like that. I looked carefully to make sure there was no damane close.” She sniffed. “If I were being held prisoner, I would not help my captors find other women to enslave. Although, the way these Falmen behave, you would think they were lifelong servants of those who should be their enemies to the death.” She looked around, openly contemptuous, at the people hurrying by; it was possible to follow the path of any Seanchan, even common soldiers and even at a distance, by the ripples of bowing. “They should resist. They should fight back.”
“How? Against . . . that.”
They had to step to the side of the street along with everyone else as a Seanchan patrol neared, climbing from the direction of the harbor. Nynaeve managed the bow, hands on knees, with face schooled to a perfect smoothness; Elayne was slower, and made her bow with a distasteful twist of her mouth.
There were twenty armored men and women in the patrol, riding horses, for which Nynaeve was grateful. She could not become used to seeing people riding things that looked like bronze-scaled, tailless cats, and a rider on one of the flying beasts was always enough to make her feel dizzy; she was glad there were so few of them. Still, two leashed creatures trotted along with the patrol, like wingless birds with coarse leather skin, and sharp beaks higher above the cobblestones than the helmeted heads of the soldier. Their long, sinewy legs looked as if they could run faster than any horse.
She straightened slowly after the Seanchan were gone. Some of those who had bowed for the patrol came close to running; no one was comfortable at the sight of the Seanchan’s beasts except the Seanchan themselves.  If you still can’t learn to be careful, maybe it’s time to think about sending you back to Tar Valon, or home to Caemlyn, or anywhere but here.”
“I am careful. At least I looked to be sure there was no damane close by. What about you? I have seen you channel with one in plain sight.”
“I made sure they weren’t looking at me,” Nynaeve muttered. She had had to ball up all her anger at women being chained like animals to manage it. “And I only did it once. And it was only a trickle.”
“A trickle? We had to spend three days hiding in our room breathing fish while they searched the town for whoever had done it. Do you call that being careful?”
“I had to know if there was a way to unfasten those collars.” She thought there was. She would have to test one more collar at least before she was certain, and she was not looking forward to it. She had thought, like Elayne, that the damane must all be prisoners eager to escape, but it had been the woman in the collar who raised the cry.
A man pushing a barrow that bumped over the cobblestones passed by them, crying his services to sharpen scissors and knives. “They should resist, somehow,” Elayne growled. “They act as if they do not see anything that happens around them if there’s a Seanchan in it.”
Nynaeve only sighed. It did not help that she thought Elayne was at least partly right. At first she had thought some of the Falmen submission, at least, must be a pose, but she had found no evidence of any resistance at all. She had looked at first, hoping to find help in freeing Egwene and Min, but everyone took fright at the merest hint that they might oppose the Seanchan, and she stopped asking before she drew the wrong sort of attention. In truth, she could not imagine how the people could fight. Monsters and Aes Sedai. How can you fight monsters and Aes Sedai?
Ahead stood five tall stone houses, among the largest in the town, all together making up a block. One street short of them, Nynaeve found an alleyway beside a tailor shop, where they could keep an eye on some of the tall houses’ entrances, at least. It was not possible to see every door at once—she did not want to risk letting Elayne go off on her own to watch more—but it was not wise to go any closer. Above the rooftops, on the next street, the golden hawk banner of the High Lord Turak flapped in the wind.
Only women went in or out of those houses, and most of those were sul’dam, alone or with damane in tow. The buildings had been taken over by the Seanchan to house the damane. Egwene had to be in there, and likely Min; they had found no sign of Min so far, though it was possible she was as hidden by the crowds as they. Nynaeve had heard many tales of women and girls being seized on the streets or brought in from the villages; they all went into those houses, and if they were seen again, they wore a collar.
Settling herself on a crate beside Elayne, she dug into the other woman’s coat for a handful of the small apples. There were fewer local folk in the streets here. Everyone knew what the houses were, and everyone avoided them, just as they avoided the stables where the Seanchan kept their beasts. It was not difficult to keep an eye on the doors through spaces between the passersby. Just two women stopping for a bite; just two more people who could not afford to eat at an inn. Nothing to attract more than a passing glance.
Eating mechanically, Nynaeve tried once more to plan. Being able to open the collar—if she really could—did no good at all unless she could reach Egwene. The apples did not taste so sweet anymore.
From the narrow window of her tiny room under the eaves, one of a number roughly walled together from whatever had been there before, Egwene could see the garden where damane were being walked by their sul’dam. It had been several gardens before the Seanchan knocked down the walls that separated them and took the big houses to keep their damane. The trees were all but leafless, but the damane were still taken out for air, whether they wanted it or not. Egwene watched the garden because Renna was down there, talking with another sul’dam, and as long as she could see Renna, then Renna was not going to enter and surprise her.
Some other sul’dam might come—there were many more sul’dam than damane, and every sul’dam wanted her turn wearing a bracelet; they called it being complete—but Renna still had charge of her training, and it was Renna who wore her bracelet four times out of five. If anyone came, they would find no impediment to entering. There were no locks on the doors of damane’s rooms. Egwene’s room held only a hard, narrow bed, a washstand with a chipped pitcher and bowl, one chair and a small table, but it had no room for more. Damane had no need of comfort, or privacy, or possessions. Damane were possessions. Min had a room just like this, in another house, but Min could come and go as she would, or almost as she would. Seanchan were great ones for rules; they had more, for everyone, than the White Tower did for novices.
Egwene stood far back from the window. She did not want any of the women below to look up and see the glow that she knew surrounded her as she channeled the One Power, probing delicately at the collar around her neck, searching futilely; she could not even tell whether the band was woven or made of links—sometimes it seemed one, sometimes the other—but it seemed all of a piece all the time. It was only a tiny trickle of the Power, the merest drip that she could imagine, but it still beaded sweat on her face and made her stomach clench. That was one of the properties of the a’dam; if a damane tried to channel without a sul’dam wearing her bracelet, she felt sick, and the more of the Power she channeled, the sicker she became. Lighting a candle beyond the reach of her arm would have made Egwene vomit. Once Renna had ordered her to juggle her tiny balls of light with the bracelet lying on the table. Remembering still made her shudder.
Now, the silver leash snaked across the bare floor and up the unpainted wooden wall to where the bracelet hung on a peg. The sight of it hanging there made her jaws clench with fury. A dog leashed so carelessly could have run away. If a damane moved her bracelet as much as a foot from where it had last been touched by a sul’dam . . . Renna had made her do that, too—had made her carry her own bracelet across the room. Or try to. She was sure it had only been minutes before the sul’dam snapped the bracelet firmly on her own wrist, but to Egwene the screaming and the cramps that had had her writhing on the floor had seemed to go on for hours.
Someone tapped at the door, and Egwene jumped, before she realized it could not be a sul’dam. None of them would knock first. She let saidar go, anyway; she was beginning to feel decidedly ill. “Min?”
“Here I am for my weekly visit,” Min announced as she slipped inside and shut the door. Her cheeriness sounded a little forced, but she always did what she could to keep Egwene’s spirits up. “How do you like it?” She spun in a little circle, showing off her dark green wool dress of Seanchan cut. A heavy, matching cloak hung over her arm. There was even a green ribbon catching up her dark hair, though her hair was hardly long enough for it. Her knife was still in its sheath at her waist, though. Egwene had been surprised when Min first showed up wearing it, but it seemed the Seanchan trusted everyone. Until they broke a rule.
“It’s pretty,” Egwene said cautiously. “But, why?”
“I haven’t gone over to the enemy, if that is what you are thinking. It was this, or else find someplace to stay out in the town, and maybe not be able to visit you again.” She started to straddle the chair as she would have in breeches, gave a wry shake of her head, and turned it around to sit. “ ‘Everyone has a place in the Pattern,’ ” she mimicked, “ ‘and the place of everyone must be readily apparent.’ That old hag Mulaen apparently got tired of not knowing what my place was on sight and decided I ranked with the serving girls. She gave me the choice. You should see some of the things Seanchan serving girls wear, the ones who serve the lords. It might be fun, but not unless I was betrothed, or, better yet, married. Well, there’s no going back. Not yet, anyway. Mulaen burned my coat and breeches.” Grimacing to show what she thought of that, she picked up a rock from a small pile on the table and bounced it from hand to hand. “It isn’t so bad,” she said with a laugh, “except that it has been so long since I wore skirts that I keep tripping over them.”
Egwene had had to watch her clothes being burned, too, including that lovely green silk. It had made her glad she had not brought more of the clothes the Lady Amalisa had given her, though she might never see any of them, or the White Tower, again. What she had on now was the same dark gray all damane wore. Damane have no possessions, it had been explained to her. The dress a damane wears, the food she eats, the bed she sleeps in, are all gifts from her sul’dam. If a sul’dam chooses that a damane sleep on the floor instead of in a bed, or in a stall in a stable, it is purely the choice of the sul’dam. Mulaen, who had charge of the damane quarters, had a droning nasal voice, but she was sharp with any damane who did not remember every word of her boring lectures.
“I don’t think there will be any going back for me ever,” Egwene said, sighing, sinking down on her bed. She gestured to the rocks on the table. “Renna gave me a test, yesterday. I picked out the piece of iron ore, and the copper ore, blindfolded, every time she mixed them up. She left them all here to remind me of my success. She seemed to think it was some kind of reward to be reminded.”
“It doesn’t seem any worse than the rest—not nearly as bad as making things explode like fireworks—but couldn’t you have lied?  Egwene tugged at the collar; pulling did no more good than channeling had. “When Renna is wearing that bracelet, she knows what I am doing with the Power, and what I am not. Sometimes she even seems to know when she isn’t wearing it; she says sul’dam develop—an affinity, she calls it—after a while.” She sighed. “No one even thought to test me on this earlier. Earth is one of the Five Powers that was strongest in men. When I picked out those rocks, she took me outside the town, and I was able to point right to an abandoned iron mine. It was all overgrown, and there wasn’t any opening to be seen at all, but once I knew how, I could feel the iron ore still in the ground. There hasn’t been enough to make it worth working in a hundred years, but I knew it was there. I couldn’t lie to her, Min. She knew I had sensed the mine as soon as I did. She was so excited, she promised me a pudding with my supper.” She felt her cheeks growing hot, in anger and embarrassment. “Apparently,” she said bitterly, “I am now too valuable to be wasted making things explode. Any damane can do that; only a handful can find ores in the ground. Light, I hate making things explode, but I wish that was all I could do.”
The color in her cheeks deepened. She did hate it, making trees tear themselves to splinters and the earth erupt; that was meant for battle, for killing, and she wanted no part of it. Yet anything the Seanchan let her do was another chance to touch saidar, to feel the Power flowing through her. She hated the things Renna and the other sul’dam made her do, but she was sure that she could handle much more of the Power now than she could before leaving Tar Valon. She certainly knew she could do things with it that no sister in the Tower had ever thought of doing; they never thought of tearing the earth apart to kill men.
“Perhaps you won’t have to worry about any of it much longer,” Min said, grinning. “I’ve found us a ship, Egwene. The captain has been held here by the Seanchan, and he is about ready to sail with or without permission.”
“If he will take you, Min, go with him,” Egwene said wearily. “I told you I’m valuable, now. Renna says in a few days they’re sending a ship back to Seanchan. Just to take me.”
Min’s grin vanished, and they stared at each other. Suddenly Min hurled her rock at the pile on the table, scattering them. “There has to be a way out of here.
 “You know the Seanchan have collected every woman they’ve been able to find who can channel even a speck. They come from all over, not just from here in Falme, but from the fishing villages, and from farming towns inland. Taraboner and Domani women, passengers off ships they’ve stopped. There are two Aes Sedai among them.”
“Aes Sedai!” Min exclaimed. By habit she looked around to make sure no Seanchan had overheard her saying that name. “Egwene, if there are Aes Sedai here, they can help us. Let me talk to them, and—”
“They can’t even help themselves, Min. I only talked to one—her name is Ryma; the sul’dam don’t call her that, but that’s her name; she wanted to make sure I knew it—and she told me there is another. She told me in between bouts of tears. She’s Aes Sedai, and she was crying, Min! She has a collar on her neck, they make her answer to Pura, and she can’t do anything more about it than I can. They captured her when Falme fell. She was crying because she’s beginning to stop fighting against it, because she cannot take being punished anymore. She was crying because she wants to take her own life, and she cannot even do that without permission. Light, I know how she feels!”
Min shifted uneasily, smoothing her dress with suddenly nervous hands. “Egwene, you don’t want to . . . Egwene, you must not think of harming yourself. I will get you out somehow.  “Even if I could. Let me have your knife. Come on. I won’t hurt myself. Just hand it to me.”
Min hesitated before slowly taking her knife from its sheath at her waist. She held it out warily, obviously ready to leap if Egwene tried anything.
Egwene took a deep breath and reached for the hilt. A soft quiver ran through the muscles of her arm. As her hand came within a foot of the knife, a cramp suddenly contorted her fingers. Eyes fixed, she tried to force her hand closer. The cramp seized her whole arm, knotting muscles to her shoulder. With a groan, she sank back, rubbing her arm and concentrating her thoughts on not touching the knife. Slowly, the pain began to lessen.
Min stared at her incredulously. “What . . . ? I don’t understand.”
“Damane are not allowed to touch a weapon of any kind.” She worked her arm, feeling the tightness go. “Even our meat is cut for us. I don’t want to hurt myself, but I could not if I did want to. No damane is ever left alone where she might jump from a height—that window is nailed shut—or throw herself in a river.”
“Well, that’s a good thing. I mean . . . Oh, I don’t know what I mean. If you could jump in a river, you might escape.”
Egwene went on dully, as if the other woman had not spoken. “They are training me, Min. The sul’dam and the a’dam are training me. I cannot touch anything I even think of as a weapon. A few weeks ago I considered hitting Renna over the head with that pitcher, and I could not pour wash water for three days. Once I’d thought of it that way, I not only had to stop thinking about hitting her with it, I had to convince myself I would never, under any circumstances, hit her with it before I could touch it again. She knew what had happened, told me what I had to do, and would not let me wash anywhere except with that pitcher and bowl. You are lucky it happened between your visiting days. Renna made sure I spent those days sweating from the time I woke to the time I fell asleep, exhausted. I am trying to fight them, but they are training me as surely as they’re training Pura.” She clapped a hand to her mouth, moaning through her teeth. “Her name is Ryma. I have to remember her name, not the name they’ve put on her. She is Ryma, and she’s Yellow Ajah, and she has fought them as long and as hard as she could. It is no fault of hers that she hasn’t the strength left to fight any longer. I wish I knew who the other sister is that Ryma mentioned. I wish I knew her name. Remember both of us, Min. Ryma, of the Yellow Ajah, and Egwene al’Vere. Not Egwene the damane; Egwene al’Vere of Emond’s Field. Will you do that?”
“Stop it!” Min snapped. “You stop it right this instant! If you get shipped off to Seanchan, I’ll be right there with you. But I don’t think you will. You know I’ve read you, Egwene. I don’t understand most of it—I almost never do—but I see things I am sure link you to Rand, and Perrin, and Mat, and—yes, even Galad, the Light help you for a fool. How can any of that happen if the Seanchan take you off across the ocean?”
“Maybe they’re going to conquer the whole world, Min. If they conquer the world, there’s no reason Rand and Galad and the rest could not end up in Seanchan.”
“You ninny-headed goose!”
“I am being practical,” Egwene said sharply. “I don’t intend to stop fighting, not as long as I can breathe, but I don’t see any hope that I’ll ever have the a’dam off me, either. Just as I don’t see any hope that anyone is going to stop the Seanchan. Min, if this ship captain will take you, go with him. At least then one of us will be free.”
The door swung open, and Renna stepped in.
Egwene jumped to her feet and bowed sharply, as did Min. The tiny room was crowded for bowing, but Seanchan insisted on protocol before comfort.
“Your visiting day, is it?” Renna said. “I had forgotten. Well, there is training to be done even on visiting days.”
Egwene watched sharply as the sul’dam took down the bracelet, opened it, and fastened it again around her wrist. She could not see how it was done. If she could have probed with the One Power, she would have, but Renna would have known that immediately. As the bracelet closed around Renna’s wrist a look came onto the sul’dam’s face that made Egwene’s heart sink.
“You have been channeling.”  “You know that is forbidden except when we are complete.” Egwene wet her lips. “Perhaps I have been too lenient with you. Perhaps you believe that because you are valuable now, you will be allowed license. I think I made a mistake letting you keep your old name. I had a kitten called Tuli when I was a child. From now on, your name is Tuli. You will go now, Min. Your visiting day with Tuli is ended.”
Min hesitated only long enough for one anguished look at Egwene before leaving. Nothing Min could say or do would do anything except make matters worse, but Egwene could not help looking longingly at the door as it closed behind her friend.
Renna took the chair, frowning at Egwene. “I must punish you severely for this. We will both be called to the Court of the Nine Moons—you for what you can do; I as your sul’dam and trainer—and I will not allow you to disgrace me in the eyes of the Empress. I will stop when you tell me how much you love being damane and how obedient you will be after this. And, Tuli. Make me believe every word.”


{% extends "layout.html" %} {% block header %} {% endblock %} {% block content %}
Flask is a python micro framework for building web applications. It depends on Werkzeug and Jinja, which leads us to...
Jinja, or sometimes Jinja2, is a templating engine that makes it easier to build consistent sites and applications while embedding python where we need to. This allows us to reuse code without rewriting every time.


[§481P-7] Other relief available. The relief provided in this chapter is in addition to remedies otherwise available for the same conduct under the common law or other state or federal statutes or rules. [L 1999, c 170, pt of §1]


Objectives
-
Objective 1
What:
Build and test 5 prototypes for new cross government project by May 29th, 2015
How:
Work with back-end developer, user researcher, business analyst and content designer on concept and design. Test with users once each prototype is completed, and iterate.
Progress:
- prototype 1 Create a profile completed, tested and iterated once
-
Objective 2
What:
Recruit new full-time front-end developer by June 20th, 2015
How:
Work with HR on job description, post vacancy on Linkedin and Civil Service Jobs
Progress:
- job description completed and vacancy posted online
- received 20 CVs to date (20/5/15)
- identified 3 potential candidates
-
Objective 3
What:
Present findings of cross government project at Generate London 2015 (17th & 18th Sept).
How:
Collect results from Objective 1 when completed. Start working on presentation by August 15th, 2015.
Progress:


All functions |
|
|---|---|
Create a themed actionButton |
|
Action item |
|
Action Subitem
Create a |
|
All possible effects for a simple linear model between factors |
|
Checked text input |
|
Collapsible tab box |
|
Content List |
|
ControlChart |
|
ControlChartControlLine |
|
ControlChartPhase |
|
ControlChartSample |
|
Control Chart Functions |
|
Count the lines of all scripts inside a directory |
|
Count lines of a function definition |
|
Count the lines of all functions in a loaded package |
|
DataSelector |
|
|
|
Dropdown for column actions |
|
|
Dropdown for dataset actions |
|
|
Dropdown for group actions |
data_selector_output |
|
Contour Plot |
|
Effect Plot |
|
Interaction Plot |
|
Pareto Plot |
|
Surface Plot |
|
List with common labels. |
|
ErrorController |
|
ErrorControllerList |
|
Easy way to add an empty list to a list |
|
FacDesign |
|
Factory generating a formula for multiple linear regression |
|
Generate formula for multiple linear regression |
|
Handle NULL with fallback value |
|
Find scripts containing specific code |
|
Turn the first letter of a string in upper case |
|
Handle a value that might be a function |
|
Handle assignment of a static counter for R6 classes |
|
HypothesisTestSample |
|
Create label in multiple languages |
|
Create choices for shiny inputs in multiple languages |
|
Guarantee that attribute has the same length as the object. |
|
Map value from a previous to a new range |
|
Create multiple actionItem |
|
Create multiple actionSubItem |
|
Store the session object of modules |
|
Function returning NULL |
|
Convert numeric to string |
|
Object |
|
ObjectStorage |
|
Get name and type of objects from all the scripts of a directory |
|
Get the names of all objects assigned in an R script |
|
Observed vector input |
|
Get the name of all functions in a loaded package |
|
Reactive member |
|
Get paths of R scripts |
|
Search Input |
|
Input module for level of significance |
|
Handle the rename of a name |
|
Source files recursively |
|
TabBox |
|
Get a string representing a simple linear model two-factor explanation of a response variable. |
|
Convert string to numeric |


Confined to our homes with social and physical distancing
being the new norm, it is to no
surprise that feelings of loneliness and isolation are felt more strongly than ever. Working with
my partner Ivan Lee, our project aims to showcase the duality of living alone and living at home
during the 2020 pandemic by comparing and contrasting the more social aspects of living with
family, to the more isolating feeling of being confined alone.
My main contributions to the pre-production process included creating a visual effect and
storyboarding. Having done a viusal effects activity in week 6 of the course, I was able to learn the
new skill of creating split screens through the software program Premiere Pro. Knowing that my partner
and I intended to include this effect in our film, gaining the ability to create the split screen effect
was useful in helping us envision our concept more clearly.
In addition to creating visual effects, I also drew out storyboards of envisioned shots.
By clarifying specific details, such as field of view, camera angles, and camera movements
of each shot, I created a guide that helped my partner and I understand the direction of our film.
Besides technical skills, I also participated in weekly meetings to
discuss and refine the vision of the story with my partner.
VISUAL EFFECTS
The visual effects I explored during this project were the split screen effect and the walk-by transition.
Since split screens can be used to depict multiple shots simultaneously, this effect fit perfectly
with the projects goal of emphasizing the juxtaposition of living at home and living alone.
Additionally, the walk-by transition created a fun and unique element that enhanced the
playful tone of our video. Watch the video below to see the effects!
A) SPLIT SCREEN
To achieve the split screen effect on Premiere Pro, I applied a crop function to the
selected footages. Once applied, keyframes were used to mark the
positions, the left crop, and the right crop, of the footages at both the initial and the end of
where the split screen were applied. By adjusting the keynotes and crops of the footage, I was able
to create a simple split screen effect.
With split screens allowing side by side shots to be displayed simultaneously, the film is able to
visually compare and contrast the similarities and differences of family life and solo life. This, in
turn, could enhance viewer’s understandings of the project, as the intentions of depicting
duality in our film becomes clearer when shots are physically shown side by side to compare.
While split screens are effective in portraying duality, they can also be used to tell the story
more efficiently in a given time frame. Showing multiple footages at once allocated more
time for the interviews, which were equally important in conveying the message of
our story.
B) WALK-BY TRANSITION
The walk-by transition was created using inverted masks and a pen tool. Starting
from where my partner began to walk across the screen, and continuing on
frame by frame, I used a pen tool outlining his figure to create an inverted mask shape.
As my partner walked off screen, the mask allowed video footage underneath to be revealed
gradually; this created a smooth transition from one shot to the next.
Adding the walk-by transition created a fun and unique element to our playful vlog.
AUDIO ADJUSTMENTS
During the editing process I was also in charge of adjusting sound volume and matching
audio clips to interview video footages. This included adjusting the volumes of the interview by
unlinking, cutting, and adjusting audio through the audio tab, as well as
matching audio by unlinking and re-positioning audio files in realtion
to video files. Audio adjustment was an
important step in ensuring our video was cohesive, producing a quality
video with quality sound.
REFLECTION
Though implementation of the project required much collaboration
and communication amongst my team member and I, especially given
the circumstances of the 2020 pandemic, in the end, the process of
creating a film at home provided a new
experience that allowed for fun creative thinking.
Bound to the comforts of our own home, this project offered the unique
challenge of innovating
new ways to use regular-everyday objects as creative solutions for filmmaking means.
From this experience I learned to overcome new challenges, developing and strenghtening my own abilities
to adapt and adjust to unprecedented circumstances.


---
layout: post
authors: ["Greg Wilson"]
title: "How to Improve Instructor Training"
date: 2014-05-02
time: "13:00:00"
tags: ["Instructor Training"]
---
We ran a three-day intensive version of
our instructor training course
in Toronto earlier this week.
The 40 attendees seemed to find it useful,
and I'm very grateful to UBC's Warren Code for co-teaching,
and to the University of Toronto's Jennifer Campbell for her presentation on MOOCs and flipped classrooms,
but there are a few things we'll do differently next time around.
They're listed below in no particular order;
comments from attendees
(and everyone else, particularly people who've been through the online instructor training)
would be very welcome.
-
Have everybody meet online in small groups for an hour a week before the live class.
Much of the first day was taken up with presentations about the psychology of learning.
These could be done as webinars,
and doing that would free up time for things that only work well live.
-
Tighten up the reading list.
Attendees were asked to read
How Learning Works,
but not pointed at specific sections.
We also should provide
more
targeted
readings
in advance,
and do a better job of connecting the readings with what we're teaching.
-
Devote half a day to mechanics.
We talked a couple of times about how to set up and run a bootcamp,
but it was pretty disjointed.
We should walk attendees through
our operations guide,
our checklists,
the assessment questionnaires we use,
and our instructions on
setting up a bootcamp repository
and
adding new lesson material.
-
Run a short Git tutorial for people who need it.
Setting up a bootcamp website and adding new lesson material requires some familiarity with Git.
Teaching this in class to people who don't already know it
would also be a good chance to demonstrate how we actually manage a classroom,
which is something else attendees asked for.
-
Make the process and outcomes clearer.
We should explain to attendees at the outset
that they will still have to teach once after this class is over,
and submit a pull request on our lesson material,
in order to get their instructor's badge.
Those are the things I took away from these three days.
What have I missed?
What else could we add or subtract to make this training more useful and more fun?
See also this post
by Jennie Rose Halperin,
one of the attendees,
about what she got out of the training.
Positive/Thing Learned
- I love all the examples, factoids, audience participation you've built into the lessons
- Lateral knowledge transfer → usually the best epiphanies! I'll pay even more attention to this in the future. Also, you are not your learners.
- How to sell the training.
- Get people to sign up in groups.
- The very end of the day conversation about various audience defined issues.
- Discussion of live coding - would like more similar specific examples
- Explanation of how live coding helps (slow down, etc)
- Discussions of motivating people to attend. Am planning on re-writing RFPs based on it
- Tips for peer teaching, how to group/motivate
- Today it was easier to link info presented to real workshop activities
- Knowing how to present material in less than 10 minutes
- I liked the hands on teaching and the examples from others. It takes the theory and applies it, which usually doesn't happen until after a class (if it happens at all)
- Instead of a thank you slide, leave up a summary slide. Learning about these kinds of tips and tricks are super helpful.
- Being able to give PhDs ideas how to teach makes my 8+ years in trenches validated
- Learning more about dealing with/living with imposter syndrome.
- Example teaching sessions
- Practice talks
- The teaching practice is great. The last session of interaction is very useful.
- Videoing and group work +1. Also teaching and question discussion was fun
- Critiquing self and streaming 10-min teaching segments very useful; something to self-reflect on.
- I learned +/- techniques for virtual lessons, which I have never done but will need to at some point
- The teaching demos in general. It was humbling to realize a couple errors I made and was hard to absorb without being defensive.
- Recorded teaching, went really well
- Video sessions daunting, but feedback great! :)
- the lesson helped with my confidence
- practice lesson good for confidence and to feel that I am learning something new
- Really enjoyed the live presentations today! I learned a lot watching others and critiquing myself
- The live remote sessions were better than I thought coule be possible even with the technical difficulties. Good to see.
- I learned that I could gain more insight into my own ability to teach a lesson by/after going through group critiquing.
- 3x10min lecture sessions + feedback. Google hangout experiment also VERY INFORMATIVE
- Have a few (limited) distinct goals in a lesson because there isn't time → no use rushing and cramming
- I learned that I am not good writing assessments and need to work on it.  Now I know what to work on.
- Discussion of live screencasting pros and cons
- Really enjoyed Jennifer's presentation. Very helpful and interesting.
- Pros and cons of inverted classroom.
- Getting to practice a 10 min lesson, despite being nervous +1
- I thought Jennifer's presentation was great - getting to hear from someone who's taught a MOOC is really worthwhile
- really liked inverted classroom talk
- loved the guest speaker and her talking about the entire range of students and not just how to engage people who wanted to learn (yay unmotivated students)
Negative/To Improve
- The lecture on MOOCs wasn't conclusive. I still think a human connection is valuable.
- MOOC instructor didn't hang around for questions after
- Not sure how the MOOCs/inverted classroom talk is relevant for me. It was interesting but I find it difficult to relate to it.
- inverted classroom took a lot of time for little value
- Need to handle discussion on MOOC and Flipped Classroom better. People confuse the two and develop false concepts.
- Not convinced how I would use screencasts in my position
- I'm learning things about myself that I don't like.
- I learned the hard way what I need to improve on (by failing in teaching) but it was so painful to fail publically that I was honestly tempted to not come back after the lunch break.
- The live teaching exercise was too time-crunched; I would have appreciated more time for the feedback/review section in each case.
- Could have more afternoon snacks (not terrible but I had to write something)
- Feedback about the content is useless (of course the content can be improved and 10 minutes is not realistic anyway!
- Important feedback is about style of presentation, quality of "acting", etc.
- Need a better way to tape teaching demos. We struggled with PPT because we initially tried to stand up. But 3 is a great group size so I don't know how to change.
- Lessons from other instructors (online) were mildly interesting but probably not so useful - redundant.
- Teaching (on camera) without a projector. Found it annoying to live code and cover the screen with my entire body at the same time.
- Need some more time to prepare 10 min lecture/teaching time. Maybe have a basic scaffold structure required for Round 1 of live teaching.
- I think that for the teaching demos, the instructors should explicitly identify their target audiences. Some of the feedback I received and some of the feedback given to the remote presenters seemed to be from people assuming a different audience (i.e. not absolute novices)
- Today felt disconnected from yesterday. Yesterday was all about catering to the student and being aware of their needs, history, etc. Today is about screencasts where we can't interact. Where is the connection? Aren't we sabotaging what we just learned yesterday?
- The hangout teaching was useful, but didn't really engage people, which might have been partly a time-of-day thing; morning next time?
- Online lectures took _way_ too long
- The online virtual teaching was a bit much. Some of the instructors had too much information on top of the fact that there was 3 of them
- seemed more formal. I enjoy interactive "movement" activities
- Very long sessions of at-the-front talking and comments from a limited number of students
- "Open forum" with voted subjects for discussion
- Some lectures are too long or too much talking
- Have a therapy dog available? Is there a way to divide based on introvert/extrovert → might increase introvert participation? Just an idea.
- Less scheduled peer discussion today. Some during coffee but peer discussion tends to bring up topics not encountered in group discussions
- Something more interactive/small groups might have been good this afternoon. Got a bit tired of listening to lecture by the end.
- Quite a busy day, so maybe not enough time to discuss some topics fully (more?)
- 90 minutes sat first thing in the morning
- would like to see a walkthrough of a typical SWC class
- network/tech glitches
- etherpad becoming more and more huge (linear monster)
- collaboration tools (etherpad) could be more robust
- I found the remote teaching a bit hard to follow and think it could have been connected to how/why webcast versus screencast
- Felt the discussion about how to do screencasts/remote lectures got muddled. Content vs. medium vs. performance
- Greg interrupting the guest speaker - more so than Warren. I get that it's a nervous tick but it seemed disproportionate based on gender overall.
- Greg, please reduce the "hands up who..." technique especially as in "Hands up who breathes?" (everyone reluctantly puts a hand up). Feels like hammering an obvious point home unnecessarily.


Runtime type safety for JSON/untyped data.
TypeScript gives you compile-time type safety for your JavaScript code. External data which you get through, for example, XHR calls is only checkable at runtime. spicery
allows you to handle runtime checks in one place using an easy to use API.
// You know TypeScript Interfaces:
interface Todo { userId: number; id: number; title: string; completed: boolean; }
// This is new: Define a Todo Parser with spicery:
const todos: ParserFn<Todo> = x => ({
userId: fromMap(x, 'userId', aNumber),
id: fromMap(x, 'id', aNumber),
title: fromMap(x, 'title', aString),
completed: fromMap(x, 'completed', aBoolean)
});
// Define another Parser for an Array containing Todos using spicery array parser:
const jsonplaceholderTodos = anArrayContaining(todos);
// Fetch Todos and parse them:
window.fetch('https://jsonplaceholder.typicode.com/todos')
.then(r => parse(jsonPlaceholderTodos)(r.body))
.then(t => console.log(t))
For further examples refer to the examples/
directory. To execute them locally, clone this repository and run following commands on your command line of choice:
yarn
yarn run example:simple
yarn run example:complex
Though the first yarn
command is only used to install any module dependencies once 🤓
The master
branch contains the latest stable release.
Development efforts are integrated with the develop
branch first. Changes get then merged into master
as soon as a new release should be published.
When opening a new Pull Request make sure you point them to develop
. Make use of proper commit messages: spicery
loves Commitizen, so take a look there and use git cz
for the most simple workflow :-)
Thank you for your contribution!
Generated using TypeDoc


Has your email been hacked? Check Now!
Your({{b}}) email has been exposed by:
You joined {{y.Title}} on {{y.AddedDate}}
On: {{y.BreachDate}} they were breached.
Official word:
You have not experienced a data breach.
According to the search, your email({{b}}) was: {{error.statusText}}


This sample demonstrates how to send a Firebase Cloud Messaging (FCM) notification from a Realtime Database triggered Function. The sample also features a Web UI to experience the FCM notification.
See file functions/index.js for the code.
Sending the notification is done using the Firebase Admin SDK. The Web client writes the individual device tokens to the realtime database which the Function uses to send the notification.
The dependencies are listed in functions/package.json.
Users sign into the app and are requested to enable notifications on their
browsers. If they successfully enable notifications the device token is
saved into the datastore under
/users/$uid/notificationTokens
.:
/functions-project-12345
/users
/Uid-12345
displayName: "Bob Dole"
/notificationTokens
1234567890: true
photoURL: "https://lh3.googleusercontent.com/..."
If a user starts following another user we’ll write to
/followers/$followedUid/$followerUid
:
/functions-project-12345
/followers
/followedUid-12345
followerUid-67890: true
/users
/Uid-12345
displayName: "Bob Dole"
/notificationTokens
1234567890: true
photoURL: "https://lh3.googleusercontent.com/..."
The function triggers every time the value of a follow flag changes at
/followers/$followedUid/$followerUid
.
This sample comes with a web-based UI for testing the function. To test it out:
fcm-notification
directory.
npm install -g firebase-tools
and then configure it
with firebase login
.
firebase use --add
and
select your project in the list.
cd functions; npm install; cd -
firebase deploy
firebase open hosting:site
, this will
open a browser.