Editing markup for pages in Arabic, Hebrew, and many other languages poses challenges unless a specialised editor is available. For similar reasons, it is also difficult to include examples of bidirectional code in explainers. This page looks at some of the problems content developers are likely to be faced with, and offers some advice, where possible.
This information is also likely to be informative for developers of markup editing tools.
The article assumes that you are familiar with bidirectional text concepts and the role of the Unicode Bidirectional Algorithm. If you are not, you should read through the article Unicode Bidirectional Algorithm basics before continuing.
If you are not familiar with how to use HTML markup for bidirectional text, you may also find it useful to first read Inline markup and bidirectional text in HTML.
There is currently a lack of good editing environments for creating HTML pages using right-to-left scripts. Because of the fact that the syntax characters in HTML markup and escapes contain punctuation and often strongly typed LTR letters, you are always working with bidirectional source text. If the editing application is not aware (as is usually the case) that the markup is not ordinary text, then it can move characters around and produce some odd effects that make coding difficult. The strongly typed letters and punctuation in the markup will appear in places you wouldn't expect, and sometimes interfere with the order of the content itself.
The following shows some simple markup in a left-to-right context. The source contains a p
tag followed by a class
attribute, followed by a title
attribute with some Arabic text (العربي) as its value. The content of the element (نشاط التدويل!) starts with Arabic text and ends with an exclamation mark. The exclamation mark is shown separately to illustrate where it ends up. The resulting order in a left-to-right environment (where Arabic text is indicated by text in square brackets) is shown below.
Same example with Arabic text:

نشاط التدويل!

The order of the title text and the paragraph content have been reversed, as has the direction of the angle bracket. Furthermore, sentence-final punctuation, such as the exclamation mark here, appears in the wrong place relative to the paragraph content. Where the paragraph content contains multiple runs of bidirectional text the readability of that content can be badly affected.
If you are creating a large amount of right-to-left text, it makes sense to set the base direction of the editing window in your editor to right-to-left. This helps to ensure that both the paragraph content and its punctuation are correctly ordered. Unfortunately, this tends to make the overall source code much worse, as can be seen in the following example.
As the next example shows, things can get much worse if the overall context for the source code is right-to-left (although this not very usual since markup languages are generally in English, so the context in editing a source code is unlikely to be right-to-left). In this case, the resulting order for the same source text can be seen here.
Same example with Arabic text:

نشاط التدويل!

The source in the examples above will display correctly in a user agent. This is just a problem for writing and maintaining the source text.
It helps a little, if you can do it, to ensure that an attribute with a value that uses left-to-right script text appears last in the list of attributes (in the example below, the class
attribute). This would make the syntax in a left-to-right context look as expected, although the problems with the paragraph text remain. In a right-to-left context it would prevent the interaction of markup with content, but things are still a little jumbled, and things are still not where you would expect.
Same example with Arabic text:

نشاط التدويل!

نشاط التدويل!

It is not a particularly good idea for authors to edit in LTR mode after applying a directional override to the whole of the source code. For this, an editor that knows nothing about the Unicode Bidirectional Algorithm would be necessary, because it avoids the reordering of the text. This makes it easier to understand the mixture of markup and content, but the author has to read all the RTL content backwards. In a cursive script such as Arabic this is particularly problematic, because the normal joining shapes are altered as well as the direction.
It can also help to set the overall direction of the editor to LTR and start the content on a new line, however this doesn't always help with inline markup, and again sentence-final markup appears in the wrong place in the paragraph text. Also, you should try to avoid including white space before the closing markup, as this can lead to other problems.
Same example with Arabic text:

نشاط التدويل!

The ideal solution would be a source editor that recognizes markup as a special construct, and protects it to produce a sensible order for the characters in the source text. If your markup includes a dir
attribute to change the directional context of the content, your editor should recognize this and produce a corresponding change in the order of the source code. Some editors may have an editing mode that converts tags to graphic entities, which can work well.
If you use a Unicode control character such as the RIGHT TO LEFT MARK (RLM) or ZERO-WIDTH NON JOINER (ZWNJ), you will not usually be able to see it in the source text, since it is invisible. It is very helpful if your editor creates visible markers for these characters.
You may think that a useful alternative is to use the pre-defined HTML character entities,
and
, or their numeric equivalents,
and
.
Unfortunately, such an approach typically has the same problems as those described in the previous section. The following example shows what you'd see if you add &x200F;
to bidirectional text in 3 different positions, in an editor that sets the context to RTL. In this simple example, the text doesn't get moved around, but the components of the escape do.
Again, an ideal solution would be for an editor to recognise these escape sequences and keep all the relevant characters together, and in the LTR order.
Given the above, it will come as no surprise that creating examples for tutorials or articles can be tricky when they represent code snippets that contain RTL text. It is probably not helpful to show the text of the snippet as it would actually look in most editors; rather it would be necessary to apply extra, hidden markup to approximate something that keeps the syntax together and shows the logical order of the text. This would include markup that changes the base direction of the text where that is indicated by a dir attribute value, or other method.
Often, authors get around the issue by not showing the RTL text. For example, in all the preceding examples we removed the actual Arabic text from the main explanatory example, and just showed it in the live code examples.
Other common ways to do this in English contexts involve representing the Arabic/Hebrew/etc. parts of the example code by UPPERCASE TRANSLATIONS, and by using left-to-right, all-lowercase characters for the markup and any LTR text. Often, but not always, the letters in the uppercase text are written from right to left, since this allows for more realistic positioning of punctuation. Written right-to-left the uppercase text attempts to indicate the rendered result; written left-to-right, it indicates the order of characters in memory.
The following provides some examples.
Example of the output using Hebrew text:
פעילות הבינאום!
It is always useful to provide a link to a page or to provide a panel containing the output of the code that contains the native text.
Tutorial, Creating HTML Pages in Arabic, Hebrew and Other Right-to-left Scripts
Related links, Authoring HTML & CSS


 In this module, we’re going to continue to solidify your Python chops by implementing a full-featured project according to a provided specification.
Put your Python basics into practice by implementing a text adventure game
Practice writing code that conforms to a specification
adv.py
which allows the player to move to rooms in the four cardinal directions.
player.py
and room.py
get [ITEM_NAME]
and drop [ITEM_NAME]
commands to the parser
The /src
directory contains the files adv.py
, which is where the main logic for the game should live, room.py
, which will contain the definition of the Room class, and player.py
, which will contain the definition of the Player class.
adv.py
that accepts directional commands to move the player
n
, s
, e
and w
which move the player North, South, East or West
[X] Put the Room class in room.py
based on what you see in adv.py
.
[X] The room should have name
and description
attributes.
[X] The room should also have n_to
, s_to
, e_to
, and w_to
attributes which point to the room in that respective direction.
player.py
.
name
and current_room
attributes
[X] Create a file called item.py
and add an Item
class in there.
[X] The item should have name
and description
attributes.
[ ] This will be the base class for specialized item types to be declared later.
[X] Add the ability to add items to rooms.
[X] The Room
class should be extended with a list
that holds the Item
s that are currently in that room.
[X] Add functionality to the main loop that prints out all the items that are visible to the player when they are in that room.
[X] Add capability to add Item
s to the player’s inventory. The inventory can also be a list
of items “in” the player, similar to how Item
s can be in a Room
.
[X] Add a new type of sentence the parser can understand: two words.
[X] Until now, the parser could just understand one sentence form:
verb
such as “n” or “q”.
[X] But now we want to add the form:
verb
object
such as “take coins” or “drop sword”.
[X] Split the entered command and see if it has 1 or 2 words in it to determine if it’s the first or second form.
[X] Implement support for the verb get
followed by an Item
name. This will be used to pick up Item
s.
[X] If the user enters get
or take
followed by an Item
name, look at the contents of the current Room
to see if the item is there.
[X] If it is there, remove it from the Room
contents, and add it to the Player
contents.
[X] If it’s not there, print an error message telling the user so.
[X] Add an on_take
method to Item
.
[X] Call this method when the Item
is picked up by the player.
[X] on_take
should print out “You have picked up [NAME]” when you pick up an item.
[X] The Item
can use this to run additional code when it is picked up.
[X] Add an on_drop
method to Item
. Implement it similar to on_take
.
[X] Implement support for the verb drop
followed by an Item
name. This is the opposite of get
/take
.
[X] Add the i
and inventory
commands that both show a list of items currently carried by the player.
In arbitrary order:
[X] Add more rooms
[ ] Add scoring
[ ] Subclass items into treasures
[ ] Add a subclass to Item
called LightSource
.
[ ] During world creation, add a lamp
LightSource
to a convenient Room
.
[ ] Override on_drop
in LightSource
that tells the player “It’s not wise to drop your source of light!” if the player drops it. (But still lets them drop it.)
[ ] Add an attribute to Room
called is_light
that is True
if the Room
is naturally illuminated, or False
if a LightSource
is required to see what is in the room.
[ ] Modify the main loop to test if there is light in the Room
(i.e. if is_light
is True
or there is a LightSource
item in the Room
’s contents or if there is a LightSource
item in the Player
’s contents).
[ ] If there is light in the room, display name, description, and contents as normal.
[ ] If there isn’t, print out “It’s pitch black!” instead.
Hint: isinstance
might help you figure out if there’s a LightSource
among all the nearby Item
s.
[ ] Modify the get
/take
code to print “Good luck finding that in the dark!” if the user tries to pick up an Item
in the dark.
[X] Add methods to notify items when they are picked up or dropped
[ ] Add light and darkness to the game
[X] Add more items to the game.
[ ] Add a way to win.
[X] Add more to the parser.
[ ] Remember the last Item
mentioned and substitute that if the user types “it” later, e.g.
take sword
drop it
Add Item
s with adjectives, like “rusty sword” and “silver sword”.
Modify the parser to handle commands like “take rusty sword” as well as “take sword”.
[ ] Modify the code that calls on_take
to check the return value. If on_take
returns False
, then don’t continue picking up the object. (I.e. prevent the user from picking it up.)
on_take
to code things like "don’t allow the user to pick up the dirt unless they’re holding the shovel.
[ ] Add monsters.
[ ] Add the attack
verb that allows you to specify a monster to attack.
[ ] Add an on_attack
method to the monster class.
[ ] Similar to the on_take
return value modification, above, have on_attack
prevent the attack from succeeding unless the user possesses a sword
item.
Come up with more stretch goals! The sky’s the limit!


public class MyModel {
private int id;
private String name;
// getters/setters
}
TomEE and Apache Johnzon - JAX-RS JSON Provider
Since TomEE 7.0, TomEE comes with Apache Johnzon. It means you can use JSON-P out of the box but also Johnzon Mapper which is the default JAX-RS provider for JSON.
IMPORTANT - this is a breaking change with 1.x which was using jettison. This last one was relying on JAXB model to generate JSON which often led to unexpected JSON tree and some unexpected escaping too.
Getting started with Johnzon Mapper
http://johnzon.apache.org/ will get more informations than this quick getting started but here are the basics of the mapping with Johnzon.
The mapper uses a direct java to json representation.
For instance this java bean:
will be mapped to:
{
"id": 1234,
"name": "Johnzon doc"
}
Note that Johnzon supports several customization either directly on the MapperBuilder of through annotations.
@JohnzonIgnore
@JohnzonIgnore is used to ignore a field. You can optionally say you ignore the field until some version if the mapper has a version:
public class MyModel {
@JohnzonIgnore
private String name;
// getters/setters
}
Or to support name for version 3, 4, … but ignore it for 1 and 2:
public class MyModel {
@JohnzonIgnore(minVersion = 3)
private String name;
// getters/setters
}
@JohnzonConverter
Converters are used for advanced mapping between java and json.
There are several converter types:
-
Converter: map java to json and the opposite based on the string representation
-
Adapter: a converter not limited to String
-
ObjectConverter.Reader: to converter from json to java at low level
-
ObjectConverter.Writer: to converter from java to json at low level
-
ObjectConverter.Codec: a Reader and Writer
The most common is to customize date format but they all take. For that simple case we often use a Converter:
public class LocalDateConverter implements Converter<LocalDate> {
@Override
public String toString(final LocalDate instance) {
return instance.toString();
}
@Override
public LocalDate fromString(final String text) {
return LocalDate.parse(text);
}
}
If you need a more advanced use case and modify the structure of the json (wrapping the value for instance) you will likely need Reader/Writer or a Codec.
Then once your converter developed you can either register globally on the MapperBuilder or simply decorate
the field you want to convert with @JohnzonConverter
:
public class MyModel {
@JohnzonConverter(LocalDateConverter.class)
private LocalDate date;
// getters/setters
}
@JohnzonProperty
Sometimes the json name is not java friendly (_foo or foo-bar or even 200 for instance). For that cases @JohnzonProperty allows to customize the name used:
public class MyModel {
@JohnzonProperty("__date")
private LocalDate date;
// getters/setters
}
AccessMode
On MapperBuilder you have several AccessMode available by default but you can also create your own one.
The default available names are:
-
field: to use fields model and ignore getters/setters
-
method: use getters/setters (means if you have a getter but no setter you will serialize the property but not read it)
-
strict-method (default based on Pojo convention): same as method but getters for collections are not used to write
You can use these names with setAccessModeName().
Your own mapper
Since johnzon is in tomee libraries you can use it yourself (if you use maven/gradle set johnzon-mapper as provided):
final MySuperObject object = createObject();
final Mapper mapper = new MapperBuilder().build();
mapper.writeObject(object, outputStream);
final MySuperObject otherObject = mapper.readObject(inputStream, MySuperObject.class);
Johnzon and JAX-RS
TomEE uses by default Johnzon as JAX-RS provider for versions 7.x. If you want however to customize it you need to follow this procedure:
-
Create a WEB-INF/openejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar>
<pojo-deployment class-name="jaxrs-application">
<properties>
# optional but requires to skip scanned providers if set to true
cxf.jaxrs.skip-provider-scanning = true
# list of providers we want
cxf.jaxrs.providers = johnzon,org.apache.openejb.server.cxf.rs.EJBAccessExceptionMapper
</properties>
</pojo-deployment>
</openejb-jar>
-
Create a WEB-INF/resources.xml to define johnzon service which will be use to instantiate the provider
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<Service id="johnzon" class-name="org.apache.johnzon.jaxrs.ConfigurableJohnzonProvider">
# 1M
maxSize = 1048576
bufferSize = 1048576
# ordered attributes
attributeOrder = $order
# Additional types to ignore
ignores = org.apache.cxf.jaxrs.ext.multipart.MultipartBody
</Service>
<Service id="order" class-name="com.company.MyAttributeSorter" />
</resources>
Note: as you can see you mainly just need to define a service with the id johnzon (same as in openejb-jar.xml)
and you can reference other instances using $id for services and @id
for resources.


HOME
PROJECT_A
PROJECT_B
Matt Ngo
Programmer, Designer.
Matt Ngo
Programmer, Designer.
Visit me on:
LinkedIn
GitHub
Behance
My Resume
Mini Web Projects:
RGB Guessing Game
Minimal To-Do List
SPLITR: A bill splitting app


{%- comment -%} * * MIT License * Copyright (c) 2020 Raghuveer S * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * File: Comments.html * Author@Raghuveer S * * This file contains the markup for the commenting system, which is basically just * a snippet provided by disqus itself. You can find it directly on disqus site. * {%- endcomment -%} {%- if page.comments -%}
{%- endif -%}


Thu Jan 17, 2008
If you want to see how a movie fared with the critics before you shell out your hard-earned bucks, check out rotten tomatoes. This popular website has recently been redesigned and has now gone into beta testing.
The new design isn’t bad, but then again, I didn’t have a problem with the old one either. I guess they were trying to go with a more community-based, web 2.0 format. The layout is still a bit cluttered, but looks lighter.
Anyway, it’s not the design that draws me to the site again and again, it’s the concept. Rotten tomatoes gathers critic reviews from across the country and adds them up. Enough positive reviews gives the movie a “fresh” rating, and too many negative ones garner a “rotten” rating. A sidebar on the home page lists current box office movies so that you can figure out what’s worth watching at a glance. If you want to search for a movie, type it in the search box and within seconds you can see if you should pop that movie into your DVD player or toss it into the returns bin.
Another website I dig is wired news, and again I go there mostly because the content is interesting and is regularly updated. At wired news, you can read the latest headlines in technology, cyberculture, and our digital lives.
Ease of navigation makes this site a delight to visit. Large, bold headlines are easy to read and if they catch your attention, you’re just one click away from reading the entire article. For those who like a little visual stimulation with their serving of words, there are plenty of well-chosen pictures to capture your attention and, in many cases, persuade you to read the article.


TMDiskCache Class Reference
| Inherits from | NSObject |
|---|---|
| Declared in | TMDiskCache.h TMDiskCache.m |
Core
name
The name of this cache, used to create a directory under Library/Caches and also appearing in stack traces.
@property (readonly) NSString *name
Discussion
The name of this cache, used to create a directory under Library/Caches and also appearing in stack traces.
Declared In
TMDiskCache.h
cacheURL
The URL of the directory used by this cache, usually Library/Caches/com.tumblr.TMDiskCache.(
name)
@property (readonly) NSURL *cacheURL
Discussion
The URL of the directory used by this cache, usually Library/Caches/com.tumblr.TMDiskCache.(
name)
Warning: Do not interact with files under this URL except on the sharedQueue.
Declared In
TMDiskCache.h
byteCount
The total number of bytes used on disk, as reported by NSURLTotalFileAllocatedSizeKey
.
@property (readonly) NSUInteger byteCount
Discussion
The total number of bytes used on disk, as reported by NSURLTotalFileAllocatedSizeKey
.
Warning: This property is technically safe to access from any thread, but it reflects the value right now,
not taking into account any pending operations. In most cases this value should only be read from a block on the
For example:
// some background thread, not a block already running on the shared queue
dispatch_sync([TMDiskCache sharedQueue], ^{
NSLog(@"accurate, unchanging byte count: %d", [[TMDiskCache sharedCache] byteCount]);
});
Declared In
TMDiskCache.h
byteLimit
The maximum number of bytes allowed on disk. This value is checked every time an object is set, if the written
size exceeds the limit a trim call is queued. Defaults to 0.0
, meaning no practical limit.
@property (assign) NSUInteger byteLimit
Discussion
The maximum number of bytes allowed on disk. This value is checked every time an object is set, if the written
size exceeds the limit a trim call is queued. Defaults to 0.0
, meaning no practical limit.
Warning: Do not read this property on the sharedQueue (including asynchronous method blocks).
Declared In
TMDiskCache.h
ageLimit
The maximum number of seconds an object is allowed to exist in the cache. Setting this to a value
greater than 0.0
will start a recurring GCD timer with the same period that calls trimToDate:.
Setting it back to 0.0
will stop the timer. Defaults to 0.0
, meaning no limit.
@property (assign) NSTimeInterval ageLimit
Discussion
The maximum number of seconds an object is allowed to exist in the cache. Setting this to a value
greater than 0.0
will start a recurring GCD timer with the same period that calls trimToDate:.
Setting it back to 0.0
will stop the timer. Defaults to 0.0
, meaning no limit.
Warning: Do not read this property on the sharedQueue (including asynchronous method blocks).
Declared In
TMDiskCache.h
Event Blocks
willRemoveObjectBlock
A block to be executed just before an object is removed from the cache. The queue waits during execution.
@property (copy) TMDiskCacheObjectBlock willRemoveObjectBlock
Discussion
A block to be executed just before an object is removed from the cache. The queue waits during execution.
Declared In
TMDiskCache.h
willRemoveAllObjectsBlock
A block to be executed just before all objects are removed from the cache as a result of removeAllObjects:. The queue waits during execution.
@property (copy) TMDiskCacheBlock willRemoveAllObjectsBlock
Discussion
A block to be executed just before all objects are removed from the cache as a result of removeAllObjects:. The queue waits during execution.
Declared In
TMDiskCache.h
didRemoveObjectBlock
A block to be executed just after an object is removed from the cache. The queue waits during execution.
@property (copy) TMDiskCacheObjectBlock didRemoveObjectBlock
Discussion
A block to be executed just after an object is removed from the cache. The queue waits during execution.
Declared In
TMDiskCache.h
didRemoveAllObjectsBlock
A block to be executed just after all objects are removed from the cache as a result of removeAllObjects:. The queue waits during execution.
@property (copy) TMDiskCacheBlock didRemoveAllObjectsBlock
Discussion
A block to be executed just after all objects are removed from the cache as a result of removeAllObjects:. The queue waits during execution.
Declared In
TMDiskCache.h
Initialization
+ sharedCache
A shared cache.
+ (instancetype)sharedCache
Return Value
The shared singleton cache instance.
Discussion
A shared cache.
Declared In
TMDiskCache.h
+ sharedQueue
A shared serial queue, used by all instances of this class. Use dispatch_set_target_
queue to integrate
this queue with an exisiting serial I/O queue.
+ (dispatch_queue_t)sharedQueue
Return Value
The shared singleton queue instance.
Discussion
A shared serial queue, used by all instances of this class. Use dispatch_set_target_
queue to integrate
this queue with an exisiting serial I/O queue.
Declared In
TMDiskCache.h
+ emptyTrash
Empties the trash with DISPATCH_QUEUE_PRIORITY_BACKGROUND
. Does not block the sharedQueue.
+ (void)emptyTrash
Discussion
Empties the trash with DISPATCH_QUEUE_PRIORITY_BACKGROUND
. Does not block the sharedQueue.
Declared In
TMDiskCache.h
– initWithName:
Multiple instances with the same name are allowed and can safely access the same data on disk thanks to the magic of seriality.
- (instancetype)initWithName:(NSString *)name
Parameters
name |
The name of the cache. |
|---|
Return Value
A new cache with the specified name.
Discussion
Multiple instances with the same name are allowed and can safely access the same data on disk thanks to the magic of seriality.
See Also
Declared In
TMDiskCache.h
– initWithName:rootPath:
The designated initializer. Multiple instances with the same name are allowed and can safely access the same data on disk thanks to the magic of seriality.
- (instancetype)initWithName:(NSString *)name rootPath:(NSString *)rootPath
Parameters
name |
The name of the cache. |
|---|---|
rootPath |
The path of the cache. |
Return Value
A new cache with the specified name.
Discussion
The designated initializer. Multiple instances with the same name are allowed and can safely access the same data on disk thanks to the magic of seriality.
See Also
Declared In
TMDiskCache.h
Asynchronous Methods
– objectForKey:block:
Retrieves the object for the specified key. This method returns immediately and executes the passed block as soon as the object is available on the serial sharedQueue.
- (void)objectForKey:(NSString *)key block:(TMDiskCacheObjectBlock)block
Parameters
key |
The key associated with the requested object. |
|---|---|
block |
A block to be executed serially when the object is available. |
Discussion
Retrieves the object for the specified key. This method returns immediately and executes the passed block as soon as the object is available on the serial sharedQueue.
Warning: The fileURL is only valid for the duration of this block, do not use it after the block ends.
Declared In
TMDiskCache.h
– fileURLForKey:block:
Retrieves the fileURL for the specified key without actually reading the data from disk. This method returns immediately and executes the passed block as soon as the object is available on the serial sharedQueue.
- (void)fileURLForKey:(NSString *)key block:(TMDiskCacheObjectBlock)block
Parameters
key |
The key associated with the requested object. |
|---|---|
block |
A block to be executed serially when the file URL is available. |
Discussion
Retrieves the fileURL for the specified key without actually reading the data from disk. This method returns immediately and executes the passed block as soon as the object is available on the serial sharedQueue.
Warning: Access is protected for the duration of the block, but to maintain safe disk access do not access this fileURL after the block has ended. Do all work on the sharedQueue.
Declared In
TMDiskCache.h
– setObject:forKey:block:
Stores an object in the cache for the specified key. This method returns immediately and executes the passed block as soon as the object has been stored.
- (void)setObject:(id<NSCoding>)object forKey:(NSString *)key block:(TMDiskCacheObjectBlock)block
Parameters
object |
An object to store in the cache. |
|---|---|
key |
A key to associate with the object. This string will be copied. |
block |
A block to be executed serially after the object has been stored, or nil. |
Discussion
Stores an object in the cache for the specified key. This method returns immediately and executes the passed block as soon as the object has been stored.
Declared In
TMDiskCache.h
– removeObjectForKey:block:
Removes the object for the specified key. This method returns immediately and executes the passed block as soon as the object has been removed.
- (void)removeObjectForKey:(NSString *)key block:(TMDiskCacheObjectBlock)block
Parameters
key |
The key associated with the object to be removed. |
|---|---|
block |
A block to be executed serially after the object has been removed, or nil. |
Discussion
Removes the object for the specified key. This method returns immediately and executes the passed block as soon as the object has been removed.
Declared In
TMDiskCache.h
– trimToDate:block:
Removes all objects from the cache that have not been used since the specified date. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
- (void)trimToDate:(NSDate *)date block:(TMDiskCacheBlock)block
Parameters
date |
Objects that haven’t been accessed since this date are removed from the cache. |
|---|---|
block |
A block to be executed serially after the cache has been trimmed, or nil. |
Discussion
Removes all objects from the cache that have not been used since the specified date. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
Declared In
TMDiskCache.h
– trimToSize:block:
Removes objects from the cache, largest first, until the cache is equal to or smaller than the specified byteCount. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
- (void)trimToSize:(NSUInteger)byteCount block:(TMDiskCacheBlock)block
Parameters
byteCount |
The cache will be trimmed equal to or smaller than this size. |
|---|---|
block |
A block to be executed serially after the cache has been trimmed, or nil. |
Discussion
Removes objects from the cache, largest first, until the cache is equal to or smaller than the specified byteCount. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
Declared In
TMDiskCache.h
– trimToSizeByDate:block:
Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or smaller than the specified byteCount. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
- (void)trimToSizeByDate:(NSUInteger)byteCount block:(TMDiskCacheBlock)block
Parameters
byteCount |
The cache will be trimmed equal to or smaller than this size. |
|---|---|
block |
A block to be executed serially after the cache has been trimmed, or nil. |
Discussion
Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or smaller than the specified byteCount. This method returns immediately and executes the passed block as soon as the cache has been trimmed.
Declared In
TMDiskCache.h
– removeAllObjects:
Removes all objects from the cache. This method returns immediately and executes the passed block as soon as the cache has been cleared.
- (void)removeAllObjects:(TMDiskCacheBlock)block
Parameters
block |
A block to be executed serially after the cache has been cleared, or nil. |
|---|
Discussion
Removes all objects from the cache. This method returns immediately and executes the passed block as soon as the cache has been cleared.
Declared In
TMDiskCache.h
– enumerateObjectsWithBlock:completionBlock:
Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually
read from disk, the object
parameter of the block will be nil
but the fileURL
will be available.
This method returns immediately.
- (void)enumerateObjectsWithBlock:(TMDiskCacheObjectBlock)block completionBlock:(TMDiskCacheBlock)completionBlock
Parameters
block |
A block to be executed for every object in the cache. |
|---|---|
completionBlock |
An optional block to be executed after the enumeration is complete. |
Discussion
Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually
read from disk, the object
parameter of the block will be nil
but the fileURL
will be available.
This method returns immediately.
Declared In
TMDiskCache.h
Synchronous Methods
– objectForKey:
Retrieves the object for the specified key. This method blocks the calling thread until the object is available.
- (id<NSCoding>)objectForKey:(NSString *)key
Parameters
key |
The key associated with the object. |
|---|
Return Value
The object for the specified key.
Discussion
Retrieves the object for the specified key. This method blocks the calling thread until the object is available.
See Also
Declared In
TMDiskCache.h
– fileURLForKey:
Retrieves the file URL for the specified key. This method blocks the calling thread until the url is available. Do not use this URL anywhere but on the sharedQueue. This method probably shouldn’t even exist, just use the asynchronous one.
- (NSURL *)fileURLForKey:(NSString *)key
Parameters
key |
The key associated with the object. |
|---|
Return Value
The file URL for the specified key.
Discussion
Retrieves the file URL for the specified key. This method blocks the calling thread until the url is available. Do not use this URL anywhere but on the sharedQueue. This method probably shouldn’t even exist, just use the asynchronous one.
See Also
Declared In
TMDiskCache.h
– setObject:forKey:
Stores an object in the cache for the specified key. This method blocks the calling thread until the object has been stored.
- (void)setObject:(id<NSCoding>)object forKey:(NSString *)key
Parameters
object |
An object to store in the cache. |
|---|---|
key |
A key to associate with the object. This string will be copied. |
Discussion
Stores an object in the cache for the specified key. This method blocks the calling thread until the object has been stored.
See Also
Declared In
TMDiskCache.h
– removeObjectForKey:
Removes the object for the specified key. This method blocks the calling thread until the object has been removed.
- (void)removeObjectForKey:(NSString *)key
Parameters
key |
The key associated with the object to be removed. |
|---|
Discussion
Removes the object for the specified key. This method blocks the calling thread until the object has been removed.
Declared In
TMDiskCache.h
– trimToDate:
Removes all objects from the cache that have not been used since the specified date. This method blocks the calling thread until the cache has been trimmed.
- (void)trimToDate:(NSDate *)date
Parameters
date |
Objects that haven’t been accessed since this date are removed from the cache. |
|---|
Discussion
Removes all objects from the cache that have not been used since the specified date. This method blocks the calling thread until the cache has been trimmed.
Declared In
TMDiskCache.h
– trimToSize:
Removes objects from the cache, largest first, until the cache is equal to or smaller than the specified byteCount. This method blocks the calling thread until the cache has been trimmed.
- (void)trimToSize:(NSUInteger)byteCount
Parameters
byteCount |
The cache will be trimmed equal to or smaller than this size. |
|---|
Discussion
Removes objects from the cache, largest first, until the cache is equal to or smaller than the specified byteCount. This method blocks the calling thread until the cache has been trimmed.
Declared In
TMDiskCache.h
– trimToSizeByDate:
Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or smaller than the specified byteCount. This method blocks the calling thread until the cache has been trimmed.
- (void)trimToSizeByDate:(NSUInteger)byteCount
Parameters
byteCount |
The cache will be trimmed equal to or smaller than this size. |
|---|
Discussion
Removes objects from the cache, ordered by date (least recently used first), until the cache is equal to or smaller than the specified byteCount. This method blocks the calling thread until the cache has been trimmed.
Declared In
TMDiskCache.h
– removeAllObjects
Removes all objects from the cache. This method blocks the calling thread until the cache has been cleared.
- (void)removeAllObjects
Discussion
Removes all objects from the cache. This method blocks the calling thread until the cache has been cleared.
Declared In
TMDiskCache.h
– enumerateObjectsWithBlock:
Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually
read from disk, the object
parameter of the block will be nil
but the fileURL
will be available.
This method blocks the calling thread until all objects have been enumerated.
- (void)enumerateObjectsWithBlock:(TMDiskCacheObjectBlock)block
Parameters
block |
A block to be executed for every object in the cache. |
|---|
Discussion
Loops through all objects in the cache (reads and writes are suspended during the enumeration). Data is not actually
read from disk, the object
parameter of the block will be nil
but the fileURL
will be available.
This method blocks the calling thread until all objects have been enumerated.
Warning: Do not call this method within the event blocks (didRemoveObjectBlock, etc.) Instead use the asynchronous version, enumerateObjectsWithBlock:completionBlock:.
Declared In
TMDiskCache.h
Background Tasks
+ setBackgroundTaskManager:
Set a global manager to be used for setting up/tearing down any background tasks needed by TMCache.
+ (void)setBackgroundTaskManager:(id<TMCacheBackgroundTaskManager>)backgroundTaskManager
Parameters
backgroundTaskManager |
Background task manager. |
|---|
Discussion
Set a global manager to be used for setting up/tearing down any background tasks needed by TMCache.
Declared In
TMDiskCache.h


Search
Preparing search index...
The search index is not available
demofile
Options
All
Public
Public/Protected
All
Inherited
Externals
Only exported
Menu
Globals
"protobufs/steammessages"
CMsgGCHUpdateSession
Interface CMsgGCHUpdateSession
Hierarchy
CMsgGCHUpdateSession
Index
Properties
app
Id
client
Addr
cm
Session
Identifier
cm
Session
Sysid
depot
Ids
extra
Fields
online
os
Type
owner
Id
server
Addr
server
Port
server
Steam
Id
steam
Id
Properties
app
Id
app
Id
:
number
client
Addr
client
Addr
:
number
cm
Session
Identifier
cm
Session
Identifier
:
number
cm
Session
Sysid
cm
Session
Sysid
:
number
depot
Ids
depot
Ids
:
number
[]
extra
Fields
extra
Fields
:
CMsgGCHUpdateSession_ExtraField
[]
online
online
:
boolean
os
Type
os
Type
:
number
owner
Id
owner
Id
:
Long
server
Addr
server
Addr
:
number
server
Port
server
Port
:
number
server
Steam
Id
server
Steam
Id
:
Long
steam
Id
steam
Id
:
Long
Globals
"protobufs/steammessages"
CMsgGCHUpdate
Session
app
Id
client
Addr
cm
Session
Identifier
cm
Session
Sysid
depot
Ids
extra
Fields
online
os
Type
owner
Id
server
Addr
server
Port
server
Steam
Id
steam
Id
Generated using
TypeDoc


Networking is about designing, structuring, building and maintaining your social networking by establishing new connections. Communication – and signaling, to some extent – is about leveraging your network. Or that of your connections or organization.
Meatspace Networking
… And honestly, networking might be one of my biggest weaknesses, but I haven’t had way too much practice, as I can’t drive. And when I have worked on a startup project, I’ve regrettably worked alone, spending the majority of my time programming.
Your Contact List is Gold
The contact list you build is one of your most valuable assets. This is one reason that I keep my Facebook friends private, even though almost everything else I’ve done on that site has been private. In sales, depending on agreements with your employer, it could be unethical to try to carry your contact list to leverage them at your next job. So there’s a ton of value there. It doesn’t matter what your profit margins are if you don’t have customers.
Mutually Beneficial Connections
In order to further your relationship with customers, or even friends, you need to get to know them. You have to develop a rapport with a connection to develop comfort and trust, then you have to the chance to understand their needs and how you fit together. No one wants to buy something they find out they didn’t really need, so even if you managed to sell someone in that case, you didn’t provide long-term value, so you’re not likely to have a repeat customer.
It’s terrible to think of people as walking ATM’s, and if you treat them like that, you’re not going far. Yet, when you develop connection where value flows in both directions, then the relationship is mutually beneficial and that’s how life works. It works in business and in friendship. It’s sad, very few people would say they want to be in a one-sided friendship, where one party receives all the value. Anyone who would want that likely doesn’t have great self-esteem.
Identifying Valuable Channels
So the idea is to find people who share interests or needs. A great trick to this is find where people talk about the thing you’re interested in. It could be a forum, an online class, a widely known twitter hashtag that seems to consistently spark discussions, or a meetup group. You can even spark random conversations with complete strangers. Some of these channels are going to provide more value than others and many of them will be outright time sinks. You have to find the ones that offer the most bang for you buck. High bandwidth, personal communication channels are the best, since you grab that person’s attention and you can read facial cues to gauge interest.
As widely connected as social media is, I’ve found that it’s a huge time sync, unless you’re a “power user” …  I think “power user” means you can afford to buy influence from bots or something. I donno. IMO, buying influence is cheap. In my personal experience, facebook promotion never worked for me.  Regardless, for me, social media is highly distracting and I tend to kill any discussion I post on. Go figure. It could be a facebook thread with 100 comments, but I post on it? It’s dead in the water…. interesting, n’est-ce pas?
The Elevator Speech
Anyways, once you’ve identified the channels, you can engage other people. You can use the elevator pitch to introduce yourself, which I picked up in Toastmasters. Their rewarding program connects you with experienced public speaking mentors with, if you’re like me and need a ton of work here. You’ll find these mentors to be influential leaders in your local community, valuable connections with constructive advice.
Toastmasters taught me about the elevator speech, which is a short 30 or 60 second speech that you imbue with your own style to introduce yourself quickly and confidently. You don’t want a mechanical cookie cutter introduction for yourself, but the more you practice the easier it becomes. You can build these quick elevator speeches for other topics or cater them to a specific audience. You’re going to need something short, but flexible, that offers plenty of interest points for the other party to grasp onto. Usually, you’ll hit a common interest. If not, you’ll find that many other people will begin talking about themselves with little encouragement. Honestly, that’s best because you don’t have to expend much effort at first and there’s plenty value there if you’re a good listener. However, if you’re like me, then you don’t like talking about yourself much … even though it’s just about all I can talk about. So I just stay quiet mostly. Again, it’s a “protracted isolation” thing.
Identifying High Value Connections
Regardless, you’ll find that the higher value connections out there usually don’t want to share as much. Or they are more difficult to approach. You can tell by observing the way people act – and there are plenty of people out there who want to act like this, but don’t pull it off right because it doesn’t come from the heart. When people act less approachable out of conscious motivation to do so, it will usually become apparent after you talk to them for a minute. You have to listen to the space between their words. They might be a true high-value person or they might just be faking it ‘til they make it. It’s OK, all of the best out there did it LOL. Also, since these people are constantly approached by others, they become bored easily and they’ve experienced all the games. That’s yet another reason to be authentic.
You’ll need to think more about what you’re trying to get out of networking. Are you looking to meet new customers? Or are you looking for an investor or business partner? There are different tactics to match various situations.
Vetting New Connections
I’ve noticed that some people seem to be very good at quickly vetting the experience level of other people. Versitility here is invaluable for interviewing, but also for networking. Almost anyone will want to convince you that they are better than they actually are at some skill, so you need to be able to quickly test someone. You can do this with ease if you are knowledgable in that field, but what if you aren’t? There are some general tactics for flushing out someone’s BS, but they aren’t guaranteed to work.
If you’re considering getting into a working or personal relationship with someone, then you’re going to want to make some assertions about their character. There are right and wrong ways to probe someone on experience level or skills. It’s kind of like a logic paradox, where if you ask just the right question, it doesn’t matter if the guy is telling the truth or lying, you’ll get the right answer.  But the people who make great managers are always proficient with this. I would know, I’ve been through a ton of interviews.
Also, just because someone isn’t highly experienced at the time doesn’t mean they’re not a valuable connection. Is this person young and ambitious and on their way up? They’ll probably remember who connected with them early on and helped them out.
These questions and topics to sound someone out will vary, depending on the industry, topic, skill, experience level, etc. There are several command line Linux utilities that you can ask about. If someone has solved certain problems, like compiling the Linux kernel, then they’ll know about them. They’ll be able to describe how they’ve used those utilities in the past. This is much more effective than: have you ever compiled the Linux kernel, yes or no?
As you progress in your career, you’ll develop more expansive knowledge and become more qualified to interview on a wider variety of topics. You’ll pick up more subtle cues that indicate trustworthiness and combined with the right information about experience, you can easily find the distinguished applicants. Or that’s what I hope. I don’t have any experience with interviewing, but I’ve spent a lot of time thinking about it, since I’m worried my weaker social skills will hurt my ability to form a strong early team, unless I hire someone with an MBA or equivalent experience. Or a lawyer. They’re good at sifting through BS. And handy for business law, too.
Another way to vet people is to leverage an existing connection – someone you know to be trustworthy. Arrange a meeting or facilitate a connection between these two people and see what your connection thinks. It’s best to steer away from introducing these people for the obstensible purpose of learning more about someone’s proficiency, definitely for the person you’re sounding out. And it works best if you can arrange it so that neither party knows the purpose. Yes, that can reduce the effectiveness, if one person doesn’t know they’re supposed to informally vet this person. You can always hint or make it known later on.
General rule of thumb: line things up so you can hit two birds with one stone. Or five birds. More is better here. And don’t make it known why you threw the rock. Or that it was even you.
Practicing Interpersonal Techniques
If you find yourself lacking in some of the techniques for execution of networking, then there are plenty of ways to practice. The first idea is to get as much practice as possible. It doesn’t help anyone to be isolated. How many times am I going to say isolated in this series of articles? Can I ask a psychologist whether or not it’s good for someone who has Asperger’s and is socially inept to be placed within a literal invisible fence? …  My point is that, while I’m not good at this stuff and even though I need a ton of practice, I obviously know the things I need to know to improve at least someone. Yet, there seems to be a problem. I can’t ever drive during daytime hours. Ever talk to someone who works late night shifts? Is it easy for them to make new friends? I wonder why.
… Moving on.
Gamifying Networking
So another good idea to improve your networking skills is to find ways to gamify it. You can do it by yourself or with a friend!! Basically, you’re just setting small goals that you keep in mind for the duration of some networking event. Set an expectation like: get ten business cards or meet ten new people. You can gauge your progress over longer periods of time if you want, but the point is to motivate yourself to make more connections at an event or increase the quality of the connections formed. The best sales guys (as well as the better friends) are going to brainstorm ways of talking to specific connections hours, days or weeks before an event. If you spend the time thinking about how you’re going to talk to someone specific in mind or what you’re going to talk about, it should go more smoothly when it happens. This is because you’ve spent that extra time thinking about that person, their life, their interests, etc.
You could even challenge yourself by competing with other people in your sales department or amoung your friends. You can suggest an informal competition to find the most interesting person or find the best reaction to a terrible joke. Or find a person who owns X car. Or has done A, B, and C.
Networking in 19th Century America
We’re incredibly lucky to have social media. Thinking back to the 19th century economy, it amazes me to think back to previous centuries before the internet and phone systems. I find myself pondering what it would be like to remain a step ahead of your competition at that time. If you owned a furniture store, you would spend an exorbitant amount of time checking prices and quality of products from wholesalers and manufacturers. You would build a network of local manufacturers and spend time cultivating those relationships.
How much of your time would you spend doing that? How would you stay ahead of your competitors? What systems & processes would you enact to ensure you were capable of collecting the best information on furniture? How would you determine what is worth manufacturing locally and what is more profitable elsewhere? How would you stay in contact with previous colleagues?
It seems that before the advent of instantaneous communication that business – and especially retail, manufacture and distribution – was all in who you knew and how you could leverage your social network in order to maximize its benefits. This was a time when doing so would be costly in terms of time and energy. Because of the increased difficulty, the ability to do so would be very profitable. Thus, in previous centuries, efficiently receiving information was a critical factor in determining success for those fortunate enough to own businesses in that time.
Fortunately, information distribution is no longer constrained by the limits of space and is beginning to transcend time. This presents a different kind of challenge, but it means your social network connections are almost more valuable. Who are you tuned in to on Twitter, Facebook and Instagram. I’ve personally noticed a huge difference in the quality of content between the various networks, primarily because I’m connected to different sets of people on each. The most valuable information I receive, concerning business and technology, comes from Twitter, where I’m connected to many influential people I don’t know.
Social Media Networking
There are strategies applicable to each social network. Social media has become much more diverse, now that there are a dozen major networks instead of Twitter and Facebook. Snapchat is great, but it’s expensive in terms of time and effort for engagement. Yet, the tradeoff is stronger, more personal connection for engagement.
The appropriate tactics depend on what what you’re trying to get out of each network. Do you want the most followers or the most engaged followers – hint: you want the most engaged followers. Ultimately, what you want has nothing to do with numbers: you want to people’s attention. You want to spend time thinking about your content.
My biggest problem with social media is that I don’t engage with content that other people created as much. You’d be surprised at the people who will end up responding to you in some way, but you’re more likely to get a response if you identify people who are looking to connect with others. People want to “trade up,” so you can use Klout to identify people interested in your topics who have a similar or lower Klout score and converse with them. Find the people who seem to have an inaccurately low Klout score. Or, forget about influence and Klout algother and just find positive people who want to talk about the stuff you want to talk about.
Identifying the right nuggets at the right time is crucial. You want to find content that’s on the up and up: if you re-share something that has 4,000 shares, what good does one more do. But if that reshared piece went from 10 to 4,000 a day later, then it’s more likely that you identified interesting content early. So, how do you identify content is likely to trend?
I find myself wanting better tools. Not for producing posts, but for consuming them and identify ripe content to interact with. I tried HootSuite, but I still don’t like maintaining the extra web portal and working through the channel based web interface. I’m probably doing it wrong.
 No offence, but the one about Sponge Bob and Hank Hill, I already saw it. Different words though. A+ for effort. To each his own, I guess. I don’t want to ignore these people either. I really don’t like the “Hide” button or whatever. But by unfollowing, you condense the information so that it’s more valuable.  Also, by narrowing your follow list down, you’re signaling to content producers an indication of what is valuable.
Which brings me to my next point: social media is democratic. One like equals one vote. Those newsfeed algorithms are powerful and valuable. They determine what is likely to be seen and what is not. In my own newsfeed on facebook, there are a set of friends who consistently get like 30-100 likes on every single thing they post, but I’m lucky to get a single comment or interaction. Ever. I don’t get it. People have told me “well, you can’t drive, but at least there’s all these online social media connections” …. PFFFTTT LMAO. Yeh, let’s trade accounts for a month and let’s see how you feel after that.
In fact, that’s a spectacular idea: trading accounts. Just for kicks.
I once sent out 75 messages after returning from an Instacart interview in San Francisco to promote their product. I didn’t expect to get anything out of it, but I included a referral code. I hoped to seed users in their active markets (there were only 10 major cities at the time) and I was curious as to whether Instacart would ever figure that out in their analytics. That they rejected my employment – no hard feelings really, though I calculated $2 million in stock options after 3 years of employment – but I still cared so much about their product that I devoted like 4 hours to sending facebook messages. You know how many people responded to me? Five. Just five. Or less. Yeh .. a bit spammy, I know, so I’m not mad. Whatevs. I was curious to see who would respond and whether Instacart would ever pick that up in their analytics. And I had a genuine interest in promoting their product.
Have I said isolated yet? Did I say that?
People use Facebook and Twitter differently: there are different categories of usage behaviors. Do you have custom lists and newsfeeds set up? I do. Do you use them? I don’t. The main feeds are so engaging that I just don’t think about it. I’d be curious to see the data on how people use these features. But if it’s not the default, you really can’t depend on people using that product. And if it’s a social media consumption feature, then as a producer or advertiser, you probably can’t query that in an API either. Which would only be mildly useful, depending on what usage patterns were available via API.
So yeh, I’m a bit bitter about my social media experience. It’s not rainbows and unicorns. It’d be nice to feel “connected” I guess. Or at least for my online social life to fill in that void left by constant moves and depression. Then again, I don’t think I want to be glued to it either. But I feel like “I did something wrong,” when really, people are probably just too click-happy with that hide button or something. I donno.
Too much information is distracting. I could watch coursera or math lectures all day and never stop like it was my job. I could just as easily read articles on Twitter 24/7 and constantly find compelling content to keep me reading. Yet, I’ve reached this point where there’s so much overlap between the knowledge I already have and the information I’m consuming that it is a serious challenge to find the valuable info that expands my knowledge or worldview. There’s way too much repetitive content out there: it’s a crowded market. It used to be exciting for me to find articles to share on Facebook in 2010, but now anything that’s important ends up in their Top Ten Trending list, so it’s basically pointless to share news articles – again, I think I’m “doing it wrong.”
But you’re basically prompting your friends with:
Hey! Do you want to read this thing that you probably already read somewhere else? If you haven’t read it, you probably already spent all the time you had available to read boring news articles about world politics or economics. But I thought I’d ask. Maybe click “like” anyways?
So yeh… I’m not great with social media. That should be clear.
Up Next:
Networking: Math and Design
In the next post on networking, I’ll describe ideas behind the design of your IRL Social Network, as well as detail the math behind it. There is a ton of math that’s involved in social situations, though it’s mostly based on set theory and statistics.
For example, the center of the table is the best place to sit, if you want to engage with a maximum number of people. If you want to restrict the number of people who can engage with you, then sit at either end of the table. Or go King Arthur and build a round table, so everyone is equidistant. That’s really the way to go.
More math: the ideal time to talk to girls at a show? If you’re actually planning on having a good first night with her/them? It’s precisely 12 O’Clock. As in, the first time you see that girl in front of you, before she has a chance to consciously think about you. That’s the statistic optimum for maximal first impression. It’s proven.
Also, the math behind designing and tapping into your social network involves much of the same stuff found in computer science. There should exist some optimal branching design for a social network that balances access to upstream nodes with influence or value for each node. This is moreso true with power structures found in corporate or governmental organizations. Additionally, you can rearrange and transform social network graphs to alternate representations with layouts that satisfy some functional objective.
In designing the social network you want to create, there are several maxim that are often repeated. There’s the famous rule of a realistic maximum of 150 connections. Another that I’d like to discuss is they saying that “you are the sum of the 5 people you spend the most time with.” This speaks volumes about optimizing the design of your social network to benefit you and the people you spend the most time with.


an intermediate object which identifies and manages PixelNucleus and
PixelNode objects.
PixelNode objects can exist independently of a PixelGraph (though normally they are
then used to create a graph). The node can be either:
- Dot (a single isolated pixel)
- terminal (a pixel with only one neighbour)
- nucleus (a pixel with 3 or more connections)
Because the details of the nucleus matter, the node is described by a
PixelNucleus and a centre Pixel. The precise details of PixelNucleus depend
on what thinning algorithm has been applied.
PixelNucleusCollection is used to search thinned islands for possible nodes,
and their nuclei. In some uses, the nucleus is the primary object, in others
the node, so maps between the two are given. A nucleus can only hold one
node; normally this is the "central" node; in rare cases there may be no
centre and a convention is used.


The goal of this exercise is to determine which products are the best for us to include in our catalog. Below are a row of products. Choose the product that you like the best. After 25 products are chosen the test is over.


FILM TITLE: HENRY AND JUNE DIRECTOR: PHILLIP KAUFMAN COUNTRY: USA ( 1991 ) CAST: Fred Ward as Henry Miller, Maria de Medeiros as Anais Nin, Uma Thurman as Miller's Wife, Richard E. Grant. SUPER FEATURES: Script taken from Anais Nin's voluminous letters about Henry Miller, their affair, and literary work.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
If you are not a literature person, skip this film. And if you don't care about what freedom meant at the time when prohibition went beyond your doors to tell you everything from behavior, to belief, then skip this film.
This film is about the anarchy of mind and body, which releases all tensions and ideas, into an area of free thinking, and creative mind/body exercises which in this case, became what today is considered literature. Anais Nin does not have her name in history of literature, as well placed as Henry Miller's does, but her ability to chronicle the life of those around her, and describe her own personal experiences, sexual, sensual, or otherwise, set her apart, as a writer who could easily rival the seasoned material of someone like LAWRENCE DURRELL ( the ALEXANDRIA QUARTET ) and D. L. LAWRENCE, whose work we have read in school. And more than likely, her position is not established because she is a woman, in a world of publishers and artists that was, and still is, ruled by men whose intent still may be questioned.
This is not a film about Henry Miller, June and Anais. This is a film which spends its time lovingly exploring that which becomes the writer's muse, and as such, it is an excellent, and truly beautiful piece of work.
Henry Miller was depressed with the state of the affairs of art and literature in New York, in the twenties and thirties, and decided to move to Paris, to join a group of many writers and artists, and near the hot cultural center which produced some of the most important and influential artists of this century. It was the SURREALISTS under the manifesto published by Andre Bresson, who decided that art should be free of all constraints, which gave us the likes of Salvador Dali, Luis Bunuel, Jean Cocteau, and later the generation of Jean Paul Sartre, Albert Camus, Jean Genet, Samuel Beckett, and too many others to mention. And it was in the many sidewalk cafes and the many nights of sharing ideas, and visions, where many met, and entwined their life's work into a sweet mesh of creativity, which still burns brightly today.
In Paris, Henry Miller met Anais Nin, a happily married society woman, who had a penchant for diary writings. Henry enticed her to create a bit of erotic literature. Their affairs became one of true erotic adventures, which added a different dimension to Anais' life and marriage, while also helping Henry forget the ghosts of a failed marriage, and a failed writer, which he considered himself to be until the fifties, when his writings begun to be noticed full scale.
Phillip Kaufman's film of this period, and its development on two literary persons, really expresses the best and the worst of the scene. The best was the excitement of the affairs, and the resulting little short story, or set of lines in the diary. The worst was that there wasn't a place where these things could be published. The happy medium was that it could be read out loud and enjoyed in a sidewalk cafe, and not be torn down to shreds by a literary critic, before it was helped by another writer.
Personally, I have never been a great fan of Henry Miller. But he is a very clever, and well thought out writer, who happens to know what he is writing about. In other words he is not lost in his ideas, and his works are not a set of organized ideas and thoughts. His works are the lives of many, and their anatomical ways in every sense. Anais Nin, I have just recently read, and while it is nice, it has not aged well. Victorian Literature, and its indecent companion pornographic genre, had tested the erotic space, but had not affected anything new. Anais Nin did, by interjecting the erotic feeling of thought behind the actual happening in a descriptive mode which has a sleepy side to it, if not a dreamy sensuality to it. Next to much unpolished garbage in film, television and literature today, it is excellent stuff. By itself, it pales a little, and has a sort of eighteen year old diary feel to it. The film does too. Compared to the blatantly distasteful stuff one sees in Madonna these days, Anais Nin is fabulous, in that the women and men in her works are not toys, they have feelings, and they live those feelings, from Henry, to June, to any lover that Anais spends her time with. Madonna's expressions are that of a lack of appreciation for a good person, and a desire to hurt, or protect the hurt person, who no longer looks for redemption on self, but by preying on others weaknesses.

SEE IT. 4.5 GIBLOONS Pedro Sena Member of the Internet Movie Critics Association
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


Whether you are planning an intimate dinner for friends, a corporate luncheon,
or an extravagant soirée, you will find the perfect setting at Délicious.
For further questions, please call
Date
Time
Party Size
Error Message
Reservation Information


Entrepreneurship Thoughts
I have been working with 2 CMU students on creating a startup as part of the NSF I-Corps program since early September (which provides some funding for startups). We went through several ideations (brainstorm on ideas) and customer discovery interviews (and switched topic completely).
Our first idea was to build a brain-computer interface (BCI) that would allow users to remotely control devices. The BCI should be non-invasive, affordable, and convenient (portable). This is not a new idea, as a lot of recent startups have been working on it (most notably NextMind). Our value proposition was to focus on everyday situations when our hands + voice control are unavailable. Hence, we named this startup, “Third Hand.”
I still think that the idea is great and believe that in the future we would have BCI as a service and perhaps as ubiquitous as cellphones. The main challenge (and reason why we gave up) was the lack of technology and expertise. No one in our team has the experience building a BCI hardware (althought I have experience analyzing brain signals), and we do not want to be dependent on APIs provided by existing BCIs.
Still, I learned a lot working on this idea. Here’s a list of what I found most important:
- Success of a startup depends highly on the team (working well together is paramount). One of my team members has a lot of experience doing it and actually setup a lot of team building exercises to help us know each other more.
- Customer discovery needs to be done constantly, especially at the start. We need to first figure out the customers’ problems, and our technology needs to provide the solutions to those problems. We followed a short book called Talking to Humans that goes more in-depth into the process. It’s very long process that consumed most of our time that we put into this. It is extremely helpful.
- There are a lot of resources for market research/competitor analysis/value proposition (customer discovery is also very helpful for this).
We are currently working on our 2nd idea (we actually came up with like 20 ideas), social media + map-based travel planner. I think again this is a great idea, but extremely crowded pre-COVID and more difficult now due to COVID-19. I’m optimistic but realistic about this idea. In the worst case, I will learn a lot.
I will make a few more posts about our 2nd idea, team, and customer discovery interview results, depending on how they go.


${error.code}: ${error.message}
${error.stackTrace}
Sorry, something went wrong.
Try the
Home Page
or find a
blog post
.


Welcome to my humble page
- My name is Israa Othman
- I am 23 years old and I live in Amman
- I completed a BC's in the Hashemite University with a Software Engineering major
- I like programming and I want to be a great developer so I am improving my skills by learning and practicing
- After I graduated
- I trained at Samsung R&D company with QA team
- and I worked with the unicif as an ICDL instructor
- here you can find my profile at linked In
In addition to my love for programming, I have a hobby that I like to do in my spare time, which is a manual work called String Art
if you want to know what is the string art and to see some of my work click on Go
- my favouraite movies :
- Harry potter
- Lord of the ring
- Fantastic beasts
- Aladdi


Center of
Curvature
Curvature
Focal
Point
Point
Principal Axis
Concave
Mirror
Mirror
Real Image
Virtual Image
Object
Object Position
Loaded: 100%


Thanks for hacking The Goat!
WebGoat is a demonstration of common web application flaws. The
associated exercises are intended to provide hands-on experience with
techniques aimed at demonstrating and testing application penetration.
From the entire WebGoat team, we appreciate your interest and efforts
in making applications not just better, but safer and more secure for
everyone. We, as well as our sacrificial goat, thank you.
Version: 6.0.1, Build: 217
Contact us:
- WebGoat mailing list<EMAIL_ADDRESS>- Bruce Mayhew<EMAIL_ADDRESS>WebGoat Authors
- Bruce Mayhew (Project Lead)
- Jeff Williams (Original Idea)
- Richard Lawson (Architect)
- Jason White (Architect)
WebGoat Design Team
- Richard Lawson
- Bruce Mayhew
- Jason White
- Ali Looney (User Interface)
- Jeff Wayman (Website and Docs)
Active Contributors
- Nanne Baars (Developer)
- Dave Cowden (Everything)
- Keith Gasser (Survey/Security)
- Devin Mayhew (Setup/Admin)
- Li Simon (Developer)
Past Contributors
- David Anderson (Developer/Design)
- Christopher Blum (Lessons)
- Laurence Casey (Graphics)
- Brian Ciomei (Bug fixes)
- Rogan Dawes (Lessons)
- Erwin Geirnaert (Solutions)
- Aung Knant (Documentation)
- Ryan Knell (Lessons)
- Christine Koppeit (Build)
- Sherif Kousa (Lessons/Documentation)
- Reto Lippuner (Lessons)
- PartNet (Lessons)
- Yiannis Pavlosoglou (Lessons)
- Eric Sheridan (Lessons)
- Alex Smolen (Lessons)
- Chuck Willis (Lessons)
- Marcel Wirth (Lessons)
Did we miss you? Our sincere apologies, as we know there have
been many contributors over the years. If your name does not
appear in any of the lists above, please send us a note. We'll
get you added with no further sacrifices required.


No room for error this time as Clermont call to fortress Ravenhill
Dan McFarland’s men can take a clear lead in Pool 3.
by Sean FarrellTHEY PULLED A result from the fire last weekend, Ulster. Tonight, they’ll have to hold Clermont’s feet to it.
The stunning try-saver from Jacob Stockdale at The Rec pasted heavy clumps of paper over the fact that Ulster botched the chance at a far more humdrum, sedate finish to the 16-17 win in Bath.
After Marcell Coetzee’s midfield turnover looked to be the game-ending play, the clock read 79.57. Rob Herring’s line-out went the shortest possible distance to Iain Henderson at the front, but it was not straight.
Cue two minutes and 21 seconds of heart-in-mouth, backs-to-the-wall mayhem before Stockdale’s magnificent intercept.
Clermont you feel, won’t be so easily pick-pocketed.
A week out from Europe, Dan McFarland’s side had set their stall out for a pack-led, away-from-home grind by pushing Munster for most of the way through the loss in Thomond Park. Back on home soil of Kingspan Stadium now, they must show the full breadth of their wares. The finesse on top of the physicality that brought them the right side of last week’s knife-edge.
It will start with getting the ball and retaining it.
“You cannot afford to give up as much possession as we did,” McFarland said on Saturday afternoon.
“For us as a team, I look at the way we attack and the kind of things that we can create when we get fast ball. I know what we can do with the ball in hand, we have got to treat it as precious.
“You give Clermont that much ball and they are going to torture us.”
The Top14 side were sorely missed from the top tier of European competition last season after a ninth-place finish in their domestic league. Franck Azema’s men were only beaten to the Bouclier de Brennus at the final hurdle by Toulouse in June and announced their return to the Champions Cup with the emphatic 50-point demolition of Harlequins.
On home soil, however, Ulster continually prove themselves able to gain an upper hand against the most vaunted of European teams.
This (kick-off 19.45 (BT Sport) will be northern province’s fifth meeting with Clermont and, with the score standing 2-2, home advantage has been telling on each occasion.
The last meeting at Ravenhill in 2016 turned into an exhilarating shoot-out as Ulster won out 39-32 and both sides walked away with try-scoring bonus points. The turnover in personnel for both sides in the intervening time is striking. Clermont retain just two of the same starters three years on - Peceli Yato and Nick Abendanon. Ulster have five, but names like Ruan Pienaar, Tommy Bowe, Charles Piutau and Chris Henry on the 2016 team-sheet make it feel like an awfully long time ago.
The centre combination – for all Ulster’s chopping and changing in that area – is the same. Stuart McCloskey and Luke Marshall working as the heartbeat of a back-line with McFarland’s rallying cry ringing in their ears, they will have their work cut out off the ball too with All Black-capped duo George Moala and Isaia Toeava as their opposite numbers.
John Cooney will hope to carry on his terrific form conducting traffic from scrum-half and will relish matching up against a Lions tourist in Greig Laidlaw. Billy Burns, new contract fresh in his back pocket, is tasked with bringing the invention to the attack.
The loss of new signings Sam Carter and Jack McGrath to injury appears a severe blow, but they pack won’t be left wanting for work-rate with the dynamic Eric O’Sullivan stepping in.
It is in the back row where Ulster must really make their presence felt. The ever-excellent Fritz Lee captains the visitors from number 8 with the powerful Yato a destructive ball-carrying force. Fortunately for the hosts, on top of the breakdown expertise of Sean Reidy and Jordi Murphy, Coetzee has been striking arguably his richest vein of form throughout this year and was mighty unfortunate to miss out on the all-conquering Springbok World Cup squad.
If he is again seen making tide-turning interventions in the final minute this week, it will signal the tail-end of another massive Ulster effort. Yet they still must hit those vital last markers to close out a second win to move them top of Pool 3.
Ulster
15. Will Addison
14. Louis Ludik
13. Luke Marshall
12. Stuart McCloskey
11. Jacob Stockdale
10 Billy Burns
9. John Cooney
1. Eric O’Sullivan
2. Rob Herring
3. Marty Moore
4. Alan O’Connor
5. Iain Henderson (captain)
6. Sean Reidy
7. Jordi Murphy
8. Marcell Coetzee
Replacements:
16. Adam McBurney
17. Kyle McCall
18. Tom O’Toole
19. Kieran Treadwell
20. Nick Timoney
21. David Shanahan
22. Bill Johnston
23. Craig Gilroy
Clermont
15. Nick Abendanon
14. Peter Betham
13. Isaiah Toeava
12. George Moala
11. Alivereti Raka
10. Jake McIntyre
9. Greig Laidlaw
1. Etienne Falgoux
2. John Ulugia
3. Rabah Slimani
4. Paul Jedrasiak
5. Sitaleki Timani
6. Peceli Yato
7. Arthur Iturria
8. Fritz Lee (captain)
Replacements:
16. Mike Tadjer
17. Loni Uhila
18. Davit Zirakashvili
19. Thibault Lanen
20. Lucas Dessaigne
21. Morgan Parra
22. Camille Lopez
23. Apisai Naqalevu


Status
Width: Height:
Iterations: Min r: Max r: Min x0: Max x0:
A view of the logistic map - the iteration of xn+1 = rxn(1-xn)
This version displays different values of r along the x-axis, different values of x0 along the y-axis, and represents xn as pixel colour - black = 0, white = 1. If you click and drag on the canvas you can zoom in. Try altering the iteration count; working through values of 0 to 20 should give you an idea of how the map works, and 100 iterations should be fine if you don't zoom in too far.
This diagram - like so many others - shows the connection between chaos and fractals. It plots the outcomes from a chaotic system, and the result is a fractal... or at any rate tends towards being fractal as the number of iterations increases. There's a lot of self-similarity in the diagram.
Other logistic map plotters - Logistic Map Graph and Logistic Map Histograms and Bifurcation Diagram
Peter Corbett, 2014


Input:
Normal
Output:
Distinct
Output:
Delay (200ms)
Output:
Throttle (200ms)
Output:
Debounce (800ms)
Output:


|
Spellbook
2.0
|
Interface to spellbook DB. More...
Public Member Functions | |
| def | __init__ (self) |
| Constructor, open db connection. More... | |
| def | check_connection (self) |
| Check if connection is expired and launch init again. More... | |
| def | __del__ (self) |
| Destructor, close db connection. More... | |
| def | get_spells_by_level (self, lvl) |
| Call get_spells_by_level procedure. More... | |
| def | get_spells_by_class_level (self, spell_class, spell_lvl) |
| Call get_spells_by_class_level procedure. More... | |
| def | get_spells_by_level_school (self, spell_school, spell_lvl) |
| Call get_spells_by_level_school procedure. More... | |
| def | get_spells_by_class (self, spell_class) |
| Call get_spells_by_class procedure. More... | |
| def | get_spells_by_name (self, spell_name) |
| Call get_spells_by_name procedure. More... | |
| def | get_query_result (self, query) |
| Create an array of dictionary contating the result set of the query passed as parameter. More... | |
| def | get_query_result_complete (self, query) |
| Create an array of dictionary contating the result set of the query passed as parameter differently from get_query_result, implements more columns. More... | |
| def | add_user (self, user_id) |
| Call add_user procedure add new user to the database. More... | |
| def | add_in_history_by_id (self, user_id, spell_name) |
| call add_user procedure add new user to the database More... | |
| def | add_in_reports_by_id (self, user_id, spell_name, report) |
| Call add_in_reports_by_id procedure. More... | |
| def | get_spells_history (self, chat_id, limit) |
| Call get_spells_history procedure. More... | |
| def | get_stats (self, chat_id) |
| Call get_stats procedure. More... | |
| def | get_spells_history (self, chat_id, limit) |
| Call get_spells_history procedure. More... | |
| def | get_users (self) |
| Call get_users procedure. More... | |
| def | remove_favourite (self, user_id, spell_name) |
| Unused methods. More... | |
| def | get_favourite (self, user_id) |
| Unused methods. More... | |
| def | print_result (self, content) |
| Unused methods. More... | |
Static Public Attributes | |
| database_connection = None | |
| cursor = None | |
Interface to spellbook DB.
| def spellbook_db.Spellbook.__init__ | ( | self | ) |
Constructor, open db connection.
| self | : self pointer |
| def spellbook_db.Spellbook.__del__ | ( | self | ) |
Destructor, close db connection.
| self | : self pointer |
| def spellbook_db.Spellbook.add_in_history_by_id | ( | self, | |
| user_id, | |||
| spell_name | |||
| ) |
call add_user procedure add new user to the database
| self | : self pointer |
| user_id | : user chat_id |
| def spellbook_db.Spellbook.add_in_reports_by_id | ( | self, | |
| user_id, | |||
| spell_name, | |||
| report | |||
| ) |
Call add_in_reports_by_id procedure.
| self | : self pointer |
| user_id | : user chat_id |
| spell_name | : spell name |
| report | : report type |
| def spellbook_db.Spellbook.add_user | ( | self, | |
| user_id | |||
| ) |
Call add_user procedure add new user to the database.
| self | : self pointer |
| user_id | : user chat_id |
| def spellbook_db.Spellbook.check_connection | ( | self | ) |
Check if connection is expired and launch init again.
| self | : self pointer |
| def spellbook_db.Spellbook.get_favourite | ( | self, | |
| user_id | |||
| ) |
Unused methods.
| def spellbook_db.Spellbook.get_query_result | ( | self, | |
| query | |||
| ) |
Create an array of dictionary contating the result set of the query passed as parameter.
| self | : self pointer |
| query | : the result set of a query ugo |
| def spellbook_db.Spellbook.get_query_result_complete | ( | self, | |
| query | |||
| ) |
Create an array of dictionary contating the result set of the query passed as parameter differently from get_query_result, implements more columns.
| self | : self pointer |
| query | : the result set of a query |
| def spellbook_db.Spellbook.get_spells_by_class | ( | self, | |
| spell_class | |||
| ) |
Call get_spells_by_class procedure.
| self | : self pointer |
| spell_cast | : character class ( Bard, Druid ecc.) |
| def spellbook_db.Spellbook.get_spells_by_class_level | ( | self, | |
| spell_class, | |||
| spell_lvl | |||
| ) |
Call get_spells_by_class_level procedure.
| self | : self pointer |
| spell_cast | : character class ( Bard, Druid ecc.) |
| lvl | : spell level |
| def spellbook_db.Spellbook.get_spells_by_level | ( | self, | |
| lvl | |||
| ) |
Call get_spells_by_level procedure.
| self | : self pointer |
| lvl | : spell level |
| def spellbook_db.Spellbook.get_spells_by_level_school | ( | self, | |
| spell_school, | |||
| spell_lvl | |||
| ) |
Call get_spells_by_level_school procedure.
| self | : self pointer |
| spell_school | : spell school |
| lvl | : spell level |
| def spellbook_db.Spellbook.get_spells_by_name | ( | self, | |
| spell_name | |||
| ) |
Call get_spells_by_name procedure.
| self | : self pointer |
| spell_name | : the spell name, or part of it |
| def spellbook_db.Spellbook.get_spells_history | ( | self, | |
| chat_id, | |||
| limit | |||
| ) |
Call get_spells_history procedure.
| self | : self pointer |
| chat_id | : user chat_id |
| limit | : result set rows limit |
| def spellbook_db.Spellbook.get_spells_history | ( | self, | |
| chat_id, | |||
| limit | |||
| ) |
Call get_spells_history procedure.
| self | : self pointer |
| chat_id | : user chat_id |
| limit | : result set rows limit |
| def spellbook_db.Spellbook.get_stats | ( | self, | |
| chat_id | |||
| ) |
Call get_stats procedure.
| self | : self pointer |
| chat_id | : user chat_id |
| def spellbook_db.Spellbook.get_users | ( | self | ) |
Call get_users procedure.
| self | : self pointer |
| def spellbook_db.Spellbook.print_result | ( | self, | |
| content | |||
| ) |
Unused methods.
| def spellbook_db.Spellbook.remove_favourite | ( | self, | |
| user_id, | |||
| spell_name | |||
| ) |
Unused methods.
|
static |
|
static |


Confirmed
Total: {{global.TotalConfirmed}}
New: {{global.NewConfirmed}}
Recovered
Total: {{global.TotalRecovered}}
New: {{global.NewRecovered}}
Deaths
Total: {{global.TotalDeaths}}
New: {{global.NewDeaths}}
Confirmed
Total: {{country.TotalConfirmed}}
New: {{country.NewConfirmed}}
Recovered
Total: {{country.TotalRecovered}}
New: {{country.NewRecovered}}
Deaths
Total: {{country.TotalDeaths}}
New: {{country.NewDeaths}}


Home
Add New Foster Child
Delete Foster Child
Add Existing Foster Child
Message Foster Child
Change Password
What is your favorite color?
What is your favorite food?
What is your birthday?
Submit


{% extends 'registration/base.html'%} {% block content %}
Basic Information
Edit your account details and settings.
Username: {{myprofile.username}}
First name: {{myprofile.first_name}}
Username: {{myprofile.last_name}}
Course Details
Course and Examinations.
Course: {{ myprofile.profile.mycourse }}
Location: {{ myprofile.profile.location }}
Country: {{ myprofile.profile.country }}


Before Change
result["targets"]["project_info:jvm_app"]["libraries"])
def test_jvm_target(self):
result = get_json(self.execute_console_task(
args=["--test-project-info"],
targets=[self.target("project_info:jvm_target")]
))
jvm_target = result["targets"]["project_info:jvm_target"]
expected_jmv_target = {
"libraries": ["org.apache:apache-jar:12.12.2012"],
"is_code_gen": False,
After Change
result["targets"]["project_info:jvm_app"]["libraries"])
def test_jvm_target(self):
result = self.get_depmap_task_json(targets=[self.target("project_info:jvm_target")])
jvm_target = result["targets"]["project_info:jvm_target"]
expected_jmv_target = {
"libraries": ["org.apache:apache-jar:12.12.2012"],
"is_code_gen": False,


Do you want to play a game?
Do you think I have more than 4 pets?
Do you think I've been to India?
Is my favorite flavor of ice cream chocolate?
Do you think I have more than 6 tattoos?
Do I like trading card games?
Can you guess my age?
I have 3 pets. Can you guess one of their names? **HINT** Two of them are named after food.
Did you guess everything correctly? If you did, congrats! Come talk if you didn't :)