Adam Sandler and Jennifer Lopez among independent film awards nominees
Adam Sandler and Jennifer Lopez are among the nominees ahead of the 2020 Film Independent Spirit Awards.
The annual ceremony recognises the best in independent film-making and will take place in February on the eve of the Oscars.
Best feature film is between Uncut Gems, The Farewell, A Hidden Life, Marriage Story and Clemency.
Sandler is up for best male lead for his role in crime thriller Uncut Gems, in a category also containing Robert Pattinson for black-and-white psychological horror The Lighthouse.
The Mustang’s Matthias Schoenaerts, Give Me Liberty’s Chris Galust and Luce’s Kelvin Harrison Jr are also nominated.
In the female category, Renee Zellweger is nominated for her acclaimed portrayal of Judy Garland in the biopic Judy.
Elisabeth Moss is recognised for Her Smell, as are Hong Chau for Driveways, Karen Allen for Colewell, Mary Kay Place for Diane and Alfre Woodard for Clemency.
Lopez is up for best supporting female for Hustlers. Octavia Spencer is also nominated for her part in thriller Luce.
Best supporting male boasts a star-studded list of nominees, including Willem Dafoe for The Lighthouse, Noah Jupe for Honey Boy, Shia LaBeouf for Honey Boy, Jonathan Majors for The Last Black Man In San Francisco and Wendell Pierce for Burning Cane.
Other highlights include Lorene Scafaria being nominated for best director for Hustlers, American Factory up for best documentary and Noah Baumbach nominated for best screenplay for Marriage Story.
To qualify for the Spirit Awards, a film must have a budget no larger than $22.5 million (£17.4 million).
The Film Independent Spirit Awards take place in Santa Monica on February 8, 2020.


Malar Malayalam Keyboard is a transliteration based Malayalam input method. This keyboard supports all Malayalam characters encoded as per the Unicode Standard, Version 15.0. Refer the below chart for key mapping. PDF version of the chart is available here.
Send your feedback about Malar Malayalam Keyboard to ramesh1@protonmail.com


In the previous post, a brief description about running Lua script on Redis and a code snippet to add a graph edge to a hash are given. In this post, an implementation of the Dijkstra’s shortest path algorithm is explained. I will not explain the algorithm itself since there are already so many articles explaining about it, e.g., Wikipedia’s page.
Priority Queue
A priority queue plays a primary role on the Dijkstra’s algorithm. The queue should hold a list of unvisited nodes ordered by a minimum cost to arrive a node. Thanks to Redis, sorted-sets can be used for this; a member and its score correspond to an unvisited node and the minimum cost of it respectively. Shift and push operations to this priority queue could be implemented like this:
-- dijkstra.lua:1
local function zshift(key)
local res = redis.call('ZRANGE', key, 0, 0, 'WITHSCORES')
redis.call('ZREMRANGEBYRANK', key, 0, 0)
return res[1], res[2]
end
local function zaddlt(key, score, member)
local s = redis.call('ZSCORE', key, member)
if not s or s+0 > score then
redis.call('ZADD', key, score, member)
end
end
The shift function retrieves the node with lowest score, i.e., lowest cost, by ZRANGE, then removes the entry by ZREMRANGEBYRANK and finally returns the node and its cost. The push operation is bit tricky due to the nature of a sorted-set; no two nodes can exist in the queue at the same time. Hence, a node and its associated cost should be added only if the cost is less than the one already existed in the queue. This is implemented as zaddlt. The time complexity of zshift and zaddlt is O(log(N))
.
Dijkstra’s algorithm
Here is my implementation of the algorithm with Lua script. Following code is the initialization step.
-- dijkstra.lua:18
local graph = KEYS[1]
local queue = KEYS[2]
local n = ARGV[1]
local from = ARGV[2]
local to = ARGV[3]
local visited = {}
for i = 1, n do visited[i] = false end
redis.call('DEL', queue)
redis.call('ZADD', queue, 0, from)
First, it assigns command line arguments to local variables mostly for clarification. My Lua script takes two keys for accessing graph edges and the priority queue, and three extra arguments: the number of nodes, source and destination nodes. A Lua’s table visited is instantiated to look up which node is already visited. In lines 27 and 28, it clears the queue and pushes the first node with cost zero. The main part of the algorithm is:
-- dijkstra.lua:29
local cur, total = zshift(queue)
while cur do
visited[cur+1] = true
if cur == to then return total end
for i = 0, n-1 do
if not visited[i+1] then
local cost = getcost(graph, n, cur, i)
if cost and cost+0 > 0 then zaddlt(queue, total+cost, i) end
end
end
cur, total = zshift(queue)
end
return nil
where the getcost function get a cost of edge from from to to nodes which is set by add_edge.lua script explained on the previous post.
-- dijkstra.lua:14
local function getcost(key, nnode, from, to)
return redis.call('HGET', key, nnode*from + to)
end
Result
Here, some example problems are solved by above code.
First is to find the minimum cost from node 0 to node 4 on above graph. You could find that the minimum cost becomes 5. My script also answers correctly:
% redis-cli EVAL "$(cat add_edge.lua)" 1 graph \
5 0 1 2 0 2 3 1 3 4 1 4 5 2 3 1 2 4 3 3 4 1
(nil)
% redis-cli EVAL "$(cat dijkstra.lua)" 2 graph queue 5 0 4
"5"
Good! But it can happen by chance since the graph is quite simple. So, I tested it by solving a Project Euler’s problem. Although I would not describe how to convert the problem to a shortest path problem, a resulting graph has 6,400 nodes and my script can calculate the correct answer to this problem, too.
However, my script is quite slow and takes about 19 seconds to solve the problem. On the other hand, my C++ implementation finishes instantly. I have not yet investigated the bottleneck of my code but I suspect that the loops in Lua are slow. Besides, my script has another bad point that is monolithic and occupies the Redis execution thread. It would be better to implement main algorithm part at client side for performance and granularity of execution. Anyway, it has been fun to pack a whole algorithm into Redis.
comments powered by Disqus


A Free Codec For Free Speech
View the Project on GitHub jpemartins/speex.js
Microphone (PCM): Broadcast
Encode times (in miliseconds): Decode time (in miliseconds): Number of samples:


Home
Events
Calendar
About
Contact
<EMAIL_ADDRESS>Moscrop Leo Club
Leadership. Experience. Opportunity.
Welcome to Moscrop Leo Club's website!


Cube Lives Matter
by Bart VeldhuizenThe default cube is suffering from constant abuse. Claudio Malefico Andaur comes to the rescue!
Blender tutorial on an easy and fast way to recover your default cube using tantalizing modelling techniques like sculpting tools and modifiers, so you can delete it again in the future.


Class 18: Project Ideas
Students presented ideas for their final projects.
Class 17: Class Meeting
We discussed plans for the semester and course projects.
Zoom Link
The link for our zoom class meetings is: https://virginia.zoom.us/j/237871483.
Everyone should have received the message on slack and email about our plans for the rest of the semester.
Class 16: Auction Results, Project Ideas
Slides Class 16 Slides (PDF) Project Ideas The Team and General Idea for your final project is due Thursday, 19 March (ready to present in class that day). Your team should be prepared to present a few slides with: Name of your project List of your team members Purpose of your project: how it satisfies the four project desiderata What you plan to do What you hope the outcome will be Links Here are links to some of the ideas and resources I presented in class.Class 14: Poker Wrap-up, Auction Theory
Slides
Class 15: In-Class Auction, Auction Theory
In-Class Auction
Congratulations to Kiara Gan, Aaron Ho, Rashid Lasker, and Eli Lifland for winning the Project 4 Auction!
It was a close competition with Team 6 (Anna Davis, Sally Greenberg, Chris Puglisi, Courtney Jacobs) and Team 3 (Maxwell Patek, Nicolas Izurrategui, Muxuan Yan, and Nate Strawser) tied for second.
We’ll have some more results and analysis from the auction in class Thursday.
Slides
Class 13: Auction Theory
Slides
Project 4
Project 4 is now posted, and is due on Tuesday, 3 March, 9:29am.
Class 12: Imperfect Information Games
Kidney Exchange Champions Congratulations to the winners of the Kidney Exchange Challenge: Bronze Kidney Rashid Lasker Eli Lafland Aaron Ho Kiara Gan Gold Kidney (Tie for First Place) Margaret Cheng Sophia Cheung Yilin Huang Yutong Zhong Brienne Tyler Christian Paget Shen Yan Will Define Slides Slides (PDF) We will finish finding the optimal strategy next class! Links John F. Nash, Jr. Equilibrium Points in N-Person Games. Proceedings of the National Academy of Sciences.Class 11: Game Theory
Slides
Links
John von Neumann and Oskar Morgenstern, Theory of Games and Economic Behavior. 1944.
Ran Canetti and Alon Rosen, Basics of Game Theory (lecture from Crytography and Game Theory course, November 2009.


About Me
I am a CS bachelor's graduate from Georgia Tech with concentrations in Intelligence and People. I am open to CS opportunites in a team-oriented enviornment.
Skillset
Primary Programming Languages: Python, React, HTML5, CSS, Java, Matlab, C
Methodlogy: Agile - Scrum
Software: Tensorflow, Scikit Learn, Docker, AppDynamics, Microsoft Suite, Adobe Suite
Languages: English, Chinese, Latin
Mapscout: An Interactive Map Resource General Solution designed to connect users with information.
Movie Prediction: A Supervised Learning Model to predict if a given movie will be successful after its launch.
Pervious Experience
Currently, I work for American Express as a Software Engineer for the Artificial Intelligence Center of Excellence. Formerly, I interned for AMEX in the summer of 2020, developing a custom UI portal to track and verify customer applications.
As a Software Developer Intern at Zuora from Jun. 2019 to Aug. 2019, I created a modular checkout flow.
I worked as a Performance Testing Intern at Elavon, part of U.S. Bank, from May 2018 to Aug. 2018. I developed automated scripts to create a report with analysis and metrics after performance tests were run.
A bit more
An allstate violinist. A HS varsity swimmer. A coffee loving addict. A lover of the latin language. A mediocre gamer.
Aspiring Photographer
In my free time I love to take photos around Atlanta and other urban places with friends and family.
Click below to see some of my IG work.
Thanks!
I appreciate your time.
Attached is my resume for additional information.


Seat on drive to create new forms of electric mobility
BARCELONA, Nov 22 — Spanish automaker Seat has unveiled two new urban mobility concepts in the form of a scooter and a motorised kick scooter at the Smart City Expo World Congress, which is currently being held in Barcelona. Both products are targeting scooter-sharing companies as well as the broader market.
This is the first time ever that Seat has presented a scooter. Simply christened e-Scooter, it is an all-electric vehicle whose final version is destined for launch on the scooter-sharing and consumer markets in in 2020. The e-Scooter concept is equipped with an 11 kW motor, which delivers the same level of performance as a 125 cc motorbike.
It can reach a top speed of 100 kph and offers an attractive range of 115 kilometres on a full charge. Its removable battery can be charged at home during the night or at public charging stations. Finally, it also offers an under-the-seat space that is sufficient to store two helmets.
The other innovation presented by Seat in Barcelona is the e-Kickscooter, which follows on from the eXS launched by the company in 2018. The e-Kickscooter is designed to be more efficient than the previous model, notably with an increased range of 65 kilometres.
Among other features the new kick scooter is equipped with two independent braking systems for added safety.
Seat's presentation in Barcelona also coincided with the launch of a new entity, Seat Urban Mobility, which, as the name suggests, will focus on the development of urban mobility solutions. — AFP-Relaxnews


Govt offers 50,000 scholarships each year to deserving, talented students
by News DeskPrime Minister Imran Khan said poor-friendly Ehsaas programme will bring a remarkable change in various sectors of the society, according to Radio Pakistan.
“The scholarship to deserving and talented students will give them an opportunity to excel in life,” said the premier while addressing the launching ceremony of Ehsaas Undergraduate Scholarship Programme in Islamabad on Monday.
He added that 50,000 scholarships each year to undergraduates is a big step towards higher education.
PM Imran said allocating quota for physically-challenged persons and females is an indication that the government believes in inclusive policies for the development of the country.
“Women are the builders of the family and nation and this scholarship will help them bring to mainstream.”
Talking about his vision behind setting up the National University of Modern Languages in Mianwali, the prime minister said he founded NUML for technical education to equip the youth of the area with skills in demand so that they could get jobs and change the economic situation of their families.
“Students from poor households were awarded scholarships to enable them to get education despite having poor socio-economic background,” he said.
Earlier in the day, he took to Twitter while terming the scholarship initiative the largest ever need-based undergraduate programme in the history of Pakistan.
Moreover, Special Assistant on Social Protection and Poverty Alleviation Sania Nishtar said the Pakistan Tehreek-e-Insaf (PTI) government is committed to promoting financial access to education and offers an equal opportunity to women.


OAuth made easy¶
Authentication in two lines¶
OAuth2.0 is complex and difficult to start with. To make it more simple, PyDrive makes all authentication into just two lines.
from pydrive.auth import GoogleAuth
gauth = GoogleAuth()
# Create local webserver and auto handles authentication.
gauth.LocalWebserverAuth()
# Or use the CommandLineAuth(), which provides you with a link to paste
# into your browser. The site it leads to then provides you with an
# authentication token which you paste into the command line.
# Commented out as it is an alternative to the LocalWebserverAuth() above,
# and someone will just copy-paste the entire thing into their editor.
# gauth.CommandLineAuth()
To make this code work, you need to download the application configurations file from APIs Console. Take a look at quickstart for detailed instructions.
LocalWebserverAuth() is a built-in method of GoogleAuth which sets up local webserver to automatically receive authentication code from user and authorizes by itself. You can also use CommandLineAuth() which manually takes code from user at command line.
Automatic and custom authentication with settings.yaml¶
Read this section if you need a custom authentication flow, such as silent authentication on a remote machine. For an example of such a setup have a look at Sample settings.yaml.
OAuth is complicated and it requires a lot of settings. By default, when you don’t provide any settings, PyDrive will automatically set default values which works for most of the cases. Here are some default settings.
- Read client configuration from file client_secrets.json
- OAuth scope:
https://www.googleapis.com/auth/drive
- Don’t save credentials
- Don’t retrieve refresh token
However, you might want to customize these settings while maintaining two lines of clean code. If that is the case, you can make settings.yaml file in your working directory and PyDrive will read it to customize authentication behavior.
These are all the possible fields of a settings.yaml file:
client_config_backend: {{str}}
client_config_file: {{str}}
client_config:
client_id: {{str}}
client_secret: {{str}}
auth_uri: {{str}}
token_uri: {{str}}
redirect_uri: {{str}}
revoke_uri: {{str}}
save_credentials: {{bool}}
save_credentials_backend: {{str}}
save_credentials_file: {{str}}
get_refresh_token: {{bool}}
oauth_scope: {{list of str}}
Fields explained:
| client_config_backend (str): | |
|---|---|
| From where to read client configuration(API application settings such as client_id and client_secrets) from. Valid values are ‘file’ and ‘settings’. Default: ‘file’. Required: No. | |
| client_config_file (str): | |
| When client_config_backend is ‘file’, path to the file containing client configuration. Default: ‘client_secrets.json’. Required: No. | |
| client_config (dict): | |
| Place holding dictionary for client configuration when client_config_backend is ‘settings’. Required: Yes, only if client_config_backend is ‘settings’ | |
| client_config[‘client_id’] (str): | |
| Client ID of the application. Required: Yes, only if client_config_backend is ‘settings’ | |
| client_config[‘client_secret’] (str): | |
| Client secret of the application. Required: Yes, only if client_config_backend is ‘settings’ | |
| client_config[‘auth_uri’] (str): | |
| The authorization server endpoint URI. Default: ‘https://accounts.google.com/o/oauth2/auth‘. Required: No. | |
| client_config[‘token_uri’] (str): | |
| The token server endpoint URI. Default: ‘https://accounts.google.com/o/oauth2/token‘. Required: No. | |
| client_config[‘redirect_uri’] (str): | |
| Redirection endpoint URI. Default: ‘urn:ietf:wg:oauth:2.0:oob‘. Required: No. | |
| client_config[‘revoke_uri’] (str): | |
| Revoke endpoint URI. Default: None. Required: No. | |
| save_credentials (bool): | |
| True if you want to save credentials. Default: False. Required: No. | |
| save_credentials_backend (str): | |
| Backend to save credentials to. ‘file’ is the only valid value for now. Default: ‘file’. Required: No. | |
| save_credentials_file (str): | |
| Destination of credentials file. Required: Yes, only if save_credentials_backend is ‘file’. | |
| get_refresh_token (bool): | |
| True if you want to retrieve refresh token along with access token. Default: False. Required: No. | |
| oauth_scope (list of str): | |
| OAuth scope to authenticate. Default: [‘https://www.googleapis.com/auth/drive‘]. Required: No. |
Sample settings.yaml¶
client_config_backend: settings
client_config:
client_id:<PHONE_NUMBER>347.apps.googleusercontent.com
client_secret: psDskOoWr1P602PXRTHi
save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json
get_refresh_token: True
oauth_scope:
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive.install
Building your own authentication flow¶
You might want to build your own authentication flow. For example, you might want to integrate your existing website with Drive API. In that case, you can customize authentication flow as follwing:
- Get authentication Url from GetAuthUrl().
- Ask users to visit the authentication Url and grant access to your application. Retrieve authentication code manually by user or automatically by building your own oauth2callback.
- Call Auth(code) with the authentication code you retrieved from step 2.
Your settings.yaml will work for your customized authentication flow, too.
Here is a sample code for your customized authentication flow
from pydrive.auth import GoogleAuth
gauth = GoogleAuth()
auth_url = gauth.GetAuthUrl() # Create authentication url user needs to visit
code = AskUserToVisitLinkAndGiveCode(auth_url) # Your customized authentication flow
gauth.Auth(code) # Authorize and build service from the code


You do not have scripting available. :-(
Your scripting is only enabled during the initial page load. Weird.
You have scripting enabled! :-)


2019-03-23 Steem Engine Breakthrough! Completed my first LTC trade on Steem-Engine.com!!! steem-engine
2018-02-19 Platform Wide Witness Milestone Unlocked: @good-karma has over 10,000 Witness votes!!! milestone
2017-12-24 Merry Christmas and 9,000 thanks to 9,000 Followers!!!! Here are 5 things you need to get there! steem
2017-08-25 I just hit 5,000 followers! Let's celebrate by meeting another mod! Have you met Shane (@swelker101)? meetyourmods
2017-07-14 2 months, 3,000 people, a bitchin' organization, 140k delegated SP from 200 separate delegations, working 30-40 hours a week for 10 straight weeks, and apparently that's all you have to do for top 50 Witness!!!! (MSP RESTEEM FUNDRAISER) witness


Stud
Eaz
Stud
Eaz
Download Files
Download all your documents.
Just in few click!
Extract Links
Select All
× Cancel


Rocket Elevators - Get a Quote
HOME
SERVICE
Residential Service
Corporate Service
PORTFOLIO
NEWS
CLIENTS
CONTACT
Get a quote
Type of building
-- select an option --
Residential
Commercial
Corporate
Hybrid
Numbers of residential appartements ?
Number of floor in the residential buildings (including basement) ?
Number of basements contained in the residential building ?
Number of distincts commercial businesses ?
Number of floors contained in the commercial building ?
Number of basements contained in the commercial building ?
Number of parkings spaces available in the commercial building ?
Number of elevators cages to be deployed in the commercial building ?
Number of separate tenant companies in the corporate building ?
Number of floors contained in the corporate building (including basement) ?
Number of basements contained in the corporate building ?
Number of parking spaces availables in the corporate building ?
Maximum number of occupants per floor in the corporate building ?
Number of distinct businesses in the hybrid building ?
Number of floors contained in the hybrid building (including basements) ?
Number of basements contained in the hybrid buildings ?
Number of parkings spaces available in the hybrid buildings ?
Maximum number of occupants per floor in the hybrid buildings ?
Number of hours (per day) of activity of the hybrid building ?
price
Estimated number of elevators cages
Our three product lines :
Standard
Premium
Excelium
unit price for an elevator shaft
Total price before installation fee :
Installation fees
Total


Unicode Version 13.0
Unicode 13.0 is the version of the Unicode Standard released on March 10, 2020. 55 new emoji code points were added in
this release, with all 117 new emojis for 2020 (including sequences for gender and skin tone) listed under Emoji 13.0.
Example
🥲
Unicode Version 12.0
Unicode 12.0 was released on March 5, 2019. Emojis that require new code points for release are listed on this page. See
Emoji 12.0 for the full 2019 emoji list.
Example
🥱
Unicode Version 11.0
Unicode 11.0 is the latest version of the Unicode Standard, released on June 5, 2018. Emojis that require new code
points for release are listed on this page but for the full 2018 emoji list see Emoji 11.0.
Example
🥰
Unicode Version 10.0
Unicode 10.0 is the version of the Unicode Standard released on June 20, 2017. 8,518 new characters were included with
this update, of which 56 were emoji characters.
Example
🤪
Unicode Version 9.0
The Unicode Consortium accepted the following emoji 72 emojis for Unicode 9.0. This update was released on June 21,
2016. Most vendors added support for this update within the 2016 calendar year.
Example
🤣
Unicode Version 8.0
The Unicode Consortium has approved the following 41 emoji characters as part of Unicode 8.0, released on June 17, 2015.
This is comprised of 37 new emojis, plus five emoji modifiers.
Example
🙃
Unicode Version 7.0
The Unicode Consortium has approved the following characters as part of Unicode 7.0, released on June 16, 2014. Support
for these emoji characters rely on updates from platform vendors such as Apple, Google and Microsoft.
Example
🙂
Unicode Version 6.1
A small update to the much larger Unicode 6.0. Unicode 6.1 included 13 new emoji characters.
Example
😀
Unicode Version 6.0
Released in October 2010, Unicode 6.0 was the first version of the Unicode Standard to support emoji.
Example
😃


Advanced Audit Policy Configuration
Location
- Open Administrative Tools
- Find and click on Local Security Policy
- Find and double click on Advanced Audit Policy Configuration
- Find and double click on System Audit Policies - Local Group Policy Object
Settings
-
Account Logon
- Audit Credential Validation - Success, Failure
-
Account Management
- Audit Computer Account Management - Success, Failure
- Audit Other Account Management Events - Success, Failure
- Audit System Group Management - Success, Failure
- Audit User Account Management - Success, Failure
-
Detailed Tracking
- Audit Process Creation - Success
-
Logon/Logoff
- Audit Logoff - Success
- Audit Logon - Success, Failure
- Audit Special Logon - Success
-
Object Access
- Audit File System - Failure
- Audit Registry - Failure
- Audit Handle Manipulation - Failure
-
Policy Change
- Audit Audit Policy Change - Success, Failure
- Audit Authentication Policy Change - Success
-
Privilege Use
- Audit Sensitive Privilege Use - Success, Failure
-
System
- Audit IPSec Driver - Success, Failure
- Audit Security State Change - Success, Failure
- Audit Security System Extension - Success, Failure
- Audit System Integrity - Success, Failure
-
Global Object Access Auditing
-
File system
- [x] Define this policy setting
- Find and click on Configure
- Find and click on Add
- Find and click on Select a principle
- Under Enter the object name to select, enter Everyone
- Press OK
- Set Type to Failure
- Make sure all Permissions are checked
- Press OK to close the windows
-
Registry
- [x] Define this policy setting
- Find and click on Configure
- Find and click on Add
- Find and click on Select a principle
- Under Enter the object name to select, enter Everyone
- Press OK
- Set Type to Fail
- Make sure all Permissions are checked
- Press OK to close the windows


1. Getting Started¶
This Getting Started guide aims to get you using the Hotmaps-Dispatch-Application as quickly as possible
1.1. Workflow¶
- Visit the Website (www.dispatch.invert.at) and log in with your user data
- Web User Interface loads
- Select a heat demand profile in the Heat Demand – Tab or upload your own profile via the Load Individual Data -Tab
- Set the yearly heat consumption of your region in the Heat Demand – Tab or in the Paramters- Tab, by editing the Total Demand [MWh] input widget
- Add predefined heat generators or heat storages in the Heat Producers and Heat Storage - Tab by pressing the + Button or upload custom generators via the Upload Power Plant Parameters – Button
- Set various prices, parameters, profiles, etc. or upload your own data and click on the Run Dispatch Model - Button
- After 60 to 120 seconds the results are shown in the output section
1.2. Things to consider¶
- Refreshing the page deletes all your progress
- Always save your progress by downloading the created structure
- After calculation is done download the result files
- Copy the link of the results if something occurs you can access your results within 2 hours (this saves you time)
- If you upload your own data, pay attention to the needed structure as described here and here
- Look up the heat generator types that are available when generating your custom structure outside the Application
- Don’t forget to press the ✓ - Button in the Sale-/Electricity Price Tab, because only so changes take effect
- If the page doesn’t respond for a long time or something else happened refresh the page and try again, if the issue is still present look up the User Guide, if you have still the issue please document all setting you set (which browser, parameters, data, etc. did you use)
- At last but not least, be patient…
2. User Guide¶
The User Guide is the primary resource for documenting key concepts that will help you use the Hotmaps-Dispatch-Application in your work
2.1. The Web User Interface¶
The figure below shows the User Interface. At first glance, you can see that the Application is divided into four sections:
- Button Section
- Notification Section with Peak Load and Missing Capacities – Information
- Output Section
- Data Section
In the following chapters, each section is described in detail.
2.2. Button Section¶
2.2.1. Short Description:¶
- In this Section, you can download the created structure to save your progress,
- You can upload your saved progress, or a custom structure into the Application,
- You can run the model you created,
- You can reset the view for better workflow or
- You can start an investment model
2.2.2. Long Description:¶
<IP_ADDRESS>. Download ¶
By pressing this button, the browser will try to download a file with the name download_input.xlsx that contains all the Information regarding heat producers and heat storages. The downloaded file has the following format (for uploading the same format must be specified): It has five worksheets:
<IP_ADDRESS>.1. Worksheets¶
The worksheets have following structure (columns):
- Heat Generators:
- prices and emission factors:
- Data:
- Heat Storage:
- Energy Carrier:
<IP_ADDRESS>. Upload ¶
By clicking this button, a pop up window will open and you will be able to upload a xlsx file. That overwrites the content of the web user interface. The file you upload must have the structure as described before in the long description of the download powerplant parameters -Button.
Consider following:
- You have to create a file that has the same names for the worksheets and columns
- The worksheet names are case sensitive
- The column names are case sensitive
- You must specify an index column starting with 0
- You can create maximum 13 energy carriers
Following heat generator types are available (type column in the Heat Generators worksheet)
| name available (case sensitive) | Description | Implementation Note |
|---|---|---|
| CHP-BP | Back Pressure CHP | |
| CHP-SE | Steam Extraction CHP | |
| boiler | heat boiler | |
| heat pump | heat pump | For temperatures < 0°C the heat pump doesn’t work |
| Solar Thermal | Solar thermal plant | At 1000 W/m² the solar power plant gives the maximum output |
| Waste treatment | waste incineration plants | |
| Waste Heat* | Power plants that work with the unused heat from other power plants | |
| Geo Thermal* | Geo thermal power plant | |
| Power To Heat* | Power to heat devices |
<IP_ADDRESS>. Run ¶
By Pressing this button, the optimization will start. You will get a progress shown in the notification section. Depending on the structure you create the optimization will run for about 60 to 120 seconds. Please be aware that your browser might freeze at that time. After the solution is found the results are shown in the output section. You can download then the results via the buttons in the notification section. Also, if something gets wrong you will get information in the notification section. If unexpected errors occur please document and send detailed instruction to reproduce the error and send these instruction with a short problem description.
<IP_ADDRESS>. Reset ¶
By pressing this button, the notification section and the output section will be cleared, and you will get a “fresh” view.
<IP_ADDRESS>. Invest ¶
The Application is implemented as a linear program and can be used on the one hand as a pure dispatch model and on the other hand for investment planning (how much capacities to install) to cover a load profile with the minimum costs. If you enable this toggle button, it is important to specify the heat producers and heat storages by marking them (hold CTRL and left mouse click to select the desired generators and storages) for which an investment model should run.
2.3. Notification Section with Peak Load and Missing Capacities – Information¶
2.3.1. Short Description:¶
In this section, you will get information regarding the progress, the peak load, missing capacities and errors that occur.
2.3.2. Long Description:¶
In the following you will see some frequent messages (progress and error information) that might appear in the notification section.
<IP_ADDRESS>. After pressing the Run Dispatch Model Button¶
- Dispatch in progress, please be patient… This can take some time. Typically, also to browser can freeze when the calculation is done and the results are rendered in the browser
- Calculation is Done With these buttons, you can download your results. It might happen that the page freezes after downloading, please be patient. We recommend also to save the link of these file right click on the buttons Copy Link (after 2 hours this links will not work but you can download the files directly if the page freeze and so save so your time)
- No Heat Generators available This will happen if you haven’t specified any heat generators and wanted to start the model from the initial page.
- The installed capacities are not enough to cover the load This will be shown when you haven’t specified enough MW to cover the peak load (see missing Capacities in the right sight of the notification section)
- Error: Problem proven to be infeasible or unbounded This happens typically when constraints cannot be met and can have a lot of reasons, its upon you to think about what could happen.
- Error: Please specify the technologies for the investment model This is shown when you enable investment planning but you forgot to select the heat generators and heat storages to mark, with whom it should do an investment optimization
<IP_ADDRESS>. After Pressing the Download Button¶
- Nothing to download Typically, this occurs when you want to download the initial page, to download you need to add first a heat generator
- Download done
<IP_ADDRESS>. After Pressing the Upload Button¶
- Not a valid file to upload This is shown when you try to upload an filetype other then .xlsx
- Fatal Error @ Update This is shown when your file you want to upload has not the needed structure.
- Upload Done
<IP_ADDRESS>. After Pressing the Invest Button¶
- Mark Technologies by pressing “CTRL” + “left mouse” Rows are marked yellow As soon as you press the Invest Button you will see this Information in the notification section, it tells you that you need to specify for which generators and storages to do the investment planning. If you don’t mark technologies you will get the message as described here
<IP_ADDRESS>. After Pressing the + Button in the Heat Producers and Heat Storage Tab¶
- This waiting spinner is especially visible after pressing the + Button, typically the browser freezes, so be patient, the add section is loading
<IP_ADDRESS>. After Pressing the ✓ ADD Button in the Heat Generator Adding Section¶
- Heat Generator ADDED
<IP_ADDRESS>. After Pressing the ✓ - Button in the Sale-/Electricity Price Tab¶
- Sale-/Electricity price Data is set as Default
- Sale-/Electricity price Data for Heat Generator name is added
<IP_ADDRESS>. After Uploading a file in the Load Individual Data Tab¶
- Invalid Filetyp to load @ Loading External Data This is shown when you try to upload a filetype that is not .xlsx or .csv
- Your file has not enough values (please specify 8760 values) Your file that you upload has to have the structure as described here
- External Data Loaded This is shown when the external Data has been uploaded.
<IP_ADDRESS>. After Pressing the ✓ Save Button in the Load Individual Data –Tab¶
2.5. Data Section¶
2.5.1. Heat Producers and Heat Storage – Tab¶
<IP_ADDRESS>. Short Description:¶
In this Tab, the created or uploaded heat generator and heat storage data is shown in two tables (heat storage table and heat generator table). The above picture shows the initial page (no heat generators and no heat storages are defined).
Please notice that it is possible to edit the values in the tables.
By pressing the + Button you will be navigated to the Adding Tab, for adding new heat generators or heat storages, pops up between the button section and the output section (see picture below) *.
- Section After Pressing + Button in the Heat Generator Table
- Section After Pressing + Button in the Heat Storage Table
<IP_ADDRESS>. Long Description:¶
<IP_ADDRESS>.1. Heat Generator Table¶
Your added (by pressing the + Button) or uploaded data of heat generators is shown here. You have the opportunity to change the values of the table *.
These parameters can also be changed via uploading. Therefor you have to create an excel sheet with the structure as described here. Then the parameters must be specified in the Heat Generators worksheet.
Format, unit and description of the Heat Generators Table
| Column name | Format | Unit | Description |
|---|---|---|---|
| name | String | - | Name of your power plant, you can give any name you want (don’t use to same names for different generators) |
| installed capacity (MW_th) | Number | MW | Here you can specify the power you want to install |
| efficiency th | Number | - | Here you can specify the thermal efficiency of the heat generator |
| efficiency el | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Here you can specify the electrical efficiency of the heat generator |
| investment costs (EUR/MW_th) | Number | \frac{}{\text{MW}} | Here you can set the specific investment cost (especially if you try to do investment planning, this parameter can be crucial) |
| OPEX fix (EUR/MWa) | Number | \frac{}{\text{MW}} | Here you can specify fixed operational expenditures |
| OPEX var (EUR/MWh) | Number | \frac{}{\text{MWh}} | Here you can specify variable operational expenditures |
| life time | Number | a | Here you can set the life time of your generator (in the model this is used for the annuity factor) |
| renewable factor | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Here you can set the renewable share of your generator, e.g. if your generator is 0% renewable ten you set 0, if your generator is 50% renewable then you have to set this value to 0.5. The Application tries then to meet the minimum renewable share (specified in the Parameter Tab) for the generation mix. Caution: the problem might become infeasible, e.g. if you defined a minimum share of 50% but you haven’t defined enough generators with a renewable factor higher than 0.5 the constraint for a minimum share of 50% cannot be met |
| must run [0-1] | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Here you can force a heat generator to run all the time with x% of its installed capacity, if you want to realize a base load you can use this as a parameter, e.g. if you want that your het generator run with 50% of its capacity all the time you have to set this value to 0.5. Caution: Due to other constraints, the problem might become infeasible, e.g. the heat pump doesn’t run at temperatures lower than 0°C, that means if you force a heat pump to run all the time with x% of its capacity the other constraint cannot be met and therefore the problem become infeasible |
*Caution: In this table, it is not possible to change the heat generators type or energy carrier. The type is either defined by the type column in the Heat Generators worksheet when uploading power plant parameters or internally by adding from the user interface in the Add new Heat Generator Section. The same applies for the energy carriers, they can only be adapted via uploading an excel file (energy carrier worksheet) or via the internal adding section.
<IP_ADDRESS>.2. Heat Storage Table¶
You have the opportunity to change the values of the table *. These parameters can also be changed via uploading. Therefor you have to create an excel sheet with the structure as described here. Then the parameters must be specified in the Heat Storage worksheet.
Format, unit and description of the Heat Storages Table
| Column name | Format | Unit | Description |
|---|---|---|---|
| name | String | - | Name of your heat storage, you can give any name you want (don’t use to same names for different storages) |
| Storage Capacity [MWh] | Number | MWh | Here you can specify the capacity you want to install (if you use only dispatch mode, you can see in the notification section, how much MW you need to cover the peak load) |
| maximum unloading power [MW] | Number | MW | Here you can specify the unloading power |
| maximum loading power [MW] | Number | MW | Here you can specify the loading power |
| loading efficiency | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Loading efficiency |
| unloading efficiency | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Unloading efficiency |
| Invesment costs for additional storage capacity [€/MWh] | Number | \frac{}{\text{MWh}} | Here you can set the specific investment cost (especially if you try to do investment planning, this parameter can be crucial) |
| OPEX fix [€/MWha] | Number | \frac{}{\text{MWh}} | Here you can specify fixed operational expenditures |
| Life Time [a] | Number | a | Here you can set the life time of your generator (in the model this is used for the annuity factor) |
*Caution: Please be aware that only one heat storage is available, e.g. if you don’t upload others only this storage will be editable. The + Button for heat storages does nothing, the implementation is in progress and in future this feature will become available.
<IP_ADDRESS>.3. Add new Heat Generator Section¶
By pressing the + Button in the Heat Generators Table the above section pops up (please be patient this will take some time). All heat generators have the three red marked tabs in common, only for heat pumps an extra tab is shown (Coefficient of Performance, COP)
The picture below shows you all predefined heat generator types, that means by selection one of these, predefined values are loaded. You can see and edit the values in the Technical Parameters Tab and in the Finance Parameters Tab, but you can also change them in later in the Heat Generator Table. (after pressing ✓ ADD )
<IP_ADDRESS>.3.1. Available Heat Genrators¶
<IP_ADDRESS>.3.2. Available types of boilers¶
<IP_ADDRESS>.3.3. Available types of heat pumps¶
<IP_ADDRESS>.3.4. Available types of CHP-Steam Extraction types¶
<IP_ADDRESS>.3.5. Available types of CHP-Back Pressure types¶
<IP_ADDRESS>.3.6. Technical Parameters – Tab¶
- Here you can select the energy carrier with witch the heat generator is fired. You can define a name and set the thermal and electrical efficiency. For heat pumps the input for Thermal Efficiency is disabled, because it is defined via the Coefficient of Performance, COP – Tab. Each heat generator has predefined values that are shown here. You can and should change them.
- Here you can define the technical parameters for your heat storage
<IP_ADDRESS>.3.7. Finance Parameters – Tab¶
- Here you can see and change predefined values of financial parameters for selected heat generator.
- Here you can set the financel Paramters for your heat storage.
<IP_ADDRESS>.3.8. Model Parameters -Tab¶
- In this Tab, you can set the orange toggle Button Must Run, that mean that this heat generator must run all the time with 100% of its capacity (for more details see here) With one slider, you can set a renewable factor (values from 0 to 1, more details see here) and with the other you can set the installed capacity of your heat generator (values from 0 to Pmax,-Peak Load of the selected Heat Profile)
- In this Tab, you can set heat storage losses, please specify losses because if losses are zero it can happen that the storage is loading and unloading at the same time
<IP_ADDRESS>.3.9. Coefficient of Performance, COP – Tab¶
Only heat pumps have this additional tab. Here you can select an Inlet-and-Return-Temperature and based on that selection a COP is defined. In the Technical Parameters Tab the COP value is inserted into the thermal efficiency input widget (the widget itself is disabled, meaning you cannot edit the value here, but you can change it later in the heat generators table )
2.5.2. Parameters – Tab¶
<IP_ADDRESS>. Short Description:¶
In this tab, you can change following parameters
| Column name | Format | Unit | Description |
|---|---|---|---|
| CO2 Price [EUR/tC02] | Number | \frac{}{\text{t\ CO}_{2}} | CO2 Certificate Price (used for the short run marginal costs) |
| Interest Rate [0-1] | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | interest rate (for investment planning) |
| Minimum Renewable Factor [0-1]] | Number $$\mathbb{R}$$ $$\vee$$[0,1] | - | Minimum renewable share that the thermal generation should have |
| Total Demand[ MWh] | Number | MWh | Heat Consumption of one year Changing this will change the peak load (can be seen in the notification section), This cell and the Set Total Demamd (MWh) input widget in the Heat Demand Tab are coupled, this means changing one value of them changes also the other |
These parameters can also be changed via uploading. Therefor you have to create an excel sheet with the structure as described here. Then the parameters must be specified in the data worksheet.
2.5.3. Prices & Emission factors – Tab¶
<IP_ADDRESS>. Short Description:¶
In this Tab, you can set prices and emission factors for different energy carriers. These prices are used to calculate the short run marginal costs.
| Column name | Format | Unit | Description |
|---|---|---|---|
| energy carrier | String | - | Name of the energy carrier |
| prices(EUR/MWh) | Number | \frac{}{\text{MWh}} | Energy carrier price |
| emission factor [tCO2/MWh] | Number | \frac{\text{t\ CO}_{2}}{\text{MWh}} | CO2 emission factor of the energy carrier |
These parameters can also be changed via uploading. Therefor you have to create an excel sheet with the structure as described here. Then the parameters must be specified in the prices and emmision factors worksheet. With the uploading method, you can create your own energy carriers (max. 13). If you create new ones don’t forget to specify the new names to your heat generators in the Energy Carrier worksheet.
2.5.4. Radiation – Tab¶
<IP_ADDRESS>. Short Description:¶
- In this Tab, you can select (Country-Year drop-down-box) a predefined or a custom radiation profile with which you want to run the Application.
- If you have created your own profile with the Load Individual Data - Tab the profile will show up in Country-Year drop-down-box (Caution please).
- The Unit of the profile is W/m² and the model use this profile for the solar thermal power plants. For hours where the radiation is larger than 1000 W/m² the plant works with it peak capacities installed .
You have the opportunity to make *reversible modifications on the profile:
- you can set an offset (every value of the profile will be added by the offset value),
- you can set the whole profile to a constant value
- you can scale the profile (multiplication by a factor)
- or you can use the mean value as constant profile.
*By reversible we mean e.g. if you check the use mean value checkbox and uncheck again you will get your profile back (see picture below), the same applies if you set a constant value and then delete this value you will get the profile back, see in contrast the irreversible modification tool in the Load Individual Data - Tab).
2.5.5. Temperature – Tab¶
<IP_ADDRESS>. Short Description:¶
- In this Tab, you can select (Country-Year drop-down-box) a predefined or a custom temperature profile with which you want to run the Application.
- If you have created your own profile with the Load Individual Data - Tab the profile will show up in Country-Year drop-down-box (Caution please).
- The Unit of the profile is °C and the model use this profile for the heat pumps. For hours where the temperature is smaller than 0°C the heat pumps don’t work.
- You have the opportunity to make reversible modifications on the profile (details see here).
2.5.6. Electricity price / Sale Electricity price – Tab¶
Process to assigning a sale-/or electricity price profile
<IP_ADDRESS>. Short Description:¶
- In this Tabs, you can select (Country-Year drop-down-box) a predefined or a custom sale-/electricity price profile and then assign it to a generator (Add to drop-down-box) by pressing the ✓ - Button *.
- If you have created your own profile with the Load Individual Data - Tab the profile will show up in Country-Year drop-down-box (Caution please).
- The Unit of the profile is €/MWh and the model uses this for
multiple purposes, e.g:
- If the energy carrier is electricity this influences the short run marginal costs
- If your generator produces electricity this affects the revenues
- Also, here you have the opportunity to make reversible modifications on the profile (details see here).
*Caution: It is important to press the ✓ - Button, because only so changes take effect: e.g. Let’s say we want to change the default electricity price (see picture above):
- you select a new profile with the Country-Year drop-down-box
- select Default in the Add to drop-down-box then
- press the ✓ - Button,
- then you will get an information in the notification section,
this is the only way to assign a price profile, otherwise the initial profile or the last set profile is used.
2.5.7. Heat Demand – Tab¶
<IP_ADDRESS>. Short Description:¶
- In this Tab, you can select (Country-Year drop-down-box) a predefined or a custom load profile with which you want to run the Application.
- If you have created your own profile with the Load Individual Data - Tab the profile will show up in Country-Year drop-down-box (Caution please).
- The Unit of the profile is MW and the model use this profile as the hourly heat demand curve.
You have the opportunity to set the total heat consumption of one year. By this you set technically the sum of all values of the profile selected.
This means if the Set Total Demand (MWh) value changes the plot will adapt so that the sum you specified is met, also the Total Demand [MWh] value in the Parameters Tab will change to the value specified (and vice versa). Additionally, in the notification section you can see how the peak load changes when you change the total heat consumption (see picture above).
2.5.8. Load Individual Data – Tab¶
<IP_ADDRESS>. Short Description:¶
<IP_ADDRESS>.1. Upload External Data – Button¶
Pressing this button will enable you to upload your own data
<IP_ADDRESS>.2. Create Data – Tools¶
Here you can create random data. You can choose between three distributions
- Dirichlet Distribution
- Normal Distribution
- Linear Distribution
<IP_ADDRESS>.3. Table¶
The values of the uploaded data or the created distribution are shown here. You can also change specific values inside the table.
<IP_ADDRESS>.4. Plot Area¶
Here a line plot of the values from the table is shown. With the toolbar at the right sight of the plot area you can inspect the data in more detail.
<IP_ADDRESS>.5. Modification Tools¶
You have the opportunity to modify the data with these tools, e.g. set the sum of all values, set an offset, scale, etc.
<IP_ADDRESS>.6. Saving Tools¶
After loading your custom data, or creating a distribution you can choose for which profile you want this dataset to be added. By Pressing the save button your data can be found at the selected profiles and can be used by selecting it with the name you specified.
It is also possible to add your own thermal efficiency series to heat generators.
<IP_ADDRESS>. Long Description:¶
<IP_ADDRESS>.1. Upload External Data ¶
When you click on this button you will get a pop up window open, where you can select your file with the desired values. Information regarding the progress are shown in the notification section. The file you upload must have following structure:
- It has to be either a .xlsx or a .csv data
- the files must have the structure as below (left: .xlsx, right:csv)
- you have to specify 8760 values and a header name
- for .xlsx only the values of the first worksheet will be uploaded
An example of a successful upload can be seen in the picture below.
<IP_ADDRESS>.2. Create Data Tool¶
This part of the user interface enables you to create random data. For this purpose, following distributions are available
<IP_ADDRESS>.2.1. Dirichlet Distribution:¶
To use this distribution, you have to specify the sum$\text{\:Σ}$ - input widget. It gives you random numbers so the sum you specify is met. An example with sum$\text{\:Σ}$=10 is shown below.
<IP_ADDRESS>.2.2. Normal Distribution¶
Another option to create random number is the gaussian-normal-distribution. To use this, you have to specify a mean value (sigma $$\sigma$$) and standard deviation from that value my $$\mu$$. Below is a normal distribution with $$\sigma = 100$$ and $$\mu = 100$$ shown.
<IP_ADDRESS>.2.3. Linear Distribution¶
We this option you can create 8760 number that are linear distributed beginning from start and ending with stop. An example with start=-10 and stop=100 is shown below.
<IP_ADDRESS>.3. Table and Plot Area¶
The values of the uploaded data or the created distribution are shown here in tabular and graphical form. You can also change specific values inside the table, in that case the cell you are editing become yellow and the graph is blurred. After editing press, the reset button on the toolbar to remove the blur.
<IP_ADDRESS>.4. Modification Tools¶
You have the opportunity to modify the data with these tools, e.g. set the sum of all values, set an offset, scale, etc. *.
*Caution: This permanently change the values in the table! (It works with the direct values and therefore it is an irreversible process e.g. if you check the use the mean value checkbox and then unchecked again you will not get your profile back see picture below, you have to upload or create your data again)
Irreversible process of the modification tool in the Load Individual Data Tab
<IP_ADDRESS>.5. Saving Tools¶
After loading your custom data, or creating a distribution you can choose for which profile you want this dataset to be added.
By Pressing the save button your data can be found at the selected profiles (Add to) Tab and can be used by selecting it with the name you specified *.
*Caution: The name of the data will always be terminated by the string _1 after saving (e.g. if you specify individual as your name and saved it to Radiation, you will find your profile in the Radiation Tab by the name individual_1
It is also possible to specify a time specific thermal efficiency for a heat generator (or COP for heat pumps).
To use this feature, you have to select in the Add To-drop down button n_th/COP and then select the heat generator (Add To Heatgenerator) which you like to add your custom thermal efficiency. Then you press save and you get an information in the notification section. The picture below shows an example.


---
title: Investment
photos:
- image: /uploads/2019-28.jpg
title: "The Most Important Thing: Uncommon Sense for the Thoughtful Investor"
caption: "2019 #28"
captionfull: "\
\
- Paying below value lowers risk and increases return.
\
- Look for good buys, not good assets.
\
- Exploit the big swings: economies, markets, and emotions.
\
- Risk aversion and skepticism is healthy for markets.
 Focus on risk control.
\
- Practice defensive investing. Avoid the losers, and the winners will take care of themselves.
\
"
- image: /uploads/2019-06.jpg
title: "New Frontiers in Technical Analysis: Effective Tools and Strategies for Trading and Investing"
caption: "2019 #6"
captionfull: ""
- image: /uploads/2019-05.jpg
title: "Intermarket Trading Strategies"
caption: "2019 #5"
captionfull: ""
- image: /uploads/2019-04.jpg
title: "Algorithmic Trading: Winning Strategies and Their Rationale"
caption: "2019 #4"
captionfull: ""
- image: /uploads/2019-03.jpg
title: "Fundamentals of the Futures Market"
caption: "2019 #3"
captionfull: ""
- image: /uploads/2019-02.jpg
title: "A Complete Guide to Volume Price Analysis"
caption: "2019 #2"
captionfull: ""
- image: /uploads/2019-01.jpg
title: "Quantitative Trading: How to Build Your Own Algorithmic Trading Business"
caption: "2019 #1"
captionfull: ""
---
{% for photo in page.photos %}
- " }}')">
{% endfor %}


These are the Covington routes for the 2020 Jerry Woods Holiday Engine. When we have specific times for each neighborhood available they will be listed here, just as we do for Maple Valley. You can use the Track Santa link to follow the engines on the nights listed below. Please select Engine 3 to track Covington routes.
Click on an individual date for a map of that days routes. We have a few different neighborhoods this year, so please be sure to scroll to the bottom of the page to see them all. Thank You!
See all of the neighborhoods covered in Covington on one page.
If you are a part of a youth organization, i.e. scouts or a sports team, and would like to help us with the Holiday Engine as we collect food in local neighborhoods, please reach out to us at<EMAIL_ADDRESS>Friday, Dec. 4
Click to See Route
Engine 2
Engine 3
|
Saturday, Dec. 5
Click to See Route
Engine 3
|
Friday, Dec. 11
Click to See Route
Engine 3
|
Saturday, Dec. 12
Click to See Route
Engine 3
|
Friday, Dec. 18
Click to See Route
Engine 3
|
Saturday, Dec. 19
Click to See Route
Engine 3
|


Engines
I will not take full credit as a lot of code is heavily inspired by guides online. I am showing these to prove that I have a general understanding of how Graphics APIs are implemented and the common tongue for developing a game engine.
OpenGL Shaders
Features:
- Camera with ProjectionView
- Matrix based Meshes
- Load Shaders from a single file with #type separation (My addition)
- Uniform Map Optimization (My addition)
- GLSL
- Spotlights
- Pointlight
- Ambient Lightning
- Direct Lightning shadows
- Skyboxes
Big Thanks to Emil Ström for teaching me this


This is link 37f909eb-484f-47af-bace-f625ef955052
This is paragraph 926ffd2d-5f12-4542-9169-14683e095ef4


SERVICES
GROOMING
OUR GROOMING ACCOMMODATIONS INCLUDE...
- HAIRCUTS
- BATHS & BLOWOUTS
- NAILS
BOUTIQUE
OUR BOUTIQUE OFFERS A WIDE VARIETY OF UNIQUE...
- DOG CLOTHING
- DOG LEASHES
- DOG COLLARS
BOARDING
OUR BOARDING ACCOMMODATIONS INCLUDE...
- OVERNIGHT STAY
- PLAYTIME AND TREATS
- OPTIONAL TRAINING


Downloading text using Blobs, URL.createObjectURL() and the anchor download attribute in js
Snakes. Why'd it have to be snakes?
Download Text


River Runs Red
River Runs Red is a movie starring Taye Diggs, John Cusack, and George Lopez. 2 cops pull a car over and shoot the driver. Not finding a gun, they plant one on him. The victim's dad, a judge, wants "justice" and after the 2 cops...


{% extends 'base.html' %} {% load bootstrap4%} {% load static %} {%block nav-items%}
Established in {{service_provided.year_of_establishement}}
{{service_provided.description}}
{% if service_provided.currency %}Offered @ {{service_provided.price}} {{service_provided.currency}}
{% endif %}{{service_provided.street_address}}
{{service_provided.phone}}
{{user.email}}
Suspended
{% else %}Active
{% endif %}Statistics
{{joining_rate}}
persons/month
{{leaving_rate}}
persons/month
{{subscriptions|length}}
{{ratings|length}}
{{complain|length}}
{{suggestions|length}}
Subscribed Customers
{{subscription.date}}
No Subscribed Customers.
Customers' ratings and reviews
{{rating.date}}
{{rating.review}}
No reviews.


Vietnam arrests 1 more, says migrants routed through Russia
HANOI, Vietnam (AP) - Vietnamese state media have reported another arrest over the deaths of dozens of migrants in England and cite police as saying a suspect had organized for people to travel to Russia before being smuggled to the West.
The state-run Tuoi Tre newspaper reported an arrest was made in Nghe An province on Monday in relation to the deaths of 39 Vietnamese migrants in a refrigerated truck container last month.
Vietnam so far has arrested two people in Ha Tinh province and nine in Nghe An who face charges of organizing people smuggling.
The newspaper cited Nguyen Huu Cau, chief of Nghe An provincial police, as saying that one of those arrested, who used to live in Russia, organized people to travel to Russia then smuggled them to Germany before getting to a third country.
The suspected truck driver, a man from Northern Ireland, has been charged with manslaughter and conspiracy to traffic people. A second man is being held in Ireland pending extradition and has been charged with manslaughter, human trafficking and immigration offenses.
British police are still working to identify the victims - 31 men and eight women - with assistance from Vietnam, where families reported their relatives missing while thought to have been in transit to England. DNA samples for identification have been provided by 21 families from Nghe An and 10 from Ha Tinh province.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


Fork me on GitHub
Instagram Facial Feature Search Engine
Find Instagram look alikes
*only photos with
specified tags
(e.g.
#selfies
) are indexed*
read the
project page
to build an IFFSE with custom tags
Search
find similar faces
instagram.com/p/
copy shareable link


You’ll find this post in your _posts
directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve
, which launches a web server and auto-regenerates your site when a file is updated.
-
posts
-
Welcome to Jekyll!


As such, C programming does not provide direct support for error handling but being a system programming language, it provides you access at lower level in the form of return values. Most of the C or even Unix function calls return -1 or NULL in case of any error and set an error code errno. It is set as a global variable and indicates an error occurred during any function call. You can find various error codes defined in <error.h> header file.
So a C programmer can check the returned values and can take appropriate action depending on the return value. It is a good practice, to set errno to 0 at the time of initializing a program. A value of 0 indicates that there is no error in the program.
The C programming language provides perror() and strerror() functions which can be used to display the text message associated with errno.
The perror() function displays the string you pass to it, followed by a colon, a space, and then the textual representation of the current errno value.
The strerror() function, which returns a pointer to the textual representation of the current errno value.
Let's try to simulate an error condition and try to open a file which does not exist. Here I'm using both the functions to show the usage, but you can use one or more ways of printing your errors. Second important point to note is that you should use stderr file stream to output all the errors.
#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE * pf; int errnum; pf = fopen ("unexist.txt", "rb"); if (pf == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d\n", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s\n", strerror( errnum )); } else { fclose (pf); } return 0; }
When the above code is compiled and executed, it produces the following result −
Value of errno: 2 Error printed by perror: No such file or directory Error opening file: No such file or directory
It is a common problem that at the time of dividing any number, programmers do not check if a divisor is zero and finally it creates a runtime error.
The code below fixes this by checking if the divisor is zero before dividing −
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(0); }
When the above code is compiled and executed, it produces the following result −
Division by zero! Exiting...
It is a common practice to exit with a value of EXIT_SUCCESS in case of program coming out after a successful operation. Here, EXIT_SUCCESS is a macro and it is defined as 0.
If you have an error condition in your program and you are coming out then you should exit with a status EXIT_FAILURE which is defined as -1. So let's write above program as follows −
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0) { fprintf(stderr, "Division by zero! Exiting...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d\n", quotient ); exit(EXIT_SUCCESS); }
When the above code is compiled and executed, it produces the following result −
Value of quotient : 4


Enumerable is a module, which is a mixin class that you can plug in, without it needing to be of a certain parentage. These classes of methods are for searching and traversing things. Ruby is fairly unique as a programming language, because it allows for these mixin modules. Basically, say there is a child of family X.  But if they wanted to fight crime, X child would have to get outside help, like from module Assassin or Vigilante. Then they could use all of the things in that module to fight crime or save their city.
puts x_child.injustice?(list_of_events)
end
So, .injustice? is a public instance method of module Vigilante.
So now that we understand modules, mixins and Enumerable.
Cycle is a public instance method of Enumerable. It's used to cycle through an array. If you pass it a number, that's the toal number of times it will cycle through an array. You can also pair it with other items, like to go backwards through an array 3 times, you could do [1,2,3].reverse_each.cycle(3) and you'd get [3,2,1,3,2,1,3,2,1].
You can us enumerable methods to iterate and sort and seperate and do all kinds of neat stuff, because Ruby likes to let all the mixins and modules and code get together. It really allows for a great customization.


Lampserver
The idea: how could I establish a cloud database and build an android application to write data to that server?
Part 1: Deploying a LAMP Web Server with CRUD abilities.
This made extensive use of AWS EC2 and Docker.
Set up LAMP Server using EC2
My first step was to set up a LAMP web server using Amazon EC2.
I found this digital ocean guide extremely useful.
I then made the effort to dockerize my setup (because I don’t think I can afford to run an EC2 instance all the time and needed to be able to launch quickly).
First I figured installed docker and docker compose on my ec2 instance with help from the docker documentation.
Note that we might have to change the version number of docker-compose in the curl command below. Find the latest version number by going to the release page on Github.
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
sudo curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
I then started building a docker LAMP image, just to learn how it’s done. This kinamo guide was super helpful.
mkdir php
cd php
echo "FROM php:5.6-apache
RUN docker-php-ext-install mysqli" > Dockerfile
mkdir www
cd www
echo "<?php
phpinfo();
?>" > index.php
cd ../../
echo "version: '2'
services:
php:
build: php
ports:
- "80:80"
- "443:443"
volumes:
- ./php/www:/var/www/html
links:
- db
db:
image: mysql:5.7
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=thisismypassword
- MYSQL_DATABASE=culturemind
" > docker-compose.yml
echo "<?php
mysqli_connect(\"db\", \"root\", \"thisismypassword\", \"culturemind\") or die(mysqli_error());
echo \"Connected to MySQL<br />\";
?>" > php/www/index.php
sudo docker-compose up -d
You should now have a dockerized LAMP server up and running!
Create a Basic Database
I found some inspiration from here.
First we write some php to create the table. We’ll use a connection class to connect to the database.
Place the contents of the following in php/www/db_config.php on the host machine.
<?php
/*
* All database connection variables
*/
define('DB_USER', "root"); // db user
define('DB_PASSWORD', "thisismypassword"); // db password (mention your db password here)
define('DB_DATABASE', "culturemind"); // database name
define('DB_SERVER', "db"); // db server
?>
Now we’ll try to create the table. Place the following in php/www/table_create.php
<?php
// Create the initial table in our database
// array for JSON response
$response = array();
require_once __DIR__ . '/db_config.php';
// Create connection
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
// sql to create table
$sql = "CREATE TABLE data(
pid int(11) primary key auto_increment,
name varchar(100) not null,
price decimal(10,2) not null,
description text,
created_at timestamp default now(),
updated_at timestamp default now()
)";
if ($link->query($sql) === TRUE) {
echo "Table data created successfully";
} else {
echo "Error creating table: " . $link->error;
}
mysqli_close($link);
?>
Now to add rows to the table. Add the following to php/www/create_product.php
<?php
/*
* Following code will create a new product row
* All product details are read from HTTP Post Request
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) {
$name = $_POST['name'];
$price = $_POST['price'];
$description = $_POST['description'];
// include db connect class
require_once __DIR__ . '/db_config.php';
// connecting to db
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
$sql = "INSERT INTO data(name, price, description) VALUES('$name', '$price', '$description')";
// mysql inserting a new row
// check if row inserted or not
if (($link->query($sql)) === TRUE) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "Product successfully created.";
// echoing JSON response
echo json_encode($response);
} else {
// failed to insert row
$response["success"] = 0;
$response["message"] = "Oops! An error occurred.";
// echoing JSON response
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
Now we’ll get product details. Add the following to php/www/get_product_details.php
<?php
/*
* Following code will get single product details
* A product is identified by product id (pid)
*/
// array for JSON response
$response = array();
// include db connect class
require_once __DIR__ . '/db_config.php';
// connecting to db
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
// check for post data
if (isset($_GET["pid"])) {
$pid = $_GET['pid'];
$sql = "SELECT *FROM products WHERE pid = $pid";
// get a product from products table
$result = mysqli_query($link, $sql);
if (!empty($result)) {
// check for empty result
if (mysqli_num_rows($result) > 0) {
$result = mysql_fetch_array($result);
$product = array();
$product["pid"] = $result["pid"];
$product["name"] = $result["name"];
$product["price"] = $result["price"];
$product["description"] = $result["description"];
$product["created_at"] = $result["created_at"];
$product["updated_at"] = $result["updated_at"];
// success
$response["success"] = 1;
// user node
$response["product"] = array();
array_push($response["product"], $product);
// echoing JSON response
echo json_encode($response);
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product found";
// echo no users JSON
echo json_encode($response);
}
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product found";
// echo no users JSON
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
Let’s view all rows in the database. Add this to php/www/get_all_products.php.
<?php
/*
* Following code will list all the products
*/
// array for JSON response
$response = array();
// include db connect class
require_once __DIR__ . '/db_config.php';
// connecting to db
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
// get all products from products table
$sql = "SELECT * FROM data";
$result = mysqli_query($link, $sql);
echo "$result";
// check for empty result
if (!empty(result)){
if (mysqli_num_rows($result) > 0) {
// looping through all results
// products node
$response["products"] = array();
while ($row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
// temp user array
$product = array();
$product["pid"] = $row["pid"];
$product["name"] = $row["name"];
$product["price"] = $row["price"];
$product["created_at"] = $row["created_at"];
$product["updated_at"] = $row["updated_at"];
// push single product into final response array
array_push($response["products"], $product);
}
// success
$response["success"] = 1;
// echoing JSON response
echo json_encode($response);
} else {
// no products found
$response["success"] = 0;
$response["message"] = "No products found";
// echo no users JSON
echo json_encode($response);
}
} else {
$response["success"] = 0;
$response["message"] = "Database was empty.";
echo json_encode($response);
}
?>
Let’s add code to update a product. Add this to php/www/update_product.php.
<?php
/*
* Following code will update a product information
* A product is identified by product id (pid)
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['pid']) && isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) {
$pid = $_POST['pid'];
$name = $_POST['name'];
$price = $_POST['price'];
$description = $_POST['description'];
// include db connect class
require_once __DIR__ . '/db_config.php';
// connecting to db
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
$sql = "UPDATE data SET name = '$name', price = '$price', description = '$description' WHERE pid = $pid";
// mysql update row with matched pid
$result = mysqli_query($link, $sql);
// check if row inserted or not
if ($result) {
// successfully updated
$response["success"] = 1;
$response["message"] = "Product successfully updated.";
// echoing JSON response
echo json_encode($response);
} else {
$response["success"] = 0;
$response["message"] = "Error updating row.";
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
Lastly, let’s set up a delete operation. Add the following to php/www/delete_product.php
<?php
/*
* Following code will delete a product from table
* A product is identified by product id (pid)
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['pid'])) {
$pid = $_POST['pid'];
// include db connect class
require_once __DIR__ . '/db_config.php';
// connecting to db
$link = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
// Check connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
$sql = "DELETE FROM data WHERE pid = $pid";
// mysql update row with matched pid
$result = mysqli_query($link, $sql);
// check if row deleted or not
if ((mysqli_affected_rows($link)) > 0) {
// successfully updated
$response["success"] = 1;
$response["message"] = "Product successfully deleted";
// echoing JSON response
echo json_encode($response);
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product found";
// echo no users JSON
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
And our CRUD api is good to go! At this point I found it super useful to use postman to send POST and GET requests to help debugging.
More coming soon!


Amzi! offers both free and commercial Prolog development tools. This tutorial text refers to the Amzi!® Eclipse IDE. Amzi! runs under all forms of Windows, and many forms of Unix including Linux and Solaris. You can download a copy from our web site:
You can find other freely available Prolog tools for Windows and other plat-forms
in the Prolog FAQ and on various Prolog and AI repositories. Our web site contains
up-to-date pointers to these sites.
You will also find numerous articles on our web site about:
Our web site also contains pointers to:
We invite you to visit!
Copyright ©1990,1996-97, 2004 Amzi! inc. All Rights Reserved


Choose an Action
How to open .torrent file after the download
Open in BitPop
Open in Default Application
Just download. Do not open
Always perform this Action


Another Door Repairing Problem
Maybe you have already solved the
Door Repairing Problem for YY, who is the officer of the accommodation building B37, in a famous university called Famous University. Maybe you have not, but it does not matter because the new term is coming. So here comes the
Another Door Repairing Problem!As is described in
Door Repairing Problem, many students live in B37. The building is old, so sometimes a careless student such as LMY may open the door of the building too vigorously, and break it as a result. However, when a student opens the door and finds it already broken, he will report it to the headmaster, and YY will be punished as a result…
More precisely, the door is fine at the beginning of the term. The term has a length of Tterm. During the term, the door will be opened many times, which can be regarded as a Poisson process, i.e., in any period of length T, the probability that the door will be opened k times is, where λ is a positive real constant.
Note that for any non-negative real T,
When the door is fine and is opened by some student, the probability that he carelessly breaks the door is p. (0<p<=1) When the door is broken, YY can repair it anytime he likes.
Both repairing the door and being punished cost a lot. YY has thought for many days trying to make a best strategy when to repair the door, so that his expense can be minimized in expectation. He failed, so he is going to try the simplest ways. Given the length of the term Tterm, the constant λ, the probability p, and the question type Q, you are to solve the Another Door Repairing Problem:
When Q=1, tell the expected number of times YY has to repair the door, if he always repairs it immediately after it is broken.
When Q=2, tell the expected number of times YY will be punished, if he never repairs the door.
Input contains multiple test cases.A test case consists of a single line containing four numbers. The first is an integer Q, where Q=1 or Q=2 holds, indicating the type of the problem that you should solve. Three positive real numbers λ, T
term and p follow. The real numbers may be given in fixed-point or scientific e notations. All real numbers can be store in a double data type of C/C++, with a sufficiently small error rate. See the sample input for details.
Input ends with a line containing four space-separated 0s.
Input contains multiple test cases.A test case consists of a single line containing four numbers. The first is an integer Q, where Q=1 or Q=2 holds, indicating the type of the problem that you should solve. Three positive real numbers λ, T
term and p follow. The real numbers may be given in fixed-point or scientific e notations. All real numbers can be store in a double data type of C/C++, with a sufficiently small error rate. See the sample input for details.
Input ends with a line containing four space-separated 0s.
1 1 1 0.5
1 1 1 1e0
2 1 1 5.00000e-0001
0 0 0 0
5.00 -1
1.00 0
2.13 -1
Hint
The solution to sample input is 0.5, 1.0 and 0.213, respectively. Don’t worry about inputting real numbers in scientific e notations. A simple scanf or cin as if it is fixed-point is OK.
(adsbygoogle = window.adsbygoogle || []).push({});
活动时间：2
活动时间：2
活动时间：2
活动时间：2
活动时间：2
活动时间：2
很有用，收藏了
为避免精度问题，PI值请使用arccos(-1)。应该是acos
输入样例作为一个整体输入，带回车
对于第一题，我的直觉告诉我换不换都一样，求指教
第15行代码，/n/n，应该改为nn
#include <stdio.h>
int main(void)
{
int arr[] = {10,20,30,40,50,60};
int *p=arr;
printf("%d,%d,",*p++,*++p);
printf("%d,%d,%d",*p,*p++,*++p);
return 0;
}
为什么是 20,20,50,40,50. 我觉得的应该是 20,20,40,40,50 . 谁能解释下？
Thanks for using the time to examine this, I truly feel strongly about it and enjoy finding out far more on this subject matter. If achievable, as you achieve knowledge
居然是机试，还和13年重复。题目不难
DFS方法的原理还是不太清楚啊
没错的，九度OJ也有此题
对于输出格式不用控制？？还是直接使用cout输出。？？
即为打印出的组合的个数C(n,r)，假设print函数复杂度为O(1)
问题3是不是应该为1/4 .因为截取的三段，无论是否能组成三角形， x， y-x ，1-y,都应大于0，所以 x<y,基础应该是一个大三角形。小三角是大三角的 1/4.


|
Fast Track to Feature Rich UI
|
- Over 30 UI components
- Customizable look and feel (theme support)
- Flexible layouts
- Declarative JSON-based UI
- Easily extendable
|
|
|
Software Engineering in WEB
|
|
|
- Based on simple OOP concepts
- Complexity abstracted from developer
- DOM manipulations reduced to minimum
- Easy to learn and understand
- Browser agnostic API
|
|
|


DigitoMentor is committed to empower 10,000 youths across the globe with professional Software Development skills.
Which languages have you interacted with before?


This text is styled with some of the text formatting properties. The heading uses the text-align, text-transform, and color properties. The paragraph is indented, aligned, and the space between characters is specified. The underline is removed from this colored "Try it yourself" link.
The color
property is used to set the color of the text.
With CSS, a color is most often specified by:
The default text color for a page is defined in the body selector.
body {
color: blue;
}
h1 {
color: green;
}
Note: For W3C compliant CSS: If you define the color property, you must also define the background-color property. |
The text-align
property is used to set the horizontal alignment of a text.
A text can be left or right aligned, centered, or justified.
The following example shows center aligned, and left and right aligned text (left alignment is default if text direction is left-to-right, and right alignment is default if text direction is right-to-left):
h1 {
text-align: center;
}
h2 {
text-align: left;
}
h3 {
text-align: right;
}
When the text-align
property is set to "justify", each line is stretched so that every line has equal width, and the left and right margins are straight (like in magazines and newspapers):
div {
text-align: justify;
}
The text-decoration
property is used to set or remove decorations from text.
The value text-decoration: none;
is often used to remove underlines from links:
a {
text-decoration: none;
}
The other text-decoration
values are used to decorate text:
h1 {
text-decoration: overline;
}
h2 {
text-decoration: line-through;
}
h3 {
text-decoration: underline;
}
| Note: It is not recommended to underline text that is not a link, as this often confuses the reader. |
The text-transform
property is used to specify uppercase and lowercase letters in a text.
It can be used to turn everything into uppercase or lowercase letters, or capitalize the first letter of each word:
p.uppercase {
text-transform: uppercase;
}
p.lowercase {
text-transform: lowercase;
}
p.capitalize {
text-transform: capitalize;
}
The text-indent
property is used to specify the indentation of the first line of a text:
p {
text-indent: 50px;
}
The letter-spacing
property is used to specify the space between the characters in a text.
The following example demonstrates how to increase or decrease the space between characters:
h1 {
letter-spacing: 3px;
}
h2 {
letter-spacing: -3px;
}
The line-height
property is used to specify the space between lines:
p.small {
line-height: 0.8;
}
p.big {
line-height: 1.8;
}
The direction
property is used to change the text direction of an element:
div {
direction: rtl;
}
The word-spacing
property is used to specify the space between the words in a text.
The following example demonstrates how to increase or decrease the space between words:
h1 {
word-spacing: 10px;
}
h2 {
word-spacing: -5px;
}