goto CPH is closing in rapidly.
As mentioned previously I am especially looking forward to David Nolen’s talk Putting the Dream Machine to Work.
Om is getting a lot of coverage and even if it is still very new, it is seeing some heavy duty prodcution usage, for instance at Prismatic. But Prismatic has gone even further that just using Om and released om-tools, which makes it even more straight forward to use Om.
Another talk I am looking very much forward to is Greg Young’s talk on Event Sourcing. Event Sourcing is a very interesting pattern which has a very natural fit to many common business scenarios, and I am looking forward to Greg Young giving us some examples of that. The benefits of the event sourcing pattern appears to me to overlap somewhat with the benefits of the Clojure based database Datomic which also emphazises the need for a solid model of time.
If you are interested in dabbling with Event Sourcing and have been inspired by David’s talk on Om/ClojureScript you should check out the JVM Soup post on Event Sourcing in Clojure. This post demonstrates how to use core.async Clojure/ClojureScripts CSP implentation, which David also recommends to do inter component communication when using Om, to do event sourcing in Clojure/ClojureScript.
=======Prior to his gotocon CPH talk “Fast Data –Tools and Peopleware” I had a brief chat with Dave.
I was interested in hearing what had informed the design of his Ivy system, especially the combination of a rich HTML based GUI and a DSL edited in the browser.
This post is a overview of what I consider the key take aways from the chat and some of my subsequent reflections.
Combining well known metaphors like a spreadsheet and boosting learnability example based queries with a DSL has been a very useful approach.
Supporting power users is a challenge but doable in a mordern web app.
1) Firstly the app has to be designed to support that user type expects, like short cuts etc. Ivy is not just a editable field for code, but a complete IDE including debugger etc.
2) Secondly if you include a DSL don’t do it to boost your ego but because it provides actual leverage. Also don’t forget that putting a DSL out there which power users are going to trly on require that you can support it. This means that you have the physical resoources available for the long run.
- Building a web app offers the possibility of offloading computationally demanding operations to the backend, for instance generation of SVG graphs.
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> masterOm My CSP
=======Git
>>>>>>> masterLooks like I will be at goto CPH again this year.
The format this year is quite different, but looks very interesting nonetheless. Especially the Leading & Bleeding Edge track looks interesting. At this track I am especially looking forward to seeing David Nolen’s talk Putting the Dream Machine to Work.
David has created a ClojureScript framework on top of React called Om. Om is not just a wrapper around React. It leverages ClojureScript’s immutable datastructures to substitute costly object and array compares with reference equality checks. This results in quite significant performance improvements.
David in his tutorials encourage another ClojureScript feature core.async for intercomponent communication.
As Om is still very new there are not many presentations available but Functional UI programming with React.JS and ClojureScript is a very good introduction.
If you understand Norwegian (and maybe even if you don’t) Magnar Sveen and Christian Johansen have recorded a very entertaining series of pair programming screencast where they use ClojureScript, Quiescent (an alternative React ClojureScript library) and a TDD approach to create a Zombie themed Memory Flash Game called ZOMBIECLJ
=======I just attended Edward Thomson’s talk “Deep Dive into Git”.
I find version control and especially git’s approach to version control especially interesting because because it is such a good examples of a hacker power tool that would add tremendous value if applied to other trades, like contract drafting.
Edward works on Microsoft’s reimplementation of git libgit2. Apparently the original git has certain issues when used as a library (especially in Visual Studio)
git is essentially distributed and branching is cheap and easy, which Edward demonstrated convincingly. But the higlight of the talk for me was Edward’s explanation of the dreaded “rebase” command. Edward succeeded where a others have failed misrably in explaning rebase in a way that actually makes sense – at least to me. Instead of merging rebase generates a set of diffs between the most recent ancestor of your present branch and the ancestor. Theses diffs are then applied to the branch your are rebasing to. When I realised this image from the Atlassian git tutorial actually made sense to me.
Related to git but not Edwards talk I recently discovered git auto commit mode for Emacs. I don’t think this would work for code, but I plan to try it out for the prose writing I do in Emacs.
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> masterLicensing Done Right!
=======GUI DSLs
>>>>>>> masterJust attended a very nice overview talk on the Unity game development system at goto Aarhus 2013.
The tech in Unity itself is very impressive, especially the ability to deploy the same code base and assets to 10+ platforms, including iOS. But Unity has also put a lot of thought into how the product is licensed. Not only was it a very conscious decision by the founders that Unity be royalty free, but the same thoughtfulness has also been applied to the Unity Asset Store.
The Asset Store is Unity’s equivalent of the App Store, but instead of apps you can buy art (e.g. graphics, models, audio) and code assets for inclusion in your Unity project. Had Unity left the choice of license up to the creators of the submitted assets, it would have completely undermined the royalty free nature of the Unity engine, as each asset could potentially inject it’s own royalty model into a product created with Unity. Instead all assets are per definition subject to standard royalty free TOS & EULA, and as explained in the below excerpt from Unity’s Asset Store submission guidelines it is not possible to sell assets in the Asset Store that are subject to other/additional terms.
6.2 Licensing your Content
For consistency sake, all Asset Store offerings are covered by a license we have created. Please have a look at the End User License Agreement to be sure you are comfortable with it. If you are offering your content for free, you have the further option of selecting one of three free-licenses, which override the basics of our commercial license. Please do not include your own license terms in your offering.
It is very refreshing to see how licensing models can be designed to enhance the usefulness of a product and its eco-system, while at the same time serve as the underpinning of an indisputable financial success.
If you have any use-cases involving 3D graphics you really should check Unity out. And please note that Unity is not limited to games. Unity Studios have done some really cool non-game applications, including a simulation for training safety procedures at sea and a brilliant app for Velux that let’s you simulate the effects of installing Velux windows in your own home.
=======As I wrote previuously I am going to the goto cph conference this year.
One speaker that I am definitively will go see is Dave Thomas. Besides being consistently entertaining Dave Thomas also has the experience required to reach into the great work of Computer Science past and show how it remains relevant the practical business challenges of today.
Dave’s company has a product called Ivy. It is a analytics product based on the programming language Q – a decendant of APL/K – and the KDb+ database.
Ivy’s primary usecase appears to be financial analytics, an area I know little about, but I find its approach to user interface fascinating. It shows how you can precent a contemporary web based GUI using familiar metaphors and maintain the ability to drop down to code when you need to.
Ivy has a very cool modern looking in-browser inteface with spreadsheet like overview of the massive volumes of data the system is designed to handle, a visual query builder and supports a wide range of visualizations. But it also has strong support for the Q language, including a debugger.
I hope to be able to chat with Dave about his thoughts on DSLs and GUIs during the conference and get his take on questions like “When do you want both?”, “What kind of IDE do you need if you want to support non-programmers programming?”, “Are projectional editors the future of DSLs?” etc. and report here on the conversation.
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> masterHit Record!
=======Open Source Upsides
>>>>>>> masterRichard Baeckman just did an excellent presentation on Java Flight Recorder at goto Aarhus 2013. Java Flight Recorder is an – enhanced – port of JRockit Flight Recorder to the Oracle(Sun) JVM. It ships with Java SE Development Kit 7u40 and includes a very nifty GUI called Java Mission Control that provides an excellent overvie of all the data collected in your recordings. I was very interested in seeing how useful JFR is when running Clojure code. Fortunately installation is very easy. After installing Java Platform (JDK) 7u40 I just added the following options to my project.clj file.
:jvm-opts ["-XX:+UnlockCommercialFeatures" "-XX:+FlightRecorder"]
On OS X you have to start the JMC from a terminal invoking the binary located at:
/Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/Home/bin/jmc
This brings up the JMC GUI. If you start your Clojure app (in my case Rich’s ants.clj), your jvm(s) should be visible under the JVM Browser tab. From here you can start a recording by double-clicking the relevant JVM, right-clicking the Flight Recorder entry and choosing “Start Flight Recording…”. I have inlcuded a screenshot below of a 1 minute recording of ants.clj. As you can tell JFR collects an immense amount of information but the overhead is minimal, approx 3% according to Richard.
Please do note that the Java Flight Recorder and JMC are both Commercial Features, which I have written about previously here. This means that neither JFR and JMC may be used for production purposes without a separate payable license from Oracle. There is currently no public information regarding prices and other conditions available from Oracle.
=======I am really looking forward to the goto cph conference this year.
One of the talks on my personal iteneary is How to train your corporation to prefer open source by Richard Lander from the Microsoft core.net team.
Microsoft is undergoing profound changes at the moment expecially in its approach to open source. One of the more prominent examples of this is the open sourcing of the .NET stack which I am sure Richard will be mentioning in his talk.
The irony of course is that Microsoft still inflicts the pain of closed source on its customers on a monumental scale – and as closed licensors go Microsoft unfortunately is at the bad end of the spectrum and showing no signs of becoming even more rigid with time. My last encounter with Microsoft’s licensing machine was less than a year ago, and for the umpteenth time numerous very reasonable requests for changes and clarifications to the license terms were summarily dismissed. It would be great to see a fresh approach to software licensing from Microsoft similar to how IBM has – although imperfectly – reinvented its terms and conditions.
There are of course many reasons to prefer open source to the extent possible. A prominent one is that you avoid the pain of license audits by vendors who missed their last quarter or who wants to strong arm you into using their latest solution that they haven’t been able to sell to customers voluntarily, better known as the Oracle approach
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> masterFlexible Contracts
=======Om, Clojure/ClojureScript and Event Sourcing
>>>>>>> masterIt was suggested to me to look into the concept of Flexible Contracts, a new approach to contracting for agile it projects championed by Gabrielle Benefield who will be providing training in agile practices in connection with goto Aarhus 2013.
Flexible Contracts are born out of the observation that traditional contract models are a very poor fit for agile IT projects. This is hardly a novel observation, but Gabrielle’s work (and that of her collaborators) distinguishes itself by actually having produced a practical alternative, which they have commendably licensed under the CC Attribution 3.0 Unported license. Only the lite version – Flexlite 0.1 as it is designated – appears to be presently available, and can be accessed if you are willing to sign up to the Flexible Contracts mailing list here.
It is worth noting that the overview attached to the contract clearly states that the Flexlite contract is to be considered a “minimum viable contract”, but after having reviewed the document I still find that the current version lacking in a number of ways.
Below I will outline a subset of the issues I have identified and for some suggests some possible remedies. Please note that I am commenting on the UK version (which you might want to keep handy if you want to make sense of my comments) of the contract which is the system of law I am most familiar with, but most of my comments should apply to both versions, with the exception of the issue of “best endeavours” where there is a significant difference between US and UK law.
Statetment of Target Outcomes (SOTO)
The contract focuses on the use of SOTOs instead of specifying the desired results through requirements or a more traditional solution specification. A SOTO:
means a statement of target outcomes as agreed by the parties in accordance with clause 1.1;
According to clause 2.2 the Supplier must for each Target Outcome create:
Options that have the potential to achieve the Target Outcome. In respect of each Option the Supplier shall provide a forecast in terms of the estimated value, costs, risks and expiry date (if any) for that Option and shall inform the Customer of any requirements for execution of the Option and any circumstances in which the Option may expire.
Even after reading the overview it remains unclear exactly what the function of the Options are and what, if any, the work-flow for calling these are.
It appears odd that acceptance (adoption) of the Outcome Delivery is left to the Supplier but I assume this is considered reasonable given that one of the objectives of the Flexible Contract is to provide as much flexibility to vendor in deciding in how to achieve the SOTO. I don’t think any customer would be comfortable with this construct, especially if the Supplier’s payment hinges in part on achieving the Target Outcomes, which is one of the models (option B) suggested in the model SOTO schedule attached to the contract. Clause 2.7 isn’t much help in this context, as 2.7. (a) is stating the obvious and (b) lacks fundamental precision. As such in can easily be interpreted as granting the Customer defacto veto rights against any Outcome Delivery, which is hardly constructive either.
Related to this issue is the lack of consistency between clause 3.1 which states that:
In consideration of the provision of the Services by the Supplier, the Customer shall pay the fees in the amount and on the dates or with the frequency as set out in each SOTO.
and the “Hybrid Outcome-based fees” model in the model SOTO schedule, where payment is conditioned upon achieving the Target Outcomes.
Best Endeavours
I also find it fundamentally concerning that the contract relies on a unqualified “best endeavours” standard when defining the Suppliers responsibility under the contract. It is simply not good practice not to agree some further specification of what the parties intend “best endeavours” to mean. This can for instance be done by indicating what financial/resources the Supplier must expend in its attempt to fulfill its obligation. Failing to provide such guidance is to invite conflict and to introduce unnecessary uncertainty. While I applaud the authors stated aim of brevity this is not an area where one wants to sacrifice lack of precision for terseness. I have included a few links below that provides more in-depth information on the subject.
Intellectual Property Rights (IPR)
The IPR as specified in clause 5 model appears fairly sensible and reflects the reality of the deliverables being a composite of bespoke, vendor, third party proprietary and FOSS. That said the specific license granted to the Customer in respect of Supplier Software (clause 5.4) will in many cases have to be adapted to the needs of the Customers, both in respect of scope but also rights to create derived works etc. I would suggest moving the specification of this license to the SOTO schedule to facilitate this. This also applies to the specification of what types of software (Customised, Supplier, Third Party, Open Source) will constitute part of the Outcome Delivery, so the Customer may determine the feasibility of the rights obtained and clear any necessary rights.
While the contract does provide a warranty for non-infringement in respect of the Services and Outcome Delivery it does not address the issue of indemnification for such infringement, which any prudent customer will require.
The above is a summary of some of the issues I have identified with the current draft of the Flexlite contract. I summation I think the contract does a good job of capturing the idea of an outcomes focused contract, but unfortunately it does so at the expense of the customers position under the contract should things not go as planned.
I hope to have the opportunity to discuss Flexible Contracts with Gabrielle during goto Aarhus 2013 and do one or more follow posts on Flexible Contracts.
Links regarding best endeavours:
“All reasonable endeavours” a lesser obligation than “best endeavours”
Best and EffortsCase Analysis and Practical Guidance Under U.S. and U.K. Law
My delicious links about “best endeavours”
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
=======goto CPH is closing in rapidly.
As mentioned previously I am especially looking forward to David Nolen’s talk Putting the Dream Machine to Work.
Om is getting a lot of coverage and even if it is still very new, it is seeing some heavy duty prodcution usage, for instance at Prismatic. But Prismatic has gone even further that just using Om and released om-tools, which makes it even more straight forward to use Om.
Another talk I am looking very much forward to is Greg Young’s talk on Event Sourcing. Event Sourcing is a very interesting pattern which has a very natural fit to many common business scenarios, and I am looking forward to Greg Young giving us some examples of that. The benefits of the event sourcing pattern appears to me to overlap somewhat with the benefits of the Clojure based database Datomic which also emphazises the need for a solid model of time.
If you are interested in dabbling with Event Sourcing and have been inspired by David’s talk on Om/ClojureScript you should check out the JVM Soup post on Event Sourcing in Clojure. This post demonstrates how to use core.async Clojure/ClojureScripts CSP implentation, which David also recommends to do inter component communication when using Om, to do event sourcing in Clojure/ClojureScript.
>>>>>>> masterGOTO Aarhus 2013 - ClojureScript
=======Om My CSP
>>>>>>> masterI put together my first draft itenary for GOTO Aarhus 2013. You can see it here.
Fortunately the programme did not pose too many dilemma’s for me to resolve, although choosing between “Obstacles And Patterns To Maximize Flow In IT Operations” and “Lambdas in Java: A peek under the hood” on Tuesday morning was a bit difficult.
I was especially pleased to see that David Nolen is giving a talk. David is fairly prolific in the Clojure community. He is the driving force behind core.logic and a significant contributor to ClojureScript. Core.logic is a implementation of miniKaren and provides robust logic programming facilities in Clojure and ClojureScript. As an example of how concise logic programming can be please see below Sudoku solver by David Nolen.
;; based on core.logic 0.8-alpha2 or core.logic master branch
(ns sudoku
(:refer-clojure :exclude [==])
(:use clojure.core.logic))
(defn get-square [rows x y]
(for [x (range x (+ x 3))
y (range y (+ y 3))]
(get-in rows [x y])))
(defn init [vars hints]
(if (seq vars)
(let [hint (first hints)]
(all
(if-not (zero? hint)
(== (first vars) hint)
succeed)
(init (next vars) (next hints))))
succeed))
(defn sudokufd [hints]
(let [vars (repeatedly 81 lvar)
rows (- vars (partition 9) (map vec) (into []))
cols (apply map vector rows)
sqs (for [x (range 0 9 3)
y (range 0 9 3)]
(get-square rows x y))]
(run 1 [q]
(== q vars)
(everyg #(infd % (domain 1 2 3 4 5 6 7 8 9)) vars)
(init vars hints)
(everyg distinctfd rows)
(everyg distinctfd cols)
(everyg distinctfd sqs))))
;; ====
(comment
(sudokufd
[0 0 3 0 2 0 6 0 0
9 0 0 3 0 5 0 0 1
0 0 1 8 0 6 4 0 0
0 0 8 1 0 2 9 0 0
7 0 0 0 0 0 0 0 8
0 0 6 7 0 8 2 0 0
0 0 2 6 0 9 5 0 0
8 0 0 2 0 3 0 0 9
0 0 5 0 1 0 3 0 0]))
ClojureScript compiles Clojure into Javascript which is guarenteed to be digestable by the Goolge Closure compiler. While the ClojureScript implementation of core.logic is somewhat limited compared to the Clojure based one, you can still do some interesting things with it. If you are not familiar with ClojureScript you might want to check this tutorial out. Some interesting examples of using canvas / SVG with ClojureScript, can be found here
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
=======Looks like I will be at goto CPH again this year.
The format this year is quite different, but looks very interesting nonetheless. Especially the Leading & Bleeding Edge track looks interesting. At this track I am especially looking forward to seeing David Nolen’s talk Putting the Dream Machine to Work.
David has created a ClojureScript framework on top of React called Om. Om is not just a wrapper around React. It leverages ClojureScript’s immutable datastructures to substitute costly object and array compares with reference equality checks. This results in quite significant performance improvements.
David in his tutorials encourage another ClojureScript feature core.async for intercomponent communication.
As Om is still very new there are not many presentations available but Functional UI programming with React.JS and ClojureScript is a very good introduction.
If you understand Norwegian (and maybe even if you don’t) Magnar Sveen and Christian Johansen have recorded a very entertaining series of pair programming screencast where they use ClojureScript, Quiescent (an alternative React ClojureScript library) and a TDD approach to create a Zombie themed Memory Flash Game called ZOMBIECLJ
>>>>>>> masterSAS vs. World Programming – Opinion of the Advocate General
=======Licensing Done Right!
>>>>>>> masterSo the Advocate General to the ECJ has submitted its opinion to the Court on the questions submitted by the High Court of Justice of England and Wales in the SAS vs World Programming case that i wrote about here and here.
The Advocate concludes the following:
(1)
Article 1(2) of Council Directive 91/250/EEC of 14 May 1991 on the legal protection of computer programs is to be interpreted as meaning that the functionalities of a computer program and the programming language are not eligible, as such, for copyright protection. It will be for the national court to examine whether, in reproducing these functionalities in its computer program, the author of the program has reproduced a substantial part of the elements of the first program which are the expression of the author’s own intellectual creation.
(2)
Articles 1(2) and 6 of Directive 91/250 are to be interpreted as meaning that it is not regarded as an act subject to authorisation for a licensee to reproduce a code or to translate the form of the code of a data file format so as to be able to write, in his own computer program, a source code which reads and writes that file format, provided that that act is absolutely indispensable for the purposes of obtaining the information necessary to achieve interoperability between the elements of different programs. That act must not have the effect of enabling the licensee to recopy the code of the computer program in his own program, a question which will be for the national court to determine.
(3)
Article 5(3) of Directive 91/250, read in conjunction with Articles 4(a) and (b) and 5(1) thereof, is to be interpreted as meaning that the expression ‘any of the acts of loading, displaying, running, transmitting or storing the computer program [which the person having the right] is entitled to do’ relates to the acts for which that person has obtained authorisation from the rightholder and to the acts of loading and running necessary in order to use the computer program in accordance with its intended purpose. Acts of observing, studying or testing the functioning of a computer program which are performed in accordance with that provision must not have the effect of enabling the person having a right to use a copy of the program to access information which is protected by copyright, such as the source code or the object code.
(4)
Article 2(a) of Directive 2001/29/EC of the European Parliament and of the Council of 22 May 2001 on the harmonisation of certain aspects of copyright and related rights in the information society is to be interpreted as meaning that the reproduction, in a computer program or a user manual, of certain elements described in the manual for another computer program may constitute an infringement of the copyright in the latter manual if – a question which will be for the national court to determine – the elements reproduced in this way are the expression of their author’s own intellectual creation.
The opinion is pretty much a slam dunk for World Programming. The only hiccup is the issue related to the copying of parts of SAS’ manuals, but that is a minor issue compared to a situation where World Programming would have been restricted in their ability to produce a product compatible with SAS’ product. Now we just have to hope that the Court agrees with the Advocate General.
=======Just attended a very nice overview talk on the Unity game development system at goto Aarhus 2013.
The tech in Unity itself is very impressive, especially the ability to deploy the same code base and assets to 10+ platforms, including iOS. But Unity has also put a lot of thought into how the product is licensed. Not only was it a very conscious decision by the founders that Unity be royalty free, but the same thoughtfulness has also been applied to the Unity Asset Store.
The Asset Store is Unity’s equivalent of the App Store, but instead of apps you can buy art (e.g. graphics, models, audio) and code assets for inclusion in your Unity project. Had Unity left the choice of license up to the creators of the submitted assets, it would have completely undermined the royalty free nature of the Unity engine, as each asset could potentially inject it’s own royalty model into a product created with Unity. Instead all assets are per definition subject to standard royalty free TOS & EULA, and as explained in the below excerpt from Unity’s Asset Store submission guidelines it is not possible to sell assets in the Asset Store that are subject to other/additional terms.
6.2 Licensing your Content
For consistency sake, all Asset Store offerings are covered by a license we have created. Please have a look at the End User License Agreement to be sure you are comfortable with it. If you are offering your content for free, you have the further option of selecting one of three free-licenses, which override the basics of our commercial license. Please do not include your own license terms in your offering.
It is very refreshing to see how licensing models can be designed to enhance the usefulness of a product and its eco-system, while at the same time serve as the underpinning of an indisputable financial success.
If you have any use-cases involving 3D graphics you really should check Unity out. And please note that Unity is not limited to games. Unity Studios have done some really cool non-game applications, including a simulation for training safety procedures at sea and a brilliant app for Velux that let’s you simulate the effects of installing Velux windows in your own home.
>>>>>>> masterOracle Java 7 and ‘Commercial Features’
=======Hit Record!
>>>>>>> masterOracle has just announced the general availability of Java 7 SE including Java SE Advanced and Java SE Suite.

The license contains some interesting wording regarding “Commercial Features” in section 1, 2 and SUPPLEMENTAL LICENSE TERMS section A and G. The “Commercial Features” are defined in this document (PDF version with better layout here). Please note that the specification of “Commercial Features” is not part of the license as such and therefor subject to change at Oracle’s discretion.
It turns out the “Commercial Features” are subject to rather draconian restrictions (SUPPLEMENTAL LICENSE TERMS section A):
COMMERCIAL FEATURES You may not use the Commercial Features for running Programs, Java applets or applications in your internal business operations or for any commercial or production purpose, or for any purpose other than as set forth in Sections B, C, D and E of these Supplemental Terms. If You want to use the Commercial Features for any purpose other than as permitted in this Agreement, You must obtain a separate license from Oracle.
As you can tell any meaningful business use of the “Commercial Features” are subject to a separate license.
So does the regular Java 7 SE download contain any of these “Commercial Features”? It does not look like it and the Java Se Advance and Java SE Suite packages doesn’t either, because they do not exist. From below two sections that appear at end of this document, it is clear that the Java SE Advanced and Java SE Suite “products” are a combination of the Java 7 SE and a number of separate packages.
Installation of Java SE Product Editions
Oracle does not provide installation programs that correspond directly to Java SE, Oracle Java SE Advanced and Oracle Java SE Suite. Depending on the features licensed, one or more of the following individual packages must be downloaded:
JRE JDK
JRockit JDK
JRockit Mission Control
Java for Business JRE
Java for Business JDK
Licensing Considerations and Restricted-Use Licensing
Some of the packages described in Installation of Java SE Product Editions install commercial features that are restricted to Oracle Java SE Advanced or Oracle Java SE Suite. For example, the JRockit JDK comes with a deterministic garbage collector that requires a Oracle Java SE Suite license.
If you download (which you can do for instance here and here) and use these extra packages for the purposes outlined above (any meaning full business use) in combination with Java 7 SE you are subject to a separate (ostensibly payable) license.
The only mention I can find of this change from Oracle is this blog post with the clearly misleading title “JRockit is Now Free (and Other Java License Updates)”, as this does not apply to the JRockit “Commercial Features” listed above.
You should make sure that your developers, ops people and relevant vendors of such service knows this, or you could end up breaching your license and owing Oracle a lot of money.
=======Richard Baeckman just did an excellent presentation on Java Flight Recorder at goto Aarhus 2013. Java Flight Recorder is an – enhanced – port of JRockit Flight Recorder to the Oracle(Sun) JVM. It ships with Java SE Development Kit 7u40 and includes a very nifty GUI called Java Mission Control that provides an excellent overvie of all the data collected in your recordings. I was very interested in seeing how useful JFR is when running Clojure code. Fortunately installation is very easy. After installing Java Platform (JDK) 7u40 I just added the following options to my project.clj file.
:jvm-opts ["-XX:+UnlockCommercialFeatures" "-XX:+FlightRecorder"]
On OS X you have to start the JMC from a terminal invoking the binary located at:
/Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/Home/bin/jmc
This brings up the JMC GUI. If you start your Clojure app (in my case Rich’s ants.clj), your jvm(s) should be visible under the JVM Browser tab. From here you can start a recording by double-clicking the relevant JVM, right-clicking the Flight Recorder entry and choosing “Start Flight Recording…”. I have inlcuded a screenshot below of a 1 minute recording of ants.clj. As you can tell JFR collects an immense amount of information but the overhead is minimal, approx 3% according to Richard.
Please do note that the Java Flight Recorder and JMC are both Commercial Features, which I have written about previously here. This means that neither JFR and JMC may be used for production purposes without a separate payable license from Oracle. There is currently no public information regarding prices and other conditions available from Oracle.
>>>>>>> masterDropbox Unzip
=======Flexible Contracts
>>>>>>> masterInspirer by this post where the author shows how to add automatic unzipping to a Dropbox folder on OS X, I wanted to see if something similar was easily achievable on Ubuntu (10.10).
After a bit of searching I found incron. Quoting from the website incron “is an “inotify cron” system. It consists of a daemon and a table manipulator. You can use it a similar way as the regular cron. The difference is that the inotify cron handles filesystem events rather than time periods.”
To create a folder in your Dropbox that automatically unzips any zip file dropped into it first install incron. It is available in the Ubuntu Universe repository and can be installed using:
sudo apt-get install incron
After the package is installed you must add the username of all users who should be permitted to add jobs to incron to /etc/incron.allow like this(replace [username] with your username):
sudo echo “[username]” >> /etc/incron.allow
Next create the unzip folder in your Dropbox folder:
mkdir [path to your Dropbox folder]/unzip
Next we need to add the actual unzip job row to incron like this:
icrontab -e
This opens the user incron table in the deafult editor. Insert the following line, replacing [path to your Dropbox folder] with the absolute path (don’t use ~) to your Dropbox folder:
[path to your Dropbox folder]/unzip IN_CLOSE_WRITE unzip $@/$# -d $@
Check that the job row was added to your incron table:
incrontab -l
This should output the line you just added above. If this works try copying a zip file into the Dropbox/unzip folder. If everything works it should unzip automatically. This obviously only so long the machine you installed the incron job is online.
=======It was suggested to me to look into the concept of Flexible Contracts, a new approach to contracting for agile it projects championed by Gabrielle Benefield who will be providing training in agile practices in connection with goto Aarhus 2013.
Flexible Contracts are born out of the observation that traditional contract models are a very poor fit for agile IT projects. This is hardly a novel observation, but Gabrielle’s work (and that of her collaborators) distinguishes itself by actually having produced a practical alternative, which they have commendably licensed under the CC Attribution 3.0 Unported license. Only the lite version – Flexlite 0.1 as it is designated – appears to be presently available, and can be accessed if you are willing to sign up to the Flexible Contracts mailing list here.
It is worth noting that the overview attached to the contract clearly states that the Flexlite contract is to be considered a “minimum viable contract”, but after having reviewed the document I still find that the current version lacking in a number of ways.
Below I will outline a subset of the issues I have identified and for some suggests some possible remedies. Please note that I am commenting on the UK version (which you might want to keep handy if you want to make sense of my comments) of the contract which is the system of law I am most familiar with, but most of my comments should apply to both versions, with the exception of the issue of “best endeavours” where there is a significant difference between US and UK law.
Statetment of Target Outcomes (SOTO)
The contract focuses on the use of SOTOs instead of specifying the desired results through requirements or a more traditional solution specification. A SOTO:
means a statement of target outcomes as agreed by the parties in accordance with clause 1.1;
According to clause 2.2 the Supplier must for each Target Outcome create:
Options that have the potential to achieve the Target Outcome. In respect of each Option the Supplier shall provide a forecast in terms of the estimated value, costs, risks and expiry date (if any) for that Option and shall inform the Customer of any requirements for execution of the Option and any circumstances in which the Option may expire.
Even after reading the overview it remains unclear exactly what the function of the Options are and what, if any, the work-flow for calling these are.
It appears odd that acceptance (adoption) of the Outcome Delivery is left to the Supplier but I assume this is considered reasonable given that one of the objectives of the Flexible Contract is to provide as much flexibility to vendor in deciding in how to achieve the SOTO. I don’t think any customer would be comfortable with this construct, especially if the Supplier’s payment hinges in part on achieving the Target Outcomes, which is one of the models (option B) suggested in the model SOTO schedule attached to the contract. Clause 2.7 isn’t much help in this context, as 2.7. (a) is stating the obvious and (b) lacks fundamental precision. As such in can easily be interpreted as granting the Customer defacto veto rights against any Outcome Delivery, which is hardly constructive either.
Related to this issue is the lack of consistency between clause 3.1 which states that:
In consideration of the provision of the Services by the Supplier, the Customer shall pay the fees in the amount and on the dates or with the frequency as set out in each SOTO.
and the “Hybrid Outcome-based fees” model in the model SOTO schedule, where payment is conditioned upon achieving the Target Outcomes.
Best Endeavours
I also find it fundamentally concerning that the contract relies on a unqualified “best endeavours” standard when defining the Suppliers responsibility under the contract. It is simply not good practice not to agree some further specification of what the parties intend “best endeavours” to mean. This can for instance be done by indicating what financial/resources the Supplier must expend in its attempt to fulfill its obligation. Failing to provide such guidance is to invite conflict and to introduce unnecessary uncertainty. While I applaud the authors stated aim of brevity this is not an area where one wants to sacrifice lack of precision for terseness. I have included a few links below that provides more in-depth information on the subject.
Intellectual Property Rights (IPR)
The IPR as specified in clause 5 model appears fairly sensible and reflects the reality of the deliverables being a composite of bespoke, vendor, third party proprietary and FOSS. That said the specific license granted to the Customer in respect of Supplier Software (clause 5.4) will in many cases have to be adapted to the needs of the Customers, both in respect of scope but also rights to create derived works etc. I would suggest moving the specification of this license to the SOTO schedule to facilitate this. This also applies to the specification of what types of software (Customised, Supplier, Third Party, Open Source) will constitute part of the Outcome Delivery, so the Customer may determine the feasibility of the rights obtained and clear any necessary rights.
While the contract does provide a warranty for non-infringement in respect of the Services and Outcome Delivery it does not address the issue of indemnification for such infringement, which any prudent customer will require.
The above is a summary of some of the issues I have identified with the current draft of the Flexlite contract. I summation I think the contract does a good job of capturing the idea of an outcomes focused contract, but unfortunately it does so at the expense of the customers position under the contract should things not go as planned.
I hope to have the opportunity to discuss Flexible Contracts with Gabrielle during goto Aarhus 2013 and do one or more follow posts on Flexible Contracts.
Links regarding best endeavours:
“All reasonable endeavours” a lesser obligation than “best endeavours”
Best and EffortsCase Analysis and Practical Guidance Under U.S. and U.K. Law
My delicious links about “best endeavours”
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> masterA Simple Chat App Using Aleph, Websockets and Clojure
=======GOTO Aarhus 2013 - ClojureScript
>>>>>>> masterI have implemented a small example shoving how to use the websocket support in Aleph, asynchronous webframework for Clojure built on Netty.
The example is tested with Chrome and Firefox on Ubuntu. It should work in all modern browsers as it relies on web-socket-js for websocket emulation in browsers that do not have native support. Please note the updated Usage instructions. The socket-policy-server necessary for Flash websocket emulation has to listen on port 843 (at least that is the first place Flash asks for the policy file) so the server has to be run using sudo.
If you are interested the example is at hosted on github, along with usage instructions.
=======I put together my first draft itenary for GOTO Aarhus 2013. You can see it here.
Fortunately the programme did not pose too many dilemma’s for me to resolve, although choosing between “Obstacles And Patterns To Maximize Flow In IT Operations” and “Lambdas in Java: A peek under the hood” on Tuesday morning was a bit difficult.
I was especially pleased to see that David Nolen is giving a talk. David is fairly prolific in the Clojure community. He is the driving force behind core.logic and a significant contributor to ClojureScript. Core.logic is a implementation of miniKaren and provides robust logic programming facilities in Clojure and ClojureScript. As an example of how concise logic programming can be please see below Sudoku solver by David Nolen.
;; based on core.logic 0.8-alpha2 or core.logic master branch
(ns sudoku
(:refer-clojure :exclude [==])
(:use clojure.core.logic))
(defn get-square [rows x y]
(for [x (range x (+ x 3))
y (range y (+ y 3))]
(get-in rows [x y])))
(defn init [vars hints]
(if (seq vars)
(let [hint (first hints)]
(all
(if-not (zero? hint)
(== (first vars) hint)
succeed)
(init (next vars) (next hints))))
succeed))
(defn sudokufd [hints]
(let [vars (repeatedly 81 lvar)
rows (- vars (partition 9) (map vec) (into []))
cols (apply map vector rows)
sqs (for [x (range 0 9 3)
y (range 0 9 3)]
(get-square rows x y))]
(run 1 [q]
(== q vars)
(everyg #(infd % (domain 1 2 3 4 5 6 7 8 9)) vars)
(init vars hints)
(everyg distinctfd rows)
(everyg distinctfd cols)
(everyg distinctfd sqs))))
;; ====
(comment
(sudokufd
[0 0 3 0 2 0 6 0 0
9 0 0 3 0 5 0 0 1
0 0 1 8 0 6 4 0 0
0 0 8 1 0 2 9 0 0
7 0 0 0 0 0 0 0 8
0 0 6 7 0 8 2 0 0
0 0 2 6 0 9 5 0 0
8 0 0 2 0 3 0 0 9
0 0 5 0 1 0 3 0 0]))
ClojureScript compiles Clojure into Javascript which is guarenteed to be digestable by the Goolge Closure compiler. While the ClojureScript implementation of core.logic is somewhat limited compared to the Clojure based one, you can still do some interesting things with it. If you are not familiar with ClojureScript you might want to check this tutorial out. Some interesting examples of using canvas / SVG with ClojureScript, can be found here
Full Disclosure: I am receiving a free GOTO ticket from the producers in exchange for blogging about the conference.
>>>>>>> master


A pastel-rainbow colored background with elements of STEM related objects. As OSTEM is an LGBT+ organization on campus that is made up of STEM majors, combining what represents both made sense.


pymatgen.analysis.elasticity.elastic module¶
-
class
ComplianceTensor
[source]¶ Bases:
pymatgen.core.tensors.Tensor
This class represents the compliance tensor, and exists primarily to keep the voigt-conversion scheme consistent since the compliance tensor has a unique vscale
-
class
ElasticTensor
[source]¶ Bases:
pymatgen.analysis.elasticity.elastic.NthOrderElasticTensor
This class extends Tensor to describe the 3x3x3x3 second-order elastic tensor, C_{ijkl}, with various methods for estimating other properties derived from the second order elastic tensor
Create an ElasticTensor object. The constructor throws an error if the shape of the input_matrix argument is not 3x3x3x3, i. e. in true tensor notation. Issues a warning if the input_matrix argument does not satisfy standard symmetries. Note that the constructor uses __new__ rather than __init__ according to the standard method of subclassing numpy ndarrays.
Parameters: - input_array (3x3x3x3 array-like) – the 3x3x3x3 array-like representing the elastic tensor
- tol (float) – tolerance for initial symmetry test of tensor
-
compliance_tensor
¶ returns the Voigt-notation compliance tensor, which is the matrix inverse of the Voigt-notation elastic tensor
-
debye_temperature_from_sound_velocities
(**kwargs)¶
-
directional_poisson_ratio
(n, m, tol=1e-08)[source]¶ Calculates the poisson ratio for a specific direction relative to a second, orthogonal direction
Parameters: - n (3-d vector) – principal direction
- m (3-d vector) – secondary direction orthogonal to n
- tol (float) – tolerance for testing of orthogonality
-
classmethod
from_independent_strains
(strains, stresses, eq_stress=None, vasp=False, tol=1e-10)[source]¶ Constructs the elastic tensor least-squares fit of independent strains :param strains: list of strain objects to fit :type strains: list of Strains :param stresses: list of stress objects to use in fit
corresponding to the list of strainsParameters: - eq_stress (Stress) – equilibrium stress to use in fitting
- vasp (boolean) – flag for whether the stress tensor should be converted based on vasp units/convention for stress
- tol (float) – tolerance for removing near-zero elements of the resulting tensor
-
classmethod
from_pseudoinverse
(strains, stresses)[source]¶ Class method to fit an elastic tensor from stress/strain data. Method uses Moore-Penrose pseudoinverse to invert the s = C*e equation with elastic tensor, stress, and strain in voigt notation
Parameters: - stresses (Nx3x3 array-like) – list or array of stresses
- strains (Nx3x3 array-like) – list or array of strains
-
g_reuss
¶ returns the G_r shear modulus
-
g_voigt
¶ returns the G_v shear modulus
-
g_vrh
¶ returns the G_vrh (Voigt-Reuss-Hill) average shear modulus
-
get_structure_property_dict
(structure, include_base_props=True, ignore_errors=False)[source]¶ returns a dictionary of properties derived from the elastic tensor and an associated structure
Parameters: - structure (Structure) – structure object for which to calculate associated properties
- include_base_props (bool) – whether to include base properties, like k_vrh, etc.
- ignore_errors (bool) – if set to true, will set problem properties that depend on a physical tensor to None, defaults to False
-
homogeneous_poisson
¶ returns the homogeneous poisson ratio
-
k_reuss
¶ returns the K_r bulk modulus
-
k_voigt
¶ returns the K_v bulk modulus
-
k_vrh
¶ returns the K_vrh (Voigt-Reuss-Hill) average bulk modulus
-
property_dict
¶ returns a dictionary of properties derived from the elastic tensor
-
universal_anisotropy
¶ returns the universal anisotropy value
-
y_mod
¶ Calculates Young’s modulus (in SI units) using the Voigt-Reuss-Hill averages of bulk and shear moduli
-
class
ElasticTensorExpansion
(c_list)[source]¶ Bases:
pymatgen.core.tensors.TensorCollection
This class is a sequence of elastic tensors corresponding to an elastic tensor expansion, which can be used to calculate stress and energy density and inherits all of the list-based properties of TensorCollection (e. g. symmetrization, voigt conversion, etc.)
Initialization method for ElasticTensorExpansion
Parameters: c_list (list or tuple) – sequence of Tensor inputs or tensors from which the elastic tensor expansion is constructed. -
calculate_stress
(strain)[source]¶ Calculate’s a given elastic tensor’s contribution to the stress using Einstein summation
-
energy_density
(strain, convert_GPa_to_eV=True)[source]¶ Calculates the elastic energy density due to a strain
-
classmethod
from_diff_fit
(strains, stresses, eq_stress=None, tol=1e-10, order=3)[source]¶ Generates an elastic tensor expansion via the fitting function defined below in diff_fit
-
get_compliance_expansion
()[source]¶ Gets a compliance tensor expansion from the elastic tensor expansion.
-
get_effective_ecs
(strain, order=2)[source]¶ Returns the effective elastic constants from the elastic tensor expansion.
Parameters: - strain (Strain or 3x3 array-like) – strain condition under which to calculate the effective constants
- order (int) – order of the ecs to be returned
-
get_ggt
(n, u)[source]¶ Gets the Generalized Gruneisen tensor for a given third-order elastic tensor expansion.
Parameters: - n (3x1 array-like) – normal mode direction
- u (3x1 array-like) – polarization direction
-
get_gruneisen_parameter
(temperature=None, structure=None, quad=None)[source]¶ Gets the single average gruneisen parameter from the TGT.
Parameters: - temperature (float) – Temperature in kelvin, if not specified will return non-cv-normalized value
- structure (float) – Structure to be used in directional heat capacity determination, only necessary if temperature is specified
- quad (dict) – quadrature for integration, should be dictionary with “points” and “weights” keys defaults to quadpy.sphere.Lebedev(19) as read from file
-
get_heat_capacity
(temperature, structure, n, u, cutoff=100.0)[source]¶ Gets the directional heat capacity for a higher order tensor expansion as a function of direction and polarization.
Parameters: - temperature (float) – Temperature in kelvin
- structure (float) – Structure to be used in directional heat capacity determination
- n (3x1 array-like) – direction for Cv determination
- u (3x1 array-like) – polarization direction, note that no attempt for verification of eigenvectors is made
- cutoff (float) – cutoff for scale of kt / (hbar * omega) if lower than this value, returns 0
-
get_stability_criteria
(s, n)[source]¶ Gets the stability criteria from the symmetric Wallace tensor from an input vector and stress value.
Parameters: - s (float) – Stress value at which to evaluate the stability criteria
- n (3x1 array-like) – direction of the applied stress
-
get_strain_from_stress
(stress)[source]¶ Gets the strain from a stress state according to the compliance expansion corresponding to the tensor expansion.
-
get_symmetric_wallace_tensor
(tau)[source]¶ Gets the symmetrized wallace tensor for determining yield strength criteria.
Parameters: tau (3x3 array-like) – stress at which to evaluate the wallace tensor.
-
get_tgt
(temperature=None, structure=None, quad=None)[source]¶ Gets the thermodynamic Gruneisen tensor (TGT) by via an integration of the GGT weighted by the directional heat capacity.
- See refs:
- R. N. Thurston and K. Brugger, Phys. Rev. 113, A1604 (1964). K. Brugger Phys. Rev. 137, A1826 (1965).
Parameters: - temperature (float) – Temperature in kelvin, if not specified will return non-cv-normalized value
- structure (float) – Structure to be used in directional heat capacity determination, only necessary if temperature is specified
- quad (dict) – quadrature for integration, should be dictionary with “points” and “weights” keys defaults to quadpy.sphere.Lebedev(19) as read from file
-
get_wallace_tensor
(tau)[source]¶ Gets the Wallace Tensor for determining yield strength criteria.
Parameters: tau (3x3 array-like) – stress at which to evaluate the wallace tensor
-
get_yield_stress
(n)[source]¶ Gets the yield stress for a given direction
Parameters: n (3x1 array-like) – direction for which to find the yield stress
-
omega
(structure, n, u)[source]¶ Finds directional frequency contribution to the heat capacity from direction and polarization
Parameters: - structure (Structure) – Structure to be used in directional heat capacity determination
- n (3x1 array-like) – direction for Cv determination
- u (3x1 array-like) – polarization direction, note that no attempt for verification of eigenvectors is made
-
order
¶ Order of the elastic tensor expansion, i. e. the order of the highest included set of elastic constants
-
thermal_expansion_coeff
(structure, temperature, mode='debye')[source]¶ Gets thermal expansion coefficient from third-order constants.
Parameters: - temperature (float) – Temperature in kelvin, if not specified will return non-cv-normalized value
- structure (Structure) – Structure to be used in directional heat capacity determination, only necessary if temperature is specified
- mode (string) – mode for finding average heat-capacity, current supported modes are ‘debye’ and ‘dulong-petit’
-
-
class
NthOrderElasticTensor
[source]¶ Bases:
pymatgen.core.tensors.Tensor
An object representing an nth-order tensor expansion of the stress-strain constitutive equations
-
GPa_to_eV_A3
= 0.006241509125883258¶
-
calculate_stress
(strain)[source]¶ Calculate’s a given elastic tensor’s contribution to the stress using Einstein summation
Parameters: strain (3x3 array-like) – matrix corresponding to strain
-
energy_density
(strain, convert_GPa_to_eV=True)[source]¶ Calculates the elastic energy density due to a strain
-
order
¶ Order of the elastic tensor
-
symbol
= 'C'¶
-
-
diff_fit
(strains, stresses, eq_stress=None, order=2, tol=1e-10)[source]¶ nth order elastic constant fitting function based on central-difference derivatives with respect to distinct strain states. The algorithm is summarized as follows:
- Identify distinct strain states as sets of indices for which nonzero strain values exist, typically [(0), (1), (2), (3), (4), (5), (0, 1) etc.]
- For each strain state, find and sort strains and stresses by strain value.
- Find first, second .. nth derivatives of each stress with respect to scalar variable corresponding to the smallest perturbation in the strain.
- Use the pseudoinverse of a matrix-vector expression corresponding to the parameterized stress-strain relationship and multiply that matrix by the respective calculated first or second derivatives from the previous step.
- Place the calculated nth-order elastic constants appropriately.
Parameters: - order (int) – order of the elastic tensor set to return
- strains (nx3x3 array-like) – Array of 3x3 strains to use in fitting of ECs
- stresses (nx3x3 array-like) – Array of 3x3 stresses to use in fitting ECs. These should be PK2 stresses.
- eq_stress (3x3 array-like) – stress corresponding to equilibrium strain (i. e. “0” strain state). If not specified, function will try to find the state in the list of provided stresses and strains. If not found, defaults to 0.
- tol (float) – value for which strains below are ignored in identifying strain states.
Returns: Set of tensors corresponding to nth order expansion of the stress/strain relation
-
find_eq_stress
(strains, stresses, tol=1e-10)[source]¶ Finds stress corresponding to zero strain state in stress-strain list
Parameters: - strains (Nx3x3 array-like) – array corresponding to strains
- stresses (Nx3x3 array-like) – array corresponding to stresses
- tol (float) – tolerance to find zero strain state
-
generate_pseudo
(strain_states, order=3)[source]¶ Generates the pseudoinverse for a given set of strains.
Parameters: - strain_states (6xN array like) – a list of voigt-notation “strain-states”, i. e. perturbed indices of the strain as a function of the smallest strain e. g. (0, 1, 0, 0, 1, 0)
- order (int) – order of pseudoinverse to calculate
Returns: - pseudo inverses for each order tensor, these can
be multiplied by the central difference derivative of the stress with respect to the strain state
- absent_syms: symbols of the tensor absent from the PI
expression
Return type: mis
-
get_diff_coeff
(hvec, n=1)[source]¶ Helper function to find difference coefficients of an derivative on an arbitrary mesh.
Parameters: - hvec (1D array-like) – sampling stencil
- n (int) – degree of derivative to find
-
get_strain_state_dict
(strains, stresses, eq_stress=None, tol=1e-10, add_eq=True, sort=True)[source]¶ Creates a dictionary of voigt-notation stress-strain sets keyed by “strain state”, i. e. a tuple corresponding to the non-zero entries in ratios to the lowest nonzero value, e.g. [0, 0.1, 0, 0.2, 0, 0] -> (0,1,0,2,0,0) This allows strains to be collected in stencils as to evaluate parameterized finite difference derivatives
Parameters: - strains (Nx3x3 array-like) – strain matrices
- stresses (Nx3x3 array-like) – stress matrices
- eq_stress (Nx3x3 array-like) – equilibrium stress
- tol (float) – tolerance for sorting strain states
- add_eq (bool) – flag for whether to add eq_strain to stress-strain sets for each strain state
- sort (bool) – flag for whether to sort strain states
Returns: OrderedDict with strain state keys and dictionaries with stress-strain data corresponding to strain state
-
get_symbol_list
(rank, dim=6)[source]¶ Returns a symbolic representation of the voigt-notation tensor that places identical symbols for entries related by index transposition, i. e. C_1121 = C_1211 etc.
Parameters: - dim (int) – dimension of matrix/tensor, e. g. 6 for voigt notation and 3 for standard
- rank (int) – rank of tensor, e. g. 3 for third-order ECs
Returns: array representing distinct indices c_arr (array): array representing tensor with equivalent
indices assigned as above
Return type: c_vec (array)


Shuffle.js
Showcase your content with Masonry-like layout with Shuffle.js plugin which is integrated into PROFI.
How it works
.shuffle-grid-gap-{n}
controls gap size between items. .shuffle-grid-cols-{gridBreakpoint}-{n}
controls how much items should be shown in each row for gridBreakpoint.

...

...

...

Filters
Use data-groups
attribute for .shuffle-grid-item
with comma-separated list of group identifier to use in filters.

<button class="btn btn-light selected" data-value="all">All</button>
<button class="btn btn-light" data-value="group-1">Group 1</button>
<button class="btn btn-light" data-value="group-2">Group 2</button>


Marquez:
It doesn't look as though you are here to travel. Do you have anything else to say to me?
Tell him that you've brought the book about primitive creatures.


A CachedRowSet
object is special in that it can operate
without being connected to its data source, that is, it is
a disconnected RowSet
object. It gets its name
from the fact that it stores (caches) its
data in memory so that it can operate on its own data
rather than on the data stored in a database.
The CachedRowSet
interface is the superinterface for all
disconnected RowSet
objects, so everything demonstrated here also applies to WebRowSet
, JoinRowSet
, and
FilteredRowSet
objects.
Note that although the data source for a CachedRowSet
object (and the RowSet
objects derived from it) is almost
always a relational database, a CachedRowSet
object is
capable of getting data from any data source that stores
its data in a tabular format. For example, a flat file or
spreadsheet could be the source of data. This is true when
the RowSetReader
object for a disconnected RowSet
object is
implemented to read data from such a data source. The
reference implementation of the CachedRowSet
interface has
a RowSetReader
object that reads data from a relational
database, so in this tutorial, the data source is always a
database.
The following topics are covered:
Setting up a CachedRowSet
object involves the following:
You can create a new CachedRowSet
object in the different ways:
RowSetFactory
, which is created from the class RowSetProvider
: See Using the RowSetFactory Interface in Using JdbcRowSet Objects for more information.Note: Alternatively, you can use the constructor from the CachedRowSet
implementation of your JDBC driver. However, implementations of the RowSet
interface will differ from the reference implementation. These implementations will have different names and constructors. For example, the Oracle JDBC driver's implementation of the CachedRowSet
interface is named oracle.jdbc.rowset.OracleCachedRowSet
.
One of the ways you can create a CachedRowSet
object is by
calling the default constructor defined in the reference
implementation, as is done in the following line of code:
CachedRowSet crs = new CachedRowSetImpl();
The object crs
has the same default values for its properties
that a JdbcRowSet
object has when it is first created. In
addition, it has been assigned an instance of the default
SyncProvider
implementation, RIOptimisticProvider
.
A SyncProvider
object supplies a RowSetReader
object (a
reader) and a RowSetWriter
object (a writer),
which a disconnected RowSet
object needs in order to read
data from its data source or to write data back to its data
source. What a reader and writer do is explained later in
the sections What Reader Does and What Writer Does. One thing to keep in mind is that
readers and writers work entirely in the background, so the
explanation of how they work is for your information only.
Having some background on readers and writers should help
you understand what some of the methods defined in the
CachedRowSet
interface do in the background.
Generally, the default values for properties are fine as they are, but you may change the value of a property by calling the appropriate setter method. There are some properties without default values that you must set yourself.
In order to get data, a disconnected RowSet
object must
be able to connect to a data source and have some means of
selecting the data it is to hold. The following properties hold
information necessary to obtain a connection to a database.
username
: The name a user supplies to a
database as part of gaining accesspassword
: The user's database password
url
: The JDBC URL for the database to
which the user wants to connectdatasourceName
: The name used to
retrieve a DataSource object that has been registered with
a JNDI naming service
Which of these
properties you must set depends on how you are going to
make a connection. The preferred way is to use a DataSource
object, but it may not be practical for you to
register a DataSource
object with a JNDI naming service,
which is generally done by a system administrator. Therefore, the code examples all
use the DriverManager
mechanism to obtain a connection, for
which you use the url
property and not the datasourceName
property.
The following lines of code set the username
, password
, and
url
properties so that a connection can be obtained using
the DriverManager
class. (You will find the JDBC URL to
set as the value for the url
property in the documentation
for your JDBC driver.)
public void setConnectionProperties(String username, String password) { crs.setUsername(username); crs.setPassword(password); crs.setUrl("jdbc:mySubprotocol:mySubname"); // ...
Another property that you must set is the command
property.
In the reference implementation, data is read into a RowSet
object from a ResultSet
object. The query that produces
that ResultSet
object is the value for the command
property. For example, the following line of code sets the
command
property with a query that produces a ResultSet
object containing all the data in the table MERCH_INVENTORY
:
crs.setCommand("select * from MERCH_INVENTORY");
If you are going make any updates to the crs
object and want
those updates saved in the database, you must set one more
piece of information: the key columns. Key columns are
essentially the same as a primary key because they indicate
one or more columns that uniquely identify a row. The
difference is that a primary key is set on a table in the
database, whereas key columns are set on a particular
RowSet
object. The following lines of code set the key
columns for crs
to the first column:
int [] keys = {1}; crs.setKeyColumns(keys);
The first column in the table MERCH_INVENTORY
is ITEM_ID
. It can
serve as the key column because every item identifier is different and therefore uniquely identifies one row and
only one row in the table MERCH_INVENTORY
. In addition, this column is specified as a primary key in the definition of the MERCH_INVENTORY
table. The method setKeyColumns
takes an array to allow for the fact that it may take two
or more columns to identify a row uniquely.
As a point of interest, the method setKeyColumns
does not
set a value for a property. In this case, it sets the value
for the field keyCols
. Key columns are used internally, so
after setting them, you do nothing more with them. You will
see how and when key columns are used in the section Using SyncResolver Objects.
Populating a disconnected RowSet
object involves more work
than populating a connected RowSet
object. Fortunately, the extra work is done in the background. After you have
done the preliminary work to set up the CachedRowSet
object
crs
, the following line of code populates crs
:
crs.execute();
The data in crs
is the data in the ResultSet
object
produced by executing the query in the command property.
What is different is that the CachedRowSet
implementation
for the execute
method does a lot more than the JdbcRowSet
implementation. Or more correctly, the CachedRowSet
object's reader, to which the method execute delegates its
tasks, does a lot more.
Every disconnected RowSet
object has a SyncProvider
object
assigned to it, and this SyncProvider
object is what
provides the RowSet
object's reader (a RowSetReader
object). When the crs
object was created, it was used as the default
CachedRowSetImpl
constructor, which, in addition to setting
default values for properties, assigns an instance of the
RIOptimisticProvider
implementation as the default
SyncProvider
object.
When an application calls the method execute
, a
disconnected RowSet
object's reader works behind the scenes
to populate the RowSet
object with data. A newly created
CachedRowSet
object is not connected to a data source and
therefore must obtain a connection to that data source in
order to get data from it. The reference implementation of
the default SyncProvider
object (RIOptimisticProvider
)
provides a reader that obtains a connection by using the
values set for the user name, password, and either the
JDBC URL or the data source name, whichever was set more
recently. Then the reader executes the query set for the
command. It reads the data in the ResultSet
object produced
by the query, populating the CachedRowSet
object with that
data. Finally, the reader closes the connection.
In the Coffee Break scenario, the owner wants to
streamline operations. The owner decides to have employees at the
warehouse enter inventory directly into a PDA (personal
digital assistant), thereby avoiding the error-prone
process of having a second person do the data entry. A
CachedRowSet
object is ideal in this situation because it
is lightweight, serializable, and can be updated without a
connection to the data source.
The owner will have the application development team create a GUI tool for
the PDA that warehouse employees will use for entering
inventory data. Headquarters will create a CachedRowSet
object populated with the table showing the current
inventory and send it using the Internet to the PDAs. When a
warehouse employee enters data using the GUI tool, the tool
adds each entry to an array, which the CachedRowSet
object
will use to perform the updates in the background. Upon
completion of the inventory, the PDAs send their new data
back to headquarters, where the data is uploaded to the
main server.
This section covers the following topics:
Updating data in a CachedRowSet
object is just the same as
updating data in a JdbcRowSet
object. For example, the
following code fragment from CachedRowSetSample.java
increments the value in the column QUAN
by 1 in the row whose ITEM_ID
column has an item identifier of 12345
:
while (crs.next()) { System.out.println("Found item " + crs.getInt("ITEM_ID") + ": " + crs.getString("ITEM_NAME")); if (crs.getInt("ITEM_ID") == 1235) { int currentQuantity = crs.getInt("QUAN") + 1; System.out.println("Updating quantity to " + currentQuantity); crs.updateInt("QUAN", currentQuantity + 1); crs.updateRow(); // Synchronizing the row back to the DB crs.acceptChanges(con); }
Just as with updating a column value, the code for
inserting and deleting rows in a CachedRowSet
object is the
same as for a JdbcRowSet
object.
The following excerpt from CachedRowSetSample.java
inserts a new row into the CachedRowSet
object crs
:
crs.moveToInsertRow(); crs.updateInt("ITEM_ID", newItemId); crs.updateString("ITEM_NAME", "TableCloth"); crs.updateInt("SUP_ID", 927); crs.updateInt("QUAN", 14); Calendar timeStamp; timeStamp = new GregorianCalendar(); timeStamp.set(2006, 4, 1); crs.updateTimestamp("DATE_VAL", new Timestamp(timeStamp.getTimeInMillis())); crs.insertRow(); crs.moveToCurrentRow();
If headquarters has decided to stop stocking a particular item, it would
probably remove the row for that coffee itself. However, in
the scenario, a warehouse employee using a PDA also has the
capability of removing it. The following code fragment
finds the row where the value in the ITEM_ID
column is
12345
and deletes it from the CachedRowSet
crs
:
while (crs.next()) { if (crs.getInt("ITEM_ID") == 12345) { crs.deleteRow(); break; } }
There is a major difference between making changes to a
JdbcRowSet
object and making changes to a CachedRowSet
object. Because a JdbcRowSet
object is connected to its
data source, the methods updateRow
, insertRow
, and
deleteRow
can update both the JdbcRowSet
object and the
data source. In the case of a disconnected RowSet
object,
however, these methods update the data stored in the
CachedRowSet
object's memory but cannot affect the data
source. A disconnected RowSet
object must call the method
acceptChanges
in order to save its changes to the data
source. In the inventory scenario, back at headquarters, an
application will call the method acceptChanges
to update
the database with the new values for the column QUAN
.
crs.acceptChanges();
Like the method execute
, the method acceptChanges
does its
work invisibly. Whereas the method execute
delegates its
work to the RowSet
object's reader, the method
acceptChanges
delegates its tasks to the RowSet
object's
writer. In the background, the writer opens a connection to
the database, updates the database with the changes made to
the RowSet
object, and then closes the connection.
The difficulty is that a conflict can arise. A
conflict is a situation in which another party has updated
a value in the database that corresponds to a value that
was updated in a RowSet
object. Which value should persist in the database? What the writer does when there
is a conflict depends on how it is implemented, and there
are many possibilities. At one end of the spectrum, the
writer does not even check for conflicts and just writes
all changes to the database. This is the case with the
RIXMLProvider
implementation, which is used by a WebRowSet
object. At the other end, the writer ensures that there are
no conflicts by setting database locks that prevent others
from making changes.
The writer for the crs
object is the one provided by the
default SyncProvider
implementation, RIOptimisticProvider
.
The RIOPtimisticProvider
implementation gets its name from
the fact that it uses an optimistic concurrency model. This
model assumes that there will be few, if any, conflicts and
therefore sets no database locks. The writer checks to see
if there are any conflicts, and if there is none, it
writes the changes made to the crs
object to the database, and those changes become persistent. If there are any conflicts, the default is not
to write the new RowSet
values to the database.
In the scenario, the default behavior works very well.
Because no one at headquarters is likely to change the
value in the QUAN
column of COF_INVENTORY
, there will be no
conflicts. As a result, the values entered into the crs
object
at the warehouse will be written to the database and thus will be
persistent, which is the desired outcome.
In other situations, however, it is possible for conflicts
to exist. To accommodate these situations, the
RIOPtimisticProvider
implementation provides an option that
lets you look at the values in conflict and decide which
ones should be persistent. This option is the use of a SyncResolver
object.
When the writer has finished looking for conflicts and has
found one or more, it creates a SyncResolver
object
containing the database values that caused the conflicts.
Next, the method acceptChanges
throws a
SyncProviderException
object, which an application may
catch and use to retrieve the SyncResolver
object. The
following lines of code retrieve the SyncResolver
object
resolver
:
try { crs.acceptChanges(); } catch (SyncProviderException spe) { SyncResolver resolver = spe.getSyncResolver(); }
The object resolver
is a RowSet
object that replicates
the crs
object except that it contains only the values in the
database that caused a conflict. All other column values
are null.
With the resolver
object, you can iterate through its
rows to locate the values that are not null and are
therefore values that caused a conflict. Then you can
locate the value at the same position in the crs
object and
compare them. The following code fragment retrieves
resolver
and uses the SyncResolver
method
nextConflict
to iterate through the rows that have conflicting
values. The object resolver
gets the status of each conflicting
value, and if it is UPDATE_ROW_CONFLICT
, meaning that the
crs
was attempting an update when the conflict
occurred, the resolver
object gets the row number of that
value. Then the code moves the cursor for the crs
object to the
same row. Next, the code finds the column in that row of the
resolver
object that contains a conflicting value, which will
be a value that is not null. After retrieving the value in
that column from both the resolver
and crs
objects, you
can compare the two and decide which one you want to become
persistent. Finally, the code sets that value in both the
crs
object and the database using the method
setResolvedValue
, as shown in the following code:
try { crs.acceptChanges(); } catch (SyncProviderException spe) { SyncResolver resolver = spe.getSyncResolver(); Object crsValue; // value in crs Object resolverValue; // value in the SyncResolver object Object resolvedValue; // value to be persistent while (resolver.nextConflict()) { if (resolver.getStatus() == SyncResolver.UPDATE_ROW_CONFLICT) { int row = resolver.getRow(); crs.absolute(row); int colCount = crs.getMetaData().getColumnCount(); for (int j = 1; j <= colCount; j++) { if (resolver.getConflictValue(j) != null) { crsValue = crs.getObject(j); resolverValue = resolver.getConflictValue(j); // ... // compare crsValue and resolverValue to determine the // value to be persistent resolvedValue = crsValue; resolver.setResolvedValue(j, resolvedValue); } } } } }
Being a JavaBeans component means that a RowSet
object can
notify other components when certain things happen to it.
For example, if data in a RowSet
object changes, the RowSet
object can notify interested parties of that change. The
nice thing about this notification mechanism is that, as an
application programmer, all you have to do is add or remove
the components that will be notified.
This section covers the following topics:
A listener for a RowSet
object is a component that
implements the following methods from the RowSetListener
interface:
cursorMoved
: Defines what the listener will do, if
anything, when the cursor in the RowSet
object moves.rowChanged
: Defines what the listener will do, if
anything, when one or more column values in a row have
changed, a row has been inserted, or a row has been deleted.rowSetChanged
: Defines what the listener will do, if
anything, when the RowSet
object has been populated with
new data.
An example of a component that might want to be a listener
is a BarGraph
object that graphs the data in a RowSet
object. As the data changes, the BarGraph
object can update
itself to reflect the new data.
As an application programmer, the only thing you must do
to take advantage of the notification mechanism is to add
or remove listeners. The following line of code means that
every time the cursor for the crs
objects moves, values in
crs
are changed, or crs
as a whole gets new
data, the BarGraph
object bar
will be notified:
crs.addRowSetListener(bar);
You can also stop notifications by removing a listener, as is done in the following line of code:
crs.removeRowSetListener(bar);
Using the Coffee Break scenario, assume that
headquarters checks with the database periodically to get
the latest price list for the coffees it sells online. In
this case, the listener is the PriceList
object
priceList
at the Coffee Break web site, which must
implement the RowSetListener
methods cursorMoved
,
rowChanged
, and rowSetChanged
. The implementation of
the cursorMoved
method could be to do nothing because the position of
the cursor does not affect the priceList
object. The
implementations for the rowChanged
and rowSetChanged
methods, on the other hand, must ascertain what changes have been made
and update priceList
accordingly.
In the reference implementation, methods that cause any of
the RowSet
events automatically notify all registered
listeners. For example, any method that moves the cursor
also calls the method cursorMoved
on each of the listeners.
Similarly, the method execute
calls the method
rowSetChanged
on all listeners, and acceptChanges
calls
rowChanged
on all listeners.
The sample code CachedRowSetSample.testCachedRowSet
demonstrates how data can
be sent in smaller pieces.


Historical Background
Economic Background
Predecessor Concepts
Coding Examples (if applicable)
Math Examples (if applicable)
Performance Calculation for M
1
Time
=
IC
x
CPI
x
Clock Period
=
=
Performance Calculation for M
2
Time
=
IC
x
CPI
x
Clock Period
=
=
Comparison for M
1
vs. M
2
Compare!


Let's get started.
There is currently nothing in this project.
What do you want to make?
You can also start by importing items to this project.
Project Members
- Aimee Smith
- (Project Owner)
Project Checklist
- Create at least one Asset
- Add Data Models
- Add Services
- Validate
- Publish
Activity
Vestibulum id ligula porta felis euismod semper eget lacinia odio. Etiam porta sem alesuda magna mollis euismod. A description list is perfrct for defining terms.


Replace any email/name with the value of your choice.
Click on clear to cancel.
When you're finished, click on the 'export' tab above, or on the button at the bottom-right of the
screen
Click on a field to start editing. Click on replay to reset a commit
to
its original state.
When you're finished, click on the 'export' tab above, or on the button at the bottom-right of the
screen
| SHA | Name | Date | Time | Commit message | ||
|---|---|---|---|---|---|---|
| replay | [[ commit.sha.substring(0, 7) ]] |
|
|
|
|


NIMS is a scientific data management system, specifically designed for neuroimaging data. It is implemented in Python, based on TurboGears. NIMS is open-source software, released under the MIT license (see below for details).
NIMS is under active development at the Center for Cognitive and Neurobiological Imaging (CNI), Stanford University. We have a very nice demo video, courtesy of Michael Perry.
Copyright (c) 2012 Robert Dougherty
Copyright (c) 2012 Gunnar Schaefer
Copyright (c) 2012 Reno Bowen
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


{% extends "home/header.html" %} {% block content %} {% load staticfiles %}
We are shipping ENVI control systems in Late 2017. Join the email list to stay updated.


This developer API is aimed at providing access to well-formed transit data for the Madison Metro service.
There are no guarantees that this data is accurate or even available. But I'll do the best I can to make it so.
New Changes! The API was recently moved to a new domain. It is no longer found at www.smsmybus.com. The base URI for all API endpoints is now api.smsmybus.com/v1. Please update your applications to reflect this change. The old endpoints will go away in the coming months.
API Resources : In addition to this documention, you may find the following resources helpful:
Currently, the Metro doesn't make their transit data available in an easy to use form for developers. But I
started to mirror the real-time schedule to build the original SMS interface.
Making this data available to other developers is the logical next step.
The Bus Tracker API is a web service that uses HTTP/1.1 as its application protocol. Each type of call/request
to the API is an HTTP GET call to a unique URL. Parameters are encoded in the HTTP GET request by following the
URL with a �?� and �argument=value� pairs separated by �&�.
The response is a JSON document with a Content-Type of �text/javascript�.
For example, to request the current system time through the developer API, a program or script will make a
HTTP/1.1 GET request to the following URL with parameters:
The api.smsmybus.com is the host on which the Developer API is servicing HTTP requests. The service is running
on port 80.
The version of the API that is being accessed is built into the URL. In the above example, �v1� represents
version 1.0 of the API.
The �key� parameter represents the API key assigned to the developer making the request. All requests to the
API must be accompanied by a valid API key.
What kind of information is available via the API?
In general terms, the API provides access to schedule data, location information (for buses and stops), and
system notifications. Note that these feeds will be rolling out in stages with the early focus being on schedule
and location information. You can browse all of the interfaces using the menu at the top of the page.
What should I do with all of this great data?
The sky is the limit! Build a great Android app or build a new browser interface that plots the buses on a map,
or find a way to give Madison visitors stop-by-stop Metro directions, or...?
How do I get started?
The first step is to register for a developer key. You'll need to use this key when you make calls to the API.
Just send me an email describing your application at<EMAIL_ADDRESS>Also,
follow us on Twitter at smsmybus to stay on top of news and updates on the
service.


The file PJWdwState.pas
includes two components -
TPJWdwState and TPJRegWdwState.
The components can save the state (minimised, maximised or normal) of a form window, along with its size and position. TPJWdwState saves the information to an ini file while TPJRegWdwState saves to the registry. The components can also read information back and restore the saved window settings. This means the components can be used to restore a window to the condition it was in during some previous execution. This is acheived either by calling a couple of methods within code or setting the component to automatically save and restore the window on creation and destruction.
With TPJWdwState you can specify the name of the ini file, or let the component choose one. You can also decide the name of the section within the ini file that will be used. Again the component can provide a suitable default section name.
Similarly with TPJRegWdwState you can specify the registry root and sub-keys under which the information is saved. Again suitable default values are used if no keys are specified.
Also included in the PJWdwState.pas
unit is the component
TPJCustomWdwState along with a helper component. Neither of these
components should be constructed directly and they are not registered with
Delphi.
The zip file that contains PJWdwState.pas
also contains an
optional property editor in PJHKeyPropEdit.pas
(TPJHKEYPropEditor) for editing the registry root key property of
TPJRegWindowState.
The components and property editor have been tested with Delphi 4, 6 and 7. It is likely that they will work with Delphi 3 and 5, but this has not been tested. They are not compatible with Delphi 1 and 2.
In these instructions $(DELPHI)
is to be taken
to represent the path where the appropriate version of Delphi was installed.
For example, if you have Delphi 4 installed on the default installation path
then $(DELPHI)
is equivalent to
C:\Program Files\Borland\Delphi4
.
To install, proceed as follows:
.zip
file containing the components into a
folder, preserving the directory structure.PJWdwState.pas
and PJWdwState.dcr
to the
folder from where you wish to install the component into the Delphi
Component Palette. This will probably be a sub-folder of the
$(DELPHI)\lib
folder.PJHKEYPropEdit.pas
then copy this file to the same
folder as PJWdwState.pas
.PJWdwState.pas
and select the file.PJHKEYPropEdit.pas
.PJWdwState.pas
(and
PJHKEYPropEdit.pas
if installed) from the place where you
copied them if you wish. The components will appear on a palette called
DelphiDabbler. You can move the components to a different
palette as required.PJWdwState.hlp
to whichever folder you wish to
install it to.DelphiX.ohl
(in
$(DELPHI)\Help
), adding the line
:Link PJWdwState.hlp
to the end of the
section labelled "Third party help".DelphiX.ohi
(in
$(DELPHI)\Help
), adding the line
:Index DelphiDabbler Window State
Components=PJWdwState.hlp
towards the end of the
index section.DelphiX.cnt
(in
$(DELPHI)\Help
), ensuring that the lines
:Include delphiX.ohi
and :Include
delphiX.ohl
appear somewhere in the file.D7.ohl
(in
$(DELPHI)\Help
), adding the line
:Link PJWdwState.hlp
to the end of the
section labelled "Third party help".D7.ohi
(in
$(DELPHI)\Help
), adding the line
:Index DelphiDabbler Window State
Components=PJWdwState.hlp
towards the end of the
index section.D7.cnt
(in
$(DELPHI)\Help
), ensuring that the lines
:Include d7.ohi
and
:Include d7.ohl
appear somewhere in the
file.HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Help
and add a new string value named
PJWdwState.hlp
whose value is the path
where you copied the help file (probably
($DELPHI)\Help
).Release 4.2 of 30 October 2003
PJWdwState v4.1 of 30 October 2003
PJHKeyPropEdit v1.0.2 of 30 October 2003
Release 4.1 of 07 August 2002
PJWdwState v4.1 of 07 August 2002
PJHKeyPropEdit v1.0.1 of 08 October 2000
Release 4.0 of 17 March 2002
PJWdwState v4.0 of 17 March 2002
PJHKeyPropEdit v1.0.1 of 08 October 2000
Release 3.1.1 of 08 October 2000
WdwState v3.1 of 29 April 2000
PJHKeyPropEdit v1.0.1 of 08 October 2000
Release 3.1 of 29 April 2000
WdwState v3.1 of 29 April 2000
Release 3.0 of 05 April 2000
WdwState v3.0 of 05 April 2000
Release 2.1 of 29 November 1999
WdwState v2.1 of 29 November 1999
ReadState
was masking a method inherited from TComponent.Release 2.0 of 19 October 1999
WdwState v2.0 of 19 October 1999
Release 1.0 of 15 August 1999
WdwState v1.0 of 15 August 1999
These components are copyright © P.D.Johnson, 1999-2003.
The source code and help files can be freely distributed on a not-for-profit basis providing that:
By not-for-profit I mean that you may recover out of pocket expenses incurred in distributing the code, but should not make a profit from this.
If you discover any bugs in this implementation, or if you have any update suggestions, please contact me via my website.
Please do modify the code for you own use. I'd like to see any changes you make - I could incorporate them into future versions. Please notify me of changes on at the above e-mail address.
This software is provided as is - no warranty is given as to its suitability for any purposes to which you may wish to put it.
I'm Peter Johnson - a hobbyist programmer living in Ceredigion in West Wales, UK. I write mainly in Delphi. My programs are available for download on my web-site: http://www.delphidabbler.com/.
I can be contacted via the website.


NSE Stock Price Predictor
It is being designed for stock price prediction of NSE-listed companies. Historical data of the stock is derived, as the user inputs, the name of the stock, the model gives the prediction using the algorithm. Currently giving
an accuracy of 62-65%.


Toy Story 2 (1999) Reviewed by Eugene Novikov http://www.ultimate-movie.com Member: Online Film Critics Society
Featuring the voice talents of Tom Hanks, Tim Allen, Joan Cusack, Kelsey Grammer, Wayne Knight. Rated G.
Toy Story 2 is the family film to end all family films (sans The Lion King, which is untouchable). It's a profound masterpiece of wit and truth that should exhilirate kids and non-snobbish adults (read: those who don't mind being touched by messages a ten-year-old can grasp) alike. It's wholesome entertainment, alright -- the best example of it in years -- but it doesn't take the form of a preachy diatribe like so many "lesson movies" have over the years, instead, the filmmakers devote their efforts to giving us a rollicking good time. We got it.
Produced by the enormously successful Pixar Disney division, this is the sequel (duh) to the (almost) equally terrific 1995 hit Toy Story. While the two certainly have some plot similarities, I was impressed at just how different this was; like the best sequels, it expands on the concept of the original rather than merely retreading it. It involves a rescue mission, just like the first one, but this time, we go to Infinity and Beyond. You see, Woody (voice of Tom Hanks has been stolen by "Big Al" (Wayne Knight) because apparently, Woody is a valuable doll. In fact a long time ago, Woody even had his own tv show, he just didn't know it. Now, he and three companion toys are to be sent away for display in a museum.
It's up to Buzz Lightyear and his pals to rescue Woody from Big Al's materialistic grasp, and for that, they must journey 19 blocks (!) and seek out "Big Al's Toy Barn," a Toys R' Us-ish plaything megastore. This leads to a genius scene in the toy store itself, with a Buzz impostor, a Barbie tourguide and, of course, a Darth Vader-style supervillain. It's not long before they realize that the place where woody is hidden is actually across the street in Big Al's office and go there -- only to be followed by Buzz Lightyear's arch nemesis.
Meanwhile, Woody faces a spectacularly profound moral dilemma: should he stay with his new friends and go to the museum, where he will probably be marveled at forever or should he try to go back to Andy who, in all likelyhood, will get over his affection for him and throw him away before long? This has more substance than most "adult" movies can even hope for -- certainly more thoughtful and complex than some of this year's "deep" movies, like Fight Club or The Insider -- and it is developed beautifully, not letting a single opportunity go to waste. Gracefully, it speaks to children about faith, loyalty, decision making, abandonment and more in one fell swoop. It talks to them on their level, without condescending, simplifying or spelling anything out; it respects their intelligence and ours. Ergo, adults can appreciate it even more than their kids.
Pixar's computer animation, though it has lost some of its novelty since the breakthrough of the original Toy Story, is still rapidly developing, and Toy Story 2 takes it to new heights. After Antz and A Bug's Life took the computer graphics so close to reality that we thought it couldn't get any richer, this new flick takes it yet another step further. The characters are so real that they're surreal, as if we're in a parallel universe rather than a cartoon. It's a marvelous experience, akin to being given a peek of a new world we've never seen before and may never see again.
Besides being profound, Toy Story 2 is exceptionally witty, with adult- oriented jabs at Star Wars, Barbie, tv remote controls, et al. It's a nice reversal from 1999's earlier Disney animated feature Tarzan, which had almost nothing to engage adults. This recalls the wonderful Hercules, which threw more mature gags at the audience (the "Grecian Express" credit card?) fast enough to make my head spin.
Is "masterpiece" too strong a word for Toy Story 2? Is it appropriate to use that moniker for a family movie? My answers are no and yes. See the movie and come up with your own but don't dismiss it because it's a cartoon.
Grade: A
©1999 Eugene Novikov
Sent via Deja.com http://www.deja.com/ Before you buy.
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


I have examined the scale dependence of precipitation errors averaged over the entire U.S. in PIRCS-Ib. The finest grid point spacing is 0.5x0.5 degrees. Coarser grid point spacing is emulated by averaging precipitation over all grid points within lat-lon squares. For example, by averaging over a square having edge-length equal to two gridpoints on each side (total of four grid points in average) I produced 1x1 degree spacing, averaging over all grid points in a square having three grid points on each side (9 total, 8 perimeter and 1 interior) gives 3x3 degree spacing, etc. Precipitation is accumulated over the two month period 1993 June-July.
Accuracy of the forecast field is determined by mean square error (MSE). Murphy and Winkler (1987, Monthly Weather Review) and Murphy (1995, Weather and Forecasting) show that MSE can be decomposed into three terms. The terms measure mean error, amplitude error, and position error. Mean error refers to an error applied uniformly across the field. Amplitude errors are those of the relative hi and low values within the domain (imagine the field as deviations from the domain mean). Position (or phase) error is the extent to which the contours of the fields are colocated.
I computed the composite MSE (12 models) by averaging each MSE term over the 12 models and then summing the average of the MSE terms. In the image above, I plotted the composite MSE and contribution by the average of each term for various scale categories (denoted as LONxLAT). The finest grid spacing produced 115 longitude x 48 latitude grid points (each box has 0.5 lon x 0.5 lat edges); the coarsest produced 2 longitude x 1 latitude grid points (each box has 28.5 lon x 12 lat). Notice that the area of the scale categories does not increase linearly, so that a linear appearance in the bar graph should not be interpreted as a linear trend with respect to scale.
When averaged over the entire U.S. the dominant source of error is position error. That is, correctly predicting the climatological position of storms is the most important factor in mesoscale error reduction for this experiment. As we would expect, position error decreases with increasing scale. However, appreciable reduction does not occur until precipitation has been averaged onto grid points spaced 3 lon x 3 lat. That suggests position errors less than this threshold might be considered random (I think). Notice that the term for ME changes slightly. If the domain included no missing values, then this term would be constant.
It should be noted that the Mean Error varies greatly from model to model, as illustrated below. While the tendency of the models considered as a group is to misrepresent the climatological position of precipitation, individual models might have error characteristics influenced more by bias or amplitude errors. For example, PROMES and UQAM contain greater bias, while the two RSMs contain little bias.
Changes in error characteristics by region are examined here.


Implicit rows allow us to declare the size of an implicitly created grid row.
To create implicit rows we need this grid-auto-rows method.
grid-auto-rows is useful when we don't know how many rows our grid will contain.
We can even define just this instructions if we don't know how many rows we need.


My name is Rachel Ayateke, I am 18 years old Rwandese. I love learning new thigs about all kinds of subjects. I love listening to podcasts, reading articles about different topics and writing poetry.
I discovered coding when I was 14, ad from that moment I fell in love with it.
I am still young and I know I have alot to learn especially regarding coding but on this page I am sharing the few things I have learnt so far.
I am a high school graduate. I attended Saint Ignatius High school and I intend to college by end of this year.
Here is just one poem to give you an idea of what I can do.
Her
Blue sneakers and white dress,
An angel, may God bless,
The day I laid my eyes on her.
Big smile and an empty stare,
One look and she left me bare.
The day I talked to her.
Soft hands and dry lips,
It was in the way she moved her hips,
The day I saw her dance.
Scar on her leg,
All I could do was beg,
The day she left me for dead.