In case you haven;t sen the notice, the new patch is out. Hopefully for those PRC users here, Lockindal or Stratovarious can let us know when that is up and running with the newest version. _________________ Come visit the Epic Builders Guild for all the character info you could ever want or need: Click Here
Yep, this is a good thing.
Turns out it was good timing for me -- on the very same day the patch was released, my local store FINALLY had NWN Platinum in stock.
Woo hoo!
Joe C.
Um.. Didn't you see the announcement above this topic?
Anuis _________________ - Epic Character Builders Guild
- Life is but a dream...
- I know more than I am letting on...
-I think, Therefore I am.
Sorry I missed the sticky up there. Delete this thread if you want. _________________ Come visit the Epic Builders Guild for all the character info you could ever want or need: Click Here
Nah, doesn't matter. Not many people would respond to the announcments anyway. Nor even respond in some threads.... many people, but almost all of them are lacking in being involved with the guild.
Such as for the servers, so far, no one has spoken up and said that they would host it. ~Sigh~
I might as well go ahead and discuss to one of those people from Conferation of some sort Server. I have several ideas that they could use and I wanted to ask them if it would be possible to have epic character server connected to theirs so we can have tournaments every month to see whoever is the best of all. Or something like that.
Anuis _________________ - Epic Character Builders Guild
- Life is but a dream...
- I know more than I am letting on...
-I think, Therefore I am.
That would be cool. _________________ Come visit the Epic Builders Guild for all the character info you could ever want or need: Click Here


?*ota*"cAL
NO.
ft
^SL«jCa
(3
-
NEW
YORK
BOTANICAL
GARDEN
DET.
BY
MILDRED
E.
MATHIAS
01501274
THE
NEW
YORK
BOTANICAL
GARDEN
EXPLORATION
OF
JAMAICA
Black
River
to
Lacovia
d
N.
L.
Britton,
collector
September
23,1907
01501274
Legend -
Level of confidence that token is an accurately-transcribed word
extremely low
very low
low
undetermined
medium
high
very high


{% extends "layout.html" %} {% block page_title %} Learning tasks {% endblock %} {% block content %} {% include "../includes/phase_banner_beta.html" %} Back Can you learn how to do more complicated everyday tasks? Can you learn how to do more complicated everyday tasks? More complicated everyday tasks are things like: making a cup of tea using a new household appliance like a washing machine or microwave oven setting a TV programme or series to record cooking a meal Yes No Sometimes Why do you find it hard to do more complicated tasks? 1500 characters left {% include "../includes/help.html" %} {% endblock %}
More complicated everyday tasks are things like:


I believe the Sabbath; I keep the Sabbath. - John Harvey Kellogg
Don't I??
I keep Shabbat. No, I do not attend shul every Friday night and Saturday (although my Saturday attendance record is decent if counting all the times I've arrived at noon, just in time for the kiddushim. My father made sure to walk by to my house from services to pull me and my four sisters out of bed whenever Yaffa is catering, a big-donor is sponsoring, or there is really good chullent.
No, I do not usually light the Friday night candles. I sometimes talk during shalom aleichem. I've gone thru quite a few Shabbatot when I have not paused for a single moment to think about G-d.
So, you might be thinking: 'FAKE!'
Or, maybe: 'It doesn't sound like you keep Shab for G-d, so why do you burden yourself with it?'
My answers: 1) F all the h8ers. 2) I do it for myself. Carry on, eager readers!
Sometimes keeping Shabbat is really, really easy.
Sometimes I'm in Israel- then it's simple. And when I keep it with my family, I virtually am being spoon-fed my obligation.

Like when I'm stuck on Long Street in Africa, or when I've just completed a half-marathon and am stuck 13 miles away from my destination and it's pouring down rain.
I really want to love Shabbat. If refusing to allow myself to turn the light off before bed will cause me to begrudge Shabbat, shouldn't I just hit the damn switch? What's the big deal? Isn't it more important that I maintain a favorable opinion of the Sabbath?
I've learned that there's no compromising. If you want to do Shabbat, commit to it. Fully fledge.
If I go to a Shabbat dinner with the plan of attending a frat party or Club 31 after, even if my plan is to walk there so that I will not "break" Shabbat, my head is going to be in the wrong place the whole time I am trying to "do" Shabbat and I will not be able to enjoy it. I will detest every d'var torah that I otherwise would've considered beautiful, simply because I will be in a rush. I will hate any schmoozing that takes place amongst all the guests who are doing Shabbat correctly. Celebrating Shabbat all-or-nothing commitment.


Connecting to Gmail
To trigger execution of an integration when a particular Gmail account receives an email, add a Gmail connection to a simple integration as its start connection. In an integration, to send an email from a particular Gmail account, do either of the following:
-
Add a Gmail connection to the middle of a flow.
-
Add a Gmail connection to finish a simple integration.
The general steps for connecting to Gmail in an integration are:
-
Creating a Gmail connection. When you do this you choose the Gmail account that the connection is authorized to access.
-
If your integration sends an email from a Gmail account, decide how to populate an email to send.
-
Adding a Gmail connection to an integration flow.
-
For a Gmail connection that sends an email, optionally mapping integration data to the email fields.
Information and instructions are in the following topics:
Creating a Gmail connection
When you create a Gmail connection, you authorize the connection to access one particular Gmail account. After you create a Gmail connection, you can add it to multiple integrations.
-
You registered {prodname} as a Google client application and enabled the Gmail API.
-
The {prodname} Settings page entry for Gmail has values for the client ID and client secret, which you obtained by registering {prodname} as a Google client application.
-
In {prodname}, in the left panel, click Connections to display any available connections.
-
Click Create Connection to display the available connectors. A connector is a template that you use to create one or more connections.
-
Click the Gmail connector.
-
In the Configure Connection page, click Connect Gmail, which takes you to a Sign in with Gmail page.
If Connect Gmail does not display, your {prodname} environment is not registered as a Google client application. See Registering {prodname} as a Google client application. When you try to create a Gmail connection and your {prodname} environment is not registered as a Google client application, then {prodname} displays multiple fields that prompt for authorization information. While you can create a Gmail connection by entering values in these fields, it is not recommended.
-
In the page that is prompting you to sign in to Gmail, enter the email address of the Google account that you want this connection to access from {prodname} and click Next.
-
In response to openshiftapps.com wants to access your Google Account, click Allow to return to {prodname}.
-
In the {prodname} Name field, enter your choice of a name that helps you distinguish this connection from any other connections. For example, enter
Gmail Connect 1
. -
In the Description field, optionally enter any information that is helpful to know about this connection. For example, enter
Sample Gmail connection that uses jkim Gmail account credentials.
-
Click Save to see that the connection you created is now available. If you entered the example name, you would see that Gmail Connect 1 appears as a connection that you can choose to add to an integration.
Alternatives for populating email to send
A Gmail connection that finishes a simple integration or that is in the middle of a flow sends an email from the Gmail account that the connection is authorized to access. There are several ways to populate the content of the email that the connection sends. Before you add a Gmail connection that sends an email, consider how you want to populate that email.
The alternatives for populating an email to send are as follows:
-
Add a data mapper step just before the Gmail connection that sends an email. In this data mapper step, map data fields that are output from previous steps to Gmail connection Send Email action fields. The Send Email action fields are:
-
Email to
-
Email subject
-
Email text
-
Email cc
-
Email bcc
If you add a data mapper step then you can map one, some, or all Send Email action fields.
-
-
When you add a Gmail connection to a flow, configure the action by specifying values in the Send Email action fields. You can specify values in one, some, or all fields.
-
Use both a data mapper step and Send Email action configuration to populate the fields. In other words, you can configure the Send Email action by specifying one or more fields and also add a data mapper step that populates other fields.
A value that you specify directly in a Send Email action field has precedence over a value that is mapped to the Send Email action field. In other words, suppose you populate a Send Email field by specifying a value when you add the connection and configure the action and also by mapping a value to the same field. The value that you specify in the action configuration always overrides the value that was mapped. For example, suppose you specify
<EMAIL_ADDRESS>in the Email to action field and you also map an email field from a previous step to the Gmail Email to field. The integration always<EMAIL_ADDRESS>as the email address.
When you add a Gmail connection that sends an email, all action configuration parameters are optional. This is because you might choose to populate an email entirely by mapping integration data to the Send Email action fields. However, the presence of an email address in the Email to field, either by action configuration specification or by mapping, is required. Without an email address to send the message to, {prodname} generates a runtime error and the integration stops executing.
Triggering an integration when polling returns a Gmail message
To trigger execution of an integration based on email received by a particular Gmail account, add a Gmail connection as the start connection of a simple integration. When the integration is running, the Gmail connection checks this account for emails at intervals that you control. When the connection finds an unread email, it passes the email to the next step in the integration and, by default, marks the email as read.
-
You created a Gmail connection that is authorized to access the Gmail account that you want to obtain emails from.
-
In the {prodname} panel on the left, click Integrations.
-
Click Create Integration.
-
On the Choose a connection page, click the Gmail connection that you want to use to start the integration.
-
On the Choose an action page, select the Receive Email action.
-
To configure the Receive Email action:
-
In the Delay field, accept the default of 30 seconds or specify how often you want the integration to check for new email.
-
Leave the Labels field blank to obtain any unread email. To obtain only certain emails, specify a comma-separated list of labels that are used in the Gmail account that the connection is accessing. By default, the integration obtains the unread emails that have those labels.
-
Select Mark as read to ensure that the connection does not return the same email twice. If Mark as read is not selected, the connection returns emails that are in the account’s in box, whether or not they were previously read. Or, if you specify one or more labels, then the integration return emails that have those labels whether or not they were already read.
-
In the Max Results field, accept the default of 5 or indicate the maximum number of emails that the connection can return for each poll. If the connection finds more than this number of unread emails, then it returns the most recent Max Results emails.
When a Gmail connection returns more than one email, the integration processes the emails as a batch. In other words, {prodname} executes the integration once for the batch.
-
Click Next to add this Gmail connection as the start connection in the integration. The connection appears as the first step in the integration flow.
-
Sending an email from a Gmail account
In an integration, you can send an email from a Gmail account either in the middle of a flow or to finish a simple integration. To do this, add a Gmail connection to the middle of a flow or as a simple integration’s finish connection.
-
You created a Gmail connection.
-
You are familiar with the alternatives for populating an email to send and you have a plan for populating such emails.
-
{prodname} is prompting you to add to the integration or to choose the finish connection for a simple integration.
-
On the Add to Integration page, click the plus sign where you want to add the connection. Skip this step if {prodname} is prompting you to choose the finish connection.
-
Click the Gmail connection that you want to use to send an email.
-
On the Choose an action page, select Send Email.
-
On the Configure Send Email page, do one of the following:
-
Leave all fields blank if you plan to add a data mapper step just before this connection and you plan to map integration data to the Send Email fields.
-
Enter information in one or more of the following Send Email fields. Separate multiple email addresses with a comma.
-
Email To
-
Email Subject
-
Email Text
-
Email cc
-
Email bcc
-
-
Leave some fields blank and enter information in some fields.
If you plan to add a data mapper step just before this Gmail connection, and you want to map integration data to some email fields, leave those fields blank in the action configuration. Enter values in other action fields as needed.
A value that you specify in a Send Email action configuration field has precedence over a value that is mapped from a previous step.
-
-
Click Next to add the connection to the flow.
The connection appears in the integration flow where you added it.
If you plan to add a data mapper step before this connection, first add any other connections that you plan to add to this flow. Then add the data mapper step.


View the Build periodically checkbox in the Build Triggers section. It's set to run this job daily. Other pre-set schedules include yearly (midnight on January 1st every year); annually (same as yearly); monthly (Midnight, 1st day of the month); weekly (Midnight, Sunday); daily (Every day, midnight); midnight (Everyday, midnight); hourly (Every hour of every day). You can use cron as well.


I recently built up a long list of commits working on a refactor, and just realized that I rewrote a codepath that had some bugs in it. As any good refactorer (refactoror?) does, I tried to get adequate testing in place before refactoring. Unfortunately, this buggy codepath was never tested in the first place, a fact I overlooked until today.
So, I set out to test the code in the past, before I wrote the new code. How could this be? While building an actual time machine would make quite the pleasing pun of “all-time yak shave”, luckily for me git already has a facility to do what I want: git-rebase.
First things first, I gotta go back and write a new test. I left my current feature branch (let’s call it “topic”) and went back to my main branch (“master”). Then I created a new branch “tests”, and made some commits writing a test to get that rogue codepath covered. I placed as many constraints as possible on it, capturing the buggy output in test assertions. This way, when I fix the bugs, the tests should break, and I’ll update them to pass again later.
OK, great, now we have two diverging branches. This is the first thing git-rebase can help with. I can have it remove my original feature branch from its base in “master” and re-base it onto the head of “tests”, so it will look like I wrote that test before doing any feature work. Here’s that incantation: git rebase --onto tests master topic
. The git docs have some diagrams (see the link below) as well as this blog post from Pivotal Labs.
Now all the commits are in a single history again, whew. But, I had a ton of commits on my original branch, “topic”, and some of them modified that buggy codepath, and I can’t remember which commits are now breaking that test. (Generally, I like each commit in my history to both be able to build and pass tests–otherwise there should be squashing going on (another use for git-rebase!).) Luckily, git-rebase can help me find the commit. I can have it run my test suite for each commit in my history since branching from master: git rebase --exec "run-tests.sh"
. Because run-tests.sh exits with a non-zero status if a test fails, the rebase will plop me right into edit mode on the commit that broke the bad tests, so I can make the world right again.
Check out the git-rebase documentation to find out more about –onto and –exec.
🙏🏻 Enjoy the post? Please help support more like it by buying me a cup of coffee!.
💡 Suggestions, questions, comments? Please submit a PR!.


<link>
The HTML <link> element specifies relationships between the current document and an external resource. Possible uses for this element include defining a relational framework for navigation. This element is most used to link to style sheets.
address
article
aside
footer
header
h1, h2, ..., h6
hgroup
nav
section
The HTML <link> element specifies relationships between the current document and an external resource. Possible uses for this element include defining a relational framework for navigation. This element is most used to link to style sheets.
The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.
The HTML <style> element contains style information for a document, or part of a document.
The HTML Title element (<title>) defines the title of the document, shown in a browser's title bar or on the page's tab.
The HTML <body> Element represents the content of an HTML document. There can be only one <body> element in a document.


All styles on one page. This pad is moderated I need it in a reliable state.
Here is a sample paragraph with bold, italic, underline, strike and some links to other pad like hackpad-cli workspace, or to external page, and link to users like oz mose
Heare we are
Header2
Just bold with no header selected
List styles normal
List sytle numbered
List style mixed
Indentation
Comments
Tasks
code
ruby code
Insertion of
image
or table
| Head 1 | Head 2 | Head 3 |
| row 1 |


by only modifying the css file, made two as different web layouts as possible
for more information, visit here
modified the html/css files of a website to make it responsive to screen size
created a simple web game using basic javascript
the classic brick-breaking game with a few differences.... please try by clicking on the pic below!2!11!!
created a web image gallery with filtering and slideshow abilities
created a trello like web app
used node + vue to make a quiz app
click here to take the quizzes!
exploring react through a dictionary app!
click here to create a list of your favorite words!!
created yelp for duke dining


{% extends "layout.html" %} {% load staticfiles %} {% block title %}Yoga Class Descriptions | Do Love : Do Yoga{% endblock %} {% block description %}Detailed class descriptions for yoga classes taught by Teresa Jugovich{% endblock %} {% block slider %} {% endblock %} {% block yoga_class_active%}class="active"{% endblock %} {% block breadcrumbs %}
{% endblock %} {% block content %}This class is for new yogis, experienced yoginis, their parents, professional athletes and/or people that can’t touch their toes. If it’s your first yoga class, fear not, you’ll be fine. If you’ve been practicing for 2 decades, I promise you won’t be bored. Modifications will be given to compliment any practice level. We will stay rooted and focus on alignment while breathing and opening our hearts together as a community.
In each class you can expect to: sweat, laugh and leave feeling a step closer to nirvana.
Want to get on your mat, but don’t have a sitter?
This Community Vinyasa class is open to EVERYONE including caregivers and their children. We will move through a simple vinyasa flow, focus on breath, incorporate our children and enjoy the sounds of them playing around us. Bring a few toys (that won’t pose a choking hazard for the wee littles) and an open mind. Yogis 12 and under study for free.
Partner Yoga is one of the deepest ways we can connect with one another. Through syncing our breathing and moving in union, we can allow our hearts to come together, find joy and transcend our minds. In this partner yoga workshop will combine partner meditation, asana, massage, laughter & chocolate. All partners (friends/lovers/spouses) welcome. Breathe into your heart, connect with your spirit and find your flow practicing together!
Preregistration is required!
$35 per couple or 3 punches on a 10 class pass
Enroll 1 of 2 ways:
Send Fee + Your Name(s) + Workshop date online @ cash.me/$DoLove
OR email Do Love yogi<EMAIL_ADDRESS>to enroll with a 10 class pass.
Move deep in your body, clear your mind, open a channel to the source and take an adventure into your soul. In this extended Vinyasa session we will start with guided meditation, move through an intentional asana practice, explore pranayama and enter space for deep meditation. Class runs 120 minutes with an invitation to stay in silent meditation an additional 30 minutes.
Preregistration is required!
$25 or 2 punches on a 10 class pass
Enroll 1 of 2 ways:
Send Fee + Your Name(s) + Workshop date online @ cash.me/$DoLove
OR email Do Love yogi<EMAIL_ADDRESS>to enroll with a 10 class pass.


:: com :: sun :: star :: registry ::
|
| enum RegistryValueType |
- Description
- represents all possible types of a key value.
An ASCII value and a string value will both be handled with type
string. But interns will be handled differently. Normally the idl
string represents a unicode string.
|
| Values |
| NOT_DEFINED |
the type of the key is not defined.
|
| LONG |
the type of the key is long.
|
| ASCII |
the type of the key is ASCII.
|
| STRING |
the type of the key is a string.
|
| BINARY |
the type of the key is binary.
|
| LONGLIST |
the type of the key is LONGLIST.
|
| ASCIILIST |
the type of the key is a ASCIILIST.
|
| STRINGLIST |
the type of the key is a STRINGLIST.
|
| Values' Details |
NOT_DEFINED
NOT_DEFINED,
- Description
- the type of the key is not defined.
|
|
LONG
LONG,
- Description
- the type of the key is long.
|
|
ASCII
ASCII,
- Description
- the type of the key is ASCII.
|
|
STRING
STRING,
- Description
- the type of the key is a string.
|
|
BINARY
BINARY,
- Description
- the type of the key is binary.
|
|
LONGLIST
LONGLIST,
- Description
- the type of the key is LONGLIST.
|
|
ASCIILIST
ASCIILIST,
- Description
- the type of the key is a ASCIILIST.
|
|
STRINGLIST
STRINGLIST,
- Description
- the type of the key is a STRINGLIST.
|
|
Top of Page
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


The Verification Plugin allows users control over all aspects of the verification system:
The Verification Plugin is based around two tabs, the Configuration tab and the Verification Results tab.
The top half of the configuration tab contains a list of checks. Each line contains the check name, a series of checkboxes indicating the events at which this check will be run, and an optional configuration button. To specify when a check should be run, check the boxes for each event for which the check should be performed.
In the middle of the panel is a series of checkboxes labeled "Show warnings". Warnings (non-fatal error messages generated by an ontology check) are only displayed during events that are checked in this panel.
Beneath this panel is a checkbox labeled "Check obsoletes?". If this box is selected, checks are run on obsolete terms. If it is not selected, obsolete terms are ignored.
Under this is a pair of buttons labeled "Add check" and "Remove check". If "Add check" is clicked, the User Check Editor is diplayed (see below). If "Remove check" is clicked, the currently selected check will be deleted. Only user defined checks can be deleted; built in checks cannot be removed, but they can be disabled by selecting no events for that check.
At the bottom is the "Run Manual Check" button. Clicking this button triggers the manual event, and all checks that are marked "On manual?" will be run.
The following checks are built-in to OBO-Edit:
Each user-defined check is associated with a term filter. If the filter matches any term in the ontology, the check fails and an error is reported to the verification system.
To create a user-defined filter, click the "Add check" button. When the "Add Check" button is clicked, the User Check Editor appears:
The "Check name" field contains the name of the user-defined check.
Below the "Check name" field is a filter editor. This editor contains the filter that will be used to determine whether a term passes or fails this check.
Beneath this is the "Message suffix" text field. This field contains the ending of the error message that will be generated for terms that fail this check. The error message has the form "Term <term name> <message suffix>".
The final control is the "Is fatal" checkbox. If this box is selected, errors generated by this check are treated as fatal errors. An ontology that generates fatal errors when checked cannot be saved until the errors are corrected. If this box is not selected, error messages are treated as non-fatal warnings.
Once the check is configured, save the new configuration by clicking "Ok".
Whenever a verification is run for any reason, the results appear in the Verification Results tab:
Note that often the verification results will also appear in a popup window, but the results of the last verification can always be reviewed in this tab of the verification plugin. Verification results appear in a popup window when the verification is triggered by a special event, such as a text edit, save, load, or reasoner-startup.
The results tab will contain a list of errors and warnings. Errors are severe problems with the ontology that must be corrected to make the ontology compliant with the OBO ontology format. Warnings are less serious problems that should be corrected, but the ontology can be saved even if these errors are not dealt with.
Warnings are preceded by a icon. Errors are preceded by a icon. Errors are generally listed first.
Warnings and error messages are grouped together by term, so that all warnings generated for a particular term appear together. If a term is mentioned in an error message or warning, the term name is a clickable hyperlink. Clicking the hyperlink causes that term to be selected. Note that these hyperlinks will not work if the verification results are displayed in an automatic popup window, but the window can be closed and the results plugin opened. The verification results will be visible in the results tab, and the hyperlinks will be clickable there.
Sometimes, a warning or error will be followed by a icon. When this icon appears, it means one or more "quick fixes" are available for the problem. When the icon is clicked, a popup menu will appear detailing the various quick fix options. To apply one of the quick fixes, select it from the menu. Normally, the fix will be applied and the verification will be at least partly re-run to reflect the changes made by the quick fix. Beware: quick fixes may modify your ontology.


Notebook Export
Letters to a Young Scientist
Wilson, Edward O.
I. THE PATH TO FOLLOW
Highlight(yellow) - 1. First Passion, Then Training > Page 25 · Location 155
put passion ahead of training. Feel out in any way you can what you most want to do in science, or technology, or some other science-related profession. Obey that passion as long as it lasts. Feed it with the knowledge the mind needs to grow. Sample other subjects, acquire a general education in science, and be smart enough to switch to a greater love if one appears. But don’t just drift through courses in science hoping that love will come to you. Maybe it will, but don’t take the chance. As in other big choices in your life, there is too much at stake. Decision and hard work based on enduring passion will never fail you.
Highlight(yellow) - 3. The Path to Follow > Page 47 · Location 354
This brings me to the ways in which scientific problems are found and discoveries made. Scientists, mathematicians among them, follow one of two pathways. First, early in the research a problem is identified, and then a solution is sought. The problem may be relatively small (for example, what is the average life span of a Nile crocodile?) or large (what is the role of dark matter in the universe?). As an answer emerges, other phenomena are typically discovered, and other questions raised. The second strategy is to study a subject broadly, while searching for any previously unknown or even unimagined phenomena.
Highlight(yellow) - 3. The Path to Follow > Page 48 · Location 363
Obviously, both strategies can be followed, together or in sequence, but by and large scientists who use the first strategy are instinctive problem solvers. They are prone by taste and talent to select a particular kind of organism, or chemical compound, or elementary particle, or physical process, to answer questions about its properties and roles in nature. Such is the predominant research activity in the physical sciences and molecular biology.
Highlight(yellow) - 3. The Path to Follow > Page 52 · Location 401
The potential paths you can follow with a scientific career are vast in number. Your choice may take you into one of the scenarios I’ve described, or not. The subject for you, as in any true love, is one in which you are interested and that stirs passion and promises pleasure from a lifetime of devotion.
II. THE CREATIVE PROCESS
Highlight(yellow) - 6. What It Takes > Page 78 · Location 618
isn’t the cutting edge a place only for geniuses? No, fortunately. Work accomplished on the frontier defines genius, not just getting there. In fact, both accomplishments along the frontier and the final eureka moment are achieved more by entrepreneurship and hard work than by native intelligence.
Highlight(yellow) - 6. What It Takes > Page 79 · Location 630
Being bright, then, is just not enough for those who dream of success in scientific research. Mathematical fluency is not enough. To reach and stay at the frontier, a strong work ethic is absolutely essential. There must be an ability to pass long hours in study and research with pleasure even though some of the effort will inevitably lead to dead ends. Such is the price of admission to the first rank of research scientists.
Highlight(yellow) - 6. What It Takes > Page 80 · Location 636
you will find friends among your fellow enthusiasts and experts. Daily satisfaction from what you are doing will be one of your rewards, but of equal importance is the esteem of people you respect. Yet another is the recognition that what you find will uniquely benefit humanity.
Highlight(yellow) - 6. What It Takes > Page 82 · Location 657
Once deeply engaged, a steady stream of small discoveries is guaranteed. But stay alert for the main chance that lies to the side. There will always be the possibility of a major strike, some wholly unexpected find, some little detail that catches your peripheral attention that might very well, if followed, enlarge or even transform the subject you have chosen. If you sense such a possibility, seize it. In science, gold fever is a good thing.
Highlight(yellow) - 6. What It Takes > Page 82 · Location 660
To make such success more likely, there is another quality in which you might or might not be well endowed but if not should at least try to cultivate. It is entrepreneurship, the willingness to try something daunting you’ve imagined doing and no one else has thought or dared. It could be, for example, starting a project in a part of the world neither you nor your colleagues have yet visited; or finding a way to try an already available instrument or technique not yet used in your field; or, even more bravely, applying your knowledge to another discipline not yet exposed to it.
Highlight(yellow) - 6. What It Takes > Page 83 · Location 664
Entrepreneurship is enhanced by performing lots of quick, easily performed experiments.
Highlight(yellow) - 6. What It Takes > Page 83 · Location 669
Quick uncontrolled experiments are very productive. They are performed just to see if you can make something interesting happen. Disturb Nature and see if she reveals a secret.
Highlight(yellow) - 7. Most Likely to Succeed > Page 92 · Location 746
The successful innovator is favored by a fortunate combination of talent and circumstance, and is socially conditioned by family, friends, teachers, and mentors, and by stories of great scientists and their discoveries.
Highlight(yellow) - 7. Most Likely to Succeed > Page 93 · Location 755
On the frontier of modern science, however, multiple skills are almost always needed to bring any new idea to fruition. An innovator may add a mathematician or statistician, a computer expert, a natural-products chemist, one or several laboratory or field assistants, a colleague or two in the same specialty—whoever it takes for the project to succeed becomes a collaborator. The collaborator is often another innovator who has been toying with the same idea, and is prone to modify or add to it. A critical mass is achieved and discussion intensifies, perhaps among scientists in the same place, perhaps scattered around the world. The project moves forward until an original result is achieved. Group thought has brought it to fruition.
Highlight(yellow) - 8. I Never Changed > Page 95 · Location 772
“If he could do it, so can I, and maybe better.”
Highlight(yellow) - 9. Archetypes of the Scientific Mind > Page 102 · Location 831
I suggest that you examine your inner thoughts in broader terms to locate the kinds of satisfaction you might obtain from a career in science. The value of this exercise in self-analysis applies equally well to professions in research, teaching, business, government, and the media.
Highlight(yellow) - 10. Scientists as Explorers of the Universe > Page 109 · Location 899
the son of Tenzing Norgay, who in 1951, with Edmund Hillary, first summited Mount Everest. I reminded him that upon his return from the mountain, when a journalist had asked Tenzing Norgay, “How does it feel to be a great man?” he responded, “It is Everest that makes men great.”
Highlight(yellow) - 10. Scientists as Explorers of the Universe > Page 115 · Location 954
the stump is a miniature ecosystem.
Note - 10. Scientists as Explorers of the Universe > Page 115 · Location 954
This was a personal note that I've omitted.
III. A LIFE IN SCIENCE
Highlight(yellow) - 11. A Mentor and the Start of a Career > Page 125 · Location 1030
Although insects, spiders, mites, centipedes, millipedes, scorpions, proturans, pillbugs, nematodes, annelid worms, and other such lilliputians are ordinarily overlooked, even by scientists, they are, nonetheless the “little things that run the world.” If we were to disappear, the rest of life would flourish as a result. If on the other hand the little invertebrates on the land were to disappear, almost everything else would die, including most of humanity.
Highlight(yellow) - 14. Know Your Subject, Thoroughly > Page 149 · Location 1253
TO MAKE DISCOVERIES in science, both small and important, you must be an expert on the topics addressed. To be an expert innovator requires commitment. Commitment to a subject implies sustained hard work.
IV. THEORY AND THE BIG PICTURE
Highlight(yellow) - 15. Science as Universal Knowledge > Page 169 · Location 1426
THERE IS ONLY one way to understand the universe and all within it, however imperfectly, and that is through science.
Highlight(yellow) - 16. Searching for New Worlds on Earth > Page 177 · Location 1494
TO MAKE IMPORTANT DISCOVERIES anywhere in science, it is necessary not only to acquire a broad knowledge of the subject that interests you, but also the ability to spot blank spaces in that knowledge.
Highlight(yellow) - 16. Searching for New Worlds on Earth > Page 177 · Location 1498
look especially for oddities, small deviations, and phenomena that seem trivial at first but on closer examination might prove important. Build scenarios in your head when scanning information available to you. Make use of puzzlement.
Highlight(yellow) - 16. Searching for New Worlds on Earth > Page 179 · Location 1516
Across thirty-five powers of magnitude (powers of ten, hence of magnitude 1, 10, 100, 1000, and so on), from one subatomic particle to the entirety of the universe, science rules the enterprise of the human imagination applied to the laws of reality.
Highlight(yellow) - 19. Theory in the Real World > Page 219 · Location 1853
IT MAY SEEM to you that science, having grown so large and complex in fact and theory, would be a difficult profession to enter. Perhaps you worry that most of the opportunities in research and application are closed, that competition for the rest is tight and daunting, and most of the epics and big pictures have been filled in. You would be wrong. The researchers of my generation and others before you accomplished a lot. But they did not close all pathways and enter all unknown regions. Instead, they opened new ones. In science every answer raises more questions. I will ramp up that important truth to an exponential degree: in science every answer creates many more questions.
V. TRUTH AND ETHICS
Highlight(yellow) - 20. The Scientific Ethic > Page 238 · Location 2011
Original discoveries, to remind you, are what count the most. Let me put that more strongly: they are all that counts. They are the silver and gold of science. Proper credit for them is therefore not only a moral imperative, but vital for the free exchange of information and amity within the scientific community as a whole. Researchers rightly demand recognition for all their original work, if not from the general public then from colleagues in their chosen field.
Highlight(yellow) - 20. The Scientific Ethic > Page 238 · Location 2016
The great scientist who works for himself in a hidden laboratory does not exist. Therefore, be rigorous in reading and citing literature. Bestow credit where it is deserved, and expect the same from others. Honest credit carefully given matters enormously.
Highlight(yellow) - 20. The Scientific Ethic > Page 239 · Location 2021
You will make mistakes. Try not to make big ones. Whatever the case, admit them and move on. A simple error in reporting or conclusion will be forgiven if publicly corrected. (At least one leading journal has a special erratum section.) An outright retraction of a result will not cause permanent harm if done graciously, and especially with thanks to the scientist who reported the error with evidence and logical reasoning. But never, ever will fraud be forgiven. The penalty is professional death: exile, never again to be trusted.
Highlight(yellow) - 20. The Scientific Ethic > Page 239 · Location 2025
If you’re not sure of a result, repeat the work. If you don’t have the time or resources to do so, drop the whole thing or pass it on to someone else. If your facts are solid, but you’re not sure of the conclusion, just say as much. If you do not have the opportunity or resources to repeat and confirm your work, don’t be afraid to use words denoting timid uncertainty: “apparently,” “seemingly,” “suggests,” “could possibly be,” “raises possibility of,” “may well be.” If the result is worthwhile, others will either confirm or disprove what you think you found, and all will share credit. That’s not sloppiness. It’s just good professional conduct, true to the core of the scientific method.


Are you positive you want to remove {{selectedMember.username}} from {{organization.name}}?
{{selectedMember.username}} was successfully removed from the organization.
Eh, That went haywire!!!?
The member was probably NOT removed, Sorry!


Restaurant
Cuisine Type
View Tables
Current Reservations
Waiting List
Control Panel
Clear Table
|
API Table Link
|
API Wait List


NSDictionary(NMX)
@interface NSDictionary (NMX)
/**
* Constructs an NSDictionary from a given json filename in the given bundle
*
* - Precondition: fileName may not be nil
*
* - Author: Tobias Baube
*
* - Version: 1.0
*
* @param fileName - make sure this filename exists in the provided bundle (filename can also be provided without extension: "filename.plist" and "filename". If provided without extension, "plist" will be appended for the initialization. If this parameter is nil, nil will be returned
* @param bundle - specifies the bundle, in which the lookup is being performed. If this value is nil, the default bundle [NSBundle mainBundle] is used
* @return returns a NSDictionary instance from a given plist-file. If the file was not found or input parameters are invalid, nil is being returned
*/
+ (instancetype __nullable)dictionaryWithPlistFile:(NSString * __nonnull)fileName bundle:(NSBundle * __nullable)bundle;
/**
* Constructs an NSDictionary from a given json filename in the given bundle
*
* - Precondition: fileName may not be nil
*
* - Author: Tobias Baube
*
* - Version: 1.0
*
* @param fileName - make sure this filename exists in the provided bundle (filename can also be provided without extension: "filename.json" and "filename". If provided without extension, "json" will be appended for the initialization. If this parameter is nil, nil will be returned
* @param bundle - specifies the bundle, in which the lookup is being performed. If this value is nil, the default bundle [NSBundle mainBundle] is used
* @return returns a NSDictionary instance from a given json-file. If the file was not found or input parameters are invalid, nil is being returned
*/
+ (instancetype __nullable)dictionaryWithJSONFile:(NSString * __nonnull)fileName bundle:(NSBundle * __nullable)bundle;
@end
Undocumented
-
Constructs an NSDictionary from a given json filename in the given bundle
Precondition
fileName may not be nil
Version
1.0
Declaration
Objective-C
+ (instancetype _Nullable)dictionaryWithPlistFile:(NSString *_Nonnull)fileName bundle:(NSBundle *_Nullable)bundle;
Swift
convenience init?(plistFile fileName: String, bundle: Bundle?)
Parameters
fileName
- make sure this filename exists in the provided bundle (filename can also be provided without extension:
filename.plist
andfilename
. If provided without extension,plist
will be appended for the initialization. If this parameter is nil, nil will be returnedbundle
- specifies the bundle, in which the lookup is being performed. If this value is nil, the default bundle [NSBundle mainBundle] is used
Return Value
returns a NSDictionary instance from a given plist-file. If the file was not found or input parameters are invalid, nil is being returned
-
Constructs an NSDictionary from a given json filename in the given bundle
Precondition
fileName may not be nil
Version
1.0
Declaration
Objective-C
+ (instancetype _Nullable)dictionaryWithJSONFile:(NSString *_Nonnull)fileName bundle:(NSBundle *_Nullable)bundle;
Swift
convenience init?(jsonFile fileName: String, bundle: Bundle?)
Parameters
fileName
- make sure this filename exists in the provided bundle (filename can also be provided without extension:
filename.json
andfilename
. If provided without extension,json
will be appended for the initialization. If this parameter is nil, nil will be returnedbundle
- specifies the bundle, in which the lookup is being performed. If this value is nil, the default bundle [NSBundle mainBundle] is used
Return Value
returns a NSDictionary instance from a given json-file. If the file was not found or input parameters are invalid, nil is being returned


Validating schemas using Kafka client serializers/deserializers
Apicurio Registry provides Kafka client serializers/deserializers for producer and consumer applications. Kafka producer applications use serializers to encode messages that conform to a specific event schema. Kafka consumer applications use deserializers to validate that the messages have been serialized using the correct schema, based on a specific schema ID. This ensures consistent schema use and helps to prevent data errors at runtime.
This chapter provides instructions on how to use the Kafka client serializers and deserializers for Apache Avro, JSON Schema, and Google Protobuf in your Kafka producer and consumer client applications:
-
You must have read Introduction to Apicurio Registry
-
You must have installed Apicurio Registry.
-
You must have created Kafka producer and consumer client applications.
Kafka client applications and Apicurio Registry
Using Apicurio Registry decouples schema management from client application configuration. You can enable an application to use a schema from the registry by specifying its URL in the client code.
For example, you can store the schemas to serialize and deserialize messages in the registry, which are then referenced from the applications that use them to ensure that the messages that they send and receive are compatible with those schemas. Kafka client applications can push or pull their schemas from Apicurio Registry at runtime.
Schemas can evolve, so you can define rules in Apicurio Registry, for example, to ensure that changes to a schema are valid and do not break previous versions used by applications. Apicurio Registry checks for compatibility by comparing a modified schema with previous schema versions.
Apicurio Registry provides schema registry support for a number of schema technologies such as:
-
Avro
-
Protobuf
-
JSON Schema
These schema technologies can be used by client applications through Kafka client serializer/deserializer (SerDe) services provided by Apicurio Registry. The maturity and usage of the SerDe classes provided by Apicurio Registry may vary. See the type-specific sections below for more details about each.
Producer schema configuration
A producer client application uses a serializer to put the messages that it sends to a specific broker topic into the correct data format.
To enable a producer to use Apicurio Registry for serialization:
-
Define and register your schema with Apicurio Registry (optional)
-
Configure the producer client code:
-
URL of Apicurio Registry
-
Apicurio Registry serializer to use with the messages
-
Strategy to map the Kafka message to an artifact ID in Apicurio Registry
-
Strategy to look up or register the schema used for serialization in Apicurio Registry
-
After registering your schema, when you start Kafka and Apicurio Registry, you can access the schema to format messages sent to the Kafka broker topic by the producer. Alternatively (depending on configuration), the producer can automatically register the schema on first use.
If a schema already exists, you can create a new version using the REST API based on compatibility rules defined in Apicurio Registry. Versions are used for compatibility checking as a schema evolves. An artifact ID and schema version represents a unique tuple that identifies a schema.
Consumer schema configuration
A consumer client application uses a deserializer to get the messages that it consumes from a specific broker topic into the correct data format.
To enable a consumer to use Apicurio Registry for deserialization:
-
Configure the consumer client code:
-
URL of Apicurio Registry
-
Apicurio Registry deserializer to use with the messages
-
Input data stream for deserialization
-
The schema is then retrieved by the deserializer using a global ID written into the message being consumed. The schema global ID can be located in the message headers or in the message payload itself, depending on the configuration of the producer application.
When locating the global ID in the message payload, the format of the data begins with a magic byte (as a signal to consumers) followed by the global ID and then the message data as normal.
For example:
# ...
[MAGIC_BYTE]
[GLOBAL_ID]
[MESSAGE DATA]
Now, when you start Kafka and Apicurio Registry, you can access the schema to format messages received from the Kafka broker topic.
Strategies to look up a schema
The Kafka client serializer uses lookup strategies to determine the artifact ID and the global ID under which the message schema is registered in Apicurio Registry.
For a given topic and message, you can use implementations of the following Java interfaces:
-
ArtifactIdStrategy
to return an artifact ID -
GlobalIdStrategy
to return a global ID
The classes for each strategy are organized in the io.apicurio.registry.utils.serde.strategy
package. The default strategy is the artifact ID TopicIdStrategy
, which looks for Apicurio Registry artifacts with the same name as the Kafka topic receiving messages.
public String artifactId(String topic, boolean isKey, T schema) {
return String.format("%s-%s", topic, isKey ? "key" : "value");
}
-
The
topic
parameter is the name of the Kafka topic receiving the message. -
The
isKey
parameter istrue
when the message key is being serialized, andfalse
when the message value is being serialized. -
The
schema
parameter is the schema of the message being serialized or deserialized. -
The
artifactID
returned is the artifact ID under which the schema is registered in Apicurio Registry.
Which lookup strategy you use depends on how and where you store your schema. For example, you might use a strategy that uses a record ID if you have different Kafka topics with the same Avro message type.
Artifact ID strategy
The artifact ID strategy provides a way to map the Kafka topic and message information to an artifact ID in Apicurio Registry. The common convention for the mapping is to combine the Kafka topic name with the key
or value
, depending on whether the serializer is used for the Kafka message key or value.
However, you can use alternative conventions for the mapping by using a strategy provided by Apicurio Registry, or by creating a custom Java class that implements io.apicurio.registry.utils.serde.strategy.ArtifactIdStrategy
.
Strategies to return an artifact ID
Apicurio Registry provides the following strategies to return an artifact ID based on an implementation of ArtifactIdStrategy
:
RecordIdStrategy
-
Avro-specific strategy that uses the full name of the schema.
TopicRecordIdStrategy
-
Avro-specific strategy that uses the topic name and the full name of the schema.
TopicIdStrategy
-
Default strategy that uses the topic name and
key
orvalue
suffix. SimpleTopicIdStrategy
-
Simple strategy that only uses the topic name.
Global ID strategy
The global ID strategy locates and identifies the specific version of the schema registered under the artifact ID provided by the artifact ID strategy. Every version of every artifact has a single globally unique identifier that can be used to retrieve the content of that artifact. This global ID is included in every Kafka message so that a deserializer can properly fetch the schema from Apicurio Registry.
The global ID strategy can look up an existing artifact version, or it can register one if not found, depending on which strategy is used. You can also provide your own strategy by creating a
custom Java class that implements io.apicurio.registry.utils.serde.strategy.GlobalIdStrategy
.
Strategies to return a global ID
Apicurio Registry provides the following strategies to return a global ID based on an implementation of GlobalIdStrategy
:
FindLatestIdStrategy
-
Strategy that returns the global ID of the latest schema version, based on an artifact ID.
FindBySchemaIdStrategy
-
Strategy that matches schema content, based on an artifact ID, to return a global ID.
CachedSchemaIdStrategy
-
Strategy that caches the schema, and uses the global ID of the cached schema.
GetOrCreateIdStrategy
-
Strategy that tries to get the latest schema, based on an artifact ID, and if it does not exist, creates a new schema.
AutoRegisterIdStrategy
-
Strategy that updates the schema, and uses the global ID of the updated schema.
Global ID strategy configuration
You can configure the following application property for the global ID strategy:
-
apicurio.registry.check-period-ms
: Configures the remote schema lookup period in milliseconds
You can configure application properties as Java system properties or include them in the Quarkus
application.properties
file. For more details, see the Quarkus documentation.
Apicurio Registry serializer/deserializer constants
You can configure specific client serializer/deserializer (SerDe) services and schema lookup strategies directly into a client using the constants outlined in this section.
Alternatively, you can specify the constants in a properties file, or a properties instance.
Constants for serializer/deserializer services
public abstract class AbstractKafkaSerDe<T extends AbstractKafkaSerDe<T>> implements AutoCloseable {
protected final Logger log = LoggerFactory.getLogger(getClass());
public static final String REGISTRY_URL_CONFIG_PARAM = "apicurio.registry.url"; (1)
public static final String REGISTRY_CACHED_CONFIG_PARAM = "apicurio.registry.cached"; (2)
public static final String REGISTRY_ID_HANDLER_CONFIG_PARAM = "apicurio.registry.id-handler"; (3)
public static final String REGISTRY_CONFLUENT_ID_HANDLER_CONFIG_PARAM = "apicurio.registry.as-confluent"; (4)
| 1 | (Required) The URL of Apicurio Registry. |
| 2 | Allows the client to make the request and look up the information from a cache of previous results, to improve processing time. If the cache is empty, the lookup is performed from Apicurio Registry. |
| 3 | Extends ID handling to support other ID formats and make them compatible with Apicurio Registry SerDe services.
For example, changing the ID format from Long to Integer supports the Confluent ID format. |
| 4 | A flag to simplify the handling of Confluent IDs. If set to true , an Integer is used for the global ID lookup. |
Constants for lookup strategies
public abstract class AbstractKafkaStrategyAwareSerDe<T, S extends AbstractKafkaStrategyAwareSerDe<T, S>> extends AbstractKafkaSerDe<S> {
public static final String REGISTRY_ARTIFACT_ID_STRATEGY_CONFIG_PARAM = "apicurio.registry.artifact-id"; (1)
public static final String REGISTRY_GLOBAL_ID_STRATEGY_CONFIG_PARAM = "apicurio.registry.global-id"; (2)
Constants for converters
public class SchemalessConverter<T> extends AbstractKafkaSerDe<SchemalessConverter<T>> implements Converter {
public static final String REGISTRY_CONVERTER_SERIALIZER_PARAM = "apicurio.registry.converter.serializer"; (1)
public static final String REGISTRY_CONVERTER_DESERIALIZER_PARAM = "apicurio.registry.converter.deserializer"; (2)
| 1 | (Required) Serializer to use with the converter. |
| 2 | (Required) Deserializer to use with the converter. |
Constants for Avro data providers
public interface AvroDatumProvider<T> {
String REGISTRY_AVRO_DATUM_PROVIDER_CONFIG_PARAM = "apicurio.registry.avro-datum-provider"; (1)
String REGISTRY_USE_SPECIFIC_AVRO_READER_CONFIG_PARAM = "apicurio.registry.use-specific-avro-reader"; (2)
| 1 | Avro Datum provider to write data to a schema, with or without reflection. |
| 2 | Flag to set to use an Avro-specific datum reader. |
DefaultAvroDatumProvider (io.apicurio.registry.utils.serde.avro) (1)
ReflectAvroDatumProvider (io.apicurio.registry.utils.serde.avro) (2)
| 1 | Default datum reader. |
| 2 | Datum reader using reflection. |
Using different client serializer/deserializer types
When using a schema technology in your Kafka applications, you must choose which specific schema type to use. Common options include:
-
Apache Avro
-
JSON Schema
-
Google Protobuf
Which schema technology you choose is dependent on use case and preference. Of course you can use Kafka to implement custom serializer and deserializer classes, so you are always free to write your own classes, including leveraging Apicurio Registry functionality using the Apicurio Registry REST Java client.
For your convenience, Apicurio Registry provides out-of-the box SerDe classes for Avro, JSON Schema, and Protobuf schema technologies. The following sections explains how to configure Kafka applications to use each type.
Kafka application configuration for serializers/deserializers
Using one of the serializer or deserializer classes provided by Apicurio Registry in your Kafka application involves setting the correct configuration properties. The following simple examples show how to configure a serializer in a Kafka producer application and how to configure a deserializer in a Kafka consumer application.
public Producer<Object,Object> createKafkaProducer(String kafkaBootstrapServers, String topicName) {
Properties props = new Properties();
// Configure standard Kafka settings
props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServers);
props.putIfAbsent(ProducerConfig.CLIENT_ID_CONFIG, "Producer-" + topicName);
props.putIfAbsent(ProducerConfig.ACKS_CONFIG, "all");
// Use a Apicurio Registry-provided Kafka serializer
props.putIfAbsent(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
io.apicurio.registry.utils.serde.AvroKafkaSerializer.class.getName());
props.putIfAbsent(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
io.apicurio.registry.utils.serde.AvroKafkaSerializer.class.getName());
// Configure Apicurio Registry location
props.putIfAbsent(AbstractKafkaSerDe.REGISTRY_URL_CONFIG_PARAM, REGISTRY_URL);
// Map the topic name (plus -key/value) to the artifactId in the registry
props.putIfAbsent(AbstractKafkaSerializer.REGISTRY_ARTIFACT_ID_STRATEGY_CONFIG_PARAM,
io.apicurio.registry.utils.serde.strategy.TopicIdStrategy.class.getName());
// Get an existing schema or auto-register if not found
props.putIfAbsent(AbstractKafkaSerializer.REGISTRY_GLOBAL_ID_STRATEGY_CONFIG_PARAM,
io.apicurio.registry.utils.serde.strategy.GetOrCreateIdStrategy.class.getName());
// Create the Kafka producer
Producer<Object, Object> producer = new KafkaProducer<>(props);
return producer;
}
public Consumer<Object,Object> createKafkaConsumer(String kafkaBootstrapServers, String topicName) {
Properties props = new Properties();
// Configure standard Kafka settings
props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServers);
props.putIfAbsent(ConsumerConfig.GROUP_ID_CONFIG, "Consumer-" + topicName);
props.putIfAbsent(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
props.putIfAbsent(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
props.putIfAbsent(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
// Use a Apicurio Registry-provided Kafka deserializer
props.putIfAbsent(ProducerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
io.apicurio.registry.utils.serde.AvroKafkaDeserializer.class.getName());
props.putIfAbsent(ProducerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
io.apicurio.registry.utils.serde.AvroKafkaDeserializer.class.getName());
// Configure Apicurio Registry location
props.putIfAbsent(AbstractKafkaSerDe.REGISTRY_URL_CONFIG_PARAM, REGISTRY_URL);
// No other configuration needed for deserializer because globalId of the schema
// the deserializer uses is sent as part of the message. The deserializer simply
// extracts that globalId and uses it to look up the schema from the registry.
// Create the Kafka consumer
KafkaConsumer<Long, GenericRecord> consumer = new KafkaConsumer<>(props);
return consumer;
}
Configure Avro SerDe with Apicurio Registry
Apicurio Registry provides Kafka client serializer and deserializer classes for Apache Avro to make using Avro as easy as possible:
-
io.apicurio.registry.utils.serde.AvroKafkaSerializer
-
io.apicurio.registry.utils.serde.AvroKafkaDeserializer
You can configure the Avro serializer class in the following ways:
-
Apicurio Registry location as a URL
-
Artifact ID strategy
-
Global ID strategy
-
Global ID location
-
Global ID handler
-
Avro datum provider
-
Avro encoding
The serializer passes the unique global ID of the schema as part of the Kafka message so that consumers can use the right schema for deserialization. The location of that global ID can be in the payload of the message or in the message headers. The default approach is to pass the global ID in the message payload. If you want the ID sent in the message headers instead, you can set the following configuration property:
props.putIfAbsent(AbstractKafkaSerDe.USE_HEADERS, "true")
The property name is apicurio.registry.use.headers
.
You can customize precisely how the global ID is encoded when passing it in the Kafka message body. Set
the configuration property apicurio.registry.id-handler
to be a class that implements the
io.apicurio.registry.utils.serde.strategy.IdHandler
interface. Apicurio Registry provides two implementations of
that interface:
-
io.apicurio.registry.utils.serde.strategy.DefaultIdHandler
- stores the ID as an 8 byte long -
io.apicurio.registry.utils.serde.strategy.Legacy4ByteIdHandler
- stores the ID as an 4 byte int
Apicurio Registry represents the global ID of an artifact as a long, but for legacy reasons (or for compatibility with other registries or serde classes) you may want to use 4 bytes when sending the ID.
Avro provides different datum writers and readers to write and read data. Apicurio Registry supports three different types:
-
Generic
-
Specific
-
Reflect
The Apicurio Registry AvroDatumProvider
is the abstraction on which type is then actually used, where DefaultAvroDatumProvider
is used by default.
There are two configuration options you can set:
-
apicurio.registry.avro-datum-provider
- provide a fully qualified Java class name of theAvroDatumProvider
implementation, for exampleio.apicurio.registry.utils.serde.avro.ReflectAvroDatumProvider
-
apicurio.registry.use-specific-avro-reader
- true or false, to use specific type when usingDefaultAvroDatumProvider
When using Apache Avro to serializer data, it is common to use the Avro binary encoding format. This is so that the data is encoded in as efficient a format as possible. However, Avro also supports encoding the data as JSON. Encoding as JSON is useful because it is much easier to inspect the payload of each message, often for logging, debugging, or other similar use cases. The Apicurio Registry Avro serializer can be configured to change the encoding to JSON from the default (binary).
Set the Avro encoding to use by configuring the apicurio.avro.encoding
property. The value must be either
JSON
or BINARY
.
You must configure the Avro deserializer class to match the configuration settings of the serializer. As a result, you can configure the Avro deserializer class in the following ways:
-
Apicurio Registry location as a URL
-
Global ID handler
-
Avro datum provider
-
Avro encoding
See the serializer section for these configuration options - the property names and values are the same.
|
The following options are not needed when configuring the deserializer:
|
The reason these options are not necessary is that the deserializer class can figure this information out from the message itself. In the case of the two strategies, they are not needed because the serializer is responsible for sending the global ID of the schema as part of the message.
The location of that global ID is determined by the deserializer by simply checking for the magic byte at the start of the message payload. If that byte is found, the global ID is read from the message payload using the configured handler. If the magic byte is not found, the global ID is read from the message headers.
Configure JSON Schema SerDe with Apicurio Registry
Apicurio Registry provides Kafka client serializer and deserializer classes for JSON Schema to make using JSON Schema as easy as possible:
-
io.apicurio.registry.utils.serde.JsonSchemaKafkaSerializer
-
io.apicurio.registry.utils.serde.JsonSchemaKafkaDeserializer
Unlike Apache Avro, JSON Schema is not actually a serialization technology - it is instead a validation technology. As a result, configuration options for JSON Schema are quite different. For example, there is no encoding option, because data is always encoded as JSON.
You can configure the JSON Schema serializer class in the following ways:
-
Apicurio Registry location as a URL
-
Artifact ID strategy
-
Global ID strategy
-
Validation enabled/disabled
The only non-standard configuration property is whether JSON Schema validation is enabled or
disabled. The validation feature is disabled by default but can be enabled by setting
apicurio.registry.serdes.json-schema.validation-enabled
to "true"
. For example:
props.putIfAbsent(JsonSchemaSerDeConstants.REGISTRY_JSON_SCHEMA_VALIDATION_ENABLED, "true")`
You can configure the JSON Schema deserializer class in the following ways:
-
Apicurio Registry location as a URL
-
Validation enabled/disabled
The deserializer is simple to configure. You must provide the location of Apicurio Registry so that the schema can be loaded. The only other configuration is whether or not to perform validation. These configuration properties are the same as for the serializer.
| Deserializer validation only works if the serializer passes the global ID in the Kafka message, which will only happen when validation is enabled in the serializer. |
Configure Protobuf SerDe with Apicurio Registry
Apicurio Registry provides Kafka client serializer and deserializer classes for Google Protobuf to make using Protobuf as easy as possible:
-
io.apicurio.registry.utils.serde.ProtobufKafkaSerializer
-
io.apicurio.registry.utils.serde.ProtobufKafkaDeserializer
You can configure the Protobuf serializer class in the following ways:
-
Apicurio Registry location as a URL
-
Artifact ID strategy
-
Global ID strategy
-
Global ID location
-
Global ID handler
You must configure the Protobuf deserializer class to match the configuration settings of the serializer. As a result, you can configure the Protobuf deserializer class in the following ways:
-
Apicurio Registry location as a URL
-
Global ID handler
See the serializer section for these configuration options - the property names and values are the same.
|
The following options are not needed when configuring the deserializer:
|
The reason these options are not necessary is that the deserializer class can figure this information out from the message itself. In the case of the two strategies, they are not needed because the serializer is responsible for sending the global ID of the schema as part of the message.
The location of that global ID is determined (by the deserializer) by simply checking for the magic byte at the start of the message payload. If that byte is found, the global ID is read from the message payload (using the configured handler). If the magic byte is not found, the global ID is read from the message headers.
The Protobuf deserializer does not deserialize to your exact Protobuf Message implementation,
but rather to a DynamicMessage instance (because there is no appropriate API to do otherwise).
|
Registering a schema in Apicurio Registry
After you have defined a schema in the appropriate format, such as Apache Avro, you can add the schema to Apicurio Registry.
You can add the schema using:
-
The Apicurio Registry web console
-
A curl command using the Apicurio Registry API
-
A Maven plugin supplied with Apicurio Registry
-
Schema configuration added to your client code
Client applications cannot use Apicurio Registry until you have registered your schemas.
Apicurio Registry web console
Having installed Apicurio Registry, you connect to the web console from the ui
endpoint:
http://MY-REGISTRY-URL/ui
From the console, you can add, view and configure schemas. You can also create the rules that prevent invalid content being added to the registry.
Curl command example
curl -X POST -H "Content-type: application/json; artifactType=AVRO" \
-H "X-Registry-ArtifactId: prices-value" \
--data '{ (1)
"type":"record",
"name":"price",
"namespace":"com.redhat",
"fields":[{"name":"symbol","type":"string"},
{"name":"price","type":"string"}]
}'
https://my-cluster-service-registry-myproject.example.com/api/artifacts -s (2)
| 1 | Avro schema artifact. |
| 2 | OpenShift route name that exposes Apicurio Registry. |
Maven plugin example
<plugin>
<groupId>io.apicurio</groupId>
<artifactId>apicurio-registry-maven-plugin</artifactId>
<version>${registry.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>register</goal>
</goals>
<configuration>
<registryUrl>https://my-cluster-service-registry-myproject.example.com/api</registryUrl>
<artifactType>AVRO</artifactType>
<artifacts>
<schema1>${project.basedir}/schemas/schema1.avsc</schema1>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
Configuration using a producer client example
String registryUrl_node1 = PropertiesUtil.property(clientProperties, "registry.url.node1", (1)
"https://my-cluster-service-registry-myproject.example.com/api");
try (RegistryService service = RegistryClient.create(registryUrl_node1)) {
String artifactId = ApplicationImpl.INPUT_TOPIC + "-value";
try {
service.getArtifactMetaData(artifactId); (2)
} catch (WebApplicationException e) {
CompletionStage <ArtifactMetaData> csa = service.createArtifact(
ArtifactType.AVRO,
artifactId,
new ByteArrayInputStream(LogInput.SCHEMA$.toString().getBytes())
);
csa.toCompletableFuture().get();
}
}
| 1 | The properties are registered. You can register properties against more than one node. |
| 2 | Check to see if the schema already exists based on the artifact ID. |
Using a schema from a Kafka consumer client
This procedure describes how to configure a Kafka consumer client written in Java to use a schema from Apicurio Registry.
-
Apicurio Registry is installed
-
The schema is registered with Apicurio Registry
-
Configure the client with the URL of Apicurio Registry. For example:
String registryUrl = "https://registry.example.com/api"; Properties props = new Properties(); props.putIfAbsent(AbstractKafkaSerDe.REGISTRY_URL_CONFIG_PARAM, registryUrl);
-
Configure the client with the Apicurio Registry deserializer. For example:
// Configure Kafka props.putIfAbsent(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, SERVERS); props.putIfAbsent(ConsumerConfig.GROUP_ID_CONFIG, "Consumer-" + TOPIC_NAME); props.putIfAbsent(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true"); props.putIfAbsent(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000"); props.putIfAbsent(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.putIfAbsent(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, AvroKafkaDeserializer.class.getName()); (1) props.putIfAbsent(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, AvroKafkaDeserializer.class.getName()); (2)
1 The deserializer provided by Apicurio Registry. 2 The deserialization is in Apache Avro JSON format.
Using a schema from a Kafka producer client
This procedure describes how to configure a Kafka producer client written in Java to use a schema from Apicurio Registry.
-
Apicurio Registry is installed
-
The schema is registered with Apicurio Registry
-
Configure the client with the URL of Apicurio Registry. For example:
String registryUrl = "https://registry.example.com/api"; Properties props = new Properties(); props.putIfAbsent(AbstractKafkaSerDe.REGISTRY_URL_CONFIG_PARAM, registryUrl);
-
Configure the client with the serializer, and the strategy to look up the schema in Apicurio Registry. For example:
props.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "my-cluster-kafka-bootstrap:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName()); (1) props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroKafkaSerializer.class.getName()); (2) props.put(AbstractKafkaSerializer.REGISTRY_GLOBAL_ID_STRATEGY_CONFIG_PARAM, FindLatestIdStrategy.class.getName()); (3)
1 The serializer for the message key provided by Apicurio Registry. 2 The serializer for the message value provided by Apicurio Registry. 3 Lookup strategy to find the global ID for the schema.
Using a schema from a Kafka Streams application
This procedure describes how to configure a Kafka Streams client written in Java to use a schema from Apicurio Registry.
-
Apicurio Registry is installed
-
The schema is registered with Apicurio Registry
-
Create and configure a REST client with the Apicurio Registry. For example:
String registryUrl = "https://registry.example.com/api"; RegistryService client = RegistryClient.cached(registryUrl);
-
Configure the serializer, deserializer, and create the Kafka Streams client. For example:
Serializer<LogInput> serializer = new AvroKafkaSerializer<>( (1) client, new DefaultAvroDatumProvider<LogInput>().setUseSpecificAvroReader(true) ); Deserializer<LogInput> deserializer = new AvroKafkaDeserializer <> ( (2) client, new DefaultAvroDatumProvider<LogInput>().setUseSpecificAvroReader(true) ); Serde<LogInput> logSerde = Serdes.serdeFrom( (3) serializer, deserializer ); KStream<String, LogInput> input = builder.stream( (4) INPUT_TOPIC, Consumed.with(Serdes.String(), logSerde) );
1 The serializer provided by Apicurio Registry. 2 The deserializer provided by Apicurio Registry. 3 The deserialization is in Apache Avro format. 4 The Kafka Streams client application.


 The Advisory Council is composed of OSS project leaders that care deeply about .NET and the success of the foundation. They drive key initiatives in the foundation and guide the board. Learn more about what the Advisory Council is all about and participate in public discussions with them on our forums.
For this next post, I interviewed Phil Haack. Phil works at GitHub as an Engineering Manager for the Desktop team. This team is responsible for GitHub for Mac, GitHub for Window, and the GitHub Extension for Visual Studio. Prior to GitHub, he was a Senior Program Manager at Microsoft responsible for shipping ASP.NET MVC and NuGet. These projects were released under open source licenses and helped serve as examples to other teams for how to ship open source software. He regularly writes for his blog http://haacked.com/ and tweets random observations on Twitter as @haacked. He also speaks at conferences here and there, and has quit writing technical books forever, several times now.
Tell us a little bit about yourself. What's your background? When did you start getting interested in programming?
My last name is pronounced "hack" which pretty much guaranteed my involvement in computers and programming. I was interested in programming at a young age when my Dad bought a TRS-80 Color Computer and we'd spend hours typing in code listings from Byte magazine. Most of my programming around this time was making the computer draw pictures and creating Mad Lib style programs. I didn’t seriously get into programming until after college when I took a job as a programmer as a way to pay the bills for a bit before I applied to grad schools for mathematics. I never got around to those applications.
What initiatives are you working on (or passionate about) within the .NET Foundation?
I'm passionate about helping OSS maintainers become better maintainers.

There’s so much I could say, but if I had one thing to say, it’s be empathetic. Sometimes the open source culture tries to completely take the human element out of the work we do under the fallacy that the compiler and computer doesn’t care about social issues. But the fact is that software is written for humans. Humans have to care and tend to the code. Humans use the end product of the code. Without humans, there’s no need for the code in the first place.
There’s often a lot of fatigue when working with new people joining OSS. I understand it. It’s frustrating to be asked the same question for the 100th time because people didn’t read the README.  For many of these folks, their interaction with you might be their very first interaction with Open Source ever! Your response could lead them down a road to becoming a valued and experienced contributor, or could totally cool them off the idea of joining in. So be welcoming. Try to remember how nervous people are about making their first contribution and act accordingly.
Can you tell us some of the first open source projects you worked on as a contributor? Why did you get involved? How did you get started?
Like many OSS contributors, I got involved because I was bored. At work I spent all day writing the same standard data-in data-out web applications for every client. Of course when I updated my resume, I managed to make those applications sound cutting edge and full of rocket surgery. Open Source afforded me the opportunity to delve into different types of software. For example, I wanted to try my hand at a desktop application. I spent a lot of time at work reading blog entries from people doing more interesting work than I was doing.
So it’s fitting that my first foray with open source started with RSS Bandit (an RSS aggregator) a long time ago. For the youngsters reading this, it’s like decentralized Medium full of very self-important writing (again, like Medium), but with many gems hidden among the bloviating. I started off by making contributions to the documentation. The maintainers started to trust me and gave me commit access so I could make direct contributions. It was a thrill to see my contributions used in the wild. I was hooked.
From there I started my own project with Subtext which pretty much amounted to taking a second job. It was with great sadness and relief that I shut it down after some 8 years working on it. It’s been supplanted by Jekyll for me. It’s the cycle of code. Newer and better code replaces older outdated approaches.
Looking back, what bug are you most proud of fixing in an open source project?
Too many to consider. Perhaps it was taking the four configuration files and merging them into one (via Subtext) that really simplified the installation of the blog engine. That really drilled into me the idea that usability is one of the most essential features for any project. The installation process needs to be flawless. If people can’t even get started using your software, they won’t stick around. They really don’t care about how hard that work is for you. They don’t have time to think about you, they’re just trying to get something done and the best thing you can do is make sure your software doesn’t get in their way.
What project(s) do you spend most of your time on now?
In terms of Open Source projects, I mostly spend my time on Octokit.net, a client library for the GitHub API I also occasionally maintain the many small NuGet packages I’ve written. I also maintain the Semantic Versioning (semver) specification. But that’s mostly a hands-off affair these days since a great feature of a specification like that is to not change too drastically too often. Rather than focus my time on one project these days, I mostly contribute small fixes back to a large number of other open source projects that we happen to use at work and that I use in my free time.
Can you tell us one thing you have learned about running an open source project?
A lot of people will tell you they'll contribute, but very few will. So treat those folks very well! Well, treat everybody well! Also, everybody has opinions on what you should do. After all, opinions are free. So seek out opinions from those who have skin in the game. The idea that if you implement some feature, someone will start using your code is usually a lie. So I tend to focus on those who are actually using the software. I also focus on those who go so far as to contribute to the software in any way. When you consider that the default action for a vast majority of users is to do nothing, something as seemingly small as logging an issue is a major contribution. Appreciate it!
Why is open source software important to you?
It's mostly about the community of folks who have a shared interest around a piece of code and work together to raise the state of the art. As a consumer, it's important to me to be able to tweak things for my scenarios at times when the API lacks the flexibility to accomplish my goals without code changes. As a participant, it’s been a great source of professional and skill growth. OSS has been a great outlet to leveling up and diversifying my skills. The types of projects I can work on isn’t driven solely by what the market finds profitable at any given moment.
What is it about .NET that you like most?
I'm just a big fan of C# and Visual Studio. I happen to like statically typed languages and am really familiar with C#. I think platforms are a lot like culture. You tend to like the one you’re born into. My first job happened to use classic ASP and I’ve been on the Microsoft stack ever since. Though being at GitHub has definitely helped me branch out a lot more. There’s so much each community can learn from each other.
What does the future of .NET look like in your dreams?
In my dreams, everybody who uses .NET is doing it on GitHub on every platform!
Thanks, Phil!
Feel free to ask more interview questions in the comments below.
Enjoy,
-Beth Massi, .NET Foundation Technical Evangelist


[See http://forge.mysql.com/wiki/MySQLConf2009MondayNotes]
Monday: day of tutorials. Plenty of interesting tutorials on the Conference itself, plus a session with Mark Callaghan - it was hard to choose. I settled for two tutorials, which turned out to be three.
Practical MySQL Plugin Development: As a C/C++/Java developer, I am very interested in the plugin API. I have used UDF before, and these turned out to be extremely helpful, and solved me a lot of headache. With the new plugin API I was expecting to learn how to properly write INFORMATION_SCHEMA tables, functions and engines.
Wasn't it possible to learn all this on the web? Sure, but this presentation was delivered by Roland Bouman and Sergei Golubchik, and I was anxious to hear from their experience. Well, that's what the conference is all about, isn't it?
The session was very good. Roland & Sergei covered the basics of the Plugin API, the general ideas, then went on to present the specific implementations: daemon plugins, INFORMATION_SCHEMA, FULLTEXT. The session was accompanied by convincing and enlighting examples. For example, a QUERY_CACHE_TABLE: an INFORMATION_SCHEMA table which lists which queries are currently in the query cache, along with the number of used blocks etc.
However, I was a bit discouraged by several findings:
- The Plugin API is not well defined. It is not stabilized nor well documented. This means the API may change frequently, rendering your plugins useless.
- In order to develop a plugin, you must compile it against every single MySQL version you want the plugin to be deployed with. You actually need to recompile MySQL from source to do so. I find this discouraging, since it's a lot of hassle: each time you change anything in your plugin, you get to have a dozen, maybe more, MySQL source compilations to work through. I believe this will generally make developers less eager to develop plugins (but maybe it's just me!).
I next attended SQL Antipatterns Strike Back by Bill Karwin. I was impressed by his last year "SQL Antipatterns" presentation (I didn't attend, just downloaded) and was keen to see what he had to add.
A lot of interesting issues were presented: trees, polymorphic tables, and more. Some were less of an interest (e.g. using a separate table instead of ENUM, using DECIMAL instead of FLOAT for currency calculations), and I found them to be very basic (of course, I don't consider this as 'bad').
On a critic note, with pardon, the presenter seemed a bit out of date with regard to MySQL's abilities, or with common utilities such as maatkit's mk-duplicate-key-checker; with long-time solved bugs in MySQL and more.
But allow me to be clear that the presenter made very good points, and had a lot of insight with regard to improper practices and with common problems. I found the session to be interesting and good. The audience was actively participating, asking, suggesting or rejecting: this is always an indication for an interesting session!
I later joined the Partitioning in MySQL 5.1 session by Giuseppe Maxia & Sarah Sproehnle. I found the presentation to be in good spirits, and it shed some new light on some partitioning behavior I was wondering about. It also presented some utilities and use cases. I only attended the last 40 minutes or so of this session, but was very pleased.
Of course, the joke of the day was Sun's acquisition by Oracle. So if Giuseppe was saying that "we are rather limited by working on InnoDB partitioning, since they're not our guys - those who are developing InnoDB" - hey, now they are!
Anyway, Giuseppe sent some thick hints about an important announcement tomorrow, after which he will be free to discuss further issues. Will we all be sent home tomorrow, I wonder?
I'm not much into pondering about the acquisition. Ke sera sera, as the song goes. Looking forward for tomorrow's announcement, though.
Tomorrow, Tuesday, will be a much busier day, with lots of interesting sessions, shorter ones. Besides, tomorrow's the day when everyone get over their jet lag!
comments powered by Disqus


The block has a vector of Boolean input signals u[nu] and a vector of (time varying) Boolean expressions expr[:]. The output signal y is set to expr[i], if i is the first element in the input vector u that is true. If all input signals are false, y is set to parameter "y_default" or the previous value of y is kept if parameter use_pre_as_default = true:
// Conceptual equation (not valid Modelica) i = 'first element of u[:] that is true'; y = if i==0 then (if use_pre_as_default then pre(y) else y_default) else expr[i];
The usage is demonstrated, e.g., in example Modelica.Blocks.Examples.BooleanNetwork1.


THE COLLAPSE HAS STARTED
2020 nov 3
Climate change, information warfare, coronavirus, late stage capitalism, automation, economic collapse, wealth inqeuality, cultural incompatability...
Our way of life is being threatened like never before. Most people in the West didn't believe in 'The Collapse' until 2020, but this year has opened the eyes of many who previously didn't believe in conspiracy theories.
Welcome to Collapsr, a service which documents, explains and predicts the progressive decline of society.


PANATUSS PED - chlophedianol hydrochloride, dexchlorpheniramine maleate and pseudoephedrine hydrochloride solution/ drops
Seyer Pharmatec, Inc.
Disclaimer: Most OTC drugs are not reviewed and approved by FDA, however they may be marketed if they comply with applicable regulations and policies. FDA has not evaluated whether this product complies.
Active Ingredients Purpose
(in each 1 mL)
Chlophedianol HCl 6.25 mg ...................... Cough Suppressant
Dexchlorpheniramine Maleate 0.5 mg ......... Antihistamine
Pseudoephedrine HCl 15 mg ................... Nasal Decongestant
Purpose
Cough Suppressant
Antihistamine
Nasal Decongestant
Uses
Temporarily calms cough due to minor throat and bronchial irritation as may occur with the common cold
- calms the cough control center and relieves coughing
- non narcotic cough suppressant for the temporary relief of cough
- temporarily relieves runny nose and alleviates sneezing, itching of the nose or throat and itchy, watery eyes due to hay fever or other upper respiratory allergies
- temporarily relieves nasal congestion due to the common cold
- helps decongest sinus openings and passages; temporarily relieves sinus congestion and pressure
Warnings
- do not exceed recommended dosage
- a persistent cough may be sign of a serious condition. If cough persists for more than 1 week, tends to recur, or is accompanied by fever, rash or persistent headache, consult a doctor
Ask a doctor before use if a child has
- a persistent or chronic cough such as occurs with asthma, chronic bronchitis, or emphysema, or where cough is accompanied by excessive phlegm (mucus) unless directed by a doctor
- heart disease
- high blood pressure
- thyroid disease
- diabetes
- glaucoma
Ask a doctor before use if a child is taking sedatives or tranquilizers.
When using this product
- excitability may occur, especially in children
- may cause marked drowsiness
- sedatives and tranquilizers may increase the drowsiness effect
Do not use
- in a child who is taking a prescription monoamine oxidase inhibitor (MAOI) (certain drugs for depression, psychiatric, or emotional conditions, or Parkinson's disease), or for 2 weeks after stopping the MAOI drug. If you do not know if your child's prescription drug contains an MAOI, ask a doctor or pharmacist before taking this product
Stop use and ask a doctor if
- nervousness, dizziness or sleeplessness occur
- if symptoms do not improve within 7 days or are accompanied by fever, rash or persistent headache.
Keep out of reach of children.In case of overdose, get medical help or contact a Poison Control Center immediately.
Directions
- take every 6 hours, not to exceed 4 doses in 24 hours or as directed by a physician
Children 6 to under 12 years of age
|
2 mL
|
Children 2 to under 6 years of age
|
Ask a doctor
|
Children under 2 years of age
|
Ask a doctor
|
Inactive ingredients
Citric acid, flavor, methylparaben, potassium citrate, potassium sorbate, propylparaben, propylene glycol, purified water, sorbitol, sucralose, xanthan gum
Questions or comments?1-888-782-3585
Seyer Pharmatec, Inc.