| Travis CI |
About
Weavy is a navigation framework for iOS applications based on a weaving pattern
This README is a short story of the whole conception process that leaded me to this framework.
Take a look at this wiki page to learn more about Weavy: Weavy in details
Navigation concerns
Regarding navigation within an iOS application, two choices are available:
- Use the builtin mechanism provided by Apple and Xcode: storyboards and segues
- Implement a custom mechanism directly in the code
The disadvantage of these two solutions:
- Builtin mechanism: navigation is relatively static and the storyboards are massive. The navigation code pollutes the UIViewControllers
- Custom mechanism: code can be difficult to set up and can be complex depending on the chosen design pattern (Router, Coordinator)
Weavy aims to
- Promote the cutting of storyboards into atomic units to enable collaboration and reusability of UIViewControllers
- Allow the presentation of a UIViewController in different ways according to the navigation context
- Ease the implementation of dependency injection
- Remove any navigation mechanism from UIViewControllers
- Promote reactive programing
- Express the navigation in a declarative way while addressing the majority of the navigation cases
- Facilitate the cutting of an application into logical blocks of navigation
The core principles
In a real world: Weaving involves using a **loom* to interlace two sets of threads at right angles to each other: the warp which runs longitudinally and the weft that crosses it*
This is how I imagine the weaving pattern in a simple application:
How do I read this ?
- Here we have three warps: Application, Onboarding and Settings which describe the three main navigation sections of the application.
- We also have three wefts: Dashboard (the default weft triggered at the application bootstrap), Set the server and Login.
Each one of these wefts will be triggered either because of user actions or because of backend state changes. The crossing between a warp and a weft represented by a colored chip will be a specific navigation action (such as a UIViewController appearance).
As we can see, some wefts are used in multiple warps and their triggering will lead to the display of the same screen, but with different presentation options. Sometimes these screens will popup and sometimes they will be pushed in a navigation stack. This sketch illustrates how we can factorize UIViewControllers and Storyboards.
Warp, Weft and Stitch
Combinaisons of Warps and Wefts describe all the possible navigation patterns within your application.
Each warp defines a clear navigation area (that makes your application divided in well defined parts) in which every weft represent a specific presentation of a screen. This representation is called a Stitch. A Stitch can be presented in different ways such as popup
or regular show
screens.
Weftable
The basic principle of navigation is very simple: it consists of successive views transitions in response to application state changes. These changes are usually due to users interactions, but they can also come from a low level layer of your application. We can imagine that a lose of network session could lead to a signin screen appearance.
We need a way to express these changes. As we saw, a combinaison of a Warp and a Weft represent a navigation action. As well as warps can define your application areas, wefts can define these navigation state changes inside these areas.
Considering this, a Weftable is basically something
in the application which is able to express a new Weft, and as a consequence a navigation state change, leading to a navigation action.
A Weft can even embed inner values (such as Ids, URLs, …) that will be propagated to screens presented by the weaving process.
Loom
A loom is a just a tool for the developper. Once he has defined the suitable combinations of Warps and Wefts representing the navigation possibilities, the job of the loom is to weave these combinaisons into patterns, according to navigation state changes induced by Weftables.
It is up to the developper to:
- define the Warps that represent in the best possible way its application sections (such as Dashboard, Onboarding, Settings, …) in which significant navigation actions are needed
- provide the Weftables that will trigger the Loom weaving process.
Demo Application
A demo application is provided to illustrate the core mechanisms of weaving. It consists of:
- a main ApplicationWarp that represents the basic application navigation (a dashboard composed of two screens in a navigation stack)
- an OnboardingWarp that represents an onboarding wizard that can be triggered within the first dashboard page (or automatically after 10s). The onboarding is composed of three screens in a navigation stack)
Tools and dependencies
Weavy relies on:
- SwiftLint for static code analysis (Github SwiftLint)
- RxSwift to expose Wefts into Observables the Loom can react to (Github RxSwift)
- RxSwiftExt which adds some usefull reactive operators not included in RxSwift (Github RxSwiftExt)
- Reusable in the Demo App to ease the storyboard cutting into atomic ViewControllers (Github Reusable)


{% extends "base.html" %} {% block navigation %}
This service allows you to view the traffic used at the DHBW Mannheim while using the BaWebAuth client.
You need to enable JavaScript in order to see the traffic usage graph.


| Name | Description | Default | Type |
|---|---|---|---|
| {$NTP_IP} |
-
 | <IP_ADDRESS> |
Text macro |
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| NTP delay [{$NTP_IP}] |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP refid [{$NTP_IP}] |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$2}’]
Update: 1800
 | |
| NTP synchronized server [{$NTP_IP}] |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
| NTP polling [{$NTP_IP}] |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| NTP offset [{$NTP_IP}] |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$9}’]
Update: 1800
 | |
| ntp[{$NTP_IP}] |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP}]
Update: 3600
 | |||
| NTP jitter[({$NTP_IP}] |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP stratum [{$NTP_IP}] |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$3}’]
Update: 1800
 |
There are no triggers in this template.
There are no macros links in this template.
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| ntpd Version |
-
 | Zabbix agent (active) |
system.run[ntpq -c version]
Update: 3600
 | |||
| NTP stratum |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$3}’]
Update: 1800
 | |
| ntpq |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p]
Update: 3600
 | |||
| NTP refid |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$2}’]
Update: 1800
 | |
| proc num NTP |
-
 | Zabbix agent |
proc.num[ntpd]
Update: 60
 | |||
| NTP jitter |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP offset |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$9}’]
Update: 1800
 | |
| NTP polling |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| NTP delay |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP synchronized server |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
There are no triggers in this template.
| Name | Description | Default | Type |
|---|---|---|---|
| {$NTP_IP} |
-
 | <IP_ADDRESS> |
Text macro |
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| ntp[{$NTP_IP}] |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP}]
Update: 3600
 | |||
| NTP refid [{$NTP_IP}] |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$2}’]
Update: 1800
 | |
| NTP delay [{$NTP_IP}] |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP synchronized server [{$NTP_IP}] |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
| NTP jitter[({$NTP_IP}] |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP polling [{$NTP_IP}] |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| NTP stratum [{$NTP_IP}] |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$3}’]
Update: 1800
 | |
| NTP offset [{$NTP_IP}] |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$9}’]
Update: 1800
 |
There are no triggers in this template.
There are no macros links in this template.
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| NTP polling |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| proc num NTP |
-
 | Zabbix agent |
proc.num[ntpd]
Update: 60
 | |||
| ntpq |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p]
Update: 3600
 | |||
| NTP offset |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$9}’]
Update: 1800
 | |
| ntpd Version |
-
 | Zabbix agent (active) |
system.run[ntpq -c version]
Update: 3600
 | |||
| NTP jitter |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP delay |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP stratum |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$3}’]
Update: 1800
 | |
| NTP synchronized server |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
| NTP refid |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$2}’]
Update: 1800
 |
There are no triggers in this template.
| Name | Description | Default | Type |
|---|---|---|---|
| {$NTP_IP} |
-
 | <IP_ADDRESS> |
Text macro |
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| ntp[{$NTP_IP}] |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP}]
Update: 3600
 | |||
| NTP refid [{$NTP_IP}] |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$2}’]
Update: 1800
 | |
| NTP delay [{$NTP_IP}] |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP synchronized server [{$NTP_IP}] |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
| NTP jitter[({$NTP_IP}] |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP polling [{$NTP_IP}] |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| NTP stratum [{$NTP_IP}] |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$3}’]
Update: 1800
 | |
| NTP offset [{$NTP_IP}] |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p {$NTP_IP} | grep * | awk ‘{print$9}’]
Update: 1800
 |
There are no triggers in this template.
There are no macros links in this template.
There are no template links in this template.
There are no discovery rules in this template.
| Name | Description | Type | Key and additional info | |||
|---|---|---|---|---|---|---|
| NTP polling |
Synchronization period with the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$6}’]
Update: 1800
 | |
| proc num NTP |
-
 | Zabbix agent |
proc.num[ntpd]
Update: 60
 | |||
| ntpq |
“*” It represents the server in the reference synchronization “+” Server that pass the clock error check “#” It is in the in the reference synchronization , but distance is distant server “ “ Blank , does not refer to a server “x” Server that fail to clock error check “. “ Server that are excluded from the reference list refid Host name or IP address of the high-stratum NTP server NTP server is referencing st NTP Server stratum t stratum type l:local,u:unicast,m:multicast,b:broadcast when The number of seconds after receiving the last packet poll Interval number of seconds to query reach Register data for reachability *octal delay [milliseconds] offset [milliseconds] jitter [milliseconds]
 | Zabbix agent (active) |
system.run[ntpq -p]
Update: 3600
 | |||
| NTP offset |
Time deviation between the NTP server
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$9}’]
Update: 1800
 | |
| ntpd Version |
-
 | Zabbix agent (active) |
system.run[ntpq -c version]
Update: 3600
 | |||
| NTP jitter |
Past 8 dispersion average value of NTP offset
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$10}’]
Update: 1800
 | |
| NTP delay |
Estimated delay time of the NTP packet
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$8}’]
Update: 1800
 | |
| NTP stratum |
Stratum of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$3}’]
Update: 1800
 | |
| NTP synchronized server |
NTP server name that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$1}’ | sed s/*//]
Update: 1800
 |
| NTP refid |
The upper NTP server of the NTP server that is synchronized
 | Zabbix agent (active) |
system.run[ntpq -p | grep * | awk ‘{print$2}’]
Update: 1800
 |
There are no triggers in this template.


Warehouse Keeper Sorint:
Why would you want to leave our coin collectors guild? How could you possibly think of abandoning the benefits of trading coins? Are you really going to give all that up?
"I wish to leave the coin collectors guild."
Return


Mum killed boyfriend’s daughter, 8, by kicking her so hard her intestines split
WARNING - UPSETTING CONTENT: Cynthia Baker, 41, subjected Rica Roundtree to "wanton cruelty" and abuse at her home in Illinois as well as twisted 'discipline' methods that were often filmed
by Abigail O'LearyA mum murdered her boyfriend’s eight-year-old daughter by kicking her until her intestines ripped and she could no longer walk.
Cynthia Baker, 41, subjected Rica Roundtree to "wanton cruelty" and abuse, a court heard.
The evil mum battered little Rica at her home in Illinois, America, for "entertainment" and treated her as a "punching bag".
Sickening evidence from court heard how Rica suffered intestinal perforation up to five days before she was rushed to a hospital, where she died on January 26.
In the days leading to her death, Rica had vomited, could no longer see and almost fell down a set of stairs.
Forensic pathologist Dr John Denton found the youngster had more than 50 injuries across he body.
Following Baker's arrest, detectives found harrowing footage of three attacks she had inflicted on Rica during in 2018.
The abuse included hitting parts of her body, hitting her head against walls and kneeing her in the back.
One clip appeared to show Baker using a twisted 'discipline' method on Rica - who was seen naked while struggling to hold two cans in her arms, which are stretched far apart.
Baker, who was found guilty of first degree murder, could be heard mocking the girl and telling her to keep her arms straight.
She says: “Cold, aren’t you? Good,” and later asked Rica if she should put a collar on her, reports Pantagraph.
The court heard how the abuse was a "normal" part of Rica's life.
Assistant State's Attorney Erika Reynolds said: "For most, it’s unthinkable but for Rica, it was normal.
"In (Baker's home), Rica was treated as less than as this defendant’s punching bag and her pain served as entertainment for the entire family,”
"Rica's life didn't matter to this defendant, but it matters in this courtroom."
Baker was also convicted of aggravated battery, three counts of domestic battery and endangering the life of a child.
Judge Casey Costigan stated that her crimes were "accompanied by exceptionally brutal or heinous behavior indicative of wanton cruelty."


Typealias StoreProjection
public typealias StoreProjection<ViewAction, ViewState> = AnyStoreType<ViewAction, ViewState>
Not necessarily a store implementation means that this entity holds the source-of-truth of an app. The source-of-truth
should be single a centralized store, where all the state is held. But your Views and ViewControllers not necessarily
need to access this main Store directly, they could, instead, access some "proxy" store that simply intermediates
all actions (inputs) and state change notifications (outputs), without actually holding the truth. For more information
on that please check StoreProjection
, and compare it to ReduxStoreBase
.
Well, this unlocks several possibilities like having "Store Projections" or "View Stores", which act somehow like
presenters (in MVP pattern) or ViewModels (in MVVM pattern), because this layer can be seen as a simple transformation
of states and actions. The view store will transform State into View State by, for example, applying NumberFormatter or
DateFormatter into numbers and dates from your state and generating strings to be shown in UI labels or text fields.
You can picture that as dozens of small functions, transforming each property individually, or you can group all the
properties in a view item, or view state, containing lots of strings to be used by UI controls, and then the whole
process is a single function from (State) -> ViewState
. In the other direction, you probably want to map UI events
like scrolling, button taps, toggle changes and view lifecycle events (did load, will appear, foreground) into app
actions like save a form, load next page, add to favorites or reload a list of items. Grouping them in an enum of
possible events triggered by the user in a certain view, and you may want to map these view actions into app actions:
(ViewAction) -> AppAction
.
Because the StoreType
protocol is very generic and offers ActionHandler
and StateProvider
, we can think of other
possible implementations like a proxy view store that knows how to reach the main store, but exposes to a view only
what's relevant for it (ViewState
and ViewAction
), at the same time it knows how to map (State) -> ViewState
and
(ViewAction) -> AppAction
. These two transformations are used every time a view dispatches a view action or a state
changes and notifies all subscribers.
Some store implementations will glue all the parts together and become responsible for being its responsibility is
being a proxy to the non-Redux world. For that reason, it's correct to say that a StoreType
is the single point of
contact with UIKit
and it's a class that you want to inject as a dependency on all the ViewControllers, either as one
single dependency or, preferably, a dependency for each of its protocols - EventHandler
and StateProvider
-, both
eventually pointing to the same instance.


Go to the first, previous, next, last section, table of contents.
If you want to contribute to g77
by doing research,
design, specification, documentation, coding, or testing,
the following information should give you some ideas.
More relevant information might be available from
ftp://alpha.gnu.org/gnu/g77/projects/.
g77
itself compile code faster.
g77
to generate faster code.
g77
easier to configure, build,
and install.
g77
should better leverage gcc
.
g77
on new code easier.
Don't bother doing any performance analysis until most of the following items are taken care of, because there's no question they represent serious space/time problems, although some of them show up only given certain kinds of (popular) input.
malloc
package and its uses to specify more info about
memory pools and, where feasible, use obstacks to implement them.
COMMON
areas, EQUIVALENCE
areas) so zeros need not be output.
This would reduce memory usage for large initialized aggregate
areas, even ones with only one initialized element.
As of version 0.5.18, a portion of this item has already been
accomplished.
g77
, don't pass line/column pairs where
a simple ffewhere
type, which points to the error as much as is
desired by the configuration, will do, and don't pass ffelexToken
types
where a simple ffewhere
type will do.
Then, allow new default
configuration of ffewhere
such that the source line text is not
preserved, and leave it to things like Emacs' next-error function
to point to them (now that `next-error' supports column,
or, perhaps, character-offset, numbers).
The change in calling sequences should improve performance somewhat,
as should not having to save source lines.
(Whether this whole
item will improve performance is questionable, but it should
improve maintainability.)
g77
itself can be fairly easily obtained without touching the back end.
Maybe type-conversion, where necessary, can be speeded up as well in
cases like the one shown (converting the `2' into `2.').
Much of this work should be put off until after g77
has
all the features necessary for its widespread acceptance as a
useful F77 compiler.
However, perhaps this work can be done in parallel during
the feature-adding work.
libg2c
and #include'ing the resulting
file in f2c
+gcc
---that is, inline all run-time-library functions
that are at all worth inlining.
(Some of this has already been done, such as for integral exponentiation.)
VAR_DECL
,
make `CHAR_VAR', not a
temporary, be the receiver for `CHAR_FUNC'.
(This is now done for COMPLEX
variables.)
libgcc
so no special linking is required to
link Fortran programs using standard language features.
This library
would speed up lots of things, from I/O (using precompiled formats,
doing just one, or, at most, very few, calls for arrays or array sections,
and so on) to general computing (array/section implementations of
various intrinsics, implementation of commonly performed loops that
aren't likely to be optimally compiled otherwise, etc.).
Among the important things the library would do are:
libg2c
would be moved at least to the
g77
compile phase, if not to finer grains (such as choosing how
list-directed I/O formatting is done by default at OPEN
time, for
preconnected units via options or even statements in the main program
unit, maybe even on a per-I/O basis with appropriate pragma-like
devices).
COMPLEX
functions return their values in the way
gcc
would if they were declared __complex__ float
,
rather than using
the mechanism currently used by CHARACTER
functions (whereby the
functions are compiled as returning void and their first arg is
a pointer to where to store the result).
(Don't append underscores to
external names for COMPLEX
functions in some cases once g77
uses
gcc
rather than f2c
calling conventions.)
doiter
references where possible.
For example, `CALL FOO(I)' cannot modify `I' if within
a DO
loop that uses `I' as the
iteration variable, and the back end might find that info useful
in determining whether it needs to read `I' back into a register after
the call.
(It normally has to do that, unless it knows `FOO' never
modifies its passed-by-reference argument, which is rarely the case
for Fortran-77 code.)
Making g77
easier to configure, port, build, and install, either
as a single-system compiler or as a cross-compiler, would be
very useful.
libg2c
) should improve portability as well as
produce more optimal code.
Further, g77
and the new library should
conspire to simplify naming of externals, such as by removing unnecessarily
added underscores, and to reduce/eliminate the possibility of naming
conflicts, while making debugger more straightforward.
Also, it should
make multi-language applications more feasible, such as by providing
Fortran intrinsics that get Fortran unit numbers given C FILE *
descriptors.
g77
should produce the equivalent
of a gcc
`main(argc, argv)' function when it compiles a
main program unit, instead of compiling something that must be
called by a library
implementation of main()
.
This would do many useful things such as
provide more flexibility in terms of setting up exception handling,
not requiring programmers to start their debugging sessions with
breakpoint MAIN__ followed by run, and so on.
g77
currently imposes
overly strict alignment requirements, due to the back end, but it
would be useful for Fortran and C programmers to be able to override
these recommendations as long as they don't violate the actual
processor requirements.
These extensions are not the sort of things users ask for "by name",
but they might improve the usability of g77
, and Fortran in
general, in the long run.
Some of these items really pertain to improving g77
internals
so that some popular extensions can be more easily supported.
NUMERIC
type to designate typeless numeric constants,
named and unnamed.
The idea is to provide a forward-looking, effective
replacement for things like the old-style PARAMETER
statement
when people
really need typelessness in a maintainable, portable, clearly documented
way.
Maybe TYPELESS
would include CHARACTER
, POINTER
,
and whatever else might come along.
(This is not really a call for polymorphism per se, just
an ability to express limited, syntactic polymorphism.)
libg2c
issue.)
UNIT=
in the first example is invalid.
Make sure this is what users of this feature would expect.
g77
disallows `READ(1'10)' since
it is an obnoxious syntax, but
supporting it might be pretty easy if needed.
More details are needed, such
as whether general expressions separated by an apostrophe are supported,
or maybe the record number can be a general expression, and so on.
STRUCTURE
, UNION
, MAP
, and RECORD
fully.
Currently there is no support at all
for %FILL
in STRUCTURE
and related syntax,
whereas the rest of the
stuff has at least some parsing support.
This requires either major
changes to libg2c
or its replacement.
g77
probably disagree about label scoping relative to
INTERFACE
and END INTERFACE
, and their contained
procedure interface bodies (blocks?).
ENTRY
doesn't support F90 RESULT()
yet,
since that was added after S8.112.
OPEN
ed,is positioned at the beginning, the end, or wherever--it
might be nice to offer an option of opening to "undefined" status, requiring
an explicit absolute-positioning operation to be performed before any
other (besides CLOSE
) to assist in making applications port to systems
(some IBM?) that OPEN
to the end of a file or some such thing.
This items pertain to generalizing g77
's view of
the machine model to more fully accept whatever the GBE
provides it via its configuration.
REAL_VALUE_TYPE
to represent floating-point constants
exclusively so the target float format need not be required.
This
means changing the way g77
handles initialization of aggregate areas
having more than one type, such as REAL
and INTEGER
,
because currently
it initializes them as if they were arrays of char
and uses the
bit patterns of the constants of the various types in them to determine
what to stuff in elements of the arrays.
g77
front-end's IL just store
the appropriate tree nodes containing constants might be best).
g77
before building
and help determine if the compiler works (especially with whatever
libraries are installed) after building.
Better info on how g77
works and how to port it is needed.
Much of this should be done only after the redesign planned for
0.6 is complete.
See section Front End, which contains some information
on g77
internals.
Some more items that would make g77
more reliable
and easier to maintain:
PARAMETER
---if
it seems
important to preserve the left-to-right-in-source order of production
of diagnostics.)
ffewhere
s in ffeglobal_terminate_1
.
outpooldisp
mechanism with malloc_pool_use
.
opANY
in more places in `com.c', `std.c',
and `ste.c', and get rid of the `opCONVERT(opANY)' kludge
(after determining if there is indeed no real need for it).
g77
source code (especially in the definitions
of access macros in `.h' files) so they can be tailored
to catch code writing into a `RETURNS()' or reading from a `SETS()'.
const
and other such stuff.
ffebld_new
calls (those outside of `ffeexpr.c' or
inside but invoked via paths not involving ffeexpr_lhs
or
ffeexpr_rhs
) might be creating things
in improper pools, leading to such things staying around too long or
(doubtful, but possible and dangerous) not long enough.
ffebld_list_new
(or whatever) calls might not be matched by
ffebld_list_bottom
(or whatever) calls, which might someday matter.
(It definitely is not a problem just yet.)
EQUIVALENCE
something
due to alignment/mismatch or other problems--they end up without
ffestorag
objects, so maybe the backend (and other parts of the front
end) can notice that and handle like an opANY
(do what it wants, just
don't complain or crash).
Most of this seems to have been addressed
by now, but a code review wouldn't hurt.
These are things users might not ask about, or that need to be looked into, before worrying about. Also here are items that involve reducing unnecessary diagnostic clutter.
FUNCTION
and ENTRY
point types disagree (CHARACTER
lengths, type classes, and so on),
ANY
-ize the offending ENTRY
point and any new dummies
it specifies.
INTEGER X(20) CONTINUE DATA (X(I), J= 1, 20) /20*5/ END(The
CONTINUE
statement ensures the DATA
statement
is processed in the context of executable, not specification,
statements.)
Go to the first, previous, next, last section, table of contents.


1.4.2 Bug Fixes
1.4.1 Bug Fixes
New Focus Subsystem
Deprecated Focus Methods
ActionEvents (and Other Events) Need
Timestamps
Headless Support
Window Centering API Required for
Multiscreen Support
The New Fullscreen Exclusive Mode
API
Sync Out of Range Error From Video Driver
Under Windows NT Undecorated
Frames
Mouse Wheel Support
Programmatic Zooming of
Frame
s
Dynamic Layout During Resize
Access to Component Listener
Lists
Changes to Drag and Drop
64-Bit Compliance on Solaris
Inconsistent DLLs Warning
Removal of the
DrawingSurface
API
New InputEvent Key Modifiers
Change in Drop Down Behavior for Choice
Menus
Choice Component Now Obeys Layout Manager
Constraints
4648702:
On Microsoft Windows 2000 and Windows XP, a TextArea
will sometimes display only a vertical scrollbar, even though the
SCROLLBARS_BOTH
field is set to true
.
4636311:
Modal dialogs may hang when run from a Runnable
on
release 1.3.1 and 1.4.
4385243: Unable to input text in Microsoft Windows locales that don't have an ANSI code page (such as Hindi).
1.4.1 Bug Fixes4690831: Game applets fail to repaint properly with Internet Explorer.
4627627: Focus traversal keys moved from awt.properties to Preferences API.
4636548/ 4639735: Crash of release 1.4 when screensaver on Microsoft Windows 2000 is activated.
4379138: Problems on Linux with key events for some dead keys.
4627542: Swing applications don't support international keyboards under Linux.
4395157: Under Linux on 1.3, can't type "%" in applets.
4669873: A drag and drop bug, reported on hopper-beta under Microsoft Windows, caused an application to briefly freeze during DnD and is fixed in the final release of 1.4.1.
New Focus SubsystemThe bugtraq report that corresponds to this change is: 4290675.
A new focus subsystem replaces the previous focus architecture and addresses many focus-related bugs caused by platform inconsistencies, and incompatibilities between AWT and Swing components. See the new Focus Model Specification for further details.
See the javadoc here.
Headless SupportThe bugtraq report that corresponds to this change is: 4281163.
Many environments, such as mainframe machines and dedicated
servers, do not support a display, keyboard, or mouse. Headless
support is enabled by the new GraphicsEnvironment
methods isHeadless
and
isHeadlessInstance
. These methods indicate whether a
display, keyboard, and mouse can be supported in a graphics
environment.
The API changes for headless include:
java.awt.HeadlessException
,
is introduced. It is derived from
UnsupportedOperationException
, which derives from
RuntimeException
, so that existing implementations of
methods that throw the new exception will not require signature
changes.java.awt.GraphicsEnvironment
.
public static boolean isHeadless() public boolean isHeadlessInstance()
Applet
and all heavyweight
components (*) are changed to throw HeadlessException
if a display, keyboard, and mouse are not supported by the toolkit
implementation. All javadoc tags on all constructors are changed to
reflect this RuntimeException
.Robot
constructor throws an
AWTException
if a display, keyboard, and mouse are not
supported by the toolkit implementation.Toolkit
and
GraphicsEnvironment
, with the exception of fonts,
imaging, and printing, are changed to throw
HeadlessException
if a display, keyboard, and mouse
are not supported. All the javadoc tags on these methods are
changed to reflect this RuntimeException
.HeadlessException
.HeadlessException
is thrown if and only if
isHeadless
returns true, and that all javadoc comments
should specify this.(*)Applet
, Button
,
Checkbox
, Choice
,
FileDialog
, Label
, List
,
Menu
, MenuBar
,
MenuComponent
, MenuItem
,
PopupMenu
, Scrollbar
,
ScrollPane
, TextArea
,
TextComponent
, Frame
,
Window
, Dialog
, JApplet
,
JFrame
, JWindow
, JDialog
,
and TextField
. Canvas
and
Panel
do not need to throw this exception since these
can be given empty peers and treated as lightweights.
To run our environment with a headless implementation, the
follow property may be specified at the java
command
line:
-Djava.awt.headless=trueIf this property is not specified and a display, keyboard, and mouse are not supported, then headless implementation is used by default.
Source code should check for headless, so that the exception may
be caught gracefully. For example, see the following pre-headless
implementation of the class Foo
:
class Foo { static Choice c = new Choice(); // could throw HeadlessException }The new and improved implementation of
Foo
should be
placed in a static block:
class Foo { static Choice c; static { try { c = new Choice(); catch (HeadlessException e) { ... } } }
The New Fullscreen Exclusive Mode API
The bugtraq report that corresponds to this change is: 4189326.
The new full-screen exclusive mode API supports high performance
graphics by suspending the windowing system so that drawing can be
done directly to the screen. Full screen mode, which is entirely
different from simply taking an AWT Frame
,
Window
, or Dialog
and expanding it to fit
the screen, is a graphics mode whereby the application takes entire
control over the contents of video memory. The application tells
the graphics card what to draw, how to draw it, and when to draw
it. This mode is not always available. On some operating systems,
it may not be implemented at all. On other operating systems, it
may only be available if the capability is supported by the
graphics card. Nevertheless, this mode is critical for performance
and is necessary for enabling hardware page-flipping on
Windows.
For a tutorial explaining how to use the full screen exclusive API mode with several code examples, see here.
API Changes:
java.awt.DisplayMode
,
is introduced.java.awt.GraphicsDevice
:
public void setFullScreenWindow(Window w) public Window getFullScreenWindow() public boolean isDisplayChangeSupported() public void setDisplayMode(DisplayMode dm) public DisplayMode getDisplayMode() public DisplayMode[] getDisplayModes()
java.awt.image.BufferStrategy
.java.awt.BufferCapabilities
can be used when creating a buffer strategy. Likewise, a new class
java.awt.ImageCapabilities
is available to define the image capabilities of a specific
configuration.Canvas
or a Window
. There are two
buffer strategies that are supported as protected inner classes:
java.awt.Component.FlipBufferStrategy
and java.awt.Component.BltBufferStrategy
.
One of these two inner classes is used on the Canvas
or
Window
when the createBufferStrategy
method is called,
depending on the BufferCapabilities
object supplied
when creating the strategy (if any). To get the buffer strategy
used by a particular component, the getBufferStrategy
method is used.The bugtraq report that corresponds to this change is: 4452207.
If you have a Dell Optiplex GX110 using an Intel 810 Graphics Controller, under Windows NT, you may get a "sync out of range" message from the video driver if you change the display mode more than once and use a high display resolution. There is evidently a bug in the (DirectX) video driver that is causing this. There are several workarounds to this problem:
-Dsun.java2d.noddraw=true
at the command line.1152 X 864 8 85 1152 X 864 16 85 1152 X 864 24 85 1280 X 1024 8 70,72,75,85 1280 X 1024 16 70,72,75,85 1280 X 1024 24 70,75,85 Bad Color (Unsatisfactory appearance in terms of color) 1024 X 768 8 60,70,72,75,85
The bugtraq report that corresponds to this change is: 4038769.
For certain applications having no native frame decorations makes sense. For example, applications that will run across many platforms and that require that the look and feel is the same, or when the programmer does not want the end-user coming in contact with the native operating system.
This release allows a Java application to turn off the creation of frame decorations; no native titlebar, system menu, border, or other native operating system dependent screen components appear when this mode is enabled. AWT and Swing components work transparently.
Changes to java.awt.Frame
:
public void setUndecorated(boolean undecorated) public boolean isUndecorated()
Changes to java.awt.Dialog
:
public void setUndecorated(boolean undecorated) public boolean isUndecorated()
The bugtraq report that corresponds to this change is: 4289845.
The mouse wheel, with a scroll wheel in place of the middle
mouse button, is enabled with new built-in Java support for
scrolling via the mouse wheel. The java.awt.event.MouseWheelEvent
class enables seamless support for mouse wheel scrolling in Java
applications with no recompiling required. Also, a new java.awt.event.MouseWheelListener
interface allows customization of mouse wheel behavior.
Note, for those using the mouse wheel on Linux, see here.
Component
than can be displayed at once, such that the
scroll thumb does not occupy the entire scroll track.setWheelScrollEnabled(false)
.TextArea
, Choice
,
FileDialog
, and List
. Such components
will let their native peers handle wheel scrolling.Component
s which do not inherit any native mouse
wheel behavior will propagate mouse wheel events up the
Container
hierarchy until a Container
with MouseWheelEvent
s enabled is found. This is
typically a ScrollPane
. Mouse wheel events are
delivered to the Component
with
MouseWheelEvent
s enabled.MouseWheelListener
s to customize what happens when the
mouse wheel is moved while the mouse is over a
Component
. In the case of Component
s that
already have native handling of mouse wheel events, clients may
consume the mouse wheel event to avoid native handling.java.awt.ScrollPane
is modified to have
MouseWheelEvent
s enabled by default. When a
ScrollPane
receives a MouseWheelEvent
, it
will properly scroll its contained Component
. This
functionality may be disabled with the new
setWheelScrollingEnabled
method.Lightweight Support:
MouseWheelListener
.MouseWheelListener
s may be added to any
JComponent
for custom event handling.javax.swing.JScrollPane
is modified to properly
scroll its viewed component. Like java.awt.ScrollPane
,
this may be disabled using
setWheelScrollingEnabled
.In addition to the new class and new interface previously mentioned, there are some other changes to the API to support the mouse wheel.
java.awt.AWTEvent
:
public final static long MOUSE_WHEEL_EVENT_MASK;
java.awt.AWTEventMulticaster
:
public void mouseWheelMoved(MouseWheelEvent e) public static MouseWheelListener add(MouseWheelListener a, MouseWheelListener b) public static MouseWheelListener remove(MouseWheelListener l, MouseWheelListener oldl)
java.awt.Component
:
public synchronized void addMouseWheelListener(MouseWheelListener l) public synchronized void removeMouseWheelListener(MouseWheelListener l)
java.awt.ScrollPane
:
public void setWheelScrollingEnabled(boolean handleWheel) public boolean isWheelScrollingEnabled()
java.awt.Robot
:
public synchronized void mouseWheel(int wheelAmt)
For Linux to recognize your mouse wheel, two modifications to
the /etc/X11/XF86Config
file are required. Under the
"Pointer" section:
Add the line:
ZAxisMapping 4 5
Change the protocol to: "imps/2" (this will vary depending on your particular wheel mouse).
Programmatic Zooming of
Frame
s
The bugtraq report that corresponds to this change is: 4071554.
Previously there was no way to zoom (or maximize) a
Frame
programmatically. This feature has been added to
this release.
The new interface java.awt.event.WindowStateListener
is introduced.
Changes to java.awt.Frame
:
public static final int MAXIMIZED_HORIZ; public static final int MAXIMIZED_VERT; public static final int MAXIMIZED_BOTH; public synchronized void setMaximizedBounds(Rectangle bounds) public Rectangle getMaximizedBounds() public synchronized void setExtendedState(int state) public synchronized int getExtendedState()
Changes to java.awt.event.WindowEvent
:
public static final int WINDOW_STATE_CHANGED; public WindowEvent(Window source, int id, Window opposite, int oldState, int newState) public WindowEvent(Window source, int id, int oldState, int newState) public int getOldState() public int getNewState()
Changes to java.awt.AWTEvent
:
public final static long WINDOW_STATE_EVENT_MASK;
Changes to java.awt.Toolkit
:
public boolean isFrameStateSupported(int state) throws HeadlessException
Changes to java.awt.Window
:
public synchronized void addWindowStateListener(WindowStateListener l) public synchronized void removeWindowStateListener(WindowStateListener l) public synchronized WindowStateListener[] getWindowStateListeners() protected void processWindowStateEvent(WindowEvent e)
Change to java.awt.event.WindowAdapter
:
public void windowStateChanged(WindowEvent e)
Changes to java.awt.AWTEventMulticaster
:
public static WindowStateListener add(WindowStateListener a, WindowStateListener b) public static WindowStateListener remove(WindowStateListener l, WindowStateListener oldl)
The bugtraq report that corresponds to this change is: 4077991.
Previously, dynamic window resizing wasn't supported on all
platforms. For example, on Windows NT, with solid resize on,
resizing a window recalculated the layout only when the drag was
finished. This has been fixed in this release with the addition of
the new desktop property awt.dynamicLayoutSupported
.
When dynamic layout is enabled, a Container
continually lays out its components as it resizes. If disabled, the
layout will be validated after resizing has finished.
API changes to java.awt.Toolkit
.
public void setDynamicLayout(boolean dynamic) protected boolean isDynamicLayoutSet() public boolean isDynamicLayoutActive()
Access to Component Listener Lists
The bugtraq report that corresponds to this change is: 4290704.
Previously all of the state in an AWT component that could be
written could also be read. For example, there are no write-only
properties in the component API. Event listeners were a notable
exception. AWT event listeners are managed according to the
JavaBeans conventions with a
pair of methods: addXXXListener
and
removeXXXListener
for a listener that
implements the XXXEventListener
interface.
No access was provided to the listener lists themselves. The fields that contain the listener lists are package private and no method was provided that returns the contents of a listener list. This has caused some problems for Swing and other AWT clients.
To mitigate the problem in the Java 2 SDK, v1.3 release, we
added a getListeners
method to Component
and to the Swing classes that defined listener lists. The
getListeners
method uses a class to specify a
particular listener list. For example to get all of the listeners
added with addFocusListener
, one would write:
getListeners(FocusListener.class)
.
This particular approach to exposing listener lists was taken to
minimize the overall change to the AWT/Swing public API. It was not
intended to be a convention for all JavaBeans and it did not handle
PropertyChangeListener
s - which can be added to a
single property, as in
addPropertyChangeListener("myProperty", myListener)
.
For this release, we have designed a more complete solution to
accessing event listeners. The two conceptual changes are:
getFooListeners
method to the
add/remove convention in AWT and Swing classes.PropertyChangeListener
s and
VetoableChangeListener
s, including those which listen
to a single property, using the new java.util.EventListenerProxy
class.There is a new java.awt.event.AWTEventListenerProxy
class.
API Changes to java.awt.Toolkit
:
public PropertyChangeListener[] getPropertyChangeListeners() public synchronized PropertyChangeListener[] getPropertyChangeListeners(String propertyName) public AWTEventListener[] getAWTEventListeners() public AWTEventListener[] getAWTEventListeners(long eventMask)
The bugtraq reports that corresponds to this change are: 4407057 and 4426750.
In the Solaris and Linux releases of Java 2 Standard Edition,
SDK 1.3, several of the AWT heavyweight Component
s
exhibited default drag behavior via the middle mouse button, even
if the application did not identify these Components
as DragSource
s via the java.awt.dnd API
.
These Component
s were implemented using Motif peers,
and Motif provides middle button drag behavior for these peers by
default.
Because of the design of the AWT, and because of bugs in the Motif library, this default behavior has been the source of numerous stability problems. Rather than continue to risk the stability of AWT and Drag & Drop for a niche feature, we have chosen to disable this feature explicitly in our implementations.
Developers can still identify these Component
s as
DragSource
s in their applications using the
java.awt.dnd API
. This is both functional and
supported. This approach is superior to relying upon default Motif
behavior in any case, because it enables drag support for these
Component
s on all platforms, not just Solaris and
Linux.
64-Bit Compliance on Solaris Machines
The bugtraq report that corresponds to this change is: 4295833.
64-bit Solaris applications use 64 bits to address memory instead of 32. This allows larger applications by providing a much larger virtual memory space. For this release, AWT has been brought up to 64-bit compliance. For more information, see here.
Inconsistent DLLs WarningThe bugtraq report that corresponds to this change is: 4414004.
If you have installed English VC++ 6.0 onto a machine that also
has Asian Windows NT installed, you may encounter strange artifacts
when rendering Asian text in the TextArea
component.
You may also see this problem if you have installed Microsoft
Exchange or Microsoft Office 97 onto a machine running Asian
Windows NT 4.0. Although this problem was reported on the Japanese
version of Windows NT, it will probably occur on other non-Latin
versions of NT as well, such as Chinese or Korean.
The problem was caused when the installation of those programs replaced the Asian Riched32.dll with the English version. The problem can be corrected by replacing Riched32.dll with the Asian version.
Removal of the Drawing Surface APIThe bugtraq report that corresponds to this change is: 4293646.
The sun.awt.DrawingSurface
API has been removed. It
was never made public, but some developers have been using it. The
functionality has been replaced by the JAWT. For more information,
see the AWT Native
Interface description.
The bugtraq report that corresponds to this change is: 4463949.
Xinerama-aware applications running on multi-headed systems have caused problems which have resulted in a variety of bug reports. Some multi-headed environments use monitors with little or no borders, which can be butted up against one another such that the resulting effect is one mammoth display. In this case, a "properly" centered window may span multiple screens. Other multi-headed environments use regular CRT monitors, with several inches of packaging between the actual display areas. In this case, a window spanning multiple screens produces a disconcerting effect, especially if the window cannot be dragged onto one monitor or the other (the Solaris login screen, for example). In short there was no way to tell where to center a window in a Xinerama environment.
To address this problem, the X group has added API which allows Xinerama users to specify where they want "centered" windows to be centered, and allows developers of Xinerama-aware applications to code accordingly.
Prior to this release, the way to center a window has been to
center it within the bounds of the default
GraphicsDevice
, like this:
bounds = getDefaultScreenDevice().getDefaultConfiguration().getBounds(); frame.setLocation(bounds / 2 - size of window / 2);This code would center the windows "correctly" on Xinerama systems where windows should be centered to the entire Xinerama coordinate space.
As of this release, post 4356756-fix JDKs will center windows "correctly" on Xinerama systems where windows should be centered within the first display.
To accomplish this, the
getCenterPoint
method has been added to GraphicsEnvironment
.
This method works as follows on various platforms:
getCenterPoint
returns the coordinates
of the center of the primary display.getCenterPoint
returns the center point of the primary
display.getCenterPoint
reflects their
value. Otherwise, it returns the point at the center of the virtual
coordinate space. (In practice, this will almost always be set -
CDE sets it by default.)As of JDK 1.4, the correct code for centering is:
frame.setLocation(getCenterPoint() - size of window / 2);
The other method added to GraphicsEnvironment
is
getMaximumWindowBounds
. Both
getCenterPoint
and getMaximumWindowBounds
throw a HeadlessException
when in Headless mode.
The bugtraq reports that corresponds to this change are: 4387938 and 4421515.
Previously, the InputEvent
modifiers had the same values for keyboard and mouse buttons. In
certain situations there was no way to distinguish which one was
pressed or when more than one was held simultaneously. These
situations included cases when more than one mouse button was down
at the same time, or when a modifier key was used to modify a mouse
event.
To address this deficiency, the following constants were added
to InputEvent
:
SHIFT_DOWN_MASK
CTRL_DOWN_MASK
META_DOWN_MASK
ALT_DOWN_MASK
ALT_GRAPH_DOWN_MASK
BUTTON1_DOWN_MASK
BUTTON2_DOWN_MASK
BUTTON3_DOWN_MASK
The following methods were added to InputEvent
:
The class spec for MouseEvent
was updated. The following constants were also added to
MouseEvent
:
These methods in MouseEvent
were added:
MouseEvent(Component source, int id, long when, int
modifiers, int x, int y, int clickCount, boolean popupTrigger, int
button)
getButton
getMouseModifiersText
DragSourceDragEvent
has the new method
getGestureModifiersEx
.
The bugtraq report that corresponds to this change is: 4462677.
The Choice
drop down menu behavior has changed from
JDK 1.3.1 to 1.4. In 1.3.1, you could click anywhere on the choice
bar and the menu would drop down. In 1.4, you must click on the
arrow selector on the right hand side of the Choice
bar. Clicking anywhere else on the Choice
bar has no
effect. Also, the symbol on the Choice
bar has changed
from a bar to an arrow/bar combination. Finally, if the drop down
menu extends outside of the parent, when clicking on that area, the
application underneath is brought to the foreground. This happens
on Solaris, not Windows.
The bugtraq report that corresponds to this change is: 4288285.
In releases prior to 1.4, the AWT Choice
widget
sometimes ignored the size that the layout manager told it to be.
As of this release, it now obeys the layout manager
constraints.
The bugtraq report that corresponds to this change is: 4476300.
The new focus subsystem, introduced in this release, introduced a new architecture and a new terminology for handling keyboard focus in sophisticated AWT and Swing applications. Prior to this project, many of the focus-related APIs were inconsistent in usage and termonology, were improperly documented, and led to poorly designed UIs. Now that the new architecture is in place, the most egregious of these APIs has been deprecated.
The following constants and methods have been deprecated:
javax.swing.FocusManager.FOCUS_MANAGER_CLASS_PROPERTY
javax.swing.FocusManager.disableSwingFocusManager()
javax.swing.FocusManager.isFocusManagerEnabled()
javax.swing.JComponent.requestDefaultFocus()
javax.swing.JComponent.isManagingFocus()
javax.swing.JComponent.setNextFocusableComponent(Component)
javax.swing.JComponent.getNextFocusableComponent()
java.awt.Component.isFocusTraversable()
java.awt.Component.hasFocus()
javax.swing.SwingUtilities.findFocusOwner(Component)
The bugtraq report that corresponds to this change is: 4434193.
The new focus architecture includes a type-ahead mechanism that
ensures that subsequent KeyEvent
s that follow a
KeyEvent
that initiates a focus transfer are not
delivered until the transfer is completed. The design for this
feature is based on the UTC timestamps of the various events.
Events with timestamps later than that of the initiating event are
enqueued pending resolution of the transfer; events with earlier
timestamps are not.
To implement this feature, the focus code keeps track of the
timestamp of the event currently being handled. If a focus change
is initiated during this handling, the timestamp is available for
use. However, if the current event does not have a timestamp, then
the current system time is used. This time is usually too far ahead
of the time that the event actually occurred to be of any real use.
As a result, the type-ahead mechanism fails, and
KeyEvent
s are delivered before the focus transfer is
completed.
The most common case where we encountered this problem was with
ActionEvent
s. ActionEvent
s are
high-level, semantic events generated in response to underlying
InputEvent
s. While the InputEvent
s had
timestamps associated with them, the ActionEvent
s did
not. The ActionEvent
API has therefore been expanded
to accomodate a timestamp and the implementation has been updated
so that an ActionEvent
's timestamp is equal to that of
its underlying InputEvent
.
The following methods have been added to ActionEvent
:
The following ActionEvent
methods were
modified:
ActionEvent(Object source, int id, String
command)
ActionEvent(Object source, int id, String command, int
modifiers)
The getWhen
method was added to InvocationEvent
.
The InvocationEvent
constructors
InvocationEvent(Object, Runnable)
and
InvocationEvent(Object, Runnable, Object, boolean)
were modified.
A new constructor
InputMethodEvent(Component, int, long,
AttributedCharacterIterator, int, TextHitInfo,
TextHitInfo)
was added to InputMethodEvent
,
as well as the
getWhen
method.
The following InputMethodEvent
constructors have
been modified:
InputMethodEvent(Component, int, AttributedCharacterIterator,
int, TextHitInfo, TextHitInfo)
InputMethodEvent(Component, int, TextHitInfo,
TextHitInfo)
.Finally, the following methods were added to EventQueue
:


--- layout: default ---
Hi, I'm Joel! I'm an R and Python developer currently working as a data scientist at Clarivate Analytics where aI work on problems like creating recommendation systems, classifiers, and text summarization. My primary domain of expertise, and most of the data that I work with at Clarivate is related to Academic Literature, and Patents. Prior to coming to San Francisco I obtained a BSc in Physics, an MSc in Medical Physics, and completed the Galvanize data science bootcamp! Broadly, my research interests include Monte Carlo methods, machine learning applications, and creating tools that enable predictive analytics.
I have developed and released two packages for R: radiomics (CRAN, github), and RImagePalette (fun live version!, CRAN, github). Contributions and feedback are always welcome!
Take a look at some of the machine learning algorithms I have implemented here! Get in touch via: Github, Facebook, or LinkedIn


#include <CollisionDetector.h>
Checks collisions between objects.
- Author
- Linus Probert linus.nosp@m..pro.nosp@m.bert@.nosp<EMAIL_ADDRESS>Definition at line 18 of file CollisionDetector.h.
◆ CollisionDetector() [1/2]
◆ CollisionDetector() [2/2]
◆ AABB()
AABB Collision detection between two EntityShape objects. This is public due to testing. Let the EntityContainer use it alone
- Parameters
-
| b1 | The first EntityShape |
| b2 | The second EntityShape |
Definition at line 74 of file CollisionDetector.cpp.
◆ handlePossibleCollisionsFor()
| void flat2d::CollisionDetector::handlePossibleCollisionsFor |
( |
Entity * |
entity, |
|
|
const GameData * |
data |
|
) |
| |
◆ operator=()
◆ sweptAABB()
AABB sweeping collision detection between two EntityShape objects. This is public due to testing. Let the EntityContainer use it alone. This actually isn't used at the moment because it's a bit broken.
Definition at line 81 of file CollisionDetector.cpp.
The documentation for this class was generated from the following files:


Loews Hotels Rebrand
Duration
8 weeks
Client
Loews Hotels
Role
Art Direction
Experience Design
Team
Publicis New York (New Client Pitch)
Loews Hotels is somewhere in the middle of the reliable hotel chain everyone can trust and the small family-owned boutique hotel where you can expect the unexpected. Loews Hotels asked us for a way to put their portfolio of hotels under one banner that highlighted their unique experiences.
Feel at home, no matter far you’ve traveled
A new look and feel to integrate Loews' unique hotels under the banner of travel and exploration.
The Brief
Each Loews is a different experience
Each Loews hotel is a different experience, with 26 different hotels in 26 different cities, offering up a stay with their own personalities. Loews wanted to highlight the unique experiences that can only be found at each individual Loews, but within the comforts of a hotel chain known for their excellent service.
Our Solution
Wonder.
Far and wide.
We brought to life a spaceman to represent the traveler in all of us, finding adventure in Loews Hotels' unique guest experiences. With our design team we created a new brand tone and laid out user journeys that integrated experiences that would bring wonder to a guest's stay.
The Process
Understand
Listen to client goals and learn guest needs
Ideate
Synthesize findings and concept initial ideas
Discuss
Share ideas with client and potential guests
Pitch
Iterate with new feedback and pitch final campaign
My role as art director on Publicis’ pitch team was from start to finish from idea conception to finalized brand messaging, design and experiences. Under the leadership of our Creative Director and Design Lead, my copywriter and I concepted and rebranded Loews Hotels under a new headline, ‘Wonder. Far and wide’. We brought to life a spaceman to represent the traveler in all of us, finding adventure in Loews Hotels' unique guest experiences. With our design team we created a new brand tone and laid out detailed user journeys that integrated experiences we created to bring wonder to a guests' stay.
Understand
Finding the traveler in all of us
We started with secondary research of the the travel industry, utilizing quantitative data of the industry, but also insightful guest reviews from travel websites to help us understand who were most likely to stay at Loews' unique hotels. Our aim was to gather insights about strategies and best practices when it comes to what guests look for in their hotel experiences and in particular the positive feelings that stayed with previous Loews guests.
Quantitative Research
The travelers and how much they spend
Qualitative Research
Traveler's Reviews
Primary Persona
Why travel? To get a little lost. See new sights. Feel new thrills.
Name Ariel McCallan
Age & Occupation 28, Designer
Budget $250 per night
Needs
Ariel is a hard-working millenial who works hard to find the right balance between climbing the corporate ladder and working on her own personal growth. She sees travel as important to her own personal growth. It's a way for her to connect with herself while in a new environment. She has used local services like Airbnb in the past because of their price and integration into the local community.
Her hotel budget has grown, but her appreciation for local culture and spontaneous travel hasn't waned one bit. For her next trip she wants to find a hotel that has the comforts of home, but is inspiring and in touch with the community.
Secondary Persona
A business trip doesn't have to be all business.
Name Kevin Robertson
Age & Occupation 38, Accountant
Budget $375 per night
Needs
Kevin is one of many business travelers who are looking to see more than another meeting room while traveling for work. Even if he's only staying for a night, he wants to try local things and feel the local culture.
For a business traveler who doesn't have time to go out and explore hidden local spots, Loews' hotels bring the local culture and wonder to them. According to Forbes, bleisure (business + leisure) travel is up 20% and the most popular cities for bleisure travel happen to be where Loews has a hotel.
Competitive Analysis
Out of this world
A competitive analysis of other hotels would show us not only what features we needed to focus on but also help us define what separates Loews from other hotel chains. Based on each category's strength and pain points, we were able to see what journeys were available now and what direction we wanted to take with Loews.
Boutique.
These hotels attract the most similar crowd that Loews is well-known to. They add personality to their hotel experience and create signature touchpoints throughout the guest’s stay. The Standard's logo for example already conveys to prospective guests that their experience will be something unique.
Global chains
Loews' consistent service and breadth of locations (27 in the US) makes it a reliable and safe choice for travellers looking for a safe hotel brand. Compared to another Hilton or Marriott where you know what to expect, Loews designs and amenities often stand out and draw in the slighlty more adventurous traveler.
Airbnb
Airbnb has disrupted the hospitality industry and given the general public a new yearning for authentic travel experiences. Loews has a unique set of traits and amenities to stand out as the ‘Airbnb’ of quality hotels.
Takeaways from Research
We travel, initially, to lose ourselves.
And we travel, next, to find ourselves.
Exploring a new place can make you feel like you’re on the outside looking in: an alien in a strange land. By intrinsically being part of the neighborhood around them, every Loews hotel stands apart from its competition.
Every Loews hotel is integrated into the fabric of the city.
We should feature the cityscape as Loews’ backyard, showing how the spirit of each Loews hotel is in the fabric of the city.
No two Loews hotels are alike
26 hotels in 26 different locations. Guest reviews show that discovering each location is an adventure itself. From the location, to the employees, to the building itself, no two Loews hotels are alike.
Travelers want to belong
The introduction of services like Airbnb have succeeded because travelers want more personal experience and a sense of community. Let’s make guests feel at home, no matter how far they’ve traveled.
Creating the mood
Wonder.
Far and Wide.
Throughout our pitch we met with our stakeholders on a weekly basis, presenting our ideas and directions in rapid sprints so that we could get feedback to refine, tweak or even scrap ideas. We went back to the drawing board many times, as each round of feedback would keep us learning more and more about Loews. While the most research was done in the early stages to help us understand guests, the company and their unique position in the industry, research was continually needed each time we wanted to incorporate a new idea into the guest’s journey.
Our initial moodboard
Based on our intial research, we began with the idea of 'Far from Usual'. This initial concept led us away from the usual safe branding that hotels often stay in.
And our final brand manifesto
Get in touch to get access to the brand manifesto video.
The Spaceman The spaceman represents the traveler in all of us. We are all astronauts. At our best. Our most curious.
Myriad Pro Light
Myriad Pro Semibold
Myriad Pro Bold
Font A variety of fonts were used for different mediums and experiences. We started with Myriad Pro because it's a versatile font that works well in many situations and explored other fonts based on situation.
Implementation Themes of exploration will be branded into Loews amenities and touchpoints that guests will come across during their stay.
Loews Green
#AFDDD0
Loews Navy
#00184A
Loews Ocean
Gradient
Colors After a day out exploring, soothing brand colors go hand in hand with the comfortable stay one will find at Loews.
Guest Experience
Designed for every touchpoint
Throughout the hotels we would create a series of sensorial touches, both big and small designed to evoke a sense of wonder. From control board sounds to replace elevators dings, to door swooshes that follow our guests as they enter, to space foods upon check in and VR experiences in the lobby, every sensation from sight to smell will be thought out, a reflection of Loews’ dedication to detail and guest relations.
Guide to the Galaxy
The Guide to the Galaxy was one way for us to showcase how we could integrate our new mood for Loews.
To help guests get acquainted with every Loews city, we’ll publish an annual guidebook with information that ranges from the vital to the quirky.
In the neighborhood
Loews prides itself in not just being an accomodation but part of the neighborhood.
Mission Control
Livestreams give guests the opportunity to be explorers from the comfort of their own home.
Examples of banner ads and FB sequencing to
Sensorial touches, both big and small
Learnings
Always exploring
It was my first time playing a leading role on such a big project and seeing my initial ideas grow into a campaign that people across the agency were putting their hard-work, sweat and late nights taught me how encouraging and rewarding it was to see a project through with the team you started it with. I'll never forget the faith my creative director put in me and my partner to carry out a little idea into a full campaign for a potential client.
At the beginning of the ideation phase, our initial goal of rebranding was to help Loews stand out from a crowded market, but our idea quickly grew into a campaign that would bring all the best that Loews has to offer into a unique experience that could resonate with guests like “our spaceman”.
I learned the effectiveness of quick design sprints. We went back to the drawing board many times, as each round of feedback with our stakeholders would keep us learning more and more about Loews. Research was continually needed each time we wanted to incorporate a new idea into the guest’s journey. From start to finish we were always exploring and open to new things and I believe that’s what made the process so wonderous.


Laemborghini
Price start from $300
Book nowWe give our best to make you feel good.

Fuel Cost Included
If you refill fuel, we will pay you back.
Flexible Price Plans
Choose according to kilometers or hours.
Damage Insurance
Drive safe and don't worry.


Here is how you assign variables in JavaScript. Const for variables that you do not plan on changing. Let for changeable variables
const id = 1;
let phoneNumber = 66666666;
To assign a string we add " " to it
let sampleString = "string here"
Since JavaScript does not allow for explicit type declaration we can do our best to make it know what we want.
One way to do it is to wrap it in the object we want it to be a type of.
We can check the type of the object with the method typeof() which returns a string of the type We can then use console.log() to print what it returns to check it.
// for String
const string_const = String("jupiter")
console.log(typeof(string_const));
console.log(string_const);
// The output is:
string
jupiter
// And for Number
const number_const = Number("12")
console.log(typeof(number_const ))
console.log(number_const );
// The output is:
number
12
Even if we initialize the 12 with quotation marks it will still be cast to Number thanks to the wrapper
If we want to represent a number with two decimals we can achieve it in two ways. We can make it be a string, or we can use the .toFixed() method.
// String
const number = "1.10";
console.log(number);
// Output:
1.10
// .toFixed()
// Casting the string "1.10" to a number, thus removing the last 0
const number2 = Number(number);
// Printing the number with two decimals with the toFixed() method
// We pass the number 2 to indicate the amount of decimals
console.log(number2.toFixed(2));
1.10
In JavaScript Strings are essentially arrays of chars. Thanks to this fact, we can use indexes to retrieve a specific character.
const letters = "abc";
// to grab the letter 'c' we can do the following:
letters[2];
// the issue is that this returns the letter,
// so we best store it somewhere.
const letter = letters[2];
console.log(letter);
// Output:
"c"
Objects in JavaScript are made by surrounding one or more key value pairs in a curly brace
const myObj = {"message": "Hello, earthling! I bring peace."};
We can assign additional values like this:
myObj.type = "sms";
console.log(myObj);
// Output:
{
message: 'Hello, earthling! I bring peace.',
type: 'sms'
}
If we want to add a boolean as an attribute then we declare it true or false without quotation marks like this
myObj.isActive = true;
console.log(myObj);
// Output:
{
message: 'Hello, earthling! I bring peace.',
type: 'sms',
isActive: true
}
We can retrieve the specific attributes of objects by calling objectName.keyName
const value = myObj.message;
console.log(value);
// Output:
'Hello, earthling! I bring peace.'
If we want to remove a property from an object we can simply call delete and the property name
delete myObj.isActive;
console.log(value);
// Output:
{
message: 'Hello, earthling! I bring peace.',
type: 'sms'
}
To initialize an array in JavaScript you simply place your attributes in between two square brackets separated by a comma like this:
const letters = ["a","b","c", 1, 3, false, myObj];
To add values to an array you have to use the push() method
let friend1 = {name:"peter", liar: false};
let friend2 = {name: "Sandy", liar: false};
let friend3 = {name: "Mandy", liar :true};
friends.push(friend1);
friends.push(friend2);
friends.push(friend3);
console.log("Printing the array of friends\n");
console.dir(friends);
// Output:
Printing the array of friends
[
{ name: 'peter', liar: false },
{ name: 'Sandy', liar: false },
{ name: 'Mandy', liar: true }
]
To search the contents of an array you can use indexOf() it will return the index in the array where the first occurrence of the passed variable is, if it exists. If its not found then it will return -1
console.log("indexOf friend2:", friends.indexOf(friend2));
// Output:
indexOf friend2: 1
If you want to insert something into the array at a specific
location you can use splice().
Splice is used to remove
things from a specific index as well as potentially insert.
It's syntax is as follows:
splice(start: number(the starting index),
deleteCount: number(amount of items to delete(from starting
index)),
...items (any amount of items to insert(optional)))
example: splice(index, numberToDelete, itemToInsert,
itemToInsert2)
let friend4 = {name: "New Friend", liar: false};
// inserting friend4 into the array's index 2 without removing
friends.splice(2,0, friend4);
console.log(friends);
// Output:
[
{ name: 'peter', liar: false },
{ name: 'Sandy', liar: false },
{ name: 'New Friend', liar: false },
{ name: 'Mandy', liar: true }
]
If you want to remove the last element of a list you can use the
pop() method.
It removes and returns the last element of a list.
Here is an example of it in action:
console.log(friends);
// Output:
[
{ name: 'peter', liar: false },
{ name: 'Sandy', liar: false },
{ name: 'New Friend', liar: false },
{ name: 'Mandy', liar: true }
]
friends.pop();
console.log(friends);
// Output:
[
{ name: 'peter', liar: false },
{ name: 'Sandy', liar: false },
{ name: 'New Friend', liar: false }
]
const poppedFriend = friends.pop();
console.log("Friend list:")
console.log(friends);
console.log("Popped friend:")
console.log(poppedFriend);
// Output:
Friend list:
[
{ name: 'peter', liar: false },
{ name: 'Sandy', liar: false }
]
Popped friend:
{ name: 'New Friend', liar: false }
You can also iterate through the items of an array with the use of
the spread operator.
If you for example wanted to copy the contents of one array to
another, the easiest way would be to do something like this
let fakeFriends = [...friends];
This will take one at a time, the contents of friends and place it
in fakeFriends, this is different to
let fakeFriends = friends;
as this only makes fakeFriends a reference of friends, and not a
new copy


|
Math library
|
C++11 based application base for developing apps.
Put your laboration test code in the folder titled 'projects'. It must be accompanied with its own CMakeLists.txt which is used to generate a project/solution. Then run CMake in the root of the project, there should be a target in your project matching the name of your lab.
Any "engine" related code should be placed in the 'engine' sub-folders; for example, rendering code goes into the 'engine/render' folder. You can add additional sub-folders if needed.
The base engine contains two classes, Window and App. Override the App class for your project to implement your own update loop. The Window class is used to open a window and connect input handlers to it.
Input handlers can be connected by assigning a lambda function to a callback matching the input you require. It is possible to have more than one window open at a time, although one must select which window to render to using the function called Window::MakeCurrent prior to doing any GL calls.
IMPORTANT NOTICE: The environment uses precompiled headers, which means all source files (.cc, .cpp) must include "config.h".
The example project is simply an example implementation which displays a colored triangle on a grey background.
This environment uses:
https://cmake.org/cmake/help/latest/guide/tutorial/index.html


JavaScript is required
This page requires JavaScript to run correctly. JavaScript seem to be disabled in your browser. Please enable JavaScript or try to open the page in another browser.


BANDIT QUEEN A film review by M. Srikanth Copyright 1995 M. Srikanth
Starring: Seema Biswas as Phoolan Devi, the bandit queen.  In a sense, it is also a chapter from the real life story of India today. In another sense, it is also a chapter from the real life story of world's women.
Here is no stylised narration of truth; this is real life viewed under the glaring arc-lights of brutal honesty. The director was walking a very thin line--one false step and this would turn into a sleazy, irreverent portrayal and would betray all good intentions. The viewer is taken through an emotional roller-coaster ride--I felt hatred, extreme anger, embarrassing helplessness, enormous pity and at last, a sense of guilt-ridden relief when it was all over. If such a movie can only be judged by the effect it has on its viewers, BANDIT QUEEN is a huge success.
The controversies:
This movie, completed a year ago, has been embroiled in controversy from multiple fronts. Initially, Phoolan Devi strongly opposed the screening of the movie saying that it was a warped account of her life. However, as Shekar Kapur (the director of the movie who was present during the screening) explained, she had not even seen the movie then and was going entirely by hearsay. Recently, however, she has been shown the movie in private screenings (the movie is still banned in India) and she has both "approved it for worldwide release" and withdrawn her case from court. After watching the movie, the only comment she had was "My life was much harder."
>From another front, Shekar has also been fighting to get the censor board of India to clear the movie. This is unlike any Indian movie ever made--graphic violence, explicit language and even a scene with full frontal nudity. But again, this is reality and if people can see it in the streets, why can't they see it on the screen? Shekar has vowed to fight the censors "tooth and nail" and is confident that the movie "will be screened without any cuts in the near future."
Is Shekar commercialising India's current moral depravity? Given the thoroughly deglamourised, non-dramatic portrayal of potentially cinematic contexts, the answer would have to be a no. "Are you saying this is India?" asked a viewer after the movie. "No," Shekar said emphatically, "I don't think I ever did." How did he feel as an Indian filming this shameful side of his country? "I feel ashamed about how things are ... I think we (Indians) all need to. But I think any other director from any other part of the world--be it from Yugoslavia or Russia or South America would do the same thing as I did. We are mature enough to face reality. Aren't we?"
The movie:
From the outside, it seems an improbable task--Shekar Kapur is a high-caste, city-bred man trying to portray the life of Phoolan Devi, a low caste woman from a village. However, the fact that, at the end, this positioning vis-a-vis the artist and his subject only serves to accentuate the merits of the films's artistic achievement, is a statement on the sincerity and involvement of the artist in his endeavour.
The film opens in the year 1968 when as a 11 year old girl, Phoolan is sold away by her father as a bride to a heartless man whose sole concern is that he "needs his wife since his mother is getting too old to do the house work." We are introduced to a girl who freely uses foulest of languages and who has a game confidence that she can take on any of these "sister *******." In her new environment, she is confronted with the caste discriminations of the local high caste Thakurs whom she would live to hate for the rest of her life. Here is also the first of the countless times she would be violated. This first act of violation was a powerful piece of work, with the camera initially showing both the husband and the scared girl, then slowly moving to close-in on the girl's tormented face, while in the background one can hear the screamings grow shriller and shriller till the moment when it mixes with a voice that is singing a high-pitched lament. Genuinely gut-wrenching.
The initial fifteen minutes of the movie, in which all this happens, sets the tone and the pattern for the remaining 105 minutes. We see the turbulent, often traumatic life of Phoolan Devi with little left to imagination. She runs away from her husband after the incident, is driven out of her native village for having "enticed" a higher caste youth, lives with her cousin for a while till the time that Vikram, a low caste bandit, falls in love with her and rescues her from his high-caste fellow bandit. There is a brief relief for Phoolan (and the audience) as she adjusts herself to the new life as a bandit, her new image and the prominence. However, things get rough again with the release of the high caste ex-leader of the gang from prison. How this changes her life irrevocably and how she rises again from the ashes to become the bandit queen is the rest of the movie.
There are several sequences in the movie where the art of portrayal of reality has been taken to new heights. I will not go into all the details and let you experience it first hand, but it would suffice to say that much of the movie is not for the faint-hearted.
While handling a story such as this, the role of the director of a movie changes dramatically. He is more of an interpreter; constantly making choices of what to show and what to leave out, there is an abundance of material, and constantly "coalescing" truth into understandable unifications and using them as vehicles to convey a sense of the reality. An overwhelming priority is also his role as a watchdog to protect the film from veering into the dimension of celluloid entertainment, while all the time maintaining an eye on both the sincerity of his own intentions and the authenticity of his interpretations. Thankfully, Shekar has scored well in all departments relieving us from having to digress into pedantic details.
Seema Biswas is Phoolan Devi. It is difficult to believe that this is her first movie. The hatred and anger in the eyes are real, the confidence in her manner in the latter part of the movie is real and on the whole a near faultless performance. Only during the scenes when she tries to portray the feminine side of Phoolan can one sense a measure of discomfort as if she is not wholly sure of what to do. However, on second thought, there might be some truth in saying that Phoolan herself, after all the trauma she has gone through, had lost touch with her feminine side and as such the hesitation on Seema's part was deliberate. Also, one has to admire and appreciate the courage of an Indian artist to come forward to be cast in such a portrayal.
The screenplay is mostly tight. The first half of the movie moves very fast and so do the final segments. The middle portion, showing the life of Vikram and Phoolan as bandits seems a little sagging, though. Towards the end, the attempts by the government to get Phoolan to surrender are shown in a hurried detail. Also, we get no real understanding of how Phoolan was perceived by the general public outside the valleys of Chambal. What we get is a tight close-up on Phoolan the person and her social position as a bandit queen is almost considered an irrelevance (Shekar did mention after the movie that he had to make many difficult choices and that he was contractually obligated to make a two hour movie).
The music by Nusrat Fateh Ali Khan and the photography by Ashok Mehta lend able support.
From a totally different view point, this is a positive film about resurgence. The fact that a physically traumatised, mentally tormented, low-caste woman from a depraved Indian village chose not to give up but stand up and fight her own battle is amazing. This movie stands as fair testimony to this life of resurgence.
Needless to say, I highly recommend the movie.
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


Welcome to Intel(R) IoT Services Orchestration Layer (IoT SOL).
In this page, we want guide you step by step to get started.
First, you should setup an environment according to the type of your machine.
If you are going to play IoT SOL on an Edison board, please visit Edison + StartKit.
For Linux PC, please visit Linux.
For Windows PC, please visit Windows.
Here we have more advanced topics for you to understand the system and more details.
This section list multiple real examples that you could follow to create interesting workflows and UIs.
More introduction and design information, please visit Reference


© 2002-2021
Encyclopaedia Metallum
Best viewed
without Internet Explorer,
in 1280 x 960 resolution
or higher.
| Disc 1 - Human | |||
| 1. | Flattening of Emotions | 04:29 | Show lyrics |
| (loading lyrics...) | |||
| 2. | Suicide Machine | 04:22 | Show lyrics |
| (loading lyrics...) | |||
| 3. | Together as One | 04:09 | Show lyrics |
| (loading lyrics...) | |||
| 4. | Secret Face | 04:36 | Show lyrics |
| (loading lyrics...) | |||
| 5. | Lack of Comprehension | 03:43 | Show lyrics |
| (loading lyrics...) | |||
| 6. | See Through Dreams | 04:25 | Show lyrics |
| (loading lyrics...) | |||
| 7. | Cosmic Sea | 04:28 | instrumental |
| (loading lyrics...) | |||
| 8. | Vacant Planets | 03:49 | Show lyrics |
| (loading lyrics...) | |||
| 9. | God of Thunder (KISS cover) | 03:55 | Show lyrics |
| (loading lyrics...) | |||
| 37:56 | |||
| Disc 2 - Human - Basic Instrumental Studio Tracks | |||
| 1. | Flattening of Emotions | 04:54 | instrumental |
| (loading lyrics...) | |||
| 2. | Suicide Machine | 04:30 | instrumental |
| (loading lyrics...) | |||
| 3. | Together as One | 04:15 | instrumental |
| (loading lyrics...) | |||
| 4. | Secret Face | 02:02 | instrumental |
| (loading lyrics...) | |||
| 5. | Secret Face - Part 2 | 02:44 | instrumental |
| (loading lyrics...) | |||
| 6. | Lack of Comprehension | 03:46 | instrumental |
| (loading lyrics...) | |||
| 7. | "Felt Good" - Studio Snippet | 00:14 | instrumental |
| (loading lyrics...) | |||
| 8. | See Through Dreams | 01:37 | instrumental |
| (loading lyrics...) | |||
| 9. | See Through Dreams - Part 2 | 03:03 | instrumental |
| (loading lyrics...) | |||
| 10. | Vacant Planets | 03:59 | instrumental |
| (loading lyrics...) | |||
| 11. | Cosmic Sea | 02:13 | instrumental |
| (loading lyrics...) | |||
| 12. | Cosmic Sea - Part 2 | 02:03 | instrumental |
| (loading lyrics...) | |||
| 13. | God of Thunder (KISS cover) | 04:05 | instrumental |
| (loading lyrics...) | |||
| 14. | Flattening of Emotions | 04:26 | |
| (loading lyrics...) | |||
| 15. | Lack of Comprehension | 03:48 | |
| (loading lyrics...) | |||
| 16. | Suicide Machine | 04:31 | |
| (loading lyrics...) | |||
| 17. | Together as One | 04:10 | |
| (loading lyrics...) | |||
| 18. | See Through Dreams | 04:08 | |
| (loading lyrics...) | |||
| 19. | Secret Face | 04:48 | instrumental |
| (loading lyrics...) | |||
| 20. | Vacant Planets | 03:59 | instrumental |
| (loading lyrics...) | |||
| 01:09:15 | |||
| Disc 3 - Human Rehearsal - January 1991 | |||
| 1. | See Through Dreams w/ Paul and Sean | 04:32 | |
| (loading lyrics...) | |||
| 2. | See Through Dreams (Take 2) w/ Paul and Sean | 04:34 | |
| (loading lyrics...) | |||
| 3. | Secret Face - w/o Paul - 1/2 song | 02:52 | |
| (loading lyrics...) | |||
| 4. | Secret Face (Take 2) - w/o Paul | 06:32 | |
| (loading lyrics...) | |||
| 5. | Secret Face - Riffs | 03:47 | instrumental |
| (loading lyrics...) | |||
| 6. | Flattening of Emotions - Riffs | 03:15 | instrumental |
| (loading lyrics...) | |||
| 7. | Lack of Comprehension - Riffs | 02:43 | instrumental |
| (loading lyrics...) | |||
| 8. | Lack of Comprehension (Take 2) - Riffs | 02:42 | instrumental |
| (loading lyrics...) | |||
| 9. | Cosmic Sea - Riffs w/ Drum Machine | 02:51 | instrumental |
| (loading lyrics...) | |||
| 10. | See Through Dreams | 04:25 | |
| (loading lyrics...) | |||
| 11. | Suicide Machine | 04:42 | |
| (loading lyrics...) | |||
| 12. | Together as One | 04:27 | |
| (loading lyrics...) | |||
| 13. | Suicide Machine | 04:25 | instrumental |
| (loading lyrics...) | |||
| 14. | Together as One | 04:05 | instrumental |
| (loading lyrics...) | |||
| 15. | Secret Face | 04:37 | instrumental |
| (loading lyrics...) | |||
| 16. | Lack of Comprehension | 03:38 | instrumental |
| (loading lyrics...) | |||
| 17. | Vacant Planets | 03:53 | instrumental |
| (loading lyrics...) | |||
| 01:08:00 |
| Original line-up | |
| Band members | |
| Sean Reinert (R.I.P. 2020) | Drums |
| Chuck Schuldiner (R.I.P. 2001) | Guitars, Vocals, Songwriting, Lyrics |
| Steve DiGiorgio | Bass |
| Paul Masvidal | Guitars |
| Guest/Session | |
| Scott Carino | Bass (track 7) |
| Miscellaneous staff | |
| Tracy Cruz | Label coordination |
| Michael Fuller | Mastering |
| Chuck Schuldiner (R.I.P. 2001) | Producer, Logo |
| Tim Hubbard | Photography |
| Scott Burns | Producer, Recording, Mixing |
| David Bett | Art direction |
| René Miville | Artwork |
| Additional line-up | |
| Guest/Session | |
| Bill Andrews | Drums (on Rehearsal August 1990 tracks) |
| Terry Butler | Bass (on Rehearsal August 1990 tracks) |
| Miscellaneous staff | |
| Drew Juergens | Reissue coordination |
| Jim Morris | Remixing, Liner notes |
| Jacob Speis | Layout |
| Alan Douches | Remastering |
| Paul Masvidal | Liner notes |
| Original line-up | |
| Sean Reinert (R.I.P. 2020) | Drums |
| Chuck Schuldiner (R.I.P. 2001) | Guitars, Vocals, Songwriting, Lyrics |
| Steve DiGiorgio | Bass |
| Paul Masvidal | Guitars |
| Original line-up | |
| Scott Carino | Bass (track 7) |
| Additional line-up | |
| Bill Andrews | Drums (on Rehearsal August 1990 tracks) |
| Terry Butler | Bass (on Rehearsal August 1990 tracks) |
| Original line-up | |
| Tracy Cruz | Label coordination |
| Michael Fuller | Mastering |
| Chuck Schuldiner (R.I.P. 2001) | Producer, Logo |
| Tim Hubbard | Photography |
| Scott Burns | Producer, Recording, Mixing |
| David Bett | Art direction |
| René Miville | Artwork |
| Additional line-up | |
| Drew Juergens | Reissue coordination |
| Jim Morris | Remixing, Liner notes |
| Jacob Speis | Layout |
| Alan Douches | Remastering |
| Paul Masvidal | Liner notes |
| Pre-"Focus" | 100% | Hames_Jetfield | January 26th, 2021 | |
| Breaking The Death Metal... | 90% | DanielG06 | January 1st, 2021 | |
| The pinnacle of metal | 100% | Fioridz | June 6th, 2019 | |
| The blueprint for tech... | 100% | mordor_machine | May 22nd, 2019 | |
| Death Changes their Style | 94% | kcajremmerhcs | December 11th, 2016 | |
| Death-Human | 95% | Iron Wizard | November 19th, 2016 | |
| A New Era of Death Metal | 100% | Cohesion | November 20th, 2014 | |
| Among the finest albums of... | 93% | psychosisholocausto | February 23rd, 2013 | |
| Death - Human | 100% | Orbitball | October 16th, 2012 | |
| Death metal can be smart, too! | 45% | RageW | July 19th, 2012 | |
| From society, to the cosmos. | 87% | hells_unicorn | December 27th, 2011 | |
| A reissue well worth your... | 85% | Pratl1971 | October 25th, 2011 | |
| Death - Human (Reissue) | 95% | ThrashManiacAYD | September 5th, 2011 | |
| Thriving On No Cliche | 90% | grain_silo | July 31st, 2011 | |
| A flattening of my devotions | 67% | autothrall | April 8th, 2011 | |
| "Death - Human (1991)" | 100% | Dolf9271986 | May 5th, 2008 | |
| This IS Death | 100% | Dedsox | December 5th, 2007 | |
| On top of things | 95% | morbert | May 30th, 2007 | |
| Beyond Human | 99% | Kingarty | May 25th, 2007 | |
| Mastery in Death metal | 99% | orionmetalhead | May 3rd, 2007 | |
| Puts me in heaven | 96% | Chrispaks | March 12th, 2007 | |
| Defining a genre and a career. | 96% | erickg13 | November 22nd, 2006 | |
| Death's first really good... | 93% | wachtourak | July 25th, 2006 | |
| A Leap forward in Death Metal | 100% | YYZman | September 30th, 2005 | |
| Deep Death Metal | 93% | meedley_meedley | December 19th, 2004 | |
| dig through the fuzzy... | 89% | Cedric | November 30th, 2004 | |
| A death metal classic | 100% | stickyshooZ | April 16th, 2004 | |
| horns up | 90% | ironasinmaiden | January 8th, 2003 |
20th anniversary mailorder exclusive numbered edition issued in a deluxe embossed 4 panel digipak with a 24 page booklet featuring unseen pictures as well as brand new liner notes.
Disc 3:
Tracks 13-17 Human - Drum & bass tracks.
Music video:
- Lack of Comprehension
Recording information:
Remixed January of 2011 at Morrisound Studios, Tampa, Florida.
Remastered at West West Side Music.
Disc 1:
Recorded at Morrisound Studios, Tampa, Florida.
Disc 2:
Tracks 14-20 Human demos recorded - March 25, 1991.
Disc 3:
Tracks 1-9 Human rehearsal recorded - January 1991.
Tracks 10-12 Human rehearsal recorded - August 1990.
Identifiers:
Barcode (Printed): 7 81676 71662 3
Barcode (String):<PHONE_NUMBER>23
Matrix / Runout (CD 1): 7232-7165D1-CD + + 72393321
Mould SID Code (CD 1): IFPI 10E7
Mastering SID Code (CD 1): IFPI L027
Matrix / Runout (CD 2): 7232-7165D2-CD + 101 + 72380221
Mastering SID Code (CD 2): IFPI L027
Matrix / Runout (CD 3): 7232-7166D3-CD + + 72390621
Mould SID Code (CD 3): IFPI 10J7
Mastering SID Code (CD 3): IFPI L028
Rights Society: BMI
Rights Society: ASCAP
ASIN: B00802V5XQ
| Added by: Torquia | Modified by: AgeOfTheWiccans |
| Added on: 2014-07-08 21:58:55 | Last modified on: 2019-07-15 20:23:41 |


{# Render a table with the given header and rows. The header should be a list of strings. The rows should be a list of a tuple of columns. The first column is expected to be the primary key used to delete the column. This first column is not considered by the header (i.e. header has one value less than the individual rows). #} {% macro table(header, rows, ondelete) -%}
| {{column}} | {% endfor %}{% for columns in rows %} |
|---|---|
| {{column}} | {% endfor %}


U Can List
Standard
Pre-validated
Custom error message, auto-validates on blur
Standard
Pre-validated
Custom error message, auto-validates on blur
Standard
Pre-validated
Custom error message, auto-validates on blur