Most of you, if not all, will be familiar with creating graphs in Excel. Software such as Excel has a predefined set of menu options for plotting the data that is the focus of the end result: “pretty graph”. Those types of menus assume data to be in a format ready for plotting, which when you get raw data is hardly the case. You are probably going to have to organise and wrangle your data to make it ready for effective visualisation.
Grammar of Graphics
The grammar of graphics enables a structured way of creating a plot by adding the components as layers, making it look effective and attractive.
It enables you to specify building blocks of a plot and to combine them to create the graphical display that you want. There are 8 building blocks:
data
aesthetic mapping
geometric object
statistical transformations
scales
coordinate system
position adjustments
faceting
Imagine talking about baking a cake and adding a cherry on the top. 🎂🍒 This philosophy has been built into the ggplot
package by Hadle Wickham for creating elegant and complex plots in R.
ggplot2
Learning how to use the ggplot2
package can be challenging, but the results are highly rewarding and just like R itself, it becomes easier the more you use it.
Unlike base graphics, ggplot works with dataframes and not individual vectors.
The best way to master it is by practising. So let us create a first ggplot
. 😃
What we need to do is the following:
ggplot()
:ggplot(dataframe, aes(x = explanatory variable, y = response variable))
This will draw a blank ggplot, even though the x and y are specified. ggplot
doesn’t assume the plot you meant to be drawn (a scatterplot). You only specify the data set and columns ie. variables to be used. Also note that aes( )
function is used to specify the x and y axes.
geom_
functions:geom_point()
We will add points using a geom layer called geom_point
.
# load the packages
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(gapminder))
suppressPackageStartupMessages(library(ggplot2))
# wrangle the data (Can you remember what this code does?)
gapminder_pipe <- gapminder %>%
filter(continent == "Europe" & year == 2007) %>%
mutate(pop_e6 = pop / 1000000)
# plot the data
ggplot(gapminder_pipe, aes(x = pop_e6, y = lifeExp)) +
geom_point(col ="red")
🤓💡 Tip: You can use the following code template to make graphs with ggplot2:
ggplot(data = <DATA>, (mapping = aes(<MAPPINGS>)) +
<GEOM_FUNCTION>()
ggplot() gallery Run the following code to see what graphs it will produce.
ggplot(data = gapminder, mapping = aes(x = lifeExp), binwidth = 10) +
geom_histogram()
#
ggplot(data = gapminder, mapping = aes(x = lifeExp)) +
geom_density()
#
ggplot(data = gapminder, mapping = aes(x = continent, color = continent)) +
geom_bar()
#
ggplot(data = gapminder, mapping = aes(x = continent, fill = continent)) +
geom_bar()
🗣👥 Confer with your neighbours: Does life expectancy depend upon population size?
\[y = b_0 + b_1 x + e\]
Run this code in your console to fit the model pop
vs lifeExp
.
Pay attention to spelling, capitalization, and parentheses!
m1 <- lm(gapminder_pipe$lifeExp ~ gapminder_pipe$pop_e6)
summary(m1)
Can you answer the question using the output of the fitted model?
m1 <- lm(gapminder_pipe$lifeExp ~ gapminder_pipe$pop_e6)
summary(m1)
##
## Call:
## lm(formula = gapminder_pipe$lifeExp ~ gapminder_pipe$pop_e6)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.324 -2.562 1.007 2.245 4.277
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 77.477421 0.721723 107.351 <2e-16 ***
## gapminder_pipe$pop_e6 0.008762 0.023779 0.368 0.715
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.025 on 28 degrees of freedom
## Multiple R-squared: 0.004826, Adjusted R-squared: -0.03072
## F-statistic: 0.1358 on 1 and 28 DF, p-value: 0.7153
👉 Practice ⏰💻: Use gapminder data.
Does life expectancy depend upon the GDP per capita?
Have a glance at the data. (tip: sample_n(df, n)
)
Produce a scatterplot: what does it tell you?
Fit a regression model: is there a relationship? How strong is it? Is the relationship linear? What conclusion(s) can you draw?
What are the other questions you could ask; could you provide the answers to them?
😃🙌 Solution: code Q1; sample
sample_n(gapminder, 30)
## # A tibble: 30 x 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Comoros Africa 1987 54.9<PHONE_NUMBER>.
## 2 Burkina Faso Africa 1967 40.7 5127935 795.
## 3 Saudi Arabia Asia 1962 45.9 4943029 11626.
## 4 South Africa Africa 2002 53.4 44433622 7711.
## 5 Cote d'Ivoire Africa 1987 54.7 10761098 2157.
## 6 Saudi Arabia Asia 2007 72.8 27601038 21655.
## 7 Hong Kong, China Asia 2002 81.5 6762476 30209.
## 8 Spain Europe 1962 69.7 31158061 5694.
## 9 Sudan Africa 2007 58.6 42292929 2602.
## 10 Finland Europe 1977 72.5 4738902 15605.
## # … with 20 more rows
We will add layers onto this scatterplot: liveExp
vs gdpPercap
. We want to superimpose regression line of the best fit and non-parametric loess line that depict a possible relationship between the two variables. That means we will have:
😃🙌 Solution: code Q2; Plot the data;
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(alpha = 0.2, shape = 21, fill = "blue", colour="black", size = 5) + # set transparency, shape, colour and size for points
geom_smooth(method = "lm", se = F, col = "maroon3") + # change the colour of line
geom_smooth(method = "loess", se = F, col = "limegreen") # change the colour of line
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
😃🙌 Solution: code Q3; simple regression model
my.model <- lm(gapminder_pipe$lifeExp ~ gapminder_pipe$gdpPercap)
summary(my.model)
##
## Call:
## lm(formula = gapminder_pipe$lifeExp ~ gapminder_pipe$gdpPercap)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.79839 -1.30472 0.00807 1.33443 2.87766
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.227e+01 6.942e-01 104.113 < 2e-16 ***
## gapminder_pipe$gdpPercap 2.146e-04 2.514e-05 8.537 2.8e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.598 on 28 degrees of freedom
## Multiple R-squared: 0.7225, Adjusted R-squared: 0.7125
## F-statistic: 72.88 on 1 and 28 DF, p-value: 2.795e-09
Playing with the aesthetic: adding more layers to your ggplot()
Whenever possible you should strive to make your graph visually appealing and informative as discussed in the previous section Principles of Visualisation.
To change the title and axis labels use layer labs
labs(title = “your title”, subtitle = “your subtitle”, y = “y label”, x = “x label”, caption = “graph’s caption”)
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(alpha = 0.2, shape = 20, col = "steelblue", size = 5) +
geom_smooth(method = "lm", se = F, col = "maroon3") +
geom_smooth(method = "loess", se = F, col = "limegreen") +
# give a title an label axes
labs(title = "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
# modify the appearance
theme(legend.position = "none",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
# add the description
geom_text(x = 80000, y = 125, label = "regression line", col = "maroon3") +
geom_text(x = 90000, y = 75, label = "smooth line", col = "limegreen")
Note, that we have added text on the plot for the two lines and have edited the plot in terms of legend and its appearance.
We could also annotate the plot by using:
annotate("text", x = 80000, y = 125 label = "regression line", color = "maroon3")
To learn more about how to modify the appearance of the theme go to ggplot’s theme page.
Change the colour of the points to reflect categories of another, third variable.
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
# change the colour of the points to reflect continent it belongs to; set transparency, shape, and size for points
geom_point(aes(col = continent), alpha = 0.5, shape = 20, size = 3) +
geom_smooth(method = "lm", se = F, col = "maroon3") +
geom_smooth(method = "loess", se = F, col = "dodgerblue3") +
labs (title= "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
theme(legend.position = "right",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
geom_text(x = 80000, y = 125, label = "regression line", col = "maroon3") +
geom_text(x = 90000, y = 75, label = "smooth line", col = "dodgerblue3")
Note that the legend is added automatically. You can remove it by setting the legend.position to none from within a theme() function.
Adjust the X and Y axis limits and change the X axis texts and its ticks’ location
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(aes(col = continent), alpha = 0.5, shape = 20, size = 3) +
geom_smooth(method = "lm", se = F, col = "maroon3") +
geom_smooth(method = "loess", se = F, col = "dodgerblue3") +
labs (title= "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
theme(legend.position = "right",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
geom_text(x = 48000, y = 90, label = "regression line", col = "maroon3") +
geom_text(x = 70000, y = 75, label = "smooth line", col = "dodgerblue3") +
# change the limits of the x & y axis
xlim(c(0, 90000)) +
ylim(c(25, 100))
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing missing values (geom_point).
## Warning: Removed 33 rows containing missing values (geom_smooth).
Note that the regression and smooth lines have changed their shapes 😳… all those warnings 😬 What’s going on?! 😲
When using xlim() and ylim(), the points outside the specified range are deleted and are not considered while drawing the line using geom_smooth(). This feature might come in handy when you wish to know how the line of best fit would change when some extreme values or outliers are removed.
Thankfully, there is another way to change the limits of the axis without deleting the points by simply zooming in to the region of interest. This is done using coord_cartesian()
. You can try to replace xlim()
and ylim()
commands in the previous code chunk with the code below to see what would happen.
coord_cartesian(xlim = c(0, 90000), ylim = c(25, 100)) # zooming in specified limits of the x & y axis
You can set the breaks on the x axis and label them by using scale_x_continuous()
. Similarly, can you can do it for the y axis?
Try to play with changing the colour palette. For more options check Sequential, diverging and qualitative colour scales from colorbrewer.org.
These are build-in themes which control all non-data display. You should use theme_bw()
to have white background or theme_dark()
for dark grey. For more build-in themes click here.
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(aes(col = continent), alpha = 0.5, shape = 20, size = 3) +
geom_smooth(method = "lm", se = F, col = "maroon3") +
geom_smooth(method = "loess", se = F, col = "dodgerblue3") +
labs (title= "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
theme(legend.position = "right",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
geom_text(x = 80000, y = 125, label = "regression line", col = "maroon3") +
geom_text(x = 90000, y = 75, label = "smooth line", col = "dodgerblue3") +
# change breaks and label them
scale_x_continuous(breaks = seq(0, 120000, 20000), labels = c("0", "20K", "40K", "60K", "80K", "100K", "120K")) +
# change color palette
scale_colour_brewer(palette = "Set1") +
# white background theme
theme_bw()
There is a ggthemes
library of themes that willhelp you create stylish ggplot charts used by different journals like the Wall Street Journal or the Economist. See what other themes you can use by going to this website
## If you don't have ggthemes installed yet, uncomment and run the line below
#install.packages("ggthemes")
library(ggthemes)
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(aes(col = continent), alpha = 0.5, shape = 20, size = 3) +
geom_smooth(method = "lm", se = F, col = "darkred") +
geom_smooth(method = "loess", se = F, col = "darkgreen") +
labs (title= "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
theme(legend.position = "right",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
geom_text(x = 80000, y = 125, label = "regression line", col = "darkred") +
geom_text(x = 90000, y = 75, label = "smooth line", col = "darkgreen") +
scale_x_continuous(breaks = seq(0, 120000, 20000), labels = c("0", "20K", "40K", "60K", "80K", "100K", "120K")) +
# Wall Street Journal theme
scale_colour_wsj() +
theme_wsj()
You are ready to make publication-ready visualizations in R. 😎 You can go further and explore for yourself to see if you can produce BBC style ggplot charts like those used in the BBC’s data journalism. Check out the BBC Visual and Data Journalism cookbook for R graphics.
Lay out panels in a grid
Sometimes it might be hard to read one panel plot, like the one we have just created in which it is not very easy to see the points of each continent. To make it easier to follow and to understand the information you are trying to depict, it would be more effective to present different categories of the same information in a clear set of multi-panel plots. This is easy to do by applying powerful faceting functions of the ggplot2
: facet_wrap()
and facet_grid()
.
ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) +
geom_point(aes(col = continent), alpha = 0.5, shape = 20, size = 3) +
geom_smooth(method = "lm", se = F, col = "darkred") +
geom_smooth(method = "loess", se = F, col = "black") +
labs (title= "GDP per Capita vs. Population Size",
x = "population", y = "Life Exp.") +
theme(legend.position = "right",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5)) +
scale_x_continuous(breaks = seq(0, 120000, 20000), labels = c("0", "20K", "40K", "60K", "80K", "100K", "120K")) +
scale_colour_wsj() +
theme_wsj() +
# forms a matrix of scatterplots for each continent
facet_grid(rows = vars(continent))
The main difference between facet_wrap()
and facet_grid()
is that the former can string together ggplots in different facets using a single variable, while the latter can do it for more than one.
Try to explore the two functions for yourself and see where it will take you.
💪 There is a challenge:
dplyr
’s group_by()
function enables you to group your data. It allows you to create a separate df that splits the original df by a variable.
boxplot()
function produces boxplot(s) of the given (grouped) values.
Knowing about group_by()
and boxplot()
function and using gapminder
data, can you compute the median life expectancy for year 2007 by continent and visualise your result?
😃🙌 Solution: code
Let us look at the median life expectancy for each continent
gapminder %>%
group_by(continent) %>%
summarise(lifeExp = median(lifeExp))
## # A tibble: 5 x 2
## continent lifeExp
## <fct> <dbl>
## 1 Africa 47.8
## 2 Americas 67.0
## 3 Asia 61.8
## 4 Europe 72.2
## 5 Oceania 73.7
We are lucky that we live in Serbia, ie. Europe!!! 😅
😃🙌 Solution: graph
# visualise the information
library("ggplot2")
ggplot(gapminder, aes(x = continent, y = lifeExp)) +
geom_boxplot(outlier.colour = "hotpink") +
geom_jitter(position = position_jitter(width = 0.1, height = 0), alpha = .2) +
labs (title= "Life Exp. vs. Continent",
x = "Continent", y = "Life Exp.") +
theme(legend.position = "none",
panel.border = element_rect(fill = NA,
colour = "black",
size = .75),
plot.title=element_text(hjust=0.5))
Case study: NO2 2017 😁
Let’s try to combine everything we have learnt so far and practise using well known to us 2017-NO2.csv data.
Remember this?
library(tidyr)
library(forcats)
no2 <- read.csv("http://data.sepa.gov.rs/dataset/ca463c44-fbfa-4de9-9a75-790995bf2830/resource/74516688-5fb5-47b2-becc-6b6e31a24d80/download/2017-no2.csv",
stringsAsFactors = FALSE,
fileEncoding = "latin1")
new_no2 <- no2 %>%
gather("place", "no2", -Datum, factor_key = TRUE) %>% # stack all columns apart from `Datum`
mutate(place = fct_recode(place,
"NS_Spens" = "Novi.Sad.SPENS.NO2",
"BG_Most" = "Beograd.Mostar.NO2",
"BG_Vracar" = "Beograd.Vraèar.NO2",
"BG_ZelenoBrdo" = "Beograd.Zeleno.brdo.NO2",
"KG" = "Kragujevac..NO2",
"NI" = "Ni..IZJZ.Ni...NO2",
"UZ" = "U.ice..NO2"))
glimpse(new_no2)
## Rows: 2,555
## Columns: 3
## $ Datum <chr> "01.01.2017", "02.01.2017", "03.01.2017", "04.01.2017", "05.01.…
## $ place <fct> NS_Spens, NS_Spens, NS_Spens, NS_Spens, NS_Spens, NS_Spens, NS_…
## $ no2 <dbl> 22.89, 32.94, 14.86, 22.73, 20.89, 10.47, 9.58, 15.99, 14.46, 9…
new_no2 %>%
group_by(place) %>%
filter(!is.na(no2)) %>%
summarise(mean_no2 = mean(no2)) %>% # !is.na(): is not NA; omits the missing values
ggplot(aes(x = place, y = mean_no2, fill = place)) + # fill: colours each bar differently
geom_bar(stat = "identity") +
xlab("Place") +
scale_fill_brewer(palette = "Dark2") + # colour scheme "Dark2"
theme(legend.position="bottom",
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) #
YOUR TURN 👇
Practise by doing the following set of exercises:
Choose a data set from https://data.gov.rs that is interesting to you. Import the dataset into R and examine what kinds of variables are there. What plots would you recommend using to help people get to know the dataset?
Go back to NO2 2017 case study:
What are the questions you can ask based on the available information within the dataset?
What plots would you recommend using to help in answering those questions?
Create appropriate visualisations for i) & ii)
Useful links:
tidyverse, visualization, and manipulation basics
Introduction to R graphics with ggplot2
An example from the Financial Times
BBC Visual and Data Journalism cookbook for R graphics
© 2020 Tatjana Kecojevic


This information is based on data from the United States Census Bureau from 2014. In 2014, the Affordable Care Act went into effect (Source: Wikipedia). Let's face it: a lack of income can significantly impact one's ability to live a healthy lifestyle. Obesity, smoking, and a lack of healthcare a linked to poverty rates, age, and household income in this graph.
According to this report, more smokers are found in the south, in states like West Virginia, Kentucky, Tennessee, Arkansas, and Louisiana. Utah claims to have the fewest smokers in the United States. When comparing smokers to poverty, there is a slight upward trend. With smoking, age does not seem to be a significant factor. When it comes to household income, though, there is a downward trend. The lower the number of smokers, the higher the profits. With smoking laws tightening and shared awareness of how smoking causes cancer, this practice is unlikely to rise in popularity in the United States.


guillermo{at}guerreroibarra{dot}com
Follow me on github: https://github.com/ryanfox1985
June 6th, 2017
proxy:
image: jwilder/nginx-proxy
volumes:
- "/var/run/docker.sock:/tmp/docker.sock:ro"
app:
build: service
environment:
- VIRTUAL_HOST=localhost
service_a:
extends:
service: app
service_b:
extends:
service: app
docker-compose build --no-cache app service_a service_b
# Shut down Service A first, and restart with new image
docker-compose stop service_a
docker-compose up -d --force-recreate service_a
# Wait a little in case the service takes a bit to start
sleep 5
# Now shut down and restart Service B with new image.
docker-compose stop service_b
docker-compose up -d --force-recreate service_b


Sample Text
Want to make an app for iPhone, iPad, Android or Windows? These app tutorials will tell you how.
You've got a great idea but you need some help – discover how to make an app for Android, iOS or Windows with these easy-to-follow tutorials for everyone from amateurs to pros.
In a world where smartphone use is rising exponentially, the opportunities to make a name for yourself, not to mention a ton of money, by turning your app idea into reality are huge. So whether you're building for Android or iOS, there are several tutorials here to help you. We start with Android...
How to make an Android app
Interactive Android tutorial
Teaching technology via app development, Codelearn offers this interactive Android tutorial, in which you will learn how to build a full fledged Twitter Android app.
Building your first Android app
This tutorial teaches you how to build your first Android app. You'll learn how to create an Android project and run a debuggable version of the app. You'll also learn some fundamentals of Android app design, including how to build a simple user interface and handle user input.
Develop an Android app: video tutorials
This handy 'playlist' of Android development tutorials will take you through everything from downloading the SDK to putting your app on the market.
Create your first Android mobile app
app tutorials
A very short beginner introduction tutorial, this shows you how to create a mobile app for Android. The tutorial is based on API Level 17 and Android 4.2. Starting from scratch, you should have a mp/h to km/h converter at the end.
Build your first Android app
Build your first Android app
This tutorial gets you started with Android development without requiring you to wade through pages of technical documentation. At the end, you'll have written a simple Android app and you will be able to deploy the application onto an emulator or a real Android device.
How to build an Android app
There are two techniques that you can use to produce Android applications with a PC. The first uses the Android Software Development Kit (SDK). This lets you write raw code and helps you get it working in the Android environment. The second uses App Inventor, a Google Labs tool that's still in beta. This tutorial demonstrates how to go about doing both.
How to develop an Android app
app tutorials
In this four-part tutorial, you'll learn the basics of developing an app for Android. A perfect starting point for any beginner, the series will explain the programming terminology used as well as any strange acronyms.
HelloWorld application using Android Studio
Google recently announced a new IDE for Android called Android Studio. This tutorial explains how to install Android Studio on your Windows 7 machine and create a new HelloWorld application.
How to install Android SDK
App tutorials
Learn how to to install the Android software development kit and set up your development environment for the first time.
Getting To Know The Android Platform
Getting To Know The Android Platform
This article explains what you need to do to build a scalable app that looks and feels right at home on Android, how to test it and your options for distributing it. After reading this article, you should have a good understanding of what kinds of decisions and challenges you will face when creating an Android app.
Advanced Android app-building tutorials
Designing For A Maturing Android
app tutorials
Around 480 million people currently use Android devices, and one million new devices are activated daily. Learn your market with this introduction to a maturing Andriod app audience.
Build a photo sharing app for Android
app tutorials
In this step by step tutorial you'll build SnapStack, a photo sharing application, from start to finish. Building SnapStack on StackMob you'll build a feature-filled app that includes User Authentication, S3 integration and more.
Unit testing with Android Studio
If you plan on doing test drive development for your Android Studio mobile projects, you will want to learn the main points of how to create and use Unit Tests in the post-Eclipse world of Android development. Rex St. John outlines all you need to know.
Next page: creating iOS and cross-platform apps, plus app-building tips
KeyWords


|
cocos2d-iphone-extensions
0.2
Cocos2D Extensions API Reference (iOS version) for Kobold2D developers
|
#include <CCScrollLayer.h>
Public Member Functions | |
| id | initWithLayers:widthOffset: (NSArray *layers,[widthOffset] int widthOffset) |
| void | updatePages () |
| void | addPage:withNumber: (CCLayer *aPage,[withNumber] int pageNumber) |
| void | addPage: (CCLayer *aPage) |
| void | removePage: (CCLayer *aPage) |
| void | removePageWithNumber: (int page) |
| void | moveToPage: (int page) |
| void | selectPage: (int page) |
Static Public Member Functions | |
| id | nodeWithLayers:widthOffset: (NSArray *layers,[widthOffset] int widthOffset) |
Protected Attributes | |
| NSObject< CCScrollLayerDelegate > * | delegate_ |
| int | currentScreen_ |
| int | prevScreen_ |
| CGFloat | startSwipe_ |
| CGFloat | minimumTouchLengthToSlide_ |
| CGFloat | minimumTouchLengthToChangePage_ |
| BOOL | showPagesIndicator_ |
| CGPoint | pagesIndicatorPosition_ |
| int | state_ |
| BOOL | stealTouches_ |
| BOOL | stealingTouchInProgress_ |
| UITouch * | scrollTouch_ |
| NSMutableArray * | layers_ |
| CGFloat | pagesWidthOffset_ |
| CGFloat | marginOffset_ |
| ccColor4B | pagesIndicatorNormalColor_ |
| ccColor4B | pagesIndicatorSelectedColor_ |
Properties | |
| NSObject< CCScrollLayerDelegate > * | delegate |
| CGFloat | minimumTouchLengthToSlide |
| CGFloat | minimumTouchLengthToChangePage |
| CGFloat | marginOffset |
| BOOL | stealTouches |
| BOOL | showPagesIndicator |
| CGPoint | pagesIndicatorPosition |
| ccColor4B | pagesIndicatorSelectedColor |
| ccColor4B | pagesIndicatorNormalColor |
| int | totalScreens |
| int | currentScreen |
| CGFloat | pagesWidthOffset |
| NSArray * | pages |
Scrolling layer for Menus, like iOS Springboard Screen.
It is a very clean and elegant subclass of CCLayer that lets you pass-in an array of layers and it will then create a smooth scroller. Complete with the "snapping" effect. You can create screens with anything that can be added to a CCLayer.
| void CCScrollLayer::addPage: | ( | CCLayer * | aPage | ) | [virtual] |
Adds new page to the right end of the scroll layer.
| void CCScrollLayer::addPage:withNumber: | ( | CCLayer * | aPage, |
| [withNumber] int | pageNumber | ||
| ) | [virtual] |
Adds new page and reorders pages trying to set given number for newly added page. If number > pages count - adds new page to the right end of the scroll layer. If number <= 0 - adds new page to the left end of the scroll layer.
| id CCScrollLayer::initWithLayers:widthOffset: | ( | NSArray * | layers, |
| [widthOffset] int | widthOffset | ||
| ) | [virtual] |
Inits scrollLayer with given pages & width offset.
| layers | NSArray of CCLayers, that will be used as pages. |
| widthOffset | Length in X-coord, that describes length of possible pages intersection. |
| id CCScrollLayer::nodeWithLayers:widthOffset: | ( | NSArray * | layers, |
| [widthOffset] int | widthOffset | ||
| ) | [static, virtual] |
Creates new scrollLayer with given pages & width offset.
| layers | NSArray of CCLayers, that will be used as pages. |
| widthOffset | Length in X-coord, that describes length of possible pages intersection. |
| void CCScrollLayer::removePage: | ( | CCLayer * | aPage | ) | [virtual] |
Removes page if it's one of scroll layers pages (not children) Does nothing if page not found.
| void CCScrollLayer::removePageWithNumber: | ( | int | page | ) | [virtual] |
Removes page with given number. Doesn nothing if there's no page for such number.
| void CCScrollLayer::updatePages | ( | ) | [virtual] |
Updates all pages positions & adds them as children if needed. Can be used to update position of pages after screen reshape, or for update after dynamic page add/remove.
int CCScrollLayer::currentScreen [read, assign] |
Current page number, that is shown. Belongs to the [0, totalScreen] interval.
CGFloat CCScrollLayer::marginOffset [read, write, assign] |
Offset that can be used to let user see empty space over first or last page.
CGFloat CCScrollLayer::minimumTouchLengthToChangePage [read, write, assign] |
Calibration property. Minimum moving touch length that is enough to change the page, without snapping back to the previous selected page.
CGFloat CCScrollLayer::minimumTouchLengthToSlide [read, write, assign] |
Calibration property. Minimum moving touch length that is enough to cancel menu items and start scrolling a layer.
NSArray* CCScrollLayer::pages [read, assign] |
Returns array of pages CCLayer's
ccColor4B CCScrollLayer::pagesIndicatorNormalColor [read, write, assign] |
Color of dots, that represents other pages.
CGPoint CCScrollLayer::pagesIndicatorPosition [read, write, assign] |
Position of dots center in parent coordinates. (Default value is screenWidth/2, screenHeight/4)
ccColor4B CCScrollLayer::pagesIndicatorSelectedColor [read, write, assign] |
Color of dot, that represents current selected page(only one dot).
CGFloat CCScrollLayer::pagesWidthOffset [read, write, assign] |
Offset, that can be used to let user see next/previous page.
BOOL CCScrollLayer::showPagesIndicator [read, write, assign] |
Whenever show or not white/grey dots under the scroll layer. If yes - dots will be rendered in parents transform (rendered after scroller visit).
BOOL CCScrollLayer::stealTouches [read, write, assign] |
If YES - when starting scrolling CCScrollLayer will claim touches, that are already claimed by others targetedTouchDelegates by calling CCTouchDispatcher::touchesCancelled Usefull to have ability to scroll with touch above menus in pages. If NO - scrolling will start, but no touches will be cancelled. Default is YES.
int CCScrollLayer::totalScreens [read, assign] |
Total pages available in scrollLayer.


JJFloatingActionButton
@objc @IBDesignable public class JJFloatingActionButton: UIControl
A floating action button.
Example
let actionButton = JJFloatingActionButton()
actionButton.addItem(title: "item 1", image: image1) { item in
// do something
}
actionButton.addItem(title: "item 2", image: image2) { item in
// do something
}
view.addSubview(actionButton)
-
The delegate object for the floating action button.
Declaration
Swift
@objc public weak var delegate: JJFloatingActionButtonDelegate?
-
The list of action items. Default is
[]
.Declaration
Swift
@objc public var items: [JJActionItem] = []
-
The background color of the floating action button. Default is
UIColor(hue: 0.31, saturation: 0.37, brightness: 0.76, alpha: 1.00)
.Declaration
Swift
@objc @IBInspectable public dynamic var buttonColor: UIColor = JJStyles.defaultButtonColor
-
The background color of the floating action button with highlighted state. Default is
nil
.Declaration
Swift
@objc @IBInspectable public dynamic var highlightedButtonColor: UIColor?
-
The image displayed on the button by default. When only one
JJActionItem
is added andhandleSingleActionDirectly
is enabled, the image from the item is shown istead. When ano penButtonImage
is given this is shwon when the button is opened. Default isnil
.See also
openButtonImage
Declaration
Swift
@objc @IBInspectable public dynamic var defaultButtonImage: UIImage?
-
The image that is displayed when the button is opened. Default is
nil
.Warning
When
openButtonImage
is set,rotationAngle
is ignored and the button will not rotate when opening.See also
Declaration
Swift
@objc @IBInspectable public dynamic var openButtonImage: UIImage?
-
The tint color of the image view. Default is
UIColor.white
.Warning
Only template images are colored.Declaration
Swift
@objc @IBInspectable public dynamic var buttonImageColor: UIColor = .white
-
The shadow color of the floating action button. Default is
UIColor.black
.Declaration
Swift
@objc @IBInspectable public dynamic var shadowColor: UIColor? = .black
-
The shadow offset of the floating action button. Default is
CGSize(width: 0, height: 1)
.Declaration
Swift
@objc @IBInspectable public dynamic var shadowOffset: CGSize = CGSize(width: 0, height: 1)
-
The shadow opacity of the floating action button. Default is
0.4
.Declaration
Swift
@objc @IBInspectable public dynamic var shadowOpacity: Float = 0.4
-
The shadow radius of the floating action button. Default is
2
.Declaration
Swift
@objc @IBInspectable public dynamic var shadowRadius: CGFloat = 2
-
The default title font of an action item. Default is
UIFont.systemFont(ofSize: UIFont.systemFontSize)
.Remark
This can be changed for each action item.Declaration
Swift
@objc public dynamic var itemTitleFont: UIFont = .systemFont(ofSize: UIFont.systemFontSize)
-
The default color of an action item. Default is
UIColor.white
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemButtonColor: UIColor = .white
-
The default highlighted color of an action item. Default is
nil
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var highlightedItemButtonColor: UIColor?
-
The default image tint color of an action item. If none is given, the color of the floating action button is used. Default is
nil
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemImageColor: UIColor?
-
The default title color of an action item. Default is
UIColor.white
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemTitleColor: UIColor = .white
-
The default shadow color of an action item. Default is
UIColor.black
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemShadowColor: UIColor = .black
-
The default shadow offset of an action item. Default is
CGSize(width: 0, height: 1)
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemShadowOffset: CGSize = CGSize(width: 0, height: 1)
-
The default shadow opacity of an action item. Default is
0.4
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemShadowOpacity: Float = 0.4
-
The default shadow radius of an action item. Default is
2
.Remark
This can be changed for each action item.Declaration
Swift
@objc @IBInspectable public dynamic var itemShadowRadius: CGFloat = 2
-
The size of an action item in relation to the floating action button. Default is
0.75
.Declaration
Swift
@objc @IBInspectable public dynamic var itemSizeRatio: CGFloat = 0.75
-
The space between two action items in points. Default is
12
.Declaration
Swift
@objc @IBInspectable public dynamic var interItemSpacing: CGFloat = 12
-
The angle in radians the button should rotate when opening. Default is
-CGFloat.pi / 4
.Warning
When
openButtonImage
is set,rotationAngle
is ignored and the button will not rotate when opening.See also
Declaration
Swift
@objc @IBInspectable public dynamic var rotationAngle: CGFloat = -.pi / 4
-
When enabled and only one action item is added, the floating action button will not open, but the action from the action item will be executed direclty when the button is tapped. Also the image of the floating action button will be replaced with the one from the action item.
Default is
true
.Declaration
Swift
@objc @IBInspectable public var handleSingleActionDirectly: Bool = true
-
The current state of the floating action button. Possible values are
.opening
.open
.closing
.closed
Declaration
Swift
@objc public fileprivate(set) var buttonState: JJFloatingActionButtonState = .closed
-
The round background view of the floating action button. Read only.
Declaration
Swift
@objc public fileprivate(set) lazy var circleView: JJCircleView = lazyCircleView()
-
The image view of the floating action button. Read only.
Declaration
Swift
@objc public fileprivate(set) lazy var imageView: UIImageView = lazyImageView()
-
The overlay view. Default background color is
UIColor(white: 0, alpha: 0.5)
. Read only.Declaration
Swift
@objc public fileprivate(set) lazy var overlayView: UIControl = lazyOverlayView()
-
Initializes and returns a newly allocated floating action button object with the specified frame rectangle.
See also
init?(coder: NSCoder)
Declaration
Swift
public override init(frame: CGRect)
Parameters
frame
The frame rectangle for the floating action button, measured in points. The origin of the frame is relative to the superview in which you plan to add it. This method uses the frame rectangle to set the center and bounds properties accordingly.
Return Value
An initialized floating action button object.
-
Returns an object initialized from data in a given unarchiver.
Declaration
Swift
public required init?(coder aDecoder: NSCoder)
Parameters
aDecoder
An unarchiver object.
Return Value
self
, initialized using the data in decoder.
-
Add floating action button to a given superview and place in trailing bottom corner.
Remark
On iOS prior to iOS 11
safeAreaInset
is ignored.Declaration
Swift
func display(inView superview: UIView, viewInset: CGFloat = 16, safeAreaInset: CGFloat = 0)
Parameters
superview
The view to which the floating action button is added as a subview.
viewInset
The (minimum) spacing in points between button and superview. Default is
16
.safeAreaInset
The (minimum) spacing in points between button and safe area of the superview. Default is
0
. -
Add floating action button to a view of a given view controller and place in trailing bottom corner.
Remark
On iOS prior to iOS 11
safeAreaInset
is ignored.Declaration
Swift
func display(inViewController viewController: UIViewController, viewInset: CGFloat = 16, safeAreaInset: CGFloat = 0)
Parameters
viewController
The view controller to which view the floating action button is added as a subview.
viewInset
The (minimum) spacing in points between button and the view controllers view. Default is
16
.safeAreaInset
The (minimum) spacing in points between button and safe area of the view controllers view. Default is
0
.
-
Add an action item with title, image and action to the list of items. The item will be pre configured with the default values.
Declaration
Swift
@discardableResult func addItem(title: String? = nil, image: UIImage? = nil, action: ((JJActionItem) -> Void)? = nil) -> JJActionItem
Parameters
title
The title of the action item. Default is
nil
.image
The image of the action item. Default is
nil
.action
The action handler of the action item. Default is
nil
.Return Value
The item that was added. This can be configured after it has been added.
-
Add an action item to the list of items. The item will be updated with the default configuration values.
Declaration
Swift
func addItem(_ item: JJActionItem)
Parameters
item
The action item.
Return Value
The item that was add. Its configuration can be changed after it has been added.
-
Open the floating action button and show all action items.
Remark
Hidden items and items that have user interaction disabled are omitted.
Declaration
Swift
func open(animated: Bool = true, completion: (() -> Void)? = nil)
Parameters
animated
When true, button will be opened with an animation. Default is
true
.completion
Will be handled upon completion. Default is
nil
. -
Close the floating action button and hide all action items.
Declaration
Swift
func close(animated: Bool = true, completion: (() -> Void)? = nil)
Parameters
animated
When true, button will be close with an animation. Default is
true
.completion
Will be handled upon completion. Default is
nil
. -
All items that will be shown when floating action button ist opened. This excludes hidden items and items that have user interaction disabled.
Declaration
Swift
var enabledItems: [JJActionItem]
-
A Boolean value indicating whether the action button draws a highlight.
Declaration
Swift
open override var isHighlighted: Bool
-
The natural size for the floating action button.
Declaration
Swift
open override var intrinsicContentSize: CGSize


{% if include.location == home %} {% else %} {% endif %} Interactive Scalable Interfaces for Machine Learning Interpretability
Fred Hohman
Dissertation, Georgia Tech, 2020.
{% if include.details==true %}ACM SIGCHI Dissertation Award
Georgia Tech College of Computing Dissertation Award
{% endif %}


WITNESS LIST Business & Industry Committee March 15, 2005-2:00P HB 7 - Committee Substitute (Solomons HB 7) For: Berkstresser, Patti (Self and Texas Physical Therapy Assocation) McMurry, Sam J. (Lockheed Martin Aeronautics Co. & Texas Self-Insurance Assn.) Woods, Joe (Property Casualty Insurers Assocation of Am.) Against: Bicklein, Royce (Self and Miller & Bicklein) On: Reagan, Karen (Texas Foundation of Drug Stores) Zamrazil, Kristie (TX Pharmacy Assocation) HB 69 Against: Bower, Bruce P. (Texas Senior Advocacy Coalition) Smith, Clinton (Self and Gray Panthers) On: Bell, Charles E. (Texas Health & Human Services Commission) HB 153 For: Bent, Steve ((TXANS) TX-Assocation Respondsible Nonsubscribers) Galliher, Teresa (Kent Moore Cabinets, Ltd.) Against: Levy, Rick (TxAFL-CIO) HB 1379 For: Sanders, Robert Tony (Chief of Police Dave M. Kunkle, Dallas Police Department) HB 1578 For: Potts, Julie (Texas Assocation of Realtors) Walker, Ron (Texas Assocation of Realtors) HB 1716 For: Burch, Bill (Self)


Javascript Basics Quiz
Your score is:
Time:
0
Try to anwser the following Javascript-related questions within the time limit. Keep in mind that incorrect answers will deduct from your score
Start!
Game Over!
click here to see more
See score
×
All done!
Your final score is
!
Enter initials:
Submit
Highscore
Start Over!


Chelsea team news: Injury, suspension list vs. Valencia
Chelsea travel to the Mestalla on Wednesday night for a crucial Group H clash with Valencia in the Champions League.
by Leo NieboerWith four games gone, Frank Lampard's men are level on seven points with Ajax and the La Liga side, making this game a decisive affair.
The Blues will take inspiration from the way they fought back in their last European outing to record a remarkable 4-4 draw with Ajax at Stamford Bridge.
Here, Sports Mole rounds up the latest injury and suspension news for Chelsea ahead of this fixture.
Status: Out
Type of injury: Pelvis
Possible return date: December 14 (vs. Bournemouth)
Lampard confirmed earlier this month that Rudiger, impeded by a pelvic problem since September, would undergo surgery that looks set to keep him sidelined until mid-December.
Status: Out
Type of injury: Achilles
Possible return date: December 14 (vs. Bournemouth)
Sidelined since May, Loftus-Cheek continues to work towards full fitness, with the midfielder expected to make a return at some point next month.
Status: Out
Type of injury: Ankle
Possible return date: Unknown
Lampard confirmed ahead of the recent international break that Barkley, who has been out with an ankle problem since last month, has an ongoing issue that will still take some time to fully resolve.
CHELSEA'S SUSPENSION LIST
Chelsea have no players who are suspended ahead of this fixture.
body check tags ::


Warehouse Freightman Stefano:
I see that you've managed to find some icicles.
Very good!
Now all we need to do is give the cell tissues a special low temperature treatment
to preserve them during the journey.
It might take a while -- do you mind waiting?
Wait.


Alert Console
Production
Development
Infrastructure
About
Origin
Version
Heartbeat Sent
Time Since Received
Latency
...
...
...
...
...


Cannot find the file {0}.
REF:Comments.html#FileNotFound
Invalid parameter.
REF:Comments.html#DivByZero


Help
Search
Search in title, url and add date. Search rules:
- /<text> - bookmark is in folder which name starts with <text>
- /<text>/ - bookmark is in folder <text>
- #<text> - bookmark contains tag that starts with <text>
- #<text># - bookmark contains tag <text>
- YYYY-MM-DD - bookmark is added in provided date. Partial date is supported, but must contain "-"
- !<filter> - bookmark does not match filter <filter> (!#abc# - without tag 'abc')
- * - all bookmarks
Inside filter following wildcards can be used:
- * - any amount of any characters (t*t matches tt, test, t1t, tqwertyt, ...)
- ? - any single character (t?t matches t1t, tqt, t2t, ...)
WARNING! Spaces in tags and folders are not supported
First 10 results can be opened with Ctrl+index hotkey
Actions
Open all
Open all bookmarks from search results
Add tag to all
Enter and add tag for all bookmarks from search results
Remove tag from all
Enter and remove tag from all bookmarks from search results
Add folder tags
Add tags for each folder name to all bookmarks from search results
Move to folder
Move bookmarks from search results to provided path
Show all tags
Show all tags used by bookmarks
Show tags in search
Show tags used by bookmarks in search results
Show possible duplicates
Show possible duplicates from all bookmarks
Remove exact duplicates
Remove identical bookmarks


{%extends "rail/base.html" %} {%load widget_tweaks%} {% block extra_head %}
PNR Number
Train Number
Train Name
Departure Date
Departure Time
Total Fare


In a previous post I went over how we could
create a generic linked list implementation in C which would allow the caller to determine that type of information
stored in the list (via a void *
).
In accordance with my desire to share and the nerdy, sadistic, love/hate relationship I have with C, I’m going to cover how we can use the linked list code from the previous post to create a generic stack implementation with very little effort.
The way a stack works is last-in, first-out (LIFO) like a stack of plates. This means that we will be doing all of the work on one end of the collection of items. We could implement this with an array by using the end of the array as the push/pop end. However, for large implementations this could (depending on the implementation) be problematic as we don’t generally return the memory back to the heap as nodes are popped off.
Without sparking a debate, the most efficient way I could think of would be to use the linked list, which makes push
,
pop
and peek
operations O(1)
and allocates only enough memory to hold existing items on the stack (plus the 4
byte next pointer to each node).
And of course…we’ll use a linked list because we already have a generic implementation available to us.
As we can see the code is pretty simple since most of the heavy lifting is done by the linked list.
Stack new takes three arguments, a pointer to the stack instance, the size of each element that will be stored on the stack (to support malloc/memcpy
operations) and finally a pointer to a function that will be called for each item when stack_destroy
is invoked. All the heavy lifting is done by the linked list.
This method takes on argument, a pointer to the stack to destroy. It first destroys the list (and all child elements) and then frees the memory for the list.
This method takes two arguments; a pointer to the stack and the element to be pushed onto the stack. The method delegates most of the work to the list element by calling list_prepend
.
This method takes two arguments; a pointer to the stack and the address to copy the item to. All the details are handled by the list, we simply call list_head
supplying the list, address and true
(to remove the item).
This method is identical to stack_pop
except that it does not remove the item from the stack.
This method simply returns the lists size
Easy enough right?


My name is Gijs van Til. I’m a LL.M Graduate currently enrolled in a coding bootcamp by New York Code + Design Academy.
Eventually I hope to build a bridge between the world of Law and the world of Start-Ups & Web Development
Skills:HTML5, CSS3, JavaScript. jQuery, Node.js, Module Building, APIs, Bootstrap, LESS, Jade, React.js, Office.
Values: Eager to learn, Creative, Intelligent, Analytical & Loyal


This is a paragraph.
This is part of a code block. This is part of a code block.
This is part of a paragraph.


## Map-Based Input `PacemLatLngElement` is the webcomponent that handles georeferenced values. > The managed **value** is an object having the following structure: `{ "lat": number, "lng": number }`.
## Metadata `PacemLatLngElement` can be injected into an autogenerating form the following way:
[ {"prop": "position", "type": "complex", "dataType": "latLng", "display": { "name": "Position" }, "extra": { "icon": { "url": "/assets/pp_w_s.png", "size": {"width": 45, "height": 45}, "anchor": {"x": 15, "y": 45} }, "mousewheel": false } } ]


Mason Rudolph's agent reviewing brawl with Myles Garrett, laments potential 'catastrophic ending'
by Ryan GaydosPittsburgh Steelers quarterback Mason Rudolph walked away unscathed from a brawl with Cleveland Browns defensive end Myles Garrett toward the end of their matchup Thursday.
In their skirmish, Garrett removed Rudolph’s helmet and hit him on the head with it. Moments later, Rudolph was pushed onto the ground by Browns defensive lineman Larry Ogunjobi.
BROWNS' MYLES GARRETT IN UGLY BRAWL WITH STEELERS' MASON RUDOLPH TOWARD END OF GAME
The social media sphere exploded with calls for Garrett to face charges. And while it’s unclear what the NFL will do at this point, Rudolph’s agent, Timothy Younger, told the Pittsburgh Post-Gazette he was still gathering information about the incident before any decisions on civil or legal action are made.
Younger also tweeted on the incident.
“The chain reaction began here with a very late take down following a pass. Very late,” Younger wrote. “That happens every Sunday. It is typically followed by pushing and shoving, even by the QB, and that usually ends it. However, what followed tonight cannot be defended by reasonable minds."
BROWNS' MYLES GARRETT BRAWL COULD LEAD TO HEFTY FINE, LENGTHY SUSPENSION
“There are many risks an NFL QB assumes every snap taken on the field.  Tonight could have had a catastrophic ending. The matter will be reviewed thoroughly.”
MYLES GARRETT BRAWL BRINGS FIERCE REACTION FROM STEELERS PLAYERS, REGRET FROM BROWNS
Cleveland police told Fox News the NFL was handling the incident.

“I thought it was pretty cowardly and bush league,” he said. “I’m not going to back down from any bully. I felt like I had a bone to pick with him. I appreciate the line always having my back, but I was angry.”
Rudolph did miss a few games this season with a concussion after being hit in the head on a tackle from Baltimore Ravens defensive back Earl Thomas.
CLICK HERE FOR MORE SPORTS COVERAGE ON FOXNEWS.COM
Suspensions and fines are likely to be handed down. Garrett has already been fined more than $50,000 for two separate incidents earlier in the season.
The Associated Press contributed to this report.


You have completed the basic settings now. The installation can be started now.
If all settings were correct, the installation can be completed now. That means your entered values are written into the configuration files and saved. Hint: of course all settings can be modified later.


{% extends 'map/base.html' %} {% block content %}
uploaded {{ gpxObj.uploadDate|timesince }} ago on {{ gpxObj.uploadDate|date:"SHORT_DATE_FORMAT" }}
There was no xml uploaded for this path.


☰
If you only live once, what difference are you making?
ARE YOU READY TO INVEST IN SEEDS THAT WILL GROW TO IMPACT GENERATIONS TO COME?
Then look below at our projects you can sponsor, and get ready to be a part of the greatest mosaic masterpiece of gen- erous investors making massive change, one small piece at a time.


Interview with Obvious Disaster
FuZioN: Hi ObviousDisaster, please introduce yourself.

For my normal boring tedious day job, I'm a software engineer (sounds a little more pretentious than programmer), web developer and system administrator.
FuZioN: How and when did you initially get into the Amiga demoscene?
OD: Must have been 1987/88 when I saw an advert by 17-bit PD library for a starter pack. It was a three or five disk pack and it had the Boing and Juggler animations which impressed the hell of out of me. But it was the disk that had the demos that really made an impression. I remember a Sunriders intro with the scrolling chequered floors and a sine scroller, but then I saw the D.O.C Demons are Forever demo. That's what got me interested.
  I graduated to DevPac which I bought with my birthday money, and then eventually to Asm-One. I think I used Argasm as well, but don't remember much other than it being incredibly fast.
What turned coding from just an interest into obsession was the Red Sector Inc Megademo. That was it for me, so I worked like a demon copying the effects in that demo.
I went to a 16-bit show at the Novatel where I met Anarchy, Slipstream and Share and Enjoy. They were at the foot of the stairs right opposite the bar with an Amiga 500 with four floppy disks and X-copy copying off demos. I remember seeing Horizon's Sleeping Bag demo running on another there.
The reason I didn't get that involved in the scene was some of them were right arrogant fuckers (especially group organisers), and I didn't want to be around them.
I knew a coder with the Mighty Druids (whose name escapes me now), Dan of Anarchy when he was just getting into coding, Kreator of Anarchy and Comrade J/SAE. I knew Kreator because I was a great customer of NBS PD library on the Isle of Wight, and they wanted to do a monthly magazine and they said Kreator/Anarchy had done some code but he was too busy with his studies to finish it off, so I was sent it. Not sure if they used it though.
I was in a couple of groups, but never produced anything. It's a bad habit I still have now, that when the hard work is done on something, I move on and can't be arsed with the easy stuff. So doing logos for LSD's Grapevine and a few articles was as close as I got.
FuZioN: What scene groups were you a member of?
OD: Delta 9, Iris UK (which I didn't know until my mate told me I'd been kicked out) and Cybertek.
FuZioN: What handles/nicks did you previously use?
OD: Slush/Cybertek, Zildjian and Khephren on IRC.
FuZioN: What are your fondest memories of the Amiga scene?
OD: I have three memories that are surprisingly clear in my head.
The first is seeing Scoopex Mental Hangover for the first time. Woah! This was a game changer. No more megademos, just great graphics and music and much easier to code.
The second is incredibly geeky, but writing MY first vector routine. Just seeing a cube rotating on the screen without copying or resourcing someone else's really gave me a thrill.
The third needs a little back story. TEC/Cryptoburners released his line source code from Seka, and it was lightning fast, it was THE code to beat. It took me months but eventually I made one that was faster than his, thanks to someone my brother put in touch with who was a maths wizard. That was my greatest achievement.
Tragic waste.
FuZioN: Name some of your favourite Amiga demoscene productions/groups
OD: Top demos? Oh I have too many.
Kefrens Desert Dreams. Demo perfection for me. [Agreed! - fZn]
Virtual Dreams Love. Loved Skull's style and demos, and Jogier's music is brilliant on this
Phenomena Enigma. For the music.
Anarchy Seeing is Believing. The music is brilliant and design.
And lastly, anything by Melon Dezign. They were a breath of fresh air, with the wild design.
FuZioN: Are you still in contact with any ex-scene buddies or contacts?
OD: Nah. Left it all behind now.
FuZioN: Do you still run any Amiga's or use emulation in any way?
OD: No, I threw my Amiga away a long time ago now. I used to run WinUAE but lost all my stuff in a hard disk crash. I don't miss it that much. I have MP3's of the music that I run off Google Music, that's as far as my nostalgia goes now.
FuZioN: What were your favourite productions that you worked on during the main years of the scene?
OD: We didn't release anything, ha!
I remember going to High Wycombe for a weekend and me and the other coder in the group started coding a demo. 1994 was a bad year for disasters, and we were going to code a demo we called Sickness. I remember I quickly drew a vector of a ferry as the Estonia ferry had just sank, and then we added vector lifejackets and lifeboats spelling out Cybertek. I think that's as far as we got before we were too pissed and stoned to carry on.
Same with the JetPac AGA which I had drawn the graphics for. We didn't get past the title page and credits for the same reasons above. Why we decided on doing the graphics in med-res is still a mystery to me.
I do remember seeing an intro with a light sourced vector face, not sure if I had anything to do with it other than the logo. It wasn't released as far as I know as we were disabled by having a musician who was crap.
FuZioN: Are you currently working on any projects when time restraints allow?
OD: I don't have a problem coming up with ideas and designs at the moment, and I've got bit and pieces of code I'm messing around with, it's just a struggle to complete a project. I blame it on me hitting my 40's.
FuZioN: Do you follow the PC demoscene at all?
OD: Nah, as far as I can tell from what I've seen it's all 3D shite, no interest in that. I like old school effects.
FuZioN: Have you ever attended any scene parties?
OD: Not that I can remember.
FuZioN: Were you active in the BBS scene and manage to run up mammoth phone bills?
OD: Yeah I was on Digital Candy and Mostly Harmless a lot, and regularly run up bills of a £1,000.
FuZioN: Are there moments when you feel nostalgic, thinking back to the best years of the Amiga scene?
OD: I have moments when I miss the competition between coders to come up with the best effect the fastest.
A few weeks ago someone posted a PDF of the original manual for ASM-One. That made me want to install WinUAE again and then have a play, but then I found I can't remember 680x0 code anymore.

OD: With lots of medication :)
FuZioN: What music are you into?
OD: Same as always, 60's and 70's along with a load of Amiga demo tunes I've MP3'ed up.
FuZioN: This is your SPAM area.. feel free to advertise any web presence, be it Fbook/Twatter/URL/other.
OD: I'm on Facebook, Twitter and all that social bollocks, but I'm anti-social... so no :)
FuZioN: Thanks for taking part in the interview mate. Any final words of wisdom?
OD: Wisdom. From me? How well do you know me mate :)


Client site for testing
Test Get Request
Response for get request
Test for post request
Name
Email
Send invitation


Abstract Class Fish. Represents all Fish object in Aquarium such as Piranha and Guppy.
More...
#include <Fish.hpp>
Abstract Class Fish. Represents all Fish object in Aquarium such as Piranha and Guppy.
◆ Fish()
| Fish::Fish |
( |
int |
food_thres, |
|
|
double |
eat_radius, |
|
|
double |
full_interval, |
|
|
double |
hunger_timeout, |
|
|
double |
created_time |
|
) |
| |
A constructor.
Constructs a new Fish object.
- Parameters
-
| int | food_thres Number of food to level up. |
| double | eat_radius |
| double | full_interval Full to hungry interval. |
| double | hunger_timeout Hungry to dead interval if there's no food. |
| double | created_time |
◆ dropCoin()
| virtual void Fish::dropCoin |
( |
| ) |
|
|
pure virtual |
Drop coin.
Drop coin following each subclasses rule
Implemented in Guppy, and Piranha.
◆ eat()
| virtual void Fish::eat |
( |
| ) |
|
|
pure virtual |
Eat object.
Eat food if the food is in range
Implemented in Guppy, and Piranha.
◆ getFoodEaten()
| int Fish::getFoodEaten |
( |
| ) |
|
Getter for food_eaten.
- Returns
- int food_eaten Number of food eaten.
◆ getHungry()
Getter for hungry.
- Returns
- bool hungry status of the Fish.
◆ getLastEatTime()
| double Fish::getLastEatTime |
( |
| ) |
|
Getter for last_eat_time.
- Returns
- double last_eat_time
◆ getLastHungerTime()
| double Fish::getLastHungerTime |
( |
| ) |
|
Getter for last_hunger_time.
- Returns
- double last_hunger_time
◆ getLastRandomTime()
| double Fish::getLastRandomTime |
( |
| ) |
|
Getter for last_random_time.
- Returns
- double last_random_time
◆ getLevel()
Getter for level.
- Returns
- int level of the Fish.
◆ setFoodEaten()
| void Fish::setFoodEaten |
( |
int |
food_eaten | ) |
|
Setter for food_eaten.
- Parameters
-
◆ setHungry()
| void Fish::setHungry |
( |
bool |
hungry | ) |
|
Setter for hungry.
- Parameters
-
◆ setLastEatTime()
| void Fish::setLastEatTime |
( |
double |
last_eat_time | ) |
|
Setter for last_eat_time.
- Parameters
-
◆ setLastHungerTime()
| void Fish::setLastHungerTime |
( |
double |
last_hunger_time | ) |
|
Setter for last_hunger_time.
- Parameters
-
◆ setLastRandomTime()
| void Fish::setLastRandomTime |
( |
double |
last_random_time | ) |
|
Setter for last_random_time.
- Parameters
-
◆ setLevel()
| void Fish::setLevel |
( |
int |
level | ) |
|
Setter for level.
- Parameters
-
◆ eatRadius
| const double Fish::eatRadius |
|
protected |
◆ foodThres
| const int Fish::foodThres |
|
protected |
◆ fullInterval
| const double Fish::fullInterval |
|
protected |
Duration until next hunger.
◆ hungerTimeout
| const double Fish::hungerTimeout |
|
protected |
Duration until starvation.
◆ x_dir
X-axis direction of the Fish.
◆ y_dir
Y-axis direction of the Fish.
The documentation for this class was generated from the following files:


'use strict';
let category=require('../lib/models/categories/categories.collection')
let product=require('../lib/models/products/products.collection')
/**
*
* @param {string} req categories or products
* @param {*} res
* @param {string} next middleware
*
* @module module-finder
*
* @returns {string} switch betwen the categories and products
*/
module.exports=(req, res, next)=> {
let model = req.params.model;
switch(model) {
case "categories":
req.model = category;
console.log(">>>>>>>>>>>>><<<<<<<<<<<<",model);
next();
break;
case "products":
req.model = product;
next();
break;
default:
next("Invalid Model!!! ");
break;
}
}
// You can (and should at some point) add extra logic and security to this module, perhaps extending it with additional functionality such as
// Pre-loading data models
// Listing available models
// Validation and security checks


Preparation time
less than 30 mins
Cooking time
over 2 hours
Serves
Serves 4
Preheat the oven to 160C/320F/Gas 3.
For the lamb shanks and sauce, season the lamb shanks with salt and freshly ground black pepper.
Heat two tablespoons of the oil in a large-lidded casserole or roasting tin over a high heat. When the oil is smoking, add the lamb shanks and fry, turning regularly, until browned all over. Remove from the pan and set aside.
Heat the remaining tablespoon of olive oil in the pan the lamb was cooked in, then add the onion, garlic, carrot, celery and leek and fry until softened and golden-brown. Add the thyme, rosemary and bay leaf, then add the tomato purée and flour and continue to fry for a further 3-4 minutes, stirring until the mixture is well combined and coats the vegetables.
Gradually add the wine, stirring until well combined. Bring the mixture to the boil, then reduce the heat to a simmer and continue to cook for 5-6 minutes, or until the volume of liquid has reduced by half.
Return the lamb shanks to the pan and pour over the lamb stock. Return the mixture to the boil, then cover the pan with a lid. Transfer the lamb to the oven and cook for 2-2½ hours, checking regularly, or until the lamb is tender and cooked to your liking.
When the lamb shanks are cooked, remove the lamb from the cooking liquid and place them onto a baking tray. Keep warm. Strain the cooking liquid through a fine sieve, reserving the strained stock in a clean pan.
Bring the strained stock to the boil, then reduce the heat to a simmer. Simmer until the volume of gravy has reduced by half. Set aside and keep warm.
For the sweet potato purée, boil the sweet potatoes in a pan of salted water for 10-15 minutes, or until tender. Drain well then return to the heat for a few seconds to drive off any excess moisture.
Transfer the boiled sweet potatoes to a food processor and add one tablespoon of the butter and 25ml/1fl oz of the cream. Blend until smooth, adding more butter and cream as necessary, to taste.
For the spinach, heat the butter in a frying pan over a high heat. When the butter is foaming, add the spinach and fry until wilted, stirring regularly.
To serve, place one of the lamb shanks into the centre of each of four serving plates. Place a spoonful of sweet potato purée and a portion of wilted spinach alongside. Drizzle over the gravy.


THE WAGES OF FEAR A film retrospective by Mark R. Leeper Copyright 1988 Mark R. Leeper
Capsule review: A classic of tension and suspense that lives up to its reputation. This tale of trucking nitroglycerine over dirt roads had members of the audience leaning forward in their seats and gasping at what they saw on the screen. Rating: +3.
In Central America four men carry nitroglycerine over bumpy roads and pray that nothing sets their cargo off. THE WAGES OF FEAR (1953) is one of those film I had wanted to see for years but I really did not expect to like it a lot. First of all, I had seen Clouzot's DIABOLIQUE and was not greatly impressed even though it is considered a sort of semi-classic. I'd seen too many similar films, mostly from Hammer Films. Now, I had seen SORCEROR, William Friedkin's remake of THE WAGES OF FEAR and thought it was an okay exercise in suspense. In some ways it was a better approach, telling more of the history of the four drivers, though it suffered from an overblown budget that got used on things like car chases unnecessary to the plot. I had also seen a similar film--I've forgotten the title--about trucking rocket fuel. So I knew that seeing the original, robbed of its novelty, could be a disappointment. Au contraire. THE WAGES OF FEAR is a white- knuckle sort of suspense film.
Somewhere in Central America there is a town, probably one of many, that is a slow death trap. To leave takes money--a lot of money. But no job in town pays well enough to earn that kind of money, at least no job left. Those who cannot get jobs with the big American oil company are doomed by poverty to stay in the little town until they work themselves to death. But suddenly there is work. Four truck drivers are needed to haul nitroglycerine to a burning oil well and the oil company will pay $2000 for a day's work for anyone crazy enough to go on what might be a suicide mission.  This is film noir with a vengeance; every yard of unpaved road becomes an enemy trying to find one unwary moment to go for the kill. (If that sounds over-dramatic, see the film.) Each man reacts differently to the pressures: one is coldly efficient; one is sloppy and foolhardy, taking foolish risks; one is heroic; and one crumbles under the weight of fear.
Ad,ittedly, there are some problems with THE WAGES OF FEAR. It takes a little too long for the plot to get underway. The final moments of the film are hackneyed. There are scenes so absurd as to be humorous. For example, an oil company foreman demonstrates the power of nitro by throwing some on the floor of his office. But it is a film that works, and works well enough to get audible gasps from the audience. THE WAGES OF FEAR is a classic that deserves to be. Rate it a +3 on the -4 to +4 scale.
Mark R. Leeper att!mtgzz!leeper<EMAIL_ADDRESS>The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


The research is aimed at estimating information about reflectance ad illumination. The method uses a very big set of data to learn on it where shape, reflectance, and illumination are not known.
The method is completed in two steps.
The first part is dedicated to estimating the object's reflectance map. Here a Convolutional Neural Network (CNN) is used to complete this stage.
The second step decomposes the object into reflectance and illumination. Here CNN is used to reconstruct reflectance parameters and spherical illumination maps.
This approach is proven to be effective by quantitative and qualitative evaluation.
Stamatios Georgoulis (Katholieke Universiteit Leuven), Konstantinos Rematas (University of Washington), Tobias Ritschel (University College London), Efstratios Gavves (University of Amsterdam), Mario Fritz (Max-Planck-Institut fur Informatik), Luc Van Gool (ETH Zurich), Tinne Tuytelaars (K. U.Leuven)
This method facilitates image-based rendering applications. It can be successfully used with complex objects. New deep learning architectures were developed. This approach outperforms the works created earlier, allowing to highlight the deep learning's potential in inverse rendering tasks and computer graphics. Much more is still to come!
References:
https://www.researchgate.net/publication/319239981_Reflectance_and_Natural_Illumination_from_Single-Material_Specular_Objects_Using_Deep_Learning
http://ieeexplore.ieee.org/document/8014479/


I am busy building a SaaS product that has to reliably send large numbers of emails. At ZappiStore we use the Ruby on Rails stack extensively. I think Rails is an excellent choice for building web applications. Rails makes you super productive and the community support is excellent. Naturally I want to use Rails for the web application layer of the system. There are a couple of different options built into Rails for sending emails.
I don’t want a user to have to wait one or two seconds for an SMTP request to finish before they get a response, so sending will have to be done asynchronously. The ActionMailer API in Rails is built for sending emails but ideally I want to pass off the load of sending mails to something that is good at making large amounts of requests and handling them asynchronously. There is support for asynchronous requests in Ruby but it is not as geared towards it as JavaScript is. Also, since Ruby is single-threaded with a global interpreter lock, I want it to do as little processing as possible and rather play to its strengths.
Node.js is built from the ground up with asynchronous operations in mind. Functions are first-class citizens in JavaScript and this makes programming with callbacks easy. Therefore it is a good choice for the creation of a microservice that sends emails. I am using the Mailgun API in order to send emails using POST requests.
Since the web application layer is written in Ruby and I have a microservice written in Node.js, these need to pass data between one-another in some way. The communication solution should have the following properties:
Robust. If a service goes down, the message should be persisted in the queue until it is handled.
Decoupled. The individual microservices should ideally not have any direct knowledge of each other. Each service should communicate via the message broker.
Enter RabbitMQ. Rabbit has been around for a long time and has proven to be a high-performance and reliable message queue. The idea is to use Ruby to push a message onto the queue and then pop the message off of the queue in the Node.js microservice.
Getting Started with RabbitMQ
For those of us that use OS X, installing RabbitMQ is easiest done with Homebrew:
brew install rabbitmq
Once RabbitMQ is installed, start it up as a service with the following command:
brew services start rabbitmq
The Ruby Layer
In order to connect to RabbitMQ from Ruby we are going to use the bunny gem. Add it to your Gemfile:
gem 'bunny', '~> 2.3.1'
Then run a bundle install.
The bunny gem gives us a lot of great functionality out of the box like robust connection handling. If the connection to RabbitMQ drops, bunny will attempt to reconnect until the connection is restored. The bunny gem also gives us an easy API for leveraging RabbitMQ from within our application.
The connection to RabbitMQ should be established at application startup and remain open for the duration of the application’s lifetime. To this end we create a MessagingService singleton class:
By using the Singleton pattern for the MessageService class we can ensure that the connection is not closed resulting in us having to reconnect every time we want to send an email. The EmailQueueService class uses the connection provided by the MessageService class to create a queue for our email pipeline:
The AccountActivationService class is specific to sending account activation emails when new users sign up:
The Node Layer
The package.json for the project is as follows:
The amqplib library is used to communicate with RabbitMQ, lodash as a helper library, mime to get the mime types of the email attachments, request for sending the HTTP requests, winston for logging and yamljs to parse the config.yml file containing settings.
The bulk of the work is done in the worker.js file:
The worker is the started using the main.js file:
Putting it all together
In order to send email accross the queue, the following code is executed from the Rails UsersController:
Summary
Node.js provides first-class support for asynchronous execution of HTTP requests. This makes it a great technology to use for sending emails via the Mailgun API. Ruby on Rails is great for building web applications. We want to leverage the best features of these two technologies together and we implemented RabbitMQ to enable robust communication between the Ruby and the JavaScript layers.


Do your regional websites talk funny?
By Chen Hui Jing / @hj_chen
Hello everybody. Welcome to CityJS. Thank you for being here on this lovely Friday morning. I'm not sure why the organisers put me in the opening slot because there's really not a lot of Javascript going on in my talk. So maybe that's why.
All of you clearly paid money to see the hard-hitting hardcore Javascript rockstars later in the day, but you need to warm up first. That's what opening acts are for. Like how Paramore opened for Taylor Swift, right?
😏 Singlish-o-meter 🤔
Because this is the Singapore edition of CityJS, I feel obliged to stay true to the culture. For the benefit of the audience who are unfamiliar with English spoken in Singapore, there is a range. Best explained in a graphical form. FYI, this is a legitimate HTML range input. Come ask me how it's built later.
So today, I will try to keep the level somewhere in the middle of Queen's english, and extreme Singlish. In general, the “R” sound sometimes becomes “L”, like ready will may sound like leddy. Also, the “ver” sound may often just be omiited. Like, government, will become gahmen. Or nevermind, will become nehmind. Also, grammar is optional.
Other than that, it should be mostly comprehensible. If you feel a lack of confidence, please sit next to a friendly Singlish-speaking attendee. They will decipher all of this for you.
🇲🇾
👾
🏀
🚲
🖌
👟
💻
🖊
🎙
🐈⬛
🧗
🏳🌈
My name is Hui Jing. It's a Chinese name, so our family name comes first. And these are my representative emojis, if you will. I've been gainfully employed as a web developer for more than a decade. Of course not with the same employer, but regardless of who it is, an employer who pays your CPF on time is a good employer.
Anyway, today you'll hear me talk to you about stuff mostly related to i18n, which is short for internationalisation. Maybe you'll learn something, maybe you won't. It's my hope you will be at least mildly entertained, and if you fall asleep, just try not to snore too loudly.
Internationalisation is the design and development of a product, application or document that enables easy localisation for target audiences that vary in culture, region, or language.
There is no canonical set-in-stone definition of i18n, but the W3C does offer this guidance. It is designing and developing in a way that enables easy localisation for specific audiences. Localisation covers a broad range of customisations including but not limited to: numerals, time and date formats, currencies, symbols, icons and colours, even textual and graphical references.
This implies that i18n is a lot more than simply translating the content on a site to different languages. There are nuances to the presentation of that content which will affect the experience of a native speaker using your site.
I've had the opportunity to work on a number of different projects that required internationalisation. Even though internationalisation is more than just translation, getting the translation part correct is really important. For this talk, because of time constraints, I picked a couple things that I encountered personally.
The “Billion” problem
The Chinese numeral system (also used by Japanese and Korean) has specific words for large numbers as per the traditional Chinese grouping of 10,000.
Simp. Chinese
Trad. Chinese
Japanese
Korean
10
十 (shí)
十
十 (juu)
십 (ship)
100
百 (bǎi)
百
百 (hyaku)
백 (baek)
1000
千 (qiān)
千
千 (sen)
천 (cheon)
10,000
万 (wàn)
万
万 (man)
만 (man)
100,000,000
亿 (yì)
億
億 (ichioku)
억 (eok)
1,000,000,000,000*
兆 (zhào)
兆
兆 (icchou)
조 (jo)
Let's talk about numbers. Specifically large numbers. I am Chinese, so I can only talk about this numeral system here. But there are also other languages that have specific words for powers of the base. Like India has lakh for 100 thousand and crore for 10 million.
For us, we have a word for 10,000, 万, and after that it goes up by power 4. So the next word is for 100 million, which is 亿. So 1 billion is 9 zeroes, and we don't have a specific word for that.
Translation strings
import {useTranslation} from "react-i18next";
function HeaderComponent() {
const {t, i18n} = useTranslation('common');
return {t('welcome.title')}
}
{
"welcome": {
"title": "Welcome to the app!"
}
}
{
"welcome": {
"title": "Laipni lūdzam lietotnē!"
}
}
Translation strings are a way for us to mark strings to be extracted from the source code to be passed over to translators to translate.
Most languages have some similar pattern, where the translation strings are all kept in separate data files, could be JSON, could be YAML. Then those strings are used in your application code via t functions.
Interpolation
/* src/translations/en.json */
{
"welcome": {
"title": "Welcome to {{framework}}"
}
}
/* src/translations/de.json */
{
"welcome": {
"title": "Willkommen bei {{framework}}"
}
}
There will inevitably be instances where it makes sense to pass in variables into these translation strings, especially for things like data, where consistency across languages is important information.
You'd think this would be a relatively straight-forward affair, and I think most of the time it is. But this does depend on exactly what you're passing into the string, and how your translation flow hands this off to the folks doing the translation.
What translators see
Not this:
But this:
Over %{total_stores} businesses in %{total_countries} countries around the world have made over $%{total_gmv_billions} billion USD in sales using Shopify
For example, in my previous place of employment, we did it like this. There was a set of stats that should be consistent throughout the entire site and across all languages, so those were substituted into the translation strings like so.
The source string is what the different translation teams see on the other end of the system, and they return the translations accordingly.
This was not a problem for the most part, in fact, there was only 1 instance where a problem arose. Because the number returned for {total_gmv_billions}
was 200. I don't know who made the decision, but I'm betting the person only spoke English? I don't know, man.
The end result
This was what we got back from the translators. For those of you who don't speak Korean or Chinese, let me explain the problem. The following translations have expressed the value of 200 billion as 200 ten million.
The problem
Saying that the GMV is 200 ten million dollars is quite a glaring grammatical error, if you speak the language.
Definitely not the translators fault that the end result is like this because if I put myself in their shoes, and I see a variable for X billion. I would intuitively think it's like oh maybe 5 or 6 billion. They didn't know the number was 200.
But regardless, a mistake is a mistake. Users don't care why, they only see that we made a rookie error.
But why didn't Japan have this problem? 🤯
The Japanese team had worked around this issue previously by editing the locale files that reference our total GMV numbers like so:
%{total_gmv_billions}0億米ドル
Our Japan team spotted this error and made the adjustment of replacing 十 with a 0.
It was actually a Korean language reviewer who was meant to review some other content that flagged this to us. They were like, I know you told us only to look at the designated section, but this is too glaring to ignore.
When I got the ticket, I was like, the other CJK locales must have this also. But only the Chinese site got. Japan was fine. Because back then, our Japan team was quite stacked with native Japanese speakers. And they manually went into the translation file to replace the character for 十 (juu) with a 0. Perfect.
See solution, steal it
This will be how it looks for each respective language:
%{total_gmv_billions}0억 달러(USD)
%{total_gmv_billions}0 亿美元
%{total_gmv_billions}0 億美元
So of course I just stole it for the fix. Another thing that tends to get overlooked is spaces between words or characters. Again, I can only talk about the CJK languages because I don't know about others.
For Chinese, there is no space between characters, but there is usually a space between a Chinese character and a non-Chinese character. Korean has its own spacing rules, called 띄어쓰기 (ttiosseugi).
This is important when dealing with translation strings and interpolation because sometimes the spaces literally get lost in translation.
Lessons and best practices
Interpolate with caution
Do Not Manually Construct Sentences or Manipulate Text in Code
Let i18n Libraries Handle the Hard Stuff
Lessons From Linguistics: i18n Best Practices for Front-End Developers by Lucas Huang
Interpolation is super useful but needs to be done very deliberately. Other than what I described earlier, things like pluralization can also become an issue. There are six plural forms identified in the Unicode Common Locale Repository, for zero, one, two, few, many and other. Some languages also have gendered nouns.
The point is, hard-coding word order or trying to manipulate text at the code level tends to make translation very difficult to get right. The folks that built and maintain the i18n libraries have done a lot of the tricky work for us, so it's probably a good idea to use those tried and tested packages, like for Javascript, we have i18next
which exists in many popular framework flavours.
The next story involves Vietnamese characters. Some of you might have heard of the acronym CJK, I've also mentioned it earlier, but sometimes the acronym is CJKV, which includes Vietnamese as well. Because historically, Vietnamese also used Chinese characters and original Vietnamese characters in their writing system previously.
The Vietnamese alphabets are listed in several non-contiguous Unicode ranges:
Basic Latin {U+0000..U+007F}
Latin-1 Supplement {U+0080..U+00FF}
Latin Extended-A, -B {U+0100..U+024F}
Latin Extended Additional {U+1E00..U+1EFF}
Combining Diacritical Marks {U+0300.. U+036F}
The Vietnamese đồng currency symbol is ₫ (U+20AB)
Unicode & Vietnamese Legacy Character Encodings
Vietnamese is interesting, because the current writing system uses the 29-letter Latin-script based Vietnamese alphabet. It is tricky because the Vietnamese alphabets exist across several non-contiguous Unicode ranges. Because designing fonts is a lot of work, most fonts are not going to support every single Unicode range in the universe. Even the Latin-based scripts probably cover until Latin-1 Supplement, unless they explicitly want to support specific languages.
Missing Vietnamese glyphs
So when choosing web fonts for your project, make sure to check the font's language support, otherwise, you might end up with the situation where missing glyphs look very obvious on your site. This situation occurs because when the browser cannot find a corresponding glyph in your chosen font to represent a character, it will use a fallback font that has that glyph.
If your fallback font doesn't really match well to your chosen font, then it will become like this. And I am aware that some people cannot tell if there is a problem here. But the point is I can tell, it's glaring to me, and I think this shouldn't happen. It looks unprofessional.
The :lang()
pseudo-class
:lang(vi) {
font-family: -apple-system, BlinkMacSystemFont, sans-serif;
}
Some products have commissioned fonts, and those are really quite expensive, so you're probably going to want to use them in as many places as possible. And that's totally justifiable. So we can use an alternative font stack only for those languages that your font doesn't support. CSS lets you do that.
Basic web development best practice is that you must declare a lang
attribute. If you want to know why, come ask me later, I explain to you. Assuming you (or most likely your framework) dutifully set the lang
attribute, you can use this pseudo-class to target only Vietnamese content. And provide an appropriate alternative font stack that fits your branding and all that.
Issue with Apple SD Gothic Neo
:lang(ko) {
font-family: 'Work Sans', -apple-system, BlinkMacSystemFont, sans-serif;
}
Since we've talked about commissioned fonts, this one is a bit of an edge-case, I would think. It has to do with Apple's choice of default font for Korean. Most CJK fonts will also have a Latin-based character set simply because we cannot escape from English on the web. That's just how it is. But anyway, Apple uses Apple SD Gothic Neo for Korean.
I discovered that it does not have support for the Latin-1 Supplement range, which means that we end up with a blasphemous situation where Beyoncé would not render correctly. Sacrilegious. For cases like this, specifying the Latin-based font first would fix it, even if that font doesn't have Korean language support because then the default fallback Korean will trigger for the Hangul characters. And everything will render properly. Talk to your designers about crafting a nice font stack.
谢谢
감사합니다
ありがとう ございます
Cảm ơn
🙇🏻


Evac scans for BLE (Bluetooth Low Energy) beacons inside buildings and enables you to locate missing people in case of an emergency.
Evac uses authentication so that only safety personnel is allowed to track your position. The beacons are not connected to any of your personal information to ensure privacy.


{% extends 'pointofsale/mainapp_layout.html' %} {% block title %} Employee Management {% endblock title %} {% block content %} Employee Management Add New Employee # First Name Last Name Username Email Action {% for employee in employees %} {{ employee.id }} {{ employee.first_name }} {{ employee.last_name }} {{ employee.username }} {{ employee.email }} Edit Delete Edit this employee × {% csrf_token %} First Name Last Name Username Email Update employee Do you want to Delete? × Clicking Delete Removes Permanently. It cannot be reversed. {% endfor %} Do you want to leave? × Click Logout to leave {% endblock content %}
Clicking Delete Removes Permanently. It cannot be reversed.
Click Logout to leave


This is the nav bar
menu stack here (Ask Ash for an explination)
Brand Name here
PRODUCT NAME HERE
Sellers details with picture here
John and Sally have been operating for the last 20 years, look how happy they are
This is the Footer


David Lynch's second best film to date is perfect evidence of what makes him fascinating as a filmmaker; he has always since day one made the types of films you normally have to earn the right to make. Filmmakers in the Americain system, capable of comandeering substantial resources(financial, human, technical etc..) in support of their projects have usually had to go through some sort of rite of passage after which the reigns on creativity are considerably loosened. John Woo had to wait two films (ignoring the more sinister implications...). There is no louder testimonial to this fact, regarding Lynch's cinema, than his first (and best) film, Eraserhead. Lost Highway is just as brilliant although we are clearly in different territory at this point.
Generally speaking, Lost Highway is either about a couple's experiences with a bizarre mental illness or an interconnected telling of two distinct tales within which certain characters intertwine. It could also be both. This is not to suggest that a single reading exists and that it is difficult to decipher; the whole point is that the film is any and all of these. In effect Lynch has negotiated an unprecedented relartionship with the spectator of total and complete complicity as far as reception and meaning-generation are concerned.
A variety of sources (Cahiers, Film Comment, Cineaste etc..) have commented on the various structures that establish this relationship. All in some way or another are linked to Lost Highway's narrative technique. Structurally, Lynch's conception transcends more conventional circular narratives in that it is ultimately a loop that invites the viewer to join in at a given point and follow through until he has reached this origin. It has been suggested that the film's indeal exhibition of the film would be a continuous loop of the film. The fact of the matter is that just as form came front iand center in Greenaway's The Pillow Book, Lynch here buries his story, as intriguing as it may be, under the two real creative thrusts of the film: narrative technique itself and the production design. Both are decidedly eerie...
The collapsing of space between filmmaker and spectator brings with it such a degree of subjectivity in the viewer that many have ended up terrified. This terror usually ends up being expressed as anger, frustration or accusations of self-indulgence on Lynch's part. Paradoxically. nothing could be further from the truth, in that, it as an act of heroic bravery, given today's viewing climate in Ameica to put forward a film that puts so much faith in them.
-Omar Odeh http://www.geocities.com/Hollywood/Theater/3920
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Ko Bobbi ahau
Ko Mount Maunganui raua ko Hamilton oku kainga
Ko Ngati Kahungungu ki te Wairoa raua ko Ngati Tuwharetoa oku iwi
Tēnā koutou, tēnā koutou, tēnā tatou katoa
Welcome to my EDA blog! I'm Bobbi and I've been working in hospatilty and customer service for over 20 years. I'm here at EDA to become a Web Developer and help improve the expereince that people have with websites. I'm a huge fan of making things usable, accessible and reducing the cognitive steps needed to complete a basic task. I also believe that we should bring kindness back into design and internet interactions.
Enjoy my blog! And feel free to hit me up.
Have a great day :)


@joseRivera
1987
FOLOWERS
12 Today
@joseRivera
1044
FOLOWERS
99 Today
@joseRivera
11K
FOLOWERS
1099 Today
Jose Rivera
1044
SUBSCRIBERS
99 Today
Overview - Today
Page Views
87
3%
Likes
52
2%
Likes
5462
2257%
Profile Views
52K
1375%
Likes
107
19%
Total Views
1407
12%


Google Earth Enterprise Documentation Home | Fusion Tutorial
Apply alpha masking to imagery
Image masking is a method for making areas of an image transparent. Images are defined as rectangular, but their contents can have irregular shapes. For example, an image that contains the land mass for a country has areas that are outside the country's borders.  When the image is overlaid on a base map, these areas should be transparent, to allow the base map to show through.
An alpha mask is a set of pixels that specifies where to make an image transparent. By default, Google Earth Enterprise Fusion automatically applies a mask when it processes an image but you can also provide custom mask data or prevent masking altogether. The Google Earth Enterprise Fusion Automask tool scans an imagery resource, detects fill data from imagery, and then creates a mask to only show the imagery.
GEE 5.x enables this overlay approach, making it easy to add high resolution imagery insets without the need to include imagery for the entire globe. In addition to use as an overlay, alpha masking can be used to blend imagery layers together.
Prior to GEE 5.x, each imagery layer—built by an imagery project—would comprise of an opaque foundation from which all imagery resources would be added. In GEE 4.4 and earlier, the following example of high resolution imagery inset with a custom mask includes the mask imagery covered with black pixels.
GEE 4.4 and earlier versions applied opaque masks:
As of GEE 5.x, each imagery layer—built by an imagery project—is comprised of a transparent foundation from which all imagery resources are added. The transparent alpha mask enables you to have imagery resources for specific areas, and to view these as overlays or blends on other imagery via Google Earth EC. The following image shows the same high resolution inset, this time with an alpha mask applied, so that it can easily be used as an overlay of a secondary database of worldwide imagery.
GEE 5.x applies alpha masking:
You can apply an alpha mask in different ways when you build an imagery asset:
- Use Auto mask to automatically scan an imagery resource, detect fill data from the imagery, then create a mask to only show the imagery.
Auto mask works well to mask fill data though it cannot, for example, mask imagery to a coastline since the water would still be considered imagery and not fill. In such cases, create a custom mask.
- Create your own custom mask and use Have mask to apply your custom mask.


Psalms 80:9
Thou preparedst room before it, and didst cause it to take deep root, and it filled the land.


BruteMD5
Decrypt MD5 Hash
Click here
to generate a md5 hash.
Click here
to enable notification.
Characters Avaliables:
Hash:
Decrypt
Text:
Stop


- {{nls.label1}} >>>>>
- {{nls.label2}} >>>>>
home currentStatus is {{currentStatus}}
home beforeActivate calls: {{beforeActivateStatus}}
home beforeDeactivate calls: {{beforeDeactivateStatus}}
home afterDeactivate calls: {{afterDeactivateStatus}}
home afterActivate calls: {{afterActivateStatus}}


MIT 1.125/1.00- Sample Project Videos
AI Platform For Restaurants
Scout, Search and Rescue
Review Intelligence
Mirror on the Wall (MotW)
Earthquake detection
Proxihue: Location Based Automated Home Light Control
Clusty (Ultimate News Search Engine)
PIE (Predictive Insights Engine)