For an entrepreneur, the line between horrible mistake and runaway success can be so thin that even Kate Moss would be envious. I lived with Gravatar for nearly four years before that line even became thick enough to measure.
As it’s become one of my favorite parables, I’ll save the details of how I came up with the idea for Gravatar for a future post. What’s important to know is that the idea was spawned not from a business perspective, but from a desperate desire to create something new in the world of blogging.
Spin the clock back four years and you’ll find me sitting at my Windows desktop machine in my underwear with a box of Life cereal to my left and a day old Coke to my right. Since I’d been laid off from my job as a Java developer some months earlier, I’d decided to take the entrepreneurial plunge doing what I knew best: web design. Working in a cone of isolation, I’d become accustomed to waking up late, swinging my legs over the right side of the bed, and in one fluid movement sliding over to the ratty chair I stole from my old college dorm room. I’d spend most of the day working on client projects in ColdFusion or PHP. It was hard work and could become a bit tiresome. I needed an outlet, something that didn’t have a suit on the other end of a telephone telling me how blue was the wrong color and things would be so much better if only the photo had a slightly bigger border. Gravatar would become that outlet for me.
I was really big into web standards at the time, having recently read Zeldman’s seminal work, and became a true believer. Eric Meyers, Dan Cederholm, and Jon Hicks became like gods to me. I worked very hard at making relevant and witty comments around the right kinds of blogs. Being a part of that movement became a significant goal for me. My Movable Type weblog rarely went more than two days days without a post on design or standards.
Two weeks after I had the idea for Gravatar the first version was written and deployed. Every request hit the database and dynamically generated a properly sized gravatar via PHP’s gd2 api. Premature optimization and all that, right? The first thing I did after getting the system to a workable state was email all the bloggers I looked up to (and that had no idea who I was). Blog comments at the time were a pretty dreary affair and I guess Cederholm was intrigued enough by my idea that he linked to it in a sidebar micro-post on simplebits.com.
That single mention kicked off a slow but steady trickle of interest in the system. A few blogs here and there installed the plugin and the world started seeing avatars that mysteriously followed them around.  This was my first nibble at the smorgasbord of what was to become the “horrible mistake” aspect of Gravatar.
Due to the inherently self-advertising nature of gravatars (the “what the hell is that and how do I get one?” brand of advertising), Gravatar adoption increased at a rapid rate. Having crafted the idea for Gravatar without any semblance of business model or growth projection or build-out strategy, things took a rather dramatic dive away from “runaway success” as my server (yes, singular) buckled under the pressure of tens of requests per second! As it turns out, regenerating a gravatar on every request is not very CPU efficient. Gravatars worldwide suddenly turned into little red Xs. Then, in what has become known as the Twitter Effect, a barrage of emails hit me complaining about how the free service on which they had come to depend was down, and how this would adversely impact my well-being.
I fixed the code. Gravatar came back online with caching. All the while I’d had the bright idea that gravatars would be rated for content, MPAA-style. Because users clearly were not fit to rate their own images, I was manually rating 400 or more avatars each day. If I missed a day, I’d have damn near a thousand waiting for me the next day. In addition to the angry mob, I was very fortunate to have an amazingly supportive group of users that volunteered to help me rate images. I owe them my sanity, and it freed up enough time for me to work on the next iteration of the site.
G2, as I called it, would be written in Rails and use lighttpd plus a convoluted directory structure of symlinks to enable me to pre-render every gravatar (1x1 up to 80x80) and serve only static images. I did this to avoid having to rent or buy the kind of hardware necessary to hook up a properly scaled system. Up until the end I ran Gravatar on a maximum of two rented commodity servers that set me back a mere $300/month, a pittance for the kind of traffic I was serving. I say it was a pittance, but that’s not really true. Donations didn’t even come close to covering that cost.
At some point early in the development of G2, Toni Schneider, the CEO of Automattic (the company behind WordPress.com and Akismet) contacted me after hearing my interview about the future of Gravatar on the WordPress podcast. This was exciting news! How perfect a fit would it be for Gravatar to be bought by Automattic? I was already planning a trip up to San Francisco to meet with the Powerset guys, so the timing worked out perfectly for me to meet in person with Toni. I ended up having lunch with Toni and Matt Mullenweg at 21st Ammendment on 2nd Street. It was a bit intimidating to come to the mecca of tech startups to meet with such huge players in the blogging community. Turned out that both Matt and Toni are great guys and so we had drinks for about two hours, talking about my ideas for Gravatar and how we might be able to work together. Everything seemed great—I was jazzed and they seemed excited—but a few weeks later Toni let me know that the timing was wrong and they couldn’t make a play at that time. He suggested I proceed with G2 and they’d proceed with their own avatar system. I was pretty bummed about the outcome, but I took their advice and kept going.
A few weeks before G2 was finished, the site imploded in a big way. One machine. Hundreds of requests per second. That poor CPU must have thought it was the End Times. Instead of wasting time on getting the existing system back up, I put on my headphones, turned it up to eleven, and got back to work on G2.
I’m not sure if you’ve ever had to work on a project while your users are publicly skewering you on your blog for allowing the service to go down, but it’s as close to depression as I’ve ever come. If I’d had less pride, I would have popped everyone a huge middle finger and let the service die, but instead I waded through the hundreds of comments and deleted the ones with threats, hatred, or my favorite, the words “fuck you” repeated 600 times. It wasn’t fair, I told myself, that I should be sitting here with high blood pressure trying to raise Gravatar from the dead while the unappreciative masses do what they do best on the internet.  It was hard to think of the situation as anything but a huge failure, but the shitstorm the downtime was causing indicated that people found the service valuable. I want to say that Twitter went through the same thing, but they suffered their downtime with millions of dollars in the bank. The only thing I had was a full time job unrelated to Gravatar and a credit card that reminded me every month of my bad judgment.
Finally G2 was done, deployed, and fully operational. I have no idea how many users I lost due to the several weeks of downtime, but I don’t think it was very many. There seems to be a corollary to the Twitter Effect that I’d call the Forgiveness Effect. It dictates that if a user enjoys a free service and that service is currently up, all past atrocities will be easily and quickly forgiven. With the site running again, things looked to be shifting back towards a success.
Things were not all rainbows and unicorns though. My Rube Goldbergian architecture had a few quirks that needed to be dealt with. The site still had some elusive bugs from the overly-rapid development cycle. And just like new lanes on freeways always fill up immediately, the two new servers I was running started causing expensive bandwidth overages. I had taken a job at Powerset at this point and the combined pressures of these two commitments started to weigh me down. Once again I started feeling like all the effort I put into Gravatar was for nothing. Like I would never benefit from any of it.
In a last ditch effort to save Gravatar from final doom, I emailed Toni and pitched him again on Gravatar. I figured it was a long shot, but what the hell, couldn’t hurt. Things must have changed in the prior 6 months because Toni was very receptive to the idea. We met again, at 21st Ammendment, and hashed out a tentative deal over drinks. I’d never sold anything like this before, so my technique was probably very amateurish. I’m almost certain I could have gotten a better deal out of it, but I had the smell of desperation about me and I really did want to see Gravatar end up in Automattic’s hands.
Four days later, Automattic made their official offer. On September 21st, 2007 we inked the deal and Gravatar became both the first company that I ever sold and the first company that Automattic ever acquired.
I am quite satisfied with the sale to Automattic. Some will say that I should have pursued VC funding. Indeed, I was contacted by several firms but never travelled very far down that road. I always felt like Gravatar was a feature, and I wasn’t comfortable building a company on such a tiny foundation. Reinforcing this decision, no viable business model ever coalesced during the time I was building the site. It was also made clear by Toni that Automattic would maintain Gravatar as a separate brand and continue its evolution (instead of just absorbing it into WordPress). This appealed to my ego. Most companies kill or maim everything they acquire, but here was a chance for Gravatar to carry forward with all of Automattic’s resources behind it (instead of two measly servers). Part of me just wanted to see what Gravatar could become with time, money, and man-power moving it forward.
Things always seem so clear in retrospect. But it was pride and persistence that kept me in the game long enough to have anything to look back on at all. While the line between horrible mistake and runaway success may be difficult to see, you can still find it if you look hard enough.


RESUME
Adisorn Nakyim (Beer)
Slogan :
Thrust me I am an Engineer.
Contact
Email
<EMAIL_ADDRESS>Line @
: Suckup001
Facebook
:
Beer'r Adisorn
Graduated
attawit commercial technology college
(former)
Studying
I'm a junior information technology student at RMUTTO: CPC
(present)
Skill
Android
HTML
CSS
Experience
2015
IT Support - บริษัทกรุงเทพผลิตเหล็ก (ฝึกงาน)
2016
-
2017
-


---
layout: default
---
Charts Institute for Housing Studies at DePaul University
State of rental housing in Cook County
Figure 1. Annual Composition of Renter Households by Income in the City of Chicago, 2012-2019, 2021
Figure 2. Annual Composition of Renters by Age of Householder in the City of Chicago, 2012-2019, 2021
Figure 3. Distribution of the Rental Supply by Building Type in the City of Chicago, 2012-2019, 2021
Figure 4. The Changing Gap Between the Supply of and Demand for Affordable Rental Housing in the City of Chicago, 2012-2019, 2021
Figure 5. Percent Change in the Affordable Rental Supply and Demand in the City of Chicago Since 2012, 2012-2019, 2021
Figure 6. Share of Renter Households that were Cost Burdened in the City of Chicago, 2012-2019, 2021
Figure 7. Shifts in Rent Burdened Status by Income in the City of Chicago, 2012-2019, 2021
Figure 8. Shifting Dynamics of Affordable Supply and Lower-Income Demand in Chicago Submarkets


This page is intentionally left blank. Please open the javascript console in your developer tools
Remember to save your code before refreshing Chrome to see new changes you've made!


Wichianmas
Wichianmas, some texts, calls Cat Kaew, an ancient Thai cat, texts that the body is black, like painted ink. And a sacred cat Often feasting in the palace since the Ayutthaya period. Ordinary people can not be raised, high value, trading up to one hundred thousand gold. When the second loss of Krungsri Was taken to Burma because he saw it as a valuable asset After that it was lost from Thailand. Later, Somdej Phutthachan Phutthasaro traveled the abandoned city of Ayutthaya. I found the unburned Khoi notebook mentioning this cat. So people were to chase the cat until they found it. Therefore brought the Siamese cat breed back to Thailand
General characteristics
Feature
Hair : The coat is short, tight, white. Or light brown Shellac Or burnt umber in the area Face, both ears, feet, four tails and on the genitals. (Both male and female cats Females), a total of nine places while they are still young kittens. The fur will appear a light cream or off-white color.As you grow older, the color will gradually darken, until it becomes a brown (candy color).
Head : The head is not too round or sharp. Big and flat forehead, short nose, large ears set high on the head.
Eyes : Blue
Tail : Long, pointed, straight The base is large and gradually small, tapering, round until the end of the tail The legs are long and slender in proportion to the body.
Disadvantage
The fur is too long, not tinted all nine places. Tint other than burnt umber Eyes are two different colors or other colors, tilted eyes, broken nose, ears, not too short tail. (When your hind legs stand parallel to the tail The length of the tail is more than 3 inches shorter than the legs). The tail is bent, the tail is bent, the tail is tripped, the tip is too crooked.


Control
What learnings did you take from the chapter
That letting go of your anoyances and frustrations is very important. Its something i am very good at in some aspects in my life and completly unable to do with other aspects, I'll be using the teachings in this chapter to try to get more balance in the difficult areas, I liked they way he talked about concentrating on holding your bad feelings in your hand and then letting them go.
How did you find the two minutes of mindfulness
Some times I find it really easy to do up to 10 minutes and sometimes I just cant stay focused for more than a minute. i have started using the body scan to try to get to sleep.
When you were pair programming, did you exercise any of your emotional intelligence skills?
I honestly didnt need to, we worked really well together. Im sure there will be a time when i need to but this time was realy enjoyable.


We exchange metrics!
- integrate sticky models
- enhance open-source channels
- iterate extensible action-items
- generate leading-edge paradigms
- deploy intuitive web services
- engage innovative systems
- recontextualize extensible partnerships
- embrace viral networks
- architect magnetic markets


Preparation time
less than 30 mins
Cooking time
over 2 hours
Serves
Serves 4-6
Bring a bit of cheer to a cold, drab day by dishing up this simple, hearty stew with dumplings and buttered carrots.
Preheat the oven to 180C/350F/Gas 4.
For the beef stew, heat the oil and butter in an ovenproof casserole and fry the beef until browned on all sides.
Sprinkle over the flour and cook for a further 2-3 minutes. Add the garlic and shallots and fry for 1-2 minutes.
Stir in the wine, stock and herbs, then add the Worcestershire sauce to taste. Season to taste with salt and freshly ground black pepper.
Cover with a lid, transfer to the oven and cook for about two hours, or until the meat is tender.
For the dumplings, sift the flour, baking powder and salt into a bowl. Add the suet and enough water to form a thick dough. With floured hands, roll spoonfuls of the dough into small balls.
After two hours, remove the lid from the stew and place the dumpling balls on top of the stew. Cover, return to the oven and cook for a further 20 minutes, or until the dumplings have swollen and are tender. (If you prefer your dumplings with a golden top, leave the lid off when returning to the oven.)
For the Vichy carrots, place the carrots, butter, sugar and four tablespoons of water into a pan and bring to a simmer.
Cover with a lid or cartouche (a circle of greaseproof paper arranged so that it covers the top of the carrots) and cook gently for 4-5 minutes, or until the carrots are tender. Season with salt and black pepper.
To serve, place a spoonful of the stew onto a plate and place one whole carrot and a dumpling next to it.


Interactive audio journey that is unraveled by the choices you make. Choose a character and follow their perspective throughout the family camping trip to the woods.
Made with love,
Hanaan, Nouf and Oyungerel
Interactive audio journey that is unraveled by the choices you make. Choose a character and follow their perspective throughout the family camping trip to the woods.
Made with love,
Hanaan, Nouf and Oyungerel


AMAZING PEOPLE ARE MAKING DESIGHS IN A FUN ENVIRONMENT
When you with us,you are part of a team of commited collaborators. All aspects of our software development process are intergrated ,interactive
and agile.
Our approach unifies design,development and product management to create exceptional products.
We start each project by understanding your business, the user's need and the product requirements.
Then we help translate them into effective and elegant solutions.
Before we sign a contract or write a line of code our team will spend necessary time needed to understand your product vision
The outcome of this scoping session is proposal or high-level statement of work.
Based on your requirements, we can provide a complete offering or just the pieces you need.
Our design practice offers a full range of services including brands strategy,interaction and visual design and user experience testing.
Throughout your project, our designers create and implement visual design and workflows,social
user feedback and work with you to make sure what gets built is what is needed
All engineers are fluent in the enterprise, mobile and web development technologies.
They collaborate with your team to write and improve code on a daily basis, using proven practices such as test-driven development and pair programming.
Planning and development is interactive, Because we are constantly coding and testing, the product we build are always ready to go live.
This iteractive process allows for changes as business requirements evolve.
DARK
STAR
ONTARIO
SECURITY
PYRAMID
JIM
CURRY
HAVE A
GOOD DAY
MOBILE
APP
BURDED
LOGO
GIRAFFE
RESTAURANT


{% extends 'email/base.html' %}
{% block message %}We have booking awaiting your approval from {{ student_name }} for
Machine: {{ instrument_name }} and Time Slot: {{ slot }} .
The application had been previously approved by {{ faculty_name }} . Please sign-in the portal
to view application details.{% endblock %}


CodeCafe
Full Stack - Mobile & Web - Software Development Company
Projects made as simple as a cup of coffee


{% load static %} {% url 'main:presentation_welink' as presentation %} {% url 'main:api_welink' as api %}
A Named Entity Disambiguation system for queries within Question Answering Systems.
WeLink is a Named Entity Disambiguation system that allows linking the named entities contained in a user query to their corresponding DBpedia resources. WeLink exploits semantic and syntactic features to overcome the context shortness problem.


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object java.io.OutputStream java.io.FilterOutputStream org.apache.tools.zip.ZipOutputStream com.izforge.izpack.util.JarOutputStream
public class JarOutputStream
IzPack will be able to support different compression methods for the packs included in the installation jar file. For this a jar output stream will be needed with which the info data (size, CRC) can be written after the compressed data. This is not possible with the standard class java.util.jar.JarOutputStream. Therefore we create an own class which supports it. Really the hole work will be delegated to the ZipOutputStream from the apache team which solves the problem.
| Field Summary | |
|---|---|
private boolean |
firstEntry
|
private static int |
JAR_MAGIC
|
private boolean |
preventClose
|
| Fields inherited from class org.apache.tools.zip.ZipOutputStream |
|---|
buf, CFH_SIG, DD_SIG, def, DEFLATED, EOCD_SIG, LFH_SIG, STORED |
| Fields inherited from class java.io.FilterOutputStream |
|---|
out |
| Constructor Summary | |
|---|---|
JarOutputStream(java.io.File arg0)
Creates a new JarOutputStream with no manifest. |
|
JarOutputStream(java.io.File fout,
java.util.jar.Manifest man)
Creates a new JarOutputStream with the specified
Manifest . |
|
JarOutputStream(java.io.OutputStream out)
Creates a new JarOutputStream with no manifest. |
| Method Summary | |
|---|---|
void |
close()
Closes this output stream and releases any system resources associated with the stream if isPreventClose is not true. |
void |
closeAlways()
Closes this output stream and releases any system resources associated with the stream also isPreventClose is true. |
private static int |
get16(byte[] b,
int off)
|
private static boolean |
hasMagic(byte[] edata)
|
boolean |
isPreventClose()
|
void |
putNextEntry(org.apache.tools.zip.ZipEntry ze)
Begins writing a new JAR file entry and positions the stream to the start of the entry data. |
private static void |
set16(byte[] b,
int off,
int value)
|
void |
setPreventClose(boolean preventClose)
Determine whether a call of the close method will be performed or not. |
| Methods inherited from class org.apache.tools.zip.ZipOutputStream |
|---|
closeEntry, deflate, finish, flush, getBytes, getEncoding, isSeekable, setComment, setEncoding, setLevel, setMethod, toDosTime, write, write, writeCentralDirectoryEnd, writeCentralFileHeader, writeDataDescriptor, writeLocalFileHeader, writeOut, writeOut |
| Methods inherited from class java.io.FilterOutputStream |
|---|
write |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
private static final int JAR_MAGIC
private boolean firstEntry
private boolean preventClose
| Constructor Detail |
|---|
public JarOutputStream(java.io.OutputStream out) throws java.io.IOException
JarOutputStream
with no manifest.
Using this constructor it will be NOT possible to write
data with compression format STORED to the stream without
declare the info data (size, CRC) at putNextEntry
.
out
- the actual output stream
java.io.IOException
- if an I/O error has occurredpublic JarOutputStream(java.io.File fout, java.util.jar.Manifest man) throws java.io.IOException
JarOutputStream
with the specified
Manifest
. The manifest is written as the first
entry to the output stream which will be created from the
file argument.
fout
- the file object with which the output stream
should be createdman
- the Manifest
java.io.IOException
- if an I/O error has occurredpublic JarOutputStream(java.io.File arg0) throws java.io.IOException
JarOutputStream
with no manifest.
Will use random access if possible.
arg0
- the file object with which the output stream
should be created
java.io.IOException
| Method Detail |
|---|
public void putNextEntry(org.apache.tools.zip.ZipEntry ze) throws java.io.IOException
putNextEntry
in class org.apache.tools.zip.ZipOutputStream
ze
- the ZIP/JAR entry to be written
java.util.zip.ZipException
- if a ZIP error has occurred
java.io.IOException
- if an I/O error has occurredpublic boolean isPreventClose()
public void setPreventClose(boolean preventClose)
preventClose
- The preventClose to set.public void close() throws java.io.IOException
close
in interface java.io.Closeable
close
in class org.apache.tools.zip.ZipOutputStream
java.io.IOException
- if an I/O error occurs.public void closeAlways() throws java.io.IOException
java.io.IOException
- if an I/O error occurs.private static boolean hasMagic(byte[] edata)
private static int get16(byte[] b, int off)
private static void set16(byte[] b, int off, int value)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Weathermaster:
Choose a project:
M_21.Starstone
M_23.Pa'agrio's Fire
M_30.Shilen's Water
M_38.Piece of Life
M_50. Crystal of Light
...
.


Question_A: Prof. Jordi Gali considers the asset pricing equations to derive important results in Equation (3) assuming similar stochastic discount factor for both Equations (1) and (2). This assumption is very questionable as the stochastic discount factor
is a random variable that may depend on the utility function considered by each Central Bank and importantly, on the probability that is postulated to define the likelihood on the possible outcomes in the economy given the initial state of the economy?
Determinants of Exchange Rates
Using one-time-period framework and finite states-of-the-world, one can derive a formulation of the stochastic discount factor via expected utility maximization that is specific to the considered economy. Using this formulation as in the work Forward Guidance and the Exchange Rate, the ratio [E_(t+1)/E_(t)]* can be expressed
approximatively as the product of two fundamental factors, one is representing the ratio between the interest rates of the two considered Central Banks and the second is related to the marginal utilities and deflators between the two considered Central Banks(to be published).
*E_(t) is the exchange rate at time t.
Automated Numerical Reasoning Framework for Major World Currencies
The aim of this work is to provide some empirical evidence to the Question_A by conducting a Machine Learning Analysis on the observed exchange rate time series in four well-established Central Banks. This analysis is to assess also this related question:
How to identify patterns & classifications in currency time series data provided by Central Banks?
One is mainly interested by detecting the most depreciated, appreciated and cyclic during a given period of time.
Most time series analysis techniques consider some form of statistical assumptions(questionable) and filtering out noise(what is noise?) in order to make the pattern more salient.
Using new technique based on Machine Learning/Graph Theory, not necessary depending on unrealistic assumptions, provides more robust solutions. Importantly, this technique provides insights about their temporal inter-connexions as a graph(see posted image) with an associated stationary distribution.
The numerical analysis "Using Raw Exchange Rate Time Series: E_(t)" and "Using Ratio Exchange Rate Time Series: [E_(t+1)/E_(t)]" uses data from Central Bank of Europe, Central Bank of England, FRED and Central Bank of Canada.


The goal for this experiment is to assess whether calf thymus DNA is sufficient in vitro to yield a disparity between \(D_{ap}\) and \(D_{phys}\). I will do this by comparing IDAs coated in 1% agarose +/- 1mg/mL ctDNA. If this experiment is successful it will help us to determine whether the disparity we observe for the biofilm is due to physical diffusion only (influenced by the heterogeneity of the biofilm) or truly self-exchange. This in vitro system should recapitulate the biofilm, but will be far more homogeneous.
First, I anticipate that we will observe a difference in the decays +/- DNA. Hopefully, enough of the PYO will bind to the DNA that diffusion is slowed. If no difference is observed between the two conditions then I think we will have to reassess how to approach the in vitro system.
Second, the DNA may yield a disparity between Dap and Dphys - this would support the self-exchange model. Alternatively, the DNA may look different than no DNA, but not yield a difference. This would support the diffusion only model, where the geometry of the biofilm is causing an artifactual \(D_{phys}\)
2% agarose will be prepared in PBS 50. Then the molten 2% agar will be combined 1:1 with either ctDNA (2mg/mL) or just PBS 50. 50uL droplets will be deposited on the IDA and solidified for 15min.
Then IDAs will be immersed in a 75uM PYO solution. The influx of PYO will be monitored by SWV only every ~10min to avoid unnecessary buildup on the electrode and incubated for at least 30min to insure PYO equilibrates into the gel. Then the IDA will be directly transferred into fresh medium and the macro will be started to acquire the SWV / GC data. Based on past data I expect this transfer acquisition to take at least 1 hour.
library(htmltools)
base_path="https://scott-saunders.github.io/labwork/IDA/08_13_19_agarose_ctDNA/"
files <- dir(path=".", pattern = "*\\.html$",include.dirs = T,recursive = T)
for(link in files){
print(
tags$a(href = paste(base_path, link, sep=''), link)
)
writeLines("")
}
analysis/08_13_19_agarose_ctDNA_analysis.html


{% include head.html %}
{% include analytics.html %}
{{ site.name }}
| To The Point
Digital Analytics, Optimization, and Marketing
{% include topnav.html %}
{{ content }}
{% include navbar.html %}


|
ML-Agents Toolkit
v0.4
|
An Academy is where Agent objects go to train their behaviors. More...
Inherits MonoBehaviour.
Public Member Functions | |
| virtual void | InitializeAcademy () |
| Initializes the academy and environment. More... | |
| virtual void | AcademyStep () |
| Specifies the academy behavior at every step of the environment. More... | |
| virtual void | AcademyReset () |
| Specifies the academy behavior when being reset (i.e. More... | |
| bool | GetIsInference () |
| Returns the isInference flag. More... | |
| void | SetIsInference (bool isInference) |
| Sets the isInference flag to the provided value. More... | |
| int | GetEpisodeCount () |
| Returns the current episode counter. More... | |
| int | GetStepCount () |
| Returns the current step counter (within the current episode). More... | |
| int | GetTotalStepCount () |
| Returns the total step counter. More... | |
| void | Done () |
| Sets the done flag to true. More... | |
| bool | IsDone () |
| Returns whether or not the academy is done. More... | |
| bool | IsCommunicatorOn () |
| Returns whether or not the communicator is on. More... | |
Public Attributes | |
| BroadcastHub | broadcastHub = new BroadcastHub() |
| ResetParameters | resetParameters |
| Contains a mapping from parameter names to float values. More... | |
| CommunicatorObjects.CustomResetParameters | customResetParameters |
Protected Member Functions | |
| virtual void | OnDestroy () |
| Cleanup function More... | |
Events | |
| System.Action | BrainDecideAction |
| System.Action | DestroyAction |
| System.Action< bool, bool, int > | AgentSetStatus |
| System.Action | AgentResetIfDone |
| System.Action | AgentSendState |
| System.Action | AgentAct |
| System.Action | AgentForceReset |
An Academy is where Agent objects go to train their behaviors.
 Currently, this class is expected to be extended to implement the desired academy behavior.
When an academy is run, it can either be in inference or training mode. The mode is determined by the presence or absence of a Communicator. In the presence of a communicator, the academy is run in training mode where the states and observations of each agent are sent through the communicator. In the absence of a communciator, the academy is run in inference mode where the agent behavior is determined by the brain attached to it (which may be internal, heuristic or player).
|
virtual |
Specifies the academy behavior when being reset (i.e.
at the completion of a global episode).
|
virtual |
Specifies the academy behavior at every step of the environment.
| void Done | ( | ) |
Sets the done flag to true.
| int GetEpisodeCount | ( | ) |
Returns the current episode counter.
| bool GetIsInference | ( | ) |
Returns the isInference flag.
true
, if current mode is inference, false
if training. | int GetStepCount | ( | ) |
Returns the current step counter (within the current episode).
| int GetTotalStepCount | ( | ) |
Returns the total step counter.
|
virtual |
Initializes the academy and environment.
Called during the waking-up phase of the environment before any of the scene objects/agents have been initialized.
| bool IsCommunicatorOn | ( | ) |
Returns whether or not the communicator is on.
true
, if communicator is on, false
otherwise. | bool IsDone | ( | ) |
Returns whether or not the academy is done.
true
, if academy is done, false
otherwise.
|
protectedvirtual |
Cleanup function
| void SetIsInference | ( | bool | isInference | ) |
Sets the isInference flag to the provided value.
If the new flag differs from the current flag value, this signals that the environment configuration needs to be updated.
| isInference | Environment mode, if true then inference, otherwise training. |
| BroadcastHub broadcastHub = new BroadcastHub() |
| CommunicatorObjects.CustomResetParameters customResetParameters |
| ResetParameters resetParameters |
Contains a mapping from parameter names to float values.
They are used in AcademyReset and AcademyStep to modify elements in the environment at reset time.
Default reset parameters are specified in the academy Editor, and can be modified when training with an external Brain by passinga config dictionary at reset.
| System.Action AgentAct |
| System.Action AgentForceReset |
| System.Action AgentResetIfDone |
| System.Action AgentSendState |
| System.Action<bool, bool, int> AgentSetStatus |
| System.Action BrainDecideAction |
| System.Action DestroyAction |


A four piece stoner rock/doom band from Essex. Heavy, catchy riffs, groovy as hell, louder than your car crash. Turn on, tune down, rock out!
NEWS: Album release party! Our first album is almost here. Come to the Soundhouse in Colchester to have a listen!Just a limited number of t-shirts. Only a few left people! Buy now or regret!.
You can find us on Facebook or bandcamp. Feel free to contact, ask for gigs dates, merch, news, whatever.


Napa
Welcome to Districtr! This is a free community webtool for redistricting and community mapping provided by the MGGG Redistricting Lab at Tufts University. We welcome your questions about Districtr and the maps that you create of the City of Napa, Napa County, and Napa Valley Unified School District<EMAIL_ADDRESS>Election Reform in Napa
- The City of Napa is switching from electing city council seats at-large, to individual districts each with one or more members.
- The Napa Valley Unified School District is considering switching from electing the Board of Education trustees at-large, to seven districts each with one member.
Try Drawing Districts
We invite you to use Districtr to draw your own districts and think about some of the tradeoffs for yourself. You can build 4 City Council Districts, 5 City Council Districts, or 7 City Council Districts using census blocks as the basic building blocks.


{% extends 'ui/page.html' %} {% load markdown_deux_tags %} {% block title %}Call for papers - {{ cfp.event.extended_title }}{% endblock %} {% block content %}
This call for papers ends on {{ cfp.end_date|date }}.
Fields marked with Public are meant to be shared publicly once your talk is announced.


Client Profile Report
Update client |
Client profile report |
QR profile
Risk Rating: {{riskFactorPercent}}
{{#if riskFactorPercentHigh}}
HIGH
{{/if}}
{{#if riskFactorPercentMedium}}
Moderate Risk
{{/if}}
{{#if riskFactorPercentLow}}
Low Risk
{{/if}}
{{#with exampleDoc}}
{{firstName}} {{lastName}}
Veteran: {{veteran}}
{{#if pregnant}}
Pregnant: true
{{/if}}
{{#if historyOfDomesticViolence}}
History Of Domestic Violence: {{historyOfDomesticViolence}}
{{/if}}
{{#if currentlyHomeless}}
Currently homeless: true
{{/if}}
{{#if hivaids}}
HIV Positive/AIDS: true
{{/if}}
{{#if abusedSubstance}}
Abused Substance: {{abusedSubstance}}
{{/if}}
{{#if educationalLevel}}
Educational Level: {{educationalLevel}}
{{/if}}
Addresses
{{#each address}}
{{startDate}} {{endDate}}
{{street}}, {{address.city}} {{address.state}} {{address.postalCode}}
{{/each}}
Family Contacts
{{#each familyContacts}}
{{name}} ({{phone}})
{{/each}}
Disability
{{#each disability}}
{{name}} ({{type}})
{{/each}}
{{/with}}


Posted by Pengyu on January 29, 2016
Posted by Pengyu on December 4, 2015
Posted by Pengyu on November 27, 2015
Posted by Pengyu on November 17, 2015
Posted by Pengyu on October 27, 2015
Posted by Pengyu on September 1, 2015
Posted by Pengyu on July 31, 2015


Login
Job Application Portal
Registration Page
Username
Password
Emaild
Location
Phone
User type
Company
Job Seeker
Register


Meet the
new
Meetup
Quickstart
Create an Account
Find a Meetup
Set if you're going
Post Questions
Comment Quentions
Vote Questions
Sign up
Sign up
Already a member?
Sign in


8000 recycled cups - Only half the number used in a week by this office and many others like it. The Interactive Architecture Lab, UCL has installed this work to raise awareness and challenge you to think about the waste we produce everyday.
Commissioned by Bank of America Merrill Lynch and their arts partner Create London


| I | Feel | Jesus | - | 我 | 知 耶 | 穌 | |||
| I | Feel | Jesus | - | wǒ | zhī yē | sū | |||
| I | Feel | Jesus | - | I | Know ye | revive |
Carman
I feel Jesus I feel Jesus
我 | 知 耶 | 穌 | 我 | 知 耶 | 穌 | ||
wǒ | zhī yē | sū | wǒ | zhī yē | sū | ||
| I | Know ye | revive | I | Know ye | revive |
I feel Jesus in this place
我 | 知 耶 | 穌 在 | 這 | 裡 | ||
wǒ | zhī yē | sū zài | zhè | lǐ | ||
| I | Know ye | He was in | this | inside |
Yes, my soul does burn with in me
我 | 心 | 為 | 祢 | 深 深 | 點 燃 | ||
wǒ | xīn | wèi | ní | shēn shēn | diǎn rán | ||
| I | heart | do | you | deeply | ignite |
I feel Jesus in this place
我 | 知 耶 | 穌 在 | 這 | 裡 | ||
wǒ | zhī yē | sū zài | zhè | lǐ | ||
| I | Know ye | He was in | this | inside |


AS Group is a leading motorbike rental company that offers a diversified and exceptional range of two-wheelers on rent. Bike riders who have a spirit governed by an intense passion to ride different bikes have just landed in the right place. We are regarded as one of the best bike rental companies in India due to our personalized service and higher commitment levels. We have a huge store of exclusive bikes where riders can choose to ride on an hourly, daily, weekly or monthly basis. You can go on a long ride and have an enjoyable trip for consecutive days by hiring your favourite bikes on rent. Our company offers competitive pricing and optimum quality bikes that provide an exquisite experience for all.
We have a pool of bikes to suit various requirements and specifications of customers. Our customer-oriented approach enables us to fulfill your distant dreams and serve beyond your expectations levels. Our unique deals and perfect offers have helped us gain absolute trust and reliance of customers. We have continuously been upgrading our online store with the new and latest collection of bikes. You can now choose bikes within your budgets and preferences. We believe in seeing our customers happy and satisfied with our service. With RenTrip you can rent bikes in Alibag-varsoli,revdanda,chaul,murud,nagoan. Pune-junner,maval.
AS Group is a leading motorbike rental company that offers a diversified and exceptional range of two-wheelers on rent. Bike riders who have a spirit governed by an intense passion to ride different bikes have just landed in the right place. We are regarded as one of the best bike rental companies in India due to our personalized service and higher commitment levels. We have a huge store of exclusive bikes where riders can choose to ride on an hourly, daily, weekly or monthly basis. You can go on a long ride and ...


grpc_signal_handler_set_np
- Set the signal handler.
grpc_error_t grpc_signal_handler_set_np(int sig_num, void (*sig_handler)(int))
int sig_num
void (*sig_handler)(int))
The grpc_signal_handler_set_np() function modifies signal dispositions for Ninf-G Client.
Procedures for signal handling differs according to environments and a signal to be processed.
Ninf-G has signal handling thread which supports the signals except SIGKILL, SIGSEGV, SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGIOT, SIGPIPE, SIGEMT, SIGSYS, SIGTRAP, SIGSTOP, SIGCONT and SIGWAITING.
If sig_num is supported by a Ninf-G signal handling thread, sig_handler is called by the signal handling thread. Otherwise, sig_handler is called as a signal handler registered by sigaction().
Note: For pthread flavor on MacOS X, Ninf-G Client processes SIGSTP as well.
sig_handler is called as a signal handler registered by sigaction().
It is unsafe to call some system calls from the signal handler registered by sigaction(). A list of safe system calls is available on the following web page and IEEE Std 1003.1(POSIX).
http://www.opengroup.org/onlinepubs/007908799/xsh/sigaction.html
This function is MT-safe.
If successful, GRPC_NO_ERROR is returned. In the case of an error, Error code is returned.
GRPC_NOT_INITIALIZED
GRPC_OTHER_ERROR_CODE


Class represents connected Client.
More...
#include <client.h>
Class represents connected Client.
Definition at line 21 of file client.h.
| Client::Client |
( |
int |
clientSocket = 0 , |
|
|
string |
clientName = "" |
|
) |
| |
Constructor of class Client.
- Parameters
-
| int | clientSocket |
| string | name |
Definition at line 20 of file client.cpp.
| int Client::getClientSocket |
( |
| ) |
|
Getter for clientSocket attribute.
- Returns
- int clientSocket
Definition at line 87 of file client.cpp.
| sockaddr_in Client::getClientSocketOpts |
( |
| ) |
|
Getter for clientSocketOpts attribute.
- Returns
- sockaddr_in clientSocketOpts
Definition at line 95 of file client.cpp.
| string Client::getName |
( |
| ) |
|
Getter for name attribute.
- Returns
- string name
Definition at line 103 of file client.cpp.
Getter for uid attribute.
- Returns
- int uid
Definition at line 79 of file client.cpp.
| bool Client::isActive |
( |
| ) |
|
Getter for active attribute.
- Returns
- bool active
Definition at line 111 of file client.cpp.
Getter for owner attribute.
- Returns
- bool owner
Definition at line 119 of file client.cpp.
| void Client::setActive |
( |
bool |
active = true | ) |
|
Setter for clientSocketOpts attribute.
- Parameters
-
| sockaddr_in | clientSocketOpts |
Definition at line 63 of file client.cpp.
| void Client::setClientSocketOpts |
( |
sockaddr_in |
clientSocketOpts | ) |
|
Setter for clientSocketOpts attribute.
- Parameters
-
| sockaddr_in | clientSocketOpts |
Definition at line 47 of file client.cpp.
| void Client::setName |
( |
string |
name | ) |
|
Setter for name attribute.
- Parameters
-
Definition at line 55 of file client.cpp.
| void Client::setOwner |
( |
bool |
owner = true | ) |
|
Setter for owner attribute.
- Parameters
-
Definition at line 71 of file client.cpp.
| void Client::setUID |
( |
int |
uid | ) |
|
Setter for uid attribute.
- Parameters
-
Definition at line 39 of file client.cpp.
The documentation for this class was generated from the following files:


Change Log: 2.088.0
Download D 2.088.0
released Sep 01, 2019
Compiler changes
- D1 operator overloads have been deprecated.
- Deprecate allowing a constructor declaration in a static block
- deprecated now applies to alias this as well
- Double initialization of immutable fields inside constructor is now obsolete
- add __traits(getLocation, symbol)
- Suppress the "read-modify-write" error if type is a struct or a class
- Postblit and destructors are no longer called on members of anonymous unions.
Runtime changes
- core.atomic : msync has been removed
- Added overloads for core.atomic.cas which don't discard their result.
- Added core.atomic.atomicExchange.
- Non-POSIX CLOCK enum members have been removed from core.sys.posix.time
- The druntime option callStructDtorsDuringGC has been deprecated.
- core.sys.posix.dlfcn : dladdr, dlvsym, Dl_info have been removed
- core.exception: Remove onHiddenFuncError / HiddenFuncError
- core.exception : setAssertHandler has been removed
- core.thread : Fiber.call(bool) has been removed
- Module core.sys.linux.sys.netinet.tcp has been removed
- core.runtime : Runtime.initialize, Runtime.terminate functions taking ExceptionHandler have been removed
- Added core.stdcpp.string.
- Added core.stdcpp.vector.
Library changes
Installer changes
List of all bug fixes and enhancements in D 2.088.0.
Compiler changes
- D1 operator overloads have been deprecated.
The following D1 operator overloads have been deprecated in favor of opUnary:
- opNeg Replace with opUnary(string op)() if (op == "-")
- opCom Replace with opUnary(string op)() if (op == "~")
- opPostInc Replace with opUnary(string op)() if (op == "++")
- opPostDec Replace with opUnary(string op)() if (op == "--")
- opStar Replace with opUnary(string op)() if (op == "*")
The following D1 operator overloads have been deprecated in favor of opBinary:
- opAdd Replace with opBinary(string op)(...) if (op == "+")
- opSub Replace with opBinary(string op)(...) if (op == "-")
- opMul Replace with opBinary(string op)(...) if (op == "*")
- opDiv Replace with opBinary(string op)(...) if (op == "/")
- opMod Replace with opBinary(string op)(...) if (op == "%")
- opAnd Replace with opBinary(string op)(...) if (op == "&")
- opXor Replace with opBinary(string op)(...) if (op == "^")
- opOr Replace with opBinary(string op)(...) if (op == "|")
- opShl Replace with opBinary(string op)(...) if (op == "<<")
- opShr Replace with opBinary(string op)(...) if (op == ">>")
- opUShr Replace with opBinary(string op)(...) if (op == ">>>")
- opCat Replace with opBinary(string op)(...) if (op == "~")
- opIn Replace with opBinary(string op)(...) if (op == "in")
The following D1 operator overloads have been deprecated in favor of opBinaryRight:
- opAdd_r Replace with opBinaryRight(string op)(...) if (op == "+")
- opSub_r Replace with opBinaryRight(string op)(...) if (op == "-")
- opMul_r Replace with opBinaryRight(string op)(...) if (op == "*")
- opDiv_r Replace with opBinaryRight(string op)(...) if (op == "/")
- opMod_r Replace with opBinaryRight(string op)(...) if (op == "%")
- opAnd_r Replace with opBinaryRight(string op)(...) if (op == "&")
- opXor_r Replace with opBinaryRight(string op)(...) if (op == "^")
- opOr_r Replace with opBinaryRight(string op)(...) if (op == "|")
- opShl_r Replace with opBinaryRight(string op)(...) if (op == "<<")
- opShr_r Replace with opBinaryRight(string op)(...) if (op == ">>")
- opUShr_r Replace with opBinaryRight(string op)(...) if (op == ">>>")
- opCat_r Replace with opBinaryRight(string op)(...) if (op == "~")
- opIn_r Replace with opBinaryRight(string op)(...) if (op == "in")
The following D1 operator overloads have been deprecated in favor of opOpAssign:
- opAddAssign Replace with opOpAssign(string op)(...) if (op == "+")
- opSubAssign Replace with opOpAssign(string op)(...) if (op == "-")
- opMulAssign Replace with opOpAssign(string op)(...) if (op == "*")
- opDivAssign Replace with opOpAssign(string op)(...) if (op == "/")
- opModAssign Replace with opOpAssign(string op)(...) if (op == "%")
- opAndAssign Replace with opOpAssign(string op)(...) if (op == "&")
- opOrAssign Replace with opOpAssign(string op)(...) if (op == "|")
- opXorAssign Replace with opOpAssign(string op)(...) if (op == "^")
- opShlAssign Replace with opOpAssign(string op)(...) if (op == "<<")
- opShrAssign Replace with opOpAssign(string op)(...) if (op == ">>")
- opUShrAssign Replace with opOpAssign(string op)(...) if (op == ">>>")
- opCatAssign Replace with opOpAssign(string op)(...) if (op == "~")
Starting with this release, any D code that triggers a lowering to the D1 operator overloads will emit a deprecation warning.
Example of deprecation warning:
struct S { int opAdd(int i) { ... } } void main() { S s; int i; i = s + 1; // Deprecation: `opAdd` is deprecated. Use `opBinary` instead. }
Example of corrective action:
struct S { int opBinary(string op)(int i) if (op == "+") { ... } } void main() { S s; int i; i = s + 1; // OK }
- Deprecate allowing a constructor declaration in a static block
The language specification states that a static constructor is defined using the construction static this(). Defining a constructor inside a static block does not have any effect on the constructor. The following code does not affect the constructor in any way:
static: this() {}
static { this() {} }
The compiler does not issue any warning/error on the above code samples and generates a normal constructor which is not ran before the main function. This leads to situations in which the compiler is not able to correctly indicate the problem:
class A { static { this() {} } this() {} } void main() { new A(); }
This code will result in an error message indicating that there is a multiple definition of the constructor this() which is a misleading message.
Beginning with this release, whenever a constructor is encountered in a static context an error message is emitted stating that the static keyword does not have any effect on the constructor. The solution is to declare the constructor outside the static block either as a normal constructor or a static one (static this()).
- deprecated now applies to alias this as well
Before this release, deprecated on alias this was accepted by the parser but did not trigger a deprecation mesage on usage.
- Double initialization of immutable fields inside constructor is now obsolete
Inside a constructor scope, assigning to aggregate declaration (class/struct) members is done by considering the first assignment as initialization and subsequent assignments as modifications of the initially constructed object. For const/immutable fields the initialization is accepted in the constructor, but subsequent modifications are not. Example:
class A { int a; immutable int b; this(int a, int b) { this.a = a; this.b = b; this.a = 7; // OK, a is mutable this.b = 9; // Error: immutable field b initialized multiple times } }
However, Bugzilla 18719 shows that this rule does not apply when inside a constructor scope there is a call to a different constructor:
class A { immutable int a; this() { this(42); this.a = 5; // second initialization of immutable field } this(int a) { this.a = a; } }
The above code wrongfully compiled succesfully before this patch, accepting the double initialization of the immutable field a. Starting with this release, this.a = 5 will emit an error stating that a is initialized multiple times.
- add __traits(getLocation, symbol)
Takes one argument which is a symbol. Returns a tuple(string, int, int) whose entries correspond to the filename, line number and column number where the argument was declared.
To disambiguate between overloads, pass the result of getOverloads with the desired index, to getLocation:
module m; int foo(); int foo(int); enum loc = __traits(getLocation, __traits(getOverloads, m, "foo")[0]);
- Suppress the "read-modify-write" error if type is a struct or a class
If a struct or class with shared type implements the opUnary or opOpAssign operator then it is possible to perform "read-modify-write" operations because the operator's implementation is supposed to perform atomic operations.
The purpose of this modification is to allow the creation of wrappers (with structs or classes) to run atomic operations silently, for example:
shared struct Atomic { int a; int opUnary(string s)() if (s == "++") { import core.atomic : atomicOp; return atomicOp!"+="(a, 1); } } Atomic atomicvar; atomicvar++; // Safe! Atomic struct implements opUnary
- Postblit and destructors are no longer called on members of anonymous unions.
Due to a bug in dmd, members of anonymous unions inside struct declarations had their postblits/destructors called when an object of the containing struct type was copied/destroyed. With this release, the postblit/destructor is no longer called in such situations.
Fixes: https://issues.dlang.org/show_bug.cgi?id=19122
Runtime changes
- core.atomic : msync has been removed
It had been deprecated in 2.061 in favor of MemoryOrder.
- Added overloads for core.atomic.cas which don't discard their result.
Existing core.atomic.cas functions discard the result, which make it impossible to implement certain operations. A new set of overloads was added which take ifThis by pointer and write the result back to the argument.
- Added core.atomic.atomicExchange.
Added missing core.atomic.atomicExchange function to the atomic suite.
- Non-POSIX CLOCK enum members have been removed from core.sys.posix.time
Namely CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC_COARSE (linux), CLOCK_MONOTONIC_PRECISE, CLOCK_MONOTONIC_FAST (FreeBSD, DragonflyBSD), and CLOCK_MONOTONIC_COARSE (CRuntime_Glibc). Those were deprecated in 2.067. They are available on their respective platform modules.
- The druntime option callStructDtorsDuringGC has been deprecated.
Starting with this release utilizing the callStructDtorsDuringGC runtime option will result in a deprecation message printed to stderr. The option will be removed in a future release.
- core.sys.posix.dlfcn : dladdr, dlvsym, Dl_info have been removed
They are linux extensions, not POSIX, and thus can be found in core.sys.linux.dlfcn. They had been deprecated since 2.063.
Those have been deprecated since 2.068, and are related to a language feature that is long gone.
- core.exception : setAssertHandler has been removed
It had been deprecated in 2.064 in favor of assertHandler.
- core.thread : Fiber.call(bool) has been removed
This had been deprecated since 2.068 in favor of Fiber.call(Rethrow.[Yes|No]).
- Module core.sys.linux.sys.netinet.tcp has been removed
This module had been deprecated since 2.077.0. core.sys.linux.netinet.tcp should be imported instead.
- core.runtime : Runtime.initialize, Runtime.terminate functions taking ExceptionHandler have been removed
They were deprecated since 2.065 in favor of rt_init C functions, which allow to initialize the runtime from C code.
- Added core.stdcpp.string.
Added core.stdcpp.string, which links against C++ std::basic_string
Known issues:
Currently, the GCC (libstdc++) implementation has a known issue with the modern __cxx11 ABI, because the C++ struct contains an interior pointer which is illegal in D, and incompatible with D move semantics. To use core.stdcpp.string on linux/GCC, you must use the old string ABI by supplying -D_GLIBCXX_USE_CXX11_ABI=0 to g++, and also -version=_GLIBCXX_USE_CXX98_ABI to your D compiler. Work to define D move constructors is ongoing and expected to resolve this issue when it arrives.
- Added core.stdcpp.vector.
Added core.stdcpp.vector, which links against C++ std::vector
Library changes
- std.array.Appender and RefAppender: use .opSlice() instead of data()
Previonsly, Appender.data() was used to extract a slice of the Appender's array. Now use the [] slice operator instead. The same goes for RefAppender.
- ErrnoException.errno is now nothrow pure @nogc @safe
Before, it was just @system. As it turns out, all it does is return the value of an integer field, so it can have all these attributes.
- Nullable alias get this has been deprecated
Nullable's feature of implicitly converting to its contained value has been marked deprecated.
All sites where a Nullable!T is implicitly converted to T, potentially throwing an error at runtime, will now produce a deprecation warning or error with -de.
To fix this, explicitly use .get to access the contained value of the Nullable.
alias get this is the only implicit conversion in D that may throw an error. Since it is an implicit conversion, it can easily be used accidentally and lead to unexpected runtime errors. By explicitly invoking get, the developer acknowledges that the operation has a chance of error. Conversely, by not implicitly converting Nullable!T to T, the compiler gives the developer a chance to spot forgotten isNull checks.
This feature will be removed after release 2.096.
- Added the std.file.getAvailableDiskSpace functionality.
std.file.getAvailableDiskSpace receives as a parameter the path of a file or directory in the file system, and returns the available disk space on the mounted filesystem. If the given path is nonexistent, an exception is thrown.
import std.file; ulong size = getAvailableDiskSpace("."); assert(size > 0);
import std.file; assertThrown(getAvailableDiskSpace("NonExistentFile"));
- Allow std.json to overlook trailing comma
The JSON grammar does not allow trailing commas, however they are accepted by many JSON parsers. std.json now ignores trailing commas as well. Use JSONOptions.strictParsing to disable this behavior.
import std.json; import std.exception : assertThrown, assertNotThrown; // before assertThrown(parseJSON(`{ "a" : { } , }`)); // after assertNotThrown(parseJSON(`{ "a" : { } , }`));
Installer changes
- Bundled libcurl is now built with DONT_USE_RECV_BEFORE_SEND_WORKAROUND
The bundled libcurl is now build with DONT_USE_RECV_BEFORE_SEND_WORKAROUND. See #399 for details.
Dub changes
- Support for dub global settings file at the root package level
Dub settings file can now also be added to project root folder and has the highest priority.
List of all bug fixes and enhancements in D 2.088.0:
DMD Compiler regressions
- Bugzilla 20021: static if doesn't evaluate opCast(T : bool)
- Bugzilla 20057: compiler hang on conflicting local and imported template
- Bugzilla 20136: opEquals not recognized for AA key
DMD Compiler bugs
- Bugzilla 1142: .stringof performs semantic analysis
- Bugzilla 7443: Better diagnostic on wrongly written static constructor
- Bugzilla 9884: Refused initialization of const array in the module static this()
- Bugzilla 15795: bogus "conflicts with" error depending on order of declaration
- Bugzilla 15818: Multiple function declarations without definition cause ambiguity overloading error
- Bugzilla 18719: Doubly-called constructor against member when using forwarding constructors
- Bugzilla 18729: dmd -run executes in different environment
- Bugzilla 19122: Postblits and destructors called on members of anonymous unions
- Bugzilla 19315: #line inside token string affect outside code
- Bugzilla 19534: Wrong error message "only one index allowed to index int"
- Bugzilla 19646: Initialization of globals not checked for @safe
- Bugzilla 19919: Incorrect initialization of union when first member isn't marked = void
- Bugzilla 19925: static opDispatch not considered in WithStatement
- Bugzilla 19931: Missing error message when defining postblit, rvalue constructor and copy constructor
- Bugzilla 19968: @safe code can create invalid bools resulting in memory corruption
- Bugzilla 20001: Error: a struct is not a valid initializer for a _error_
- Bugzilla 20033: alias this does not support deprecated attribute
- Bugzilla 20047: call of static nested function ignores purity
- Bugzilla 20050: pure function should be able to return function pointer to impure static nested function
- Bugzilla 20073: Wrong implicit conversion for return type
- Bugzilla 20074: header file generation doesn't include attributes with CallExp
- Bugzilla 20096: error message 'cannot goto into try block' is followed by seg fault
- Bugzilla 20100: Segfault with checkaction=context on struct comparison
- Bugzilla 20108: -dip1000 defeated by auto
- Bugzilla 20113: Cannot find source code for runtime library file 'object.d' when the path contains '~'
DMD Compiler enhancements
- Bugzilla 1252: Inline assembler could support BasicType properties
- Bugzilla 18665: Deprecate Undocumented Operator Overloads
- Bugzilla 19917: unions should require that all members are = void initialised
- Bugzilla 19969: Unhelpful error when attempting (incorrectly) to append to a string
- Bugzilla 20000: Casting to interfaces disallowed in @safe code
- Bugzilla 20024: "No property x for type Y" error not as helpful as it should be
- Bugzilla 20037: Imports in module info should be deduplicated
- Bugzilla 20053: add mixin types
- Bugzilla 20059: mismatched function return type inference should give location of inferred type
Phobos bugs
- Bugzilla 19823: std.algorithm.iteration.filter's popFront doesn't always pop the first element like it's supposed to
- Bugzilla 19980: File.byLine skips first line in some cases when used inside map!()
- Bugzilla 19986: Can't assign large const T to std.Variant.VariantN
- Bugzilla 19987: std.variantN wastes space
- Bugzilla 20064: format separator fails with leading zeros
- Bugzilla 20097: SysTime cannot be used with std.concurrency.send
- Bugzilla 20129: AA require with File values gives "Error: return expression expected" in object.d
Phobos enhancements
- Bugzilla 16487: Add function to obtain the available disk space
- Bugzilla 19834: File exception for [std.file.copy] on windows shows the target file rather than the source file
- Bugzilla 19979: std.regex should return null instead of zero-length slice for non-matched captures
- Bugzilla 19983: Add fast path using slice assignment to std.internal.cstring.tempCString
- Bugzilla 19994: Can't nest self-referential Algebraic types
- Bugzilla 20069: std.format digit grouping separator (aka thousands separator) needs to be revisited
- Bugzilla 20098: Improve result of printing std.regex compiled pattern
Druntime bugs
- Bugzilla 20066: Assertion on void[] does not compile with -checkaction=context
- Bugzilla 20088: void[] cast unusable in betterC due to new __ArrayCast template
Druntime enhancements
- Bugzilla 19976: Simplify std.internal.convert.toUbyte CTFE path for float and double
- Bugzilla 20104: core.atomic has no exchange function
- Bugzilla 20122: core.atomic.cas discards result on failure
dlang.org bugs
- Bugzilla 19402: specs for promotion rule of shift exp is wrong
- Bugzilla 19944: Some examples on std.file docs page raise FileException
Contributors to this release (58)
A huge thanks goes to all the awesome people who made this release possible.
- aG0aep6G
- Alexibu
- Andrei Alexandrescu
- Atila Neves
- Basile Burg
- Basile-z
- Bastiaan Veelo
- Boris Carvajal
- Brian Kessler
- Cameron Ross
- Charles McAnany
- Chloé Kekoa
- Dan Printzell
- David Gileadi
- dkorpel
- Dmitry Olshansky
- Dragos Carp
- Eduard Staniloiu
- Elias Batek
- Ernesto Castellotti
- Francesco Mecca
- godmyoh
- Greg V
- Hiroki Noda
- Iain Buclaw
- Jason Schroeder
- jercaianu
- John Colvin
- Jonathan Marler
- Kriyszig
- lenoil98
- Les De Ridder
- Manu Evans
- Marco de Wild
- Martin Kinkelin
- Martin Nowak
- Mathias Lang
- Mathis Beer
- Mike Franklin
- Nathan Sashihara
- Nicholas Wilson
- Paul Backus
- Petar Kirov
- Quirin F. Schroll
- Rainer Schuetze
- Razvan Nitu
- Robert burner Schadek
- Robert Schadek
- Sebastiaan Koppe
- Sebastian Wilzbach
- shove
- Stanislav Blinov
- TJesionowski
- Tomáš Chaloupka
- Viktor
- Vladimir Panteleev
- Walter Bright
- سليمان السهمي (Suleyman Sahmi)


climate change local knowledge Climate rainfall Change adaptation study household indigenous communities impacts n=) water key Zimbabwe temperatures use used food respondents community farmers {border-style drought informants changing px;} #ffffff;} Local livestock perceptions strategies systems indicated traditional Africa area change. changes data ecological livelihoods species people reported wildlife Adaptation Area UNESCO production Communal Figure Findings biophysical extreme natural participants season seasonal Biosphere Key Management Nyamakate climatic coping excessive increase like observed resources variability wild African Development Resettlement Traditional biosphere collab: crop findings rural study, survey tree whilst (SE) Chundu FGD Hurungwe Indigenous International South Zambezi areas e.g., informant observations perceiving rain research sustainable trends Agricultural Household LEK Nations Research United Zimbabwe. agricultural case factors fruits group harvesting income indicators information livelihood plants potato practices px; stated studies temperature wetlands {font-family (BI) ./.. Data Dioscorea IPCC Miombo Resources Results Systems Table adaptive analysis crops cultural droughts ecosystem effects environment experienced farming font-size human line located low perceived questionnaire revealed seed southern trees (%; (.%; (BI/SE) ./s--- France Ghana However, Kenya Knowledge Middle National Paris, Respondents Similar affected area. change, conservation decreasing discussions domestic double; drought. dry example, focus head households identify indicate maize management noted noticed periods plant protected provide related resilience response security shortages significant socioeconomic that, trends, tubers Africa, Biological Cultural Department Environment Human Kariba MZBR. Nature Reduced Rural Safari Strategies Thus, Trends University Wildlife Zimbabwe, addition, adjacent agriculture air availability based biodiversity border-color border-width capacity changes. cited cold community-based declining demographic disappearance drying ecosystem-based ecosystems enhance erratic especially established exotic explore floods fruit heat mean mixed onset overall poor proportion reserves resource responses river sampled scientific similar smallholder social solid; time village woodland {font-style {font-weight (–) Conservation Council District Ecology Environmental Gathuru Global Impacts Kaguna MZBR Mafongoya Mana Mburu Meteorological Natural Perceptions Phiri Pools Reserve Reserves Science Services Society Socioeconomic Sustainable Using Van Water Zimbabwe: abundance anthropogenic associated bold brew cases causes climate. collect components conflict courier; decline development did different em; events events. experiences forest frequent general generally generation held impact including increasing influence interviews knowledge, large led legumes long longer major mentioned mitigation moisture monthly multiple need parts period periods. planting potential prediction prolonged pt;} rainfall, rainy reduced role services severe shifting sites societies species. status strategies. strategy threats tobacco understanding unpredictable using vulnerability weather wells


3 Tidy Data
In this chapter, we’ll discuss the importance of tidy data. You may think that this means just having your data in a spreadsheet, but you’ll see that it is actually more specific than that. Data actually comes to us in a variety of formats from pictures to text to just numbers. We’ll focus on datasets that can be stored in a spreadsheet throughout this book as that is the most common way data is collected in the sciences.
Having tidy data will allow us to more easily create data visualizations as we will see in Chapter 4. It will also help us with manipulating data in Chapter 5 and in all subsequent chapters when we discuss statistical inference. You may not necessarily understand the importance for tidy data immediately but it will become more and more apparent as we proceed through the book.
Needed packages
At the beginning of this and all subsequent chapters, we’ll always have a list of packages you should have installed and loaded. In particular we load the nycflights13
package which we’ll discuss shortly and the dplyr
package for data manipulation, the subject of Chapter 5. We also load the tibble
package here, which contains the useful glimpse
function.
library(nycflights13)
library(dplyr)
library(tibble)
3.1 What is tidy data?
You have surely heard the word “tidy” in your life:
- “Tidy up your room!”
- “Please write your homework in a tidy way so that it is easier to grade and to provide feedback.”
- Marie Kondo’s best-selling book The Life-Changing Magic of Tidying Up: The Japanese Art of Decluttering and Organizing
- “I am not by any stretch of the imagination a tidy person, and the piles of unread books on the coffee table and by my bed have a plaintive, pleading quality to me - ‘Read me, please!’” - Linda Grant
So what does it mean for your data to be tidy? Put simply, it means that your data is organized. But it’s more than just that. It means that your data follows the same standard format making it easy for others to find elements of your data, to manipulate and transform your data, and, for our purposes, continuing with the common theme: it makes it easier to visualize your data and the relationships between different variables in your data.
We will follow Hadley Wickham’s definition of tidy data here (Wickham 2014):
A dataset is a collection of values, usually either numbers (if quantitative) or strings (if qualitative). Values are organised in two ways. Every value belongs to a variable and an observation. A variable contains all values that measure the same underlying attribute (like height, temperature, duration) across units. An observation contains all values measured on the same unit (like a person, or a day, or a race) across attributes.
Tidy data is a standard way of mapping the meaning of a dataset to its structure. A dataset is messy or tidy depending on how rows, columns and tables are matched up with observations, variables and types. In tidy data:
- Each variable forms a column.
- Each observation forms a row.
- Each type of observational unit forms a table.
Reading over this definition, you can begin to think about datasets that won’t follow this nice format. This format of data is also known as “long” format.
Learning check
(LC3.1) Give an example dataset that doesn’t follow this format.
- What features of this dataset might make it difficult to visualize?
- How could the dataset be tweaked to make it tidy?
(LC3.2) Say the following table are stock prices, how would you make this tidy?
| Date | Boeing | Amazon | |
|---|---|---|---|
| 2009-01-01 | $173.55 | $174.90 | $174.34 |
| 2009-01-02 | $172.61 | $171.42 | $170.04 |
| 2009-01-03 | $173.86 | $171.58 | $173.65 |
| 2009-01-04 | $170.77 | $173.89 | $174.87 |
| 2009-01-05 | $174.29 | $170.16 | $172.19 |
3.2 Datasets in the nycflights13
package
We likely have all flown on airplanes or know someone that has. Air travel has become an ever-present aspect of our daily lives. If you live in or are visiting a relatively large city and you walk around that city’s airport, you see gates showing flight information from many different airlines. And you will frequently see that some flights are delayed because of a variety of conditions. Are there ways that we can avoid having to deal with these flight delays?
We’d all like to arrive at our destinations on time whenever possible. (Unless you secretly love hanging out at airports. If you are one of these people, pretend for the moment that you are very much anticipating being at your final destination.) Throughout this book, we’re going to analyze data related to flights contained in the nycflights13
package we loaded earlier (Wickham 2017). Specifically, this package contains information about all flights that departed from NYC (e.g. EWR, JFK and LGA) in 2013 in 5 data sets:
flights
: information on all 336,776 flightsweather
: hourly meterological data for each airportplanes
: construction information about each planeairports
: airport names and locationsairlines
: translation between two letter carrier codes and names
We will begin by loading in the flights
dataset and getting an idea of its structure. Run the following in your console
data(flights)
This line of code loads in the flights
dataset that is stored in the nycflights13
package. This dataset and most others presented in this book will be in the “data frame” format in R. Data frames are essentially spreadsheets and allow us to look at collections of variables that are tightly coupled together.
The best way to get a feel for a data frame is to use the View
function in RStudio. This command will be given throughout the book as a reminder, but the actual output will be hidden. Run View(flights)
in R and look over this data frame. You should slowly get into the habit of always View
ing any data frames that come your way.
Learning check
(LC3.3) What does any ONE row in this flights
dataset refer to?
- A. Data on an airline
- B. Data on a flight
- C. Data on an airport
- D. Data on multiple flights
By running View(flights)
, we see the different variables listed in the columns and we see that there are different types of variables. Some of the variables like distance
, day
, and arr_delay
are what we will call quantitative variables. These variables vary in a numerical way. Other variables here are categorical.
Note that if you look in the leftmost column of the View(flights)
output, you will see a column of numbers. These are the row numbers of the dataset. If you glance across a row with the same number, say row 5, you can get an idea of what each row corresponds to. In other words, this will allow you to identify what object is being referred to in a given row. This is often called the observational unit. The observational unit in this example is an individual flight departing New York City in 2013. You can identify the observational unit by determining what the thing is that is being measured in each of the variables.
Note: Frequently the first thing you should do when given a dataset is to
- identify the observational unit,
- specify the variables, and
- give the types of variables you are presented with.
The glimpse()
command in the tibble
package provides us with much of the above information and more:
glimpse(flights)
## Observations: 336,776
## Variables: 19
## $ year <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 20...
## $ month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ day <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ dep_time <int> 517, 533, 542, 544, 554, 554, 555, 557, 557,...
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600,...
## $ dep_delay <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2,...
## $ arr_time <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838...
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846...
## $ arr_delay <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2...
## $ carrier <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "E...
## $ flight <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708,...
## $ tailnum <chr> "N14228", "N24211", "N619AA", "N804JB", "N66...
## $ origin <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "E...
## $ dest <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "F...
## $ air_time <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, ...
## $ distance <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229,...
## $ hour <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,...
## $ minute <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, ...
## $ time_hour <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2...
Learning check
(LC3.4) What are some examples in this dataset of categorical variables? What makes them different than quantitative variables?
(LC3.5) What does int
, dbl
, and chr
mean in the output above? If you need a hint, you might want to run str(flights)
instead.
(LC3.6) How many different columns are in this dataset?
(LC3.7) How many different rows are in this dataset?
We see that glimpse
will give you the first few entries of each variable in a row after the variable. In addition, the type of the variable is given immediately after each variable’s name inside < >
. Here, int
and num
refer to quantitative variables. In contrast, chr
refers to categorical variables. One more type of variable is given here with the time_hour
variable: dttm. As you may suspect, this variable corresponds to a specific date and time of day.
Another nice feature of R is the help system. You can get help in R by simply entering a question mark before the name of a function or an object and you will be presented with a page showing the documentation. Since glimpse
is a function defined in the tibble
package, you can further emphasize that you’d like to look at the help for that specific glimpse
function by adding the two columns between the package name and the function. Note that these output help files is omitted here but the flights
help can be accessed here on page 3 of the PDF document.
?tibble::glimpse
?flights
Another aspect of tidy data is a description of what each variable in the dataset represents. This helps others to understand what your variable names mean and what they correspond to. If we look at the output of ?flights
, we can see that a description of each variable by name is given.
An important feature to ALWAYS include with your data is the appropriate units of measurement. We’ll see this further when we work with the dep_delay
variable in Chapter 4. (It’s in minutes, but you’d get some really strange interpretations if you thought it was in hours or seconds. UNITS MATTER!)
3.3 How is flights
tidy?
We see that flights
has a rectangular shape with each row corresponding to a different flight and each column corresponding to a characteristic of that flight. This matches exactly with how Hadley Wickham defined tidy data:
- Each variable forms a column.
- Each observation forms a row.
But what about the third property?
- Each type of observational unit forms a table.
We identified earlier that the observational unit in the flights
dataset is an individual flight. And we have shown that this dataset consists of 336,776 flights with 19 variables. In other words, some rows of this dataset don’t refer to a measurement on an airline or on an airport. They specifically refer to characteristics/measurements on a given flight from New York City in 2013.
By contrast, also included in the nycflights13
package are datasets with different observational units (Wickham 2017):
weather
: hourly meteorological data for each airportplanes
: construction information about each planeairports
: airport names and locationsairlines
: translation between two letter carrier codes and names
You may have been asking yourself what carrier
refers to in the glimpse(flights)
output above. The airlines
dataset provides a description of this with each airline being the observational unit:
data(airlines)
airlines
As can be seen here when you just enter the name of an object in R, by default it will print the contents of that object to the screen. Be careful! It’s usually better to use the View()
function in RStudio since larger objects may take awhile to print to the screen and it likely won’t be helpful to you to have hundreds of lines outputted.
Learning check
(LC3.8) Run the following block of code in RStudio to load and view each of the four data frames in the nycflights13
package. Switch between the different tabs that have opened to view each of the four data frames. Describe in two sentences for each data frame what stands out to you and what the most important features are of each.
data(weather)
data(planes)
data(airports)
data(airlines)
View(weather)
View(planes)
View(airports)
View(airlines)
3.3.1 Identification variables
There is a subtle difference between the kinds of variables that you will encounter in data frames. The airports
data frame you worked with above contains data in these different kinds. Let’s pull them apart using the glimpse
function:
glimpse(airports)
## Observations: 1,458
## Variables: 8
## $ faa <chr> "04G", "06A", "06C", "06N", "09J", "0A9", "0G6", "0G7...
## $ name <chr> "Lansdowne Airport", "Moton Field Municipal Airport",...
## $ lat <dbl> 41.13, 32.46, 41.99, 41.43, 31.07, 36.37, 41.47, 42.8...
## $ lon <dbl> -80.62, -85.68, -88.10, -74.39, -81.43, -82.17, -84.5...
## $ alt <int> 1044, 264, 801, 523, 11, 1593, 730, 492, 1000, 108, 4...
## $ tz <dbl> -5, -6, -6, -5, -5, -5, -5, -5, -5, -8, -5, -6, -5, -...
## $ dst <chr> "A", "A", "A", "A", "A", "A", "A", "A", "U", "A", "A"...
## $ tzone <chr> "America/New_York", "America/Chicago", "America/Chica...
The variables faa
and name
are what we will call identification variables. They are mainly used to provide a name to the observational unit. Here the observational unit is an airport and the faa
gives the code provided by the FAA for that airport while the name
variable gives the longer more natural name of the airport. These ID variables differ from the other variables that are often called measurement or characteristic variables. The remaining variables (aside from faa
and name
) are of this type in airports
. They don’t uniquely identify the observational unit, but instead describe properties of the observational unit. For organizational purposes, it is best practice to have your identification variables in the far leftmost columns of your data frame.
Learning check
(LC3.9) What properties of the observational unit do each of lat
, lon
, alt
, tz
, dst
, and tzone
describe for the airports
data frame? Note that you may want to use ?airports
to get more information or go to the reference manual for the nycflights13
package here.
(LC3.10) Provide the names of variables in a data frame with at least three variables in which one of them is an identification variable and the other two are not. In other words, create your own tidy data set that matches these conditions.
3.4 Normal forms of data
The datasets included in the nycflights13
package are in a form that minimizes redundancy of data. We will see that there are ways to merge (or join) the different tables together easily. We are capable of doing so because each of the tables have keys in common to relate one to another. This is an important property of normal forms of data. The process of decomposing data frames into less redundant tables without losing information is called normalization. More information is available on Wikipedia.
We saw an example of this above with the airlines
dataset. While the flights
data frame could also include a column with the names of the airlines instead of the carrier code, this would be repetitive since there is a unique mapping of the carrier code to the name of the airline/carrier.
Below an example is given showing how to join the airlines
data frame together with the flights
data frame by linking together the two datasets via a common key of "carrier"
. Note that this “joined” data frame is assigned to a new data frame called joined_flights
. The key variable that we frequently join by is one of the identification variables mentioned above.
library(dplyr)
joined_flights <- inner_join(x = flights, y = airlines, by = "carrier")
View(joined_flights)
If we View
this dataset, we see a new variable has been created called name
. (We will see in Subsection 5.4.2 ways to change name
to a more descriptive variable name.) More discussion about joining data frames together will be given in Chapter 5. We will see there that the names of the columns to be linked need not match as they did here with "carrier"
.
Learning check
(LC3.11) What are common characteristics of “tidy” datasets?
(LC3.12) What makes “tidy” datasets useful for organizing data?
(LC3.13) How many variables are presented in the table below? What does each row correspond to? (Hint: You may not be able to answer both of these questions immediately but take your best guess.)
| students | faculty |
|---|---|
| 4 | 2 |
| 6 | 3 |
(LC3.14) The confusion you may have encountered in LC3.13 is a common one those that work with data are commonly presented with. This dataset is not tidy. Actually, the dataset in LC3.13 has three variables not the two that were presented. Make a guess as to what these variables are and present a tidy dataset instead of this untidy one given in LC3.13.
(LC3.15) The actual data presented in LC3.13 is given below in tidy data format:
| role | Sociology? | Type of School |
|---|---|---|
| student | TRUE | Public |
| student | TRUE | Public |
| student | TRUE | Public |
| student | TRUE | Public |
| student | FALSE | Public |
| student | FALSE | Public |
| student | FALSE | Private |
| student | FALSE | Private |
| student | FALSE | Private |
| student | FALSE | Private |
| faculty | TRUE | Public |
| faculty | TRUE | Public |
| faculty | FALSE | Public |
| faculty | FALSE | Private |
| faculty | FALSE | Private |
- What does each row correspond to?
- What are the different variables in this data frame?
- The
Sociology?
variable is known as a logical variable. What types of values does a logical variable take on?
(LC3.16) What are some advantages of data in normal forms? What are some disadvantages?
Review questions
Review questions have been designed using the fivethirtyeight
R package (Ismay and Chunn 2017) with links to the corresponding FiveThirtyEight.com articles in our free DataCamp course Effective Data Storytelling using the tidyverse
. The material in this chapter is covered in the Tidy Data chapter of the DataCamp course available here.
3.5 What’s to come?
In Chapter 4, we will further explore the distribution of a variable in a related dataset to flights
: the temp
variable in the weather
dataset. We’ll be interested in understanding how this variable varies in relation to the values of other variables in the dataset. We will see that visualization is often a powerful tool in helping us see what is going on in a dataset. It will be a useful way to expand on the glimpse
function we have seen here for tidy data.
References
Wickham, Hadley. 2014. “Tidy Data.” Journal of Statistical Software Volume 59 (Issue 10). https://www.jstatsoft.org/index.php/jss/article/view/v059i10/v59i10.pdf.
Wickham, Hadley. 2017. Nycflights13: Flights That Departed Nyc in 2013. https://CRAN.R-project.org/package=nycflights13.
Ismay, Chester, and Jennifer Chunn. 2017. Fivethirtyeight: Data and Code Behind the Stories and Interactives at ’Fivethirtyeight’. https://CRAN.R-project.org/package=fivethirtyeight.


We offer hands-on workshop on the Open Targets initiative and on our Open Targets Platform. Check our blog post for more details.
There are no training sessions scheduled, email us to arrange training sessions at your institution
If you can't attend any of the above, email us now to arrange training sessions at your institution.
We are currently putting together our new series of training. Please check back again for future dates.