Summary after Four Months with Ada¶
For the last four months I’ve been learning and writing Ada 2012. I wanted to share my experiences with the language for those who aren’t familiar with it. I’m neither endorsing or denouncing Ada. For those unfamiliar with Ada terms, I’ll using the vernacular common to C family languages. This will make Ada programmers cringe, but will be much more clear to the general reader.
When I refer to “Ada” here, I’m referring to Ada 2012 and the SPARK 2014 language, which is a subset of Ada 2012 used for formal verification.
Why?¶
Ada’s an obscure language. It’s been around for decades and strong opinions about it existed in the past, but overall it seems forgotten outside its niche. When I mention I made things in it, I’ve gotten baffled responses of “That language is still around?” Another comment was, “I’ve never heard of anyone else ever working, or having working in Ada.”
I’ve written code in a variety of languages, but Ada by far is the most bizarre and strangely familiar one at the same time. My intent was to mess around with it for a few weekends and move on, but it wasn’t the “dead language” I expected. There’s been a lot of modernization in the last couple of years, which makes it a surprisingly modern language to work in.
Resources¶
These are listed in order of what I used:
-
A good tutorial site. It’s enough to get you started.
John Barnes “Programming in Ada 2012”
Barnes works on several major Ada references, and this book walks through the language. At over 700 pages, it took me abotu a month to get through.
This seems to be a common way Ada programmers get onboarded, and Ada programmers stay updated.
-
This is exceptionally good and very complete.
-
A site with way more resources than I list here.
-
Authoritative reference about how Ada should work.
Building High Integrity Applications with SPARK
It’s ok, the first third of the book is an Ada crash couse before it gets into SPARK.
Projects¶
During this timeframe I made a few projects:
Septum - context-based source code search
dir_iterators - library similar to the incredible walkdir
project_indicators - library for spinners and progress bars
trendy_terminal - library for cross-platform terminal setup
trendy_test - library for simple unit testing
Ada Ray Tracer - a port of Ray Tracing in One Weekend)
dirs_to_graphviz : Make graphviz files from directory trees
Ecosystem¶
Alire¶
Alire simplifies Ada development significantly, by simplifying project generation, building, running, and dependency management.
It borrows heavily from Cargo, and if “good artists borrow, great artists steal,” then Ada is on par with Michaelangelo. In its quest for modernizing, many concepts of Rust’s cargo are being built into this tool.
alr build
alr run
alr edit
Before Alire, I had a a lot of confusion about “How do I use ______ project as a dependency?” and with Alire it’s one command line and go.
# Add dir_iterators library
alr with dir_iterators
This tool only went to 1.0 since I’ve been working with Ada and it simplifies development considerably. Alire interfaces with the pre-existing tool grpbuild, which is a common interface into the GNAT ecosystem and tools. Since it wraps it, you can do additional configuration past the initial setup, and it works well with GNAT Studio, one of the major editors. You can also set the config to run any other editor command with environment variables setup, such as Visual Studio Code:
alr config --set editor.cmd "code ."
Toolchains are integrated into Alire as of the 1.1 release candidate, so it’s becoming a one-stop shop for what you need.
However, there’s a few hoops to jump through to get a crate into the manager. For now, every package and version update requires manual approval. This is supposed to prevent name squatting and ensures existing libraries can get their appropriate names. It still can be frustrating waiting for approval, though things usually get approved within a day or so. You can use local versions as a dependency, which helps when developing libraries, and keeps you moving if you’re waiting that day for approval.
Overall, Alire is a fantastic tool which makes working with Ada easy and I wouldn’t recommend learning Ada without it.
GNAT¶
The major Ada ecosystem is GNAT. Yes, there supposedly are commercially supported compilers and AdaCore offers paid support, but the Free Software Foundation (FSF) offers a Ada front-end to GCC. This is usually referred to as “FSF GNAT”.
Can I use Ada for free? Yes, if you can use GCC for your project, you can use Ada.
You can grab the FSF GNAT toolchain with Alire 1.1 and alr toolchain --select gnat_native
.
The entire ecosystem is designed around running tools from the command line, which allows editors and CI to use the same actions for behaviors. For example, GNAT Studio just wraps many of the GNAT tools and it shows you the command line for the actions you want to use. This acts as training wheels if you want to get started quickly and then transition to using another editor, especially a terminal one like Emacs or Vim.
There’s a lot of parts to GNAT, which is a super deep dive I’m not interested in doing here.
To give an idea, there’s a formatter (gnatpp
) and a document generator (gnatdoc
).
There is also an LLVM frontend for Ada in progress. It’d be exciting to see this integrated as a toolchain you can download with Alire.
Editors¶
If you believe reddit, editor usage is split roughly in thirds between GNAT Studio and Visual Studio Code, with Emacs/Vim balanced in the remaining third.
The big editor is GNAT Studio, which used to be known as “GPS”, and supports Ada, C and C++. It comes bundled with GNAT Community Edition, but you can build and run it separately as well. There’s some quirky behavior, like tab indenting to where it thinks the indent should be and not actually inserting a tab, and some obscure keyboard shortcuts, but otherwise is a mature IDE experience. You can make and export your own keybindings, which I’ve done for Visual Studio which I should probably contribute back at some point.
There’s also support for Visual Studio code, which relies on the Ada Language Server.
A coordinated set of Vim plugins is available for those who want to go that route.
I had been primarily using GNAT Studio and then moved over to Visual Studio code, you can get a good editing experience with either one of these.
I’m not an Emacs user, so I’m not familiar with how folks work in that environment.
Cross-Platform Behavior¶
Alire hooks into GPRbuild’s external variable system for cross-platform behavior. In general, I haven’t had to mess with GPR configurations too much since Alire wraps it well and provides good defaults on project creation.
This is the Alire side, describing the external values to set for gprbuild to do the “right thing.”
Just like in cargo, we have a .toml
describing the build.
# alire.toml
# Platform selection by Alire on download.
[gpr-set-externals.'case(os)']
windows = { Trendy_Terminal_Platform = "windows" }
linux = { Trendy_Terminal_Platform = "linux" }
macos = { Trendy_Terminal_Platform = "macos" }
On the GPR side, we select the source we want to use, since Ada doesn’t have a common preprocessor. GNAT has a preprocessor but it seems frowned upon to use it.
-- my_project.gpr
type Platform_Type is ("windows", "linux", "macos");
Platform : Platform_Type := external ("Trendy_Terminal_Platform");
case Platform is
when "windows" => Trendy_Terminal_Sources := Trendy_Terminal_Sources & "src/windows";
when "linux" => Trendy_Terminal_Sources := Trendy_Terminal_Sources & "src/linux";
when "macos" => Trendy_Terminal_Sources := Trendy_Terminal_Sources & "src/mac";
end case;
Community¶
The online Ada community is exceptionally small. Online counts in r/ada hover in the mid twenties, compared to Rust’s ~900, and seem to peak in the 50s.
Despite the size, the community is extremely knowledgeable and there’s a lot of folks with decades of Ada experience chomping at the bit to answer questions. This means Reddit and Stack Overflow answers regularly include the applicable language rule’s section and paragraph from the Ada Reference Manual.
An interesting aside is that if Github locations are to be believed, the Ada community is predominantly European. This correlates with what I’ve seen, since I’m in the US Eastern time zone, people online tend to be very active in the morning.
AdaCore and Ada Modernization¶
AdaCore didn’t invent Ada, so they’re not a direct comparison to Mozilla with Rust, but they did help develop GNAT originally, and continue to contribute back. I’m sure there’s other companies promoting Ada, but they seem to be the most visible.
It looks like there was a huge burst of activity after the release of Ada 2012, including a lot of quite-detailed YouTube videos and marketing.
The second wave promoting Ada now seems to be getting better traction and community involvement. AdaCore open-sourced a lot of libraries and have been the primary group I’ve seen promoting the language. The movement they’re pushing seems to be the right direction: building an LLVM front-end to the language, a language server, open-sourcing a lot of libraries, creating learning resources and improving IDE support.
The modernization push is intense. There is a marked improvement working in the language even in the short time span I’ve seen. It’s gone from “a quirky and sometimes clunky car” to feeling “modern.”
A Free-Function Focused C++, or a Strongly Typed C¶
Ada focuses on creating packages of code which contain types and functions.
There’s no preprocessor, so instead of #include
, you with
packages which contain what you need.
with RT.Vecs; -- depend on another package, RT.Vecs
package RT.Rays is
use RT.Vecs; -- use the names inside RT.Vecs
type Ray is record
Origin : Point3;
Direction : Vec3;
end record;
function Point_At(R : Ray; T: F32) return Point3;
end RT.Rays;
Packages are namespaces for functions and types, unlike other languages where types can “contain” functions and types. Function overloading acts as a key design element, made clear by the lack of implicit casts.
-- Idiomatic versions of "ToString"
function Image(S : Some_Type) return String;
function Image(A : Another_Type) return String;
Everything in a package is related, there’s no syntactical split between “free function”, “class function”, or “member function” (method).
package RT.Vecs is
type Vec3 is record
X, Y, Z : F32 := 0.0;
end record;
function Length (V : Vec3) return F32;
-- Is this a free function, a class function or a member function (method)?
-- It doesn't really matter, because it's declared the same.
function Dot (A, B : Vec3) return F32;
end RT.Vecs
Functions get declared similarly, with parameter type and ordering describing the difference between C++’s “free functions” vs instance functions. A class type as a leading parameter determines if one would be considered a member function (“methods”). There’s a concept called “primitive operations” which describe bringing in operations of a parent type (even primitive, like Integer) where this matters.
package SP.Filters is
-- An empty "abstract class"
type Filter is abstract tagged null record;
-- A "pure virtual method"
function Matches_Line (F : Filter; Str : String) return Boolean is abstract;
-- Accepts any derived class of Filter
function Matches_File (F : Filter'Class; Lines : String_Vectors.Vector) return Boolean;
-- A "subclass"
type Case_Sensitive_Match_Filter is new Filter with record
Text : Unbounded_String;
end record;
-- An overridden method of a base class.
overriding function Matches_Line (F : Case_Sensitive_Match_Filter; Str : String) return Boolean;
-- "Free-function" which is just part of the package.
function Is_Quoted (S : String) return Boolean;
end SP.Filters
Packages are split between a “specification” (.ads file) and a “body” (.adb file), akin to the “header” and “source” files you encounter in C/C++, though this distinction is understood at the language level. Since physical design matters in ways similar to C and C++, some physical design techniques in Lakos’ Large-Scale C++ Software Design book actually work.
package body RT.Rays is
-- Use all the operators of Vec3
use all type RT.Vecs.Vec3;
function Point_At(R : Ray; T: F32) return Point3 is (R.Origin + T * R.Direction);
end RT.Rays;
Packages can contain startup code executed by the “environment task” prior to entering the main procedure for initialization. Unlike C++, there are language pragmas you can use to control order of initialization of these elements.
package body RT.Debug is
begin
Ada.Text_IO.Put_Line("Executed before the program enters the main function!");
end RT.Debug;
SPARK¶
SPARK is a subset of Ada I glazed over earlier.
It’s a language for formal verification which you can intermingle with Ada code.
Think of it as sort of like extern C
in C++, or unsafe
in Rust, except it marks code as undergoing verification.
Since it’s a subset of Ada, in addition to verification, you get all the rest of the Ada tooling here, like Alire.
Yes, there are SPARK formally verified crates in Alire, such as a formally verified implementation of NaCl.
Focus on Intent¶
Parameter Modes¶
Ada source focuses on describing intent and modeling semantics.
I misled you earlier for expediency. What most C-family languages call “functions”, Ada calls “subprograms”. Ada distinguishes between those which return a value and are truly “functions” and those which do not return a value, and are “procedures.”
For example, subprogram parameters can be either in
, out
, or both.
in
parameters are readonly, and while you can force passing by reference via specifics in the language, you often just ignore how this happens.
Parameters are implicitly in
, so you can omit that if you want.
This is common in SPARK code because out
parameters are forbidden.
-- Receives and modifies a parameter.
procedure Clear_Filters (Srch : in out Search);
-- Like a "const" member function in C++, which can't modify its argument
-- Could also be declared like this:
-- function Num_Files (Srch : Search) return Natural;
function Num_Files (Srch : in Search) return Natural;
Derived Types¶
Describing semantics goes all the way into primitive types, and the rules are consistent between primitive and user-defined types.
Creating lightweight types with domain-specific meaning, prevents mishandling of semantics on primitive types due to no implicit casting.
Interfaces rarely use Integer
or Float
directly, instead you’ll find semantic versions (“derived types”) created such as “Meters” or “Kilometers”.
type Seconds is new Natural;
type Milliseconds is new Natural;
S : Seconds := 10;
M : Milliseconds := 50;
M := S; -- Compile error!
M := Milliseconds (1000 * S); -- Allowed because I told compiler it's ok
Function overloading checks parameters as well as return types, so creating functions and transforms of types is straightforward.
procedure Update (S : Seconds);
procedure Update (M : Milliseconds);
function Delta_Time return Seconds;
function Delta_Time return Milliseconds;
Compile and runtime checks provide bounds-checking and numerical types can have their bounds constrained to “known good” values.
-- Let's write this with our own defined range, only allowing less than 60 seconds.
type Seconds is new Integer range 0 .. 59;
You can also access the ranges of types with the 'First
and 'Last
attributes (read as “tick first” and “tick last”).
pragma Assert(Seconds'First = 0);
pragma Assert(Seconds'Last = 59);
Enumeration Types¶
Enumeration types have first class support, with many automatically generated attributes.
'First
and 'Last
get the bounds of the values and 'Pred
(predecessor) and 'Succ
move between individual values.
Iteration over all values and conversions to and from strings and integers gets provided for free.
Together, these attributes and iteration capability allow writing of generic code which operates on discrete types like integers, or enumerations.
with Ada.Unchecked_Conversion;
type Filter_Action is (Keep, Exclude);
-- Specify internal values for the enumeration (optional).
for Filter_Action use (
Keep => 2,
Exclude => 3
);
-- Allow conversion to get the values out
function Repr is new Ada.Unchecked_Conversion(Filter_Action, Integer);
procedure Print_Actions is
begin
-- Which order are they in?
pragma Assert(Keep = Filter_Action'Val(0));
pragma Assert(Exclude = Filter_Action'Val(1));
pragma Assert(0 = Filter_Action'Pos(Keep));
pragma Assert(1 = Filter_Action'Pos(Exclude));
-- Comparison operators
pragma Assert(Keep /= Exclude); -- /= is Ada's not equal (i.e. !=)
pragma Assert(Keep < Exclude);
pragma Assert(Filter_Action'First = Keep);
pragma Assert(Filter_Action'Last = Exclude);
pragma Assert(Filter_Action'Succ(Keep) = Exclude);
pragma Assert(Filter_Action'Pred(Exclude) = Keep);
-- Parsing from string
pragma Assert(Filter_Action'Value("KEEP") = Keep);
pragma Assert(Filter_Action'Value("Exclude") = Exclude);
-- Getting underlying representation
pragma Assert(2 = Repr(Keep));
pragma Assert(3 = Repr(Exclude));
for Action in Filter_Action loop
Ada.Text_IO.Put_Line(Action'Image); -- Prints KEEP and then EXCLUDE
end loop;
end Print_Actions;
Since arrays operate using a discrete type as an index, enumerations can be used as the type to index into an array.
type Test_Status is (Passed, Failed, Skipped);
type Test_Report is array (Test_Status) of Natural;
procedure Foo is
Report : Test_Report;
begin
-- ...
-- Increment number of passed tests.
Report(Passed) := Report(Passed) + 1;
-- ...
Pre- and Post-Conditions¶
Ada 2012 adds built-in support for pre and post conditions, through the use of “aspects.” This is a “killer feature” of Ada 2012, on top of all of the other type checking and safety checking. Though used in SPARK analyses, you can also write them in plain Ada 2012 code and as part of specification of the function. Clients can see it as part of the interface and the compiler inserts these runtime checks if enabled. A lot of languages have an assertion mechanism which often effectively gets used for these checks, but it’s nice to have a client-visible built-in way of doing this I’ve also found that adding pre and post condition checks during debugging to be a very effective tool.
function Merge (A, B : Context_Match) return Context_Match with
Pre => Is_Valid (A) and then Is_Valid (B),
Post => Is_Valid (Merge'Result);
Types which expose no private state can also have type invariants which are checked prior to usage as function arguments and after assignments.
type Spinner is record
Ticks_Per_Move : Positive;
Ticks : Natural;
State : Spinner_State;
Style : Spinner_Style;
end record with
Type_Invariant => Ticks < Ticks_Per_Move;
Protected Objects¶
Protected objects coordinate concurrent access to shared state. The control can also include arbitrarily complex conditionals as well, such as not allowing any writers when readers exist, or blocking any more readers when a writer is waiting.
protected body Concurrent_Context_Results is
-- Calling Get_Results will wait for Pending_Results to equal 0.
entry Get_Results (Out_Results : out SP.Contexts.Context_Vectors.Vector)
when Pending_Results = 0 is
begin
Out_Results := Results;
end Get_Results;
procedure Wait_For (Num_Results : Natural) is
begin
Pending_Results := Num_Results;
end Wait_For;
procedure Add_Result (More : SP.Contexts.Context_Vectors.Vector) is
begin
Results.Append (More);
Pending_Results := Pending_Results - 1;
end Add_Result;
end Concurrent_Context_Results;
Tasks¶
Tasks provide concurrent execution. Additionally, they have special procedures called “entries” which can be “accepted” by a related task during its flow of execution to synchronize (rendezvous) with other tasks and share data at these points.
Tasks run concurrently in the block in which they’re declared, and the block will not exit until the task finishes or terminates, unless it is allocated on the heap.
Both single instance and instantiable versions of protected objects and tasks can be created.
task type File_Loader_Task is
entry Wake;
end File_Loader_Task;
task body File_Loader_Task is
Elem : Ada.Strings.Unbounded.Unbounded_String;
begin
-- Concurrent execution starts here when the task is created.
-- Don't proceed until the "Wake" Entry has been called.
select
accept Wake;
or
-- If Wake was never received the program can terminate
-- this task if needed to exit the block.
terminate;
end select;
loop
select
-- Blocking dequeue
File_Queue.Dequeue (Elem);
or
-- Timeout: we waited 1 second, and nothing else to process
-- was on the queue, so quit this task.
delay 1.0;
exit;
end select;
if Is_Text (Elem) then
Cache_File (File_Cache, Elem);
end if;
-- "Progress" is an (unshown) declared variable in the same scope
-- as the task, so the task has access to it.
Progress.Finish_Work (1);
end loop;
end File_Loader_Task;
Generics¶
Ada generics are similar to ML signatures, and may contain types, functions and even other packages as parameters. Generic packages or functions must be explicitly instantiated for use. This eliminates the debate of angled brackes (<>) versus square brackets for generics ([]), but leads to additional names being created. This makes their usage and their cost explicit, at the expense of verboseness.
-- Instantiate a generic package which contains an
-- Ada equivalent to std::vector<std::string>
package String_Vectors is new Ada.Containers.Vectors(
Index_Type => Positive,
Element_Type => Ada.Strings.Unbounded.Unbounded_String,
"=" => Ada.Strings.Unbounded."=");
-- Since String_Vectors is a package, Vector is the actual vector type.
-- There are more related types in the instantiated package.
function Shell_Split (S : Ada.Strings.Unbounded.Unbounded_String) return String_Vectors.Vector;
Low Level Control¶
Accessing C functions and compiler intrinsics is straightforward.
You create a declaration of the subprogram and then describe where it comes from using aspects or the Import
pragma.
with Interfaces.C;
type FD is new Interfaces.C.int;
function isatty (File_Descriptor : FD) return BOOL
with Import => True,
Convention => C;
-- Bring in the stdout file pointer from C
type FILE_Ptr is new System.Address;
stdout : aliased FILE_Ptr;
pragma Import (C, stdout, "stdout");
Since the usage is the same as with an Ada function, imported functions can be replaced with actual Ada code if needed. Inline assembler is also available, but due to the lack of a preprocessor, the build system (gpr) is leveraged to choose the appropriate definition (body) file to compile.
function File_Line return Natural;
pragma Import (Intrinsic, File_Line, "__builtin_LINE");
Representation clauses allow you to match struct layout or binary formats such as for files.
type Bitmap_File_Header is record
Identifier : Integer_16;
File_Size_Bytes : Integer_32;
Reserved : Integer_16 := 0;
Reserved2 : Integer_16 := 0;
Offset : Integer_32;
end record with
Size => Byte * 14;
for Bitmap_File_Header use record
Identifier at 0 range 0 .. 15;
File_Size_Bytes at 2 range 0 .. 31;
Reserved at 6 range 0 .. 15;
Reserved2 at 8 range 0 .. 15;
Offset at 10 range 0 .. 31;
end record;
Vocabulary¶
Ada suffers from a lack of familiarity for many programmers due to being a Pascal family language and also its peculiar, but very specific vocabulary. However, the usage of keywords over punctuation helps ease many problems of dealing with an unfamiliar language. While this helps with googling and a lot of terms appear in code, many are specific to, or have Ada-specific definitions. Examples are “accesses” (sort of like pointers), “accesibility” (similar to a scope for borrowing), “tagged types” (classes), “derived types” (unrelated to OOP), and “subprogram”.
Verboseness¶
The language has a mind of its own as well. As one online quote says,
When I find myself fighting the [Ada] language, it usually means that I need to revisit my design.
I’ve found this to be true overall. Ada makes some easy things verbose and some verbose things easy. When things go from “verbose” to “writing like a Charles Dickens novels”, that’s when I rethink my approach to the problem. There’s usually a significantly better and shorted way to accomplish the task.
Was it worth it?¶
If I were never to write Ada again, I still learned a lot about program correctness. Correctness isn’t usually a fun language feature to talk about and no one likes to admit they write bugs. Ada excels at modeling your program in the language while automating a lot of error checking. For example, you may know you’re not going to use the full range of an integer, and Ada enables specification and automatic checking of valid values. Combined with built-in pre and post conditions, this has helped me improve the way I think while programming.


acme.sh is the best shell script I've ever used. It makes interacting with the LetsEncrypt API trivial.
Once you get it set up, it's more or less completely hands off. Your TLS certificates will be renewed automatically once every 60 days.
In this case, since I am using it with HAProxy, my configuration is a bit more complicated.
{% raw %}
/root/.acme.sh/acme.sh --accountemail {{ admin_email }}
--issue --standalone --httpport {{ acme_nc_port }}
-d {{ ' -d '.join(tls_hostnames) }}
--key-file {{ key }}
--fullchain-file {{ fullchain }}
--reloadcmd 'umask 027 && cat {{ fullchain }} {{ key }} >{{ combined }} && chown root:haproxy {{ combined }} && service haproxy restart'
{% endraw %}
It's running in standalone mode, which means it will use its own webserver (netcat) to listen for replies. I've got HAProxy in front of it, directing traffic from public port 80 to the localhost listener.
Jinja2 dynamically compiles a list of names for the SAN certificate.
The reloadcmd directive tells it what actions to perform when a certificate is renewed. There's really no limitation to what you can do here. Since uptime is not critical for me, I've elected to just concat the key and chain together, and then restart HAProxy.


This Build 1.0 release should compile on Linux (SL 5 and 6) and MACOS. The HXI ans SGD telemetry FITS files have similar formats and can be processed in similar fashions. Consequently a single FTool called "hxisgdff" has been developed to accomodate both instrument's first FITS file (mostly telemetry) data pre-pipeline processing, in one Ftool application. A Perl script "ahsysinfo" should be included in the Build 1.0 release that provides some version info. extracted from the Ftool binary app. An exampe of its printout is appended below. The FITS file prcessing via this Ftool requires the minimal set of standard AstroH parameter file values. The nature of the processing is mostly "data-driven". This means that the bulk of the runtime behavior is determined by the contents of the input FITS data file. This includes HDU keywords, and importantly, the bitset values read and decoded directly out of the "raw data" variable length binary table column cells. This raw data is essentially instrument telemetry (TLM) extracted whithout modification from the spacecraft (S/C) downloaded CCSDS packets, into a FITS binary table file. Here is a typical par-file (hxisgdsff.par): # begin hxisgdsff.par clobber, b, h, yes, , , "Overwrite existing output file?" precheck, b, h, no, , , "Check pre-requisites?" templatefile, f, a, "./input/HXI_SF2012June.tpl", , , "Enter the HXI FITS Template file name" infile, f, a, "./input/01ahHXI_tlm.fits", , , "Enter the input HXI FITS file name" outfile, f, a, "./output/01ahHXI_tlm_extract.fits", , , "Enter the output HXI FITS file name" mode, s, h, "ql", , , "Mode of automatic parameters" # end hxisgdsff.par There are 6 fully self contained unit tests of the hxisgdsff Ftool, where one can simple invoke "aht -t" (in each respective sub-directory). The tests described here, however, may be performed manually by the usual UNIX shell command-line invocation of a standard HEADAS Ftool application. There are three ready-made PFILE paramater files here for each instrument, meant to support testing of the hxisgdsff Ftool app. Please note that the 'hmake install' should have placed a default version of the hxisgd.par file under $HEADAS/syspfiles, and another version may also reside under one's $HOME/pfiles. It may be necessary to delete both those versions of the paramater files to ensure that the Ftool application reads these "local" (current working directory) versions. One should also double-check the setting of the $PFILES environment variable. Process HXI data via HXI FITS temeplate: hxisf_yy.par -- precheck and clobber set to yes. hxisf_nn.par -- precheck and clobber set to no. hxisf_ny.par -- precheck set to no, clobber to yes. To test with one, please set a symlink (depending on one's PFILE environmet setting, it may be necessary to set and reset the symlink indicated below with one's ~/pfiles directory): ln -s hxisf_yy.par hxisgdsff.par and optionally remove or empty/clear any pre-existing subdirectories: ./input ./output ./expected_output. Run the (local) hxisgdsff binary with both clobber and precheck true, to produce the default input test FITS file, template, and expected output file (assuming the binary is located in one's current working directory): ./hxisgdsff This should initialize and populate ./input ./expected_output (with internally generated test/fake telemetry FITS files) and an empty ./output directory. Then reset the synlink: unlink hxisgdsff.par ln -s hxisf_nn.par hxisgdsff.par Run the hxisgdsff ftool with clobber and precheck set to no (assuming the binary is located in one's current working directory): ./hxisgdsff This should process the test input file and create an output file in ./output that can be verified against the file in ./expected_output via "ftverify". Iterative tests can be performed by the "ny" parfile: ln -s hxisf_ny.par hxisgdsff.par Similarly, process SGD telemetry via hxisgdsff with these parfile: sgdsf_nn.par sgdsf_ny.par sgdsf_yy.par Please note that name of the FITS template file and the FITS HDU keyword "INSTRUME" are checked to validate which instrument is meant to be processed (HXI vs. SGD). There are also 6 pre-generated test input FITS files currently stored in the CVS repository. The hxitest and sgdtest subdirectories under the hxisgd/tasks/hxisgdsff source should each provide 3 test files -- containing one to three row b-table HDUs. Finally, feel free to check the version info for the tool runtime and its library dependencies via the Perl script "ahsysinfo". Below is the result from a Scientific Linux environment of "ahsysinfo hxisgdsff" (ahsysinfo may also be used to inspect a runtime library as well as an application binary). ------------------------ Astro-H Software Host: gs66-xen.gsfc.nasa.gov -------------------- Linux xen 2.6.32-220.23.1.el6.x86_64 #1 SMP Mon Jun 18 09:58:09 CDT 2012 x86_64 x86_64 x86_64 GNU/Linux This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-thread-multi linux-vdso.so.1 => (0x00007fff475ff000) libahhxi.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahhxi.so (0x00002aee3edd5000) libahsgd.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahsgd.so (0x00002aee3f011000) libahtlm.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahtlm.so (0x00002aee3f251000) libahfits.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahfits.so (0x00002aee3f4a2000) libahmath.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahmath.so (0x00002aee3f6c7000) libahgen.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahgen.so (0x00002aee3f8cc000) libahlog.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libahlog.so (0x00002aee3facf000) libst_stream.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libst_stream.so (0x00002aee3fcd9000) libhdinit_2.6.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libhdinit_2.6.so (0x00002aee3feeb000) libhdutils_2.6.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libhdutils_2.6.so (0x00002aee400ee000) libape_2.8.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libape_2.8.so (0x00002aee40309000) libcfitsio_3.29.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libcfitsio_3.29.so (0x00002aee4054f000) libreadline.so.6 => /lib64/libreadline.so.6 (0x00000037f3400000) libhdio_2.6.so => /Home/xtelab/dhon/local/headev/x86_64-unknown-linux-gnu-libc2.12/lib/libhdio_2.6.so (0x00002aee40942000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030b8400000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000037f2a00000) libdl.so.2 => /lib64/libdl.so.2 (0x00000030b8000000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00000030c8600000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000030be800000) libm.so.6 => /lib64/libm.so.6 (0x00000030b7c00000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000030be400000) libc.so.6 => /lib64/libc.so.6 (0x00000030b7800000) /lib64/ld-linux-x86-64.so.2 (0x00000030b7400000) $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $ $Name: $ $Id: hxisgdsff.html,v 1.2 2012/07/31 17:40:27 dhon Exp $


---
layout: page
title: "Mods & Patches"
subtitle: My modifications and patches for various games.
excerpt: My modifications and patches for various games.
permalink: /mods/index/
hide: true
---
{% assign items = site.games | sort_natural: "title" %}
{% for item in items %}
{% unless item.hide or item.hide-on-list %}
{% assign modlist = site.mods | where: "game-series", item.game-series %}
{% if modlist.size > 0 %}
- {{ item.title }}
{% endif %}
{% endunless %}
{% endfor %}


You are currently authorized to view the following dashboards:
tbd
If you are missing anything or need to request access to additional dashboards please contact the common services team.
Contact


From the parking structure A, head east on Downey Way. At your first opportunity, turn left onto a pedestrian walkway. Walk up the path until you see the Brain and Creativity Institute on your left. There will be a shiny metal post out in front. When you get to the door, ring the doorbell and someone will buzz you into the building. In the lobby, you’ll check in with the receptionist and she’ll call Sarah. Should you get lost, please feel free to call Sarah or Priscilla at<PHONE_NUMBER>2 (office) or<PHONE_NUMBER> (cell).
Lyfts can be ordered whenever you are ready to go -- just let us know where and when!
If you wish to send your child our lab without you, we have a ride service specially designated for that, called HopSkipDrive. This is a service that uses drivers with childcare experience and extensive background checks. If you would like this option for your child, we must be notified a day in advance.


{% load humanize %} {% load tz %}
{{ greeting }} {{ first_name }}!We just wanted to keep you up to date on a few things this week. {% if days_present == 0 %}You didn't come to TurnToTech at all this week, {{ days_message }}. {% else %}You were at TurnToTech {{ days_present }} day{{ days_present|pluralize }} this week, {{ days_message }}. {% endif %}You started studying at TurnToTech {{ student.start_date|timesince }} ago You're currently working on {{ current_project }}. {% if remaining_projects_count != None %} You have {{ remaining_projects_count|apnumber }} project{{ remaining_projects_count|pluralize }} left. They are:
{{ signoff }}, |
| Don't want this email? Unsubscribe |


Peers downloaded from:
0
Peers shared to:
Thanks to the new WebRTC data channels, we can deliver images without a centralized server. The image above is being loaded directly from someone else using the site whenever possible.
View Github for more information
We're going beta on April 7th. If you're interested in piloting a hosted version of PeerKit or just keeping up to date — sign up for our mailing list.
© 2013 PeerKit. Questions? Contact us at team@peerkit.com.


{% assign areas = 'Technical, Communication, Delivery, Leadership' | split: ', ' %} {% for level in site.data.levels %} {% if level.id == include.level %}
{{level.summary}}
The competencies for {{level.name}} are outlined below. Before reviewing them, it is helpful to review how to use these competencies.
{% for area in areas %} {% assign area_lower_case = area | downcase %}{{competency.summary}}{% if example-count > 0 %}, e.g.{% endif %}
{% if example-count > 0 %}


--- layout: default title: Release notes permalink: /demo-redis/ redirect_from: - /demo-redis.html sitemap: priority: 0.4 lastmod: 2014-02-17T00:00:00-00:00 ---
To get the latest NHipster news, please always look at GitHub


Rickyleaks @rickhanlonii. 55m
Wonderful work of art✨
Tweets
Following
Followers
As a football team, everyone has a role to play. Define yours. Promoted by Coca-Cola Nigeria
Kante 12.5K Tweets
Ycee 1,697 Tweets
1,699 Tweets Blaqbonez 9,631 Tweets Longstaff 5,998 Tweets
Rickyleaks @rickhanlonii. 55m
Wonderful work of art✨
Dave @SDCarter10. 5h
Multi-cloud security requires organizations to implement consistent security policies that span across multiple cloud environments. Find out how to address #cloudsecurity challenges through the implementation of seven main strategies: http://spr.ly/6012EvOuE


1 reference to WMI_Class_Service
Microsoft.PowerShell.Commands.Management (1)
commands\management\Computer.cs (1)
674
const string wmiServiceQuery = "Select * from " + ComputerWMIHelper.
WMI_Class_Service
+ " Where name = 'Winmgmt'";


Hi, I'm Dales, graduating of Computer Science in Federal University of Campina Grande (UFCG). Nowdays I have 5/8 of course concluded. My interest areas in general are Android and Web development, and I'm studying to be good with data analysis too.
If you want to learn web development, android development, logic programming, Java, C++, Swift, Python and etc. I can help you. The lessons are made using Google Hangouts and only to you (Lower Price too ). Contact me using the form bellow.


|
***½ The Glimmer Man |
|
|
Nationality: BUDDHIST Generic American™ Training/Specialty: CIA (Special Projects/Assassin), West Point, see one-liners KILLS: 11 Broken Bones |
|
| Elbows: 1 Right | Knees: 1 Left |
| Back: | Neck: |
| Wrist: | Ankles: |
| Fingers: | |
|
Notable Painful Injuries: 3 throats split with credit card razorblade, pistol whipped in the head 16 times rapidly (yes, I counted), chin impaled on spiked fence |
|
|
One-liners: [About Seagal's abilities as an assassin] "There'd be nothing but jungle, then a glimmer, then you'd be dead." Seagal: "You shouldn't knock Chinese remedies. I have something in my pocket that will completely clear up that bruise on your forehead."  [Seagal punches him hard] Seagal: "THAT bruise!" |


Empowering your collective productivity
How version control, git and GitHub can make your life easier
Feb 26, 2015
As a business consultant, it wasn’t rare to spend nights up working on spreadsheets and powerpoint presentations. And, not rarely too, after spending hours working in a huge analysis…. bang! Excel just stopped working! Invariantly (even though Excel has an autosave feature), hours of work were waisted and I had to start all over again (and remembering how to structure your analysis again from scratch at 2am is not always that easy!). But what if, for each step of the analysis I evolved, I could just save a snapshot of it, controlling what’s been achieved so far? And, if something went wrong, or I didn’t like the results of my current iteration, I could then just roll back to my previous state, effortlessly?
The version control tool git does it, and more! Working with a tree structure, git defines a ‘master’ version of your document, from which you can derive as many branches as you need to keep working. Each branch starts as an identical copy of your master, and you’re free to make any changes you want to it without affecting master. Once you’ve come to a point worth ‘saving’, you can merge your changes back to the master, specifying what’s been made. All versions of this master document are preserved, and if you need to come back to any of them, you can simply do that by hitting one command line.
And if you have a team working in this same document, it gets even better. For collaborative work, git works beautifully along with GitHub. GitHub is a remote repository to which all your team can have access. The master will always be the most up to date version of the team’s work. Each person of the team will work on their part from their own (local) branch, and once they’re finished, they’ll merge their improvements to team’s (remote) master. The newest version of the document is already available to all the team to sync and keep working!
Moreover, if you want to maintain your project the highest level, there’s another amazing feature that GitHub provides: instead of directly merging your improvements to the project, you can instead ask for someone in the group to revise it for you. This is really useful not only as a double check, but also to keep the group always aware of how project’s growing and evolving overall.
If you’re interested in trying this miracle out, I would suggest you to take a look at this quick guide GitHub provides to set up git and GitHub and enjoy this beauty. Good luck!


Language Grammar
Notation used in the grammar:
n
A nonterminal symbol that has to appear at some place within the grammar on the left side of a rule. All nonterminal symbols have to be derived to be terminal symbols.
t
A terminal symbol (shown in italic bold).
x y
x followed by y
x | y
x or y
(x | y)
x or y
[ x ]
x or empty
{ x }
A possibly empty sequence of x.
comment
descriptive text
Grammar list:
symbol ::= expression
query_program ::= [ imports semicolon ] query [semicolon]
imports ::= import { semicolon import }
import ::= IMPORT qualifiedName [ AS identifier ]
query ::= selectExpr | expr
selectExpr ::= SELECT DISTINCT projectionAttributes fromClause [ whereClause ]
projectionAttributes ::= * | projectionList
projectionList ::= projection { comma projection }
projection ::= field | expr [ AS identifier ]
field ::= identifier colon expr
fromClause ::= FROM iteratorDef { comma iteratorDef }
iteratorDef ::= expr [ [ AS ] identifier ] [ TYPE identifier ] | identifier IN expr [ TYPE identifier ]
whereClause ::= WHERE expr
expr ::= castExpr
castExpr ::= orExpr | left_paren identifier right_paren castExpr
orExpr ::= andExpr { OR andExpr }
andExpr ::= equalityExpr { AND equalityExpr }
equalityExpr ::= relationalExpr { ( = | <> | != ) relationalExpr }
relationalExpr ::= additiveExpr { ( < | <= | > | >= ) additiveExpr }
additiveExpr ::= multiplicativeExpr { (+ | -) multiplicativeExpr }
multiplicativeExpr ::= inExpr { (MOD | % | / | *) inExpr}
inExpr ::= unaryExpr { IN unaryExpr }
unaryExpr ::= [ NOT ] unaryExpr
postfixExpr ::= primaryExpr { left_bracket expr right_bracket }
| primaryExpr { dot identifier [ argList ] }
argList ::= left_paren [ valueList ] right_paren
qualifiedName ::= identifier { dot identifier }
primaryExpr ::= functionExpr
| identifier [ argList ]
| undefinedExpr
| collectionConstruction
| queryParam
| literal
| ( query )
| region_path
functionExpr ::= ELEMENT left_paren query right_paren
| NVL left_paren query comma query right_paren
| TO_DATE left_paren query right_paren
undefinedExpr ::= IS_UNDEFINED left_paren query right_paren
| IS_DEFINED left_paren query right_paren
collectionConstruction ::= SET left_paren [ valueList ] right_paren
valueList ::= expr { comma expr }
queryParam ::= $ integerLiteral
region_path ::= forward_slash region_name { forward_slash region_name }
region_name ::= name_character { name_character }
identifier ::= letter { name_character }
literal ::= booleanLiteral
| integerLiteral
| longLiteral
| doubleLiteral
| floatLiteral
| charLiteral
| stringLiteral
| dateLiteral
| timeLiteral
| timestampLiteral
| NULL
| UNDEFINED
booleanLiteral ::= TRUE | FALSE
integerLiteral ::= [ dash ] digit { digit }
longLiteral ::= integerLiteral L
floatLiteral ::= [ dash ] digit { digit } dot digit { digit } [ ( E | e ) [ plus | dash ] digit { digit } ] F
doubleLiteral ::= [ dash ] digit { digit } dot digit { digit } [ ( E | e ) [ plus | dash ] digit { digit } ] [ D ]
charLiteral ::= CHAR single_quote character single_quote
stringLiteral ::= single_quote { character } single_quote
dateLiteral ::= DATE single_quote integerLiteral dash integerLiteral dash integerLiteral single_quote
timeLiteral ::= TIME single_quote integerLiteral colon
integerLiteral colon integerLiteral single_quote
timestampLiteral ::= TIMESTAMP single_quote
integerLiteral dash integerLiteral dash integerLiteral integerLiteral colon
integerLiteral colon
digit { digit } [ dot digit { digit } ] single_quote
letter ::= any unicode letter
character ::= any unicode character except 0xFFFF
name_character ::= letter | digit | underscore
digit ::= any unicode digit
The expressions in the following are all terminal characters:
dot ::= .
left_paren ::= (
right_paren ::= )
left_bracket ::= [
right_bracket ::= ]
single_quote ::= ’
underscore ::= _
forward_slash ::= /
comma ::= ,
semicolon ::= ;
colon ::= :
dash ::= -
plus ::= +
Language Notes
- Query language keywords such as SELECT, NULL, and DATE are case-insensitive. Identifiers such as attribute names, method names, and path expressions are case-sensitive.
- Comment lines begin with – (double dash).
- Comment blocks begin with /* and end with */.
String literals are delimited by single-quotes. Embedded single-quotes are doubled.
Examples:
'Hello' value = Hello 'He said, ''Hello''' value = He said, 'Hello'
Character literals begin with the CHAR keyword followed by the character in single quotation marks. The single-quotation mark character itself is represented as
CHAR ''''
(with four single quotation marks).In the TIMESTAMP literal, there is a maximum of nine digits after the decimal point.


Strictly's Katya Jones praises ‘inspiring' Mike Bushell as pair are eliminated
Katya Jones praised her Strictly partner Mike Bushell for “showing everyone that there’s no such thing as can’t” as they were eliminated from the competition.
The pair got the boot on Sunday’s results show after a dance-off against Michelle Visage and Giovanni Pernice.
Jones posted a message on Instagram after the show, explaining how impressed she was with her partner.
She wrote: “Honestly it’s so hard to find words to describe how proud I feel @mikebushellofficial. Or there just too much I want to say!
“How you threw yourself into this wild experience, how you kept turning up every day with a smile on your face and positive energy no matter what, showing everyone that there’s no such thing as CAN’T, inspiring others with your example, going beyond what anyone expected from you, making me the lucky teacher to have such a fantastic student – is only few things that I admire you for.”
“I take my hat off to you partner,” she added.
“I’ve had the most wonderful journey, and all I can hope for is that you did too and that memories that you will take away from this is something you can cherish forever!
“But most important and above all that- You have the KINDEST HEART and I don’t feel sad for us, I feel that it’s a beautiful celebration of what you have achieved !!!
“I will forever remain Mike Bushel number one fan! And we did CONGA as our last dance!!!!!!!!!!!!”
Bushell was also full of praise for Jones after their exit.
He tweeted after the elimination: “Loved every second. Thanks so much for all the support. The most amazing teacher @Mrs_katjones surely coach of the year.”
He went on: “When it’s been such an honour @bbcstrictly and such a wonderful journey
@Mrs_katjones you have to out on a high after thankfully a mistake free final dance.
“And so Lets go and celebrate the last moments on the iconic floor @BBCBreakfast albeit getting stuck under the dress.”
Jones and Bushell’s fellow Strictly stars also posted messages on social media after the results programme.
Dancer Nadiya Bychkova and judge Motsi Mabuse posted hearts, while Amy Dowden wrote: “You did such a great job! Such a lovely partnership! Will miss watching you both.”
Former judge Arlene Phillips wrote: “It was your best dance and your tears were so moving. I really felt for you.”
Strictly continues on BBC One.


So by now using .Net Core on Linux is old news, everyone is doing it and deploying their production apps on Kubernetes to reach peak "I can scale" points. However, one thing that can get tricky is when you have a requirement to debug an application in a container. I believe VS on Windows and VS for Mac has some sort of capability to do that (I have no idea what it does underneath but hey who cares I can right click debug right!?) but the information about doing this in VSCode is a bit sketchy. I tend to use VSCode on OSX the most so I wanted to see how I could do this.
For demonstration purposes lets take a very simple application and we are going to publish it as a self contained application ie/one that has all the runtime and application binaries outputted so you don't have to install dotnet in a container.
To be able to debug that application we are going to need VSDBG(the .Net Core command line debugger) inside the container.
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg
We are also going to need to append the launch.json for VSCode in your project's root to have the below:
{
"name": ".NET Core Remote Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickRemoteProcess}",
"pipeTransport": {
"pipeProgram": "bash",
"pipeArgs": [ "-c", "docker exec -i json ${debuggerCommand}" ],
"debuggerPath": "/root/vsdbg/vsdbg",
"pipeCwd": "${workspaceRoot}",
"quoteArgs": true
},
"sourceFileMap": {
"/Users/jonathan/Projects/jsonfile": "${workspaceRoot}"
},
"justMyCode": true
}
They key things to note are the pipeArgs
and sourceFileMap
. Where it says json
, under pipeArgs
this will need to be replaced the name of the container that you are trying to debug. The sourceFileMap
is a mapping between where it was compiled on your machine and where it is in VSCode.
One thing to note with this is, is that you cannot debug a project that has been compiled in Release mode. Whilst the config above looks like it should work it doesn't. I tried! I believe there may be plans to allow this and the issue can be tracked here . A sample application and Dockerfile can be found here


{% extends 'base.html' %} {% block head %}
Back to fireSafety list homepage
can't not search the dataset for empty string.
can't not find any object that has {{ search_result }}.


Dry-fitting shelves in the utility room so tomorrow I can put the spacers in between joists above the sheetrock. More fun than concrete...
3/1/2008, 10:31:03 PM
Favs: 0
Retweets: 0
link--- layout: tweet ---
Dry-fitting shelves in the utility room so tomorrow I can put the spacers in between joists above the sheetrock. More fun than concrete...
3/1/2008, 10:31:03 PM
Favs: 0
Retweets: 0
link


Print your name
Review your signature
Draw your signature
Type It
Draw It
Clear
Print your name
Review your signature
Draw your signature
Type It
Draw It
Clear
I accept the terms of this agreement.


AFS Photo species MVR people systems biodiversity trees vegetation agricultural conservation agroforestry Zapotitlán plant use management forest important Axusco Quiotepec shrubs diversity studied plots forests recorded maintain sites {border-style reasons px;} #ffffff;} alluvial cover local wild Casas high intensive practices make mentioned number plants regional richness traditional México Prosopis agriculture areas ground main Agroforestry Mexico Moreno-Calles capacity plot provision sp. study techniques terraces using (%), (Figure Figure Tehuacán Valley average borders different land resources values ./s--- Biosphere However, Tehuacán-Cuicatlán area associated authorities calculated maintaining studied. tropical AFS. features information maintained native nearly order particularly production sampled soil valleys water zones Opuntia Rose Valiente-Banuet Valley, cacti chemical communities community conducted edible higher highest provide px; studies useful wood zone {font-family Agave Biodivers Bot Bursera Communal Dávila Parkinsonia Reserve UNAM. Value arid aspects columnar current data documented ecosystem font-size increasing knowledge lower machinery no, practices, practices. recognized region remove role similar species, total valley value (%) (Table AFS, Acacia Agricultural Biodiversity Blancas Ecological Econ Ejidal People Plant Salado Table animals benefits compared conserving crop cultivated double; frequency fuel general human identified index intensification laevigata manage milpa natural plot, programs protection related shade significant significantly system. tree (L.) (a) (b) Agrofor Central Conserv Ecosyst Engl. Ethnobiol Forest Importance Leucaena Mexico, Rangel-Landa Sci Syst Vallejo Zucc. agaves allow beauty border-color border-width crops cultivation cultural design differences ecological ecosystems fallow generally including interviewed level located maize practiced program provided reasons, relation said solid; state strong tenure time type used years {font-style {font-weight (%). (F.A.C. (on According Arizmendi Axusco, Based Benth. Caballero Centro Citrus Colwell Dalea Environ Ethnomed Euphorbia General Investigaciones Land Mammillaria Manag Mexico. México, Press Private Quiotepec, Reserve, Shannon Sideroxylon Soc Solís Torres Traditional Trees University Vegetation Viguiera Weber according addition, agrochemical amounts analysed areas. biocultural bold called cases changes compare comparison component components considered contribute control courier; del designing direct dominated dry economic em; experience exponential followed food frequent governmental highly included indigenous inputs, insects irrigation landscape larvae like mainly management, managing model occurring original paper. para perennial plot. plots. practice praecox pt;} reason region, reported sampling sites, small standing strategy structure studied, subsistence supporting sustainable technique territory tractor trees, uses valued writing = .,


#include <GrUberTexture.h>
Classes | |
| struct | SAtlasErase |
| atlas erase queue structure. | |
| struct | STileData |
| tile data structure. | |
| union | STileKey |
| tile key structure. | |
Public Types | |
| enum | ECONSTANTS { MAX_ATLAS_WRITES = 4096 } |
Public Member Functions | |
| GrUberTexture (const UPath &filePath) | |
| class GrUberTexture | |
| GrUberTexture (const UPath &filePath, const void *tileUsageBitmap, const char *metaData=0, unsigned int metaDataSize=0) | |
| ~GrUberTexture () | |
| const UPath & | GetName () const |
| returns the name of the ubertexture. | |
| bool | IsValid () const |
| returns true if the ubertexture is valid. | |
| void | CacheDetailTiles (unsigned int startMip, unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int clipMinX, unsigned int clipMinY, unsigned int clipMaxX, unsigned int clipMaxY) |
| caches the detail tiles for rendering. | |
| void | BindLowResTextures (unsigned int bumpSampler, unsigned int diffuseSampler, unsigned int specularSampler) |
| binds the ubertexture lowres textures to the device. | |
| void | ResetAtlas () |
Definition at line 25 of file GrUberTexture.h.
| GrUberTexture::GrUberTexture | ( | const UPath & | filePath | ) |
class GrUberTexture
ctor & dtor
open an existing file.
open the file.
prepare the ubertexture database for reading.
allocate resources.
TODO: fill out the base mip levels.
Definition at line 63 of file GrUberTexture.cpp.
| GrUberTexture::GrUberTexture | ( | const UPath & | filePath, | |
| const void * | tileUsageBitmap, | |||
| const char * | metaData = 0 , |
|||
| unsigned int | metaDataSize = 0 | |||
| ) |
create a new file.
open the file.
create the ubertexture database.
allocate resources.
TODO: fill out the base mip levels.
Definition at line 86 of file GrUberTexture.cpp.
| GrUberTexture::~GrUberTexture | ( | ) |
free textures.
free the detail tile usage map.
close the ubertexture.
free the tile cache.
free the tile locks.
free the tile memory.
Definition at line 112 of file GrUberTexture.cpp.
| void GrUberTexture::BindLowResTextures | ( | unsigned int | bumpSampler, | |
| unsigned int | diffuseSampler, | |||
| unsigned int | specularSampler | |||
| ) |
binds the ubertexture lowres textures to the device.
bind the low resolution textures to the device.
Definition at line 231 of file GrUberTexture.cpp.
| void GrUberTexture::CacheDetailTiles | ( | unsigned int | startMip, | |
| unsigned int | x, | |||
| unsigned int | y, | |||
| unsigned int | width, | |||
| unsigned int | height, | |||
| unsigned int | clipMinX, | |||
| unsigned int | clipMinY, | |||
| unsigned int | clipMaxX, | |||
| unsigned int | clipMaxY | |||
| ) |
caches the detail tiles for rendering.
public methods.
make sure the width and height are valid.
try to find a free location in the detail cache.
write to the atlas.
iterate through each miplevel and pack data.
calculate the tiles needed for the current mip-level.
clip the current region.
iterate through each tile.
try to find the tile in the cache.
cache the tile.
upload the tile to the detail cache.
get the chunk in the file where the tile resides.
get the tile we're going to be replacing.
make sure the tile isn't being loaded from disk.
send a request for the tile data.
now add a new item into the cache.
Definition at line 148 of file GrUberTexture.cpp.
| const UPath& GrUberTexture::GetName | ( | ) | const [inline] |
| bool GrUberTexture::IsValid | ( | ) | const [inline] |
| void GrUberTexture::ResetAtlas | ( | ) |
clears the detail cache atlas. This should be called at the beginning of each frame.
get the current atlas memory.
do a "spot cleanup" of the atlas if possible.
clear the whole atlas.
Definition at line 242 of file GrUberTexture.cpp.


Nottingham Forest to show support for campaign against Cardiff City
Nottingham Forest news| The Reds are backing the LGBT+ community at the City Ground on Saturday
by Matt DaviesNottingham Forest have announced that fixture against Cardiff City is the club’s designated awareness match for the Rainbow Laces campaign.
The campaign is aiming to show support for the LGBT+ community and that football is everyone’s game, and Forest have said there will be a number of activities as part of the awareness match.
The players will be warming-up in t-shirts with the LGBT Trickies logo on, the supporter group for LGBT+ fans of the club, while the rainbow colours will also adorn the corner flag, captain’s armband and the fourth official’s LED board.
There will also be a double-page feature in the matchday programme and content on the big screens throughout the match to raise awareness and encourage supporters to unite behind the campaign.
Kevin George, from LGBT Trickies, said: "As an LGBT+ group we are very proud to work with Nottingham Forest Football Club in addressing the issues of inclusivity."
"Since we were formed we have worked closely with the club.
Nottingham Forest latest
This is your round up of all things Forest; the one-stop shop that will keep you updated on the latest goings on at the City Ground and beyond.
Transfers, injuries, match-days and managers, we’ve got you covered.
We’ll be bringing the very latest on the Reds throughout the week and around the clock.
Make sure you keep yourself updated with our handy daily catch up...
Must reads...
- Confirmed: Nottingham Forest star signs new contract amid Everton transfer link
- 'Maybe Forest fans were right?' - QPR supporters have their say on heavy defeat
- 'More than angry' - QPR boss Mark Warburton unleashes angry rant after Nottingham Forest defeat
For all your latest NFFC news, opinion, analysis and transfer gossip, click here
You can follow our Reds reporter Sarah Clapson on Twitter, and her email address is<EMAIL_ADDRESS>"To move forward and make the City Ground a welcoming place for LGBT+ people to attend and this weekends Rainbow Laces game is one of those ways."
"We look forward to continuing our joint work with such a progressive football club."


7.3.2. Universal DAO¶
Table of contents
- Function overview
- Module list
- How to use
- Configure settings to use Universal DAO
- Search with any SQL (SQL file)
- Obtain search results using JOIN of tables
- Deferred loading of search results
- Searching by specifying the conditions
- Convert type
- Paging
- Numbering the surrogate keys
- Perform batch execution (batch registration, update and deletion)
- Optimistic locking
- Pessimistic locking
- Concept of exclusive control
- Register (update) binary data with a large data size
- Registration (update) of text data with a large data size
- Execute in a transaction different from the current transaction
- Expansion example
- JPA annotation that can be used for Entity
- Data types that can be used for Bean
Universal DAO provides a simple O/R mapper that uses JPA2.0(JSR317) (external site) annotations.
Since Universal DAO uses a Database Access (JDBC Wrapper), the Database Access (JDBC Wrapper) must be configured to use Universal DAO.
Tip
Universal DAO is positioned as a simple O/R mapper and is not intended to realize all database access. Perform Database Access (JDBC Wrapper) operations directly if it cannot be realized with Universal DAO.
For example, in Universal DAO, update/delete with conditions other than the primary key cannot be performed, so Database Access (JDBC Wrapper) operations must be performed directly.
Tip
Universal DAO does not provide an automatic configuration function for common items (insert users, update users, etc. defined in all tables). To automatically configure values for common items, apply Doma Adapter and use Doma entity listener function.
To use Universal DAO in any case, configure the common items explicitly in the application before using the functions of Universal DAO.
<IP_ADDRESS>. Function overview¶
<IP_ADDRESS>.1. Simple CRUD without writing SQL¶
Just by adding JPA annotation to Entity, a simple CRUD can be created without writing SQL. SQL statements are constructed at runtime based on JPA annotations.
- Registration/Batch registration
- Update/Batch update by specifying the primary key
- Delete/Batch delete by specifying the primary key
- Search by specifying the primary key
For JPA annotations that can be used in Entity, see JPA annotation that can be used for Entity.
Tip
In the above CRUD function of Universal DAO, schema can be specified using @Table
annotation (see JPA annotation that can be used for Entity).
However, Switch the schema in SQL statement for each environment function of Database Access (JDBC Wrapper) cannot be used with the above CRUD function of Universal DAO. Use the Database Access (JDBC Wrapper) directly instead of Universal DAO for switching the schema for each environment.
<IP_ADDRESS>.2. Search results can be mapped to Bean¶
In search, as with Database Access (JDBC Wrapper), you can create an SQL file and perform a search by specifying the SQL ID. In Universal DAO, search results can be obtained by mapping them to Bean (Entity, Form, DTO). Map the items whose Bean property name matches the SELECT clause name.
For data types that can be used for Bean, see Data types that can be used for Bean.
<IP_ADDRESS>. Module list¶
<dependency>
<groupId>com.nablarch.framework</groupId>
<artifactId>nablarch-common-dao</artifactId>
</dependency>
<IP_ADDRESS>. How to use¶
Important
See nablarch.common.dao.UniversalDao for the basic usage of Universal DAO.
<IP_ADDRESS>.1. Configure settings to use Universal DAO¶
To use universal DAO, add BasicDaoContextFactory configuration to component definition in addition to Database Access (JDBC Wrapper) configuration.
<!-- Configure the component name in "daoContextFactory". -->
<component name="daoContextFactory" class="nablarch.common.dao.BasicDaoContextFactory" />
<IP_ADDRESS>.2. Search with any SQL (SQL file)¶
To search using SQL, create an SQL file and search by specifying the SQL ID, similar to Manage SQL in files of database access.
UniversalDao.findAllBySqlFile(User.class, "FIND_BY_NAME");
SQL file is derived from Bean that maps the search results. When User.class in the above example is sample.entity.User, the path of the SQL file is sample/entity/User.sql under the class path.
If “#” is included in the SQL ID, it is interpreted as “SQL file path#SQL ID”. In the example below, the SQL file path is sample/entity/Member.sql under the class path, and the SQL ID is FIND_BY_NAME.
UniversalDao.findAllBySqlFile(GoldUser.class, "sample.entity.Member#FIND_BY_NAME");
Tip
The specification including “#” can be used when SQL is to be aggregated in function units (action handler units). However, since there is a disadvantage that the specification becomes complicated, basically use the specification without “#”.
<IP_ADDRESS>.3. Obtain search results using JOIN of tables¶
Sometimes the result of JOIN of multiple tables in list search is required to be acquired. Since it is inefficient in such cases, create a Bean that maps the SQL that can be searched once and JOIN results, without individually searching the JOIN target data.
<IP_ADDRESS>.4. Deferred loading of search results¶
The memory becomes insufficient in processes that handle large amounts of search results, and all search results cannot be expanded in the memory. Some of the cases are as follows.
- Download large amounts of data on the Web
- Process large amounts of data in batch
In such cases, use deferred loading of Universal DAO. When deferred loading is used, Universal DAO loads the records one by one, but the amount of memory used changes depending on the JDBC fetch size. For details of the fetch size, refer to the manual provided by the database vendor.
Deferred loading can be used by just calling the UniversalDao#defer method first during search. since server cursor is used internally, DeferredEntityList#close method must be called.
// Call close using try-with-resources.
// Get DeferredEntityList by downcast.
try (DeferredEntityList<User> users
= (DeferredEntityList<User>) UniversalDao.defer()
.findAllBySqlFile(User.class, "FIND_BY_NAME")) {
for (User user : users) {
// Process using the user
}
}
<IP_ADDRESS>.5. Searching by specifying the conditions¶
Like the search screen, Universal DAO also provides a search with specified conditions.
// Get the search conditions
ProjectSearchForm condition = context.getRequestScopedVar("form");
// Search by specifying the conditions
List<Project> projects = UniversalDao.findAllBySqlFile(
Project.class, "SEARCH_PROJECT", condition);
Important
For the search condition, specify a dedicated Bean that has the search condition instead of Entity. However, Entity may be specified when accessing only one table.
<IP_ADDRESS>.6. Convert type¶
In Universal DAO, @Temporal can be used to specify how to map java.util.Date
and java.util.Calendar
type values to the database.
Since arbitrary mapping is not possible for other types, Entity properties must be defined according to the database type and specifications of the JDBC driver to be used.
Though Universal DAO uses JPA annotation information when sending automatically generated SQL to the DB, JPA annotation information is not used when sending arbitrary SQL to the DB. Therefore, the type conversion is as follows.
- When executing SQL automatically generated from the Entity
- During output to a database
- For properties configured with @Temporal, converts to the type specified in @Temporal.
- For other than above, conversion is performed by delegating the process to the Database Access (JDBC Wrapper).
- When fetching from database
- For properties configured with @Temporal, converts from the type specified in @Temporal.
- For other than the above, values are converted based on Entity information.
- When searching with an arbitrary SQL
- During output to a database
- Conversion is performed by delegating the process to the Database Access (JDBC Wrapper).
- When fetching from database
- Perform the same process as when executing SQL automatically generated from the Entity.
Important
If the database type and property type do not match, a type conversion error may occur during runtime. In addition, implicit type conversion is performed during SQL execution, which may cause performance degradation (caused as index is not used).
To map between database and Java data type, refer to the JDBC driver manual as it depends on the product used.
For example, if the DB is a date type, the property type is java.sql.Date in many databases. If the DB is a numeric type (integer, bigint, number), the property type will be int (java.lang.Integer) or long (java.lang.Long).
<IP_ADDRESS>.7. Paging¶
Universal DAO Search supports paging. First call the UniversalDao#per method and UniversalDao#page method for paging at the time of search.
EntityList<User> users = UniversalDao.per(3).page(1)
.findAllBySqlFile(User.class, "FIND_ALL_USERS");
Information such as the number of search results required for displaying the paging screen is stored in Pagination. Pagination can be obtained from EntityList.
Pagination pagination = users.getPagination();
Tip
Search process for paging is performed using range specified search function of database access (JDBC wrapper).
<IP_ADDRESS>.8. Numbering the surrogate keys¶
When numbering the surrogate keys, use the following annotations.
Universal DAO supports all strategies of javax.persistence.GenerationType.
- GenerationType.AUTO
-
@Id @Column(name = "USER_ID", length = 15) @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; }
- Select the numbering method based on Dialect configured in the database function. The priority is in the order IDENTITY → SEQUENCE → TABLE.
- If SEQUENCE is selected, the sequence object name will be “<table name>_<column name to be numbered>”.
- To specify the sequence object name, use @SequenceGenerator.
- GenerationType.IDENTITY
-
@Id @Column(name = "USER_ID", length = 15) @GeneratedValue(strategy = GenerationType.IDENTITY) public Long getId() { return id; }
- GenerationType.SEQUENCE
-
@Id @Column(name = "USER_ID", length = 15) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq") @SequenceGenerator(name = "seq", sequenceName = "USER_ID_SEQ") public Long getId() { return id; }
- Specify the sequence object name with @SequenceGenerator.
- If the sequenceName attribute is omitted, it will be “<table name>_<column name to be numbered>”.
- GenerationType.TABLE
-
@Id @Column(name = "USER_ID", length = 15) @GeneratedValue(strategy = GenerationType.TABLE, generator = "table") @TableGenerator(name = "table", pkColumnValue = "USER_ID") public Long getId() { return id; }
- Specify the value that identifies a record with @TableGenerator.
- If the pkColumnValue attribute is omitted, it will be “<table name>_<column name to be numbered>”.
Tip
Numbering process of surrogate key using sequence and table is performed using Surrogate Key Numbering. Refer to the link destination for configuring the value (configuring the table and column names when using a table).
<IP_ADDRESS>.9. Perform batch execution (batch registration, update and deletion)¶
Universal DAO allows batch execution when registering, updating, or deleting large amounts of data. By performing batch execution, the number of round trips between the application server and database server can be reduced, and improvement in performance can be expected.
Batch execution uses the following methods.
Important
Exclusive control processing is not performed in the batch update processing that uses batchUpdate. If the version of the Entity to be updated and the version in the database do not match, the process ends normally without updating the record.
If the update processing requires exclusive control, call the update process for each record instead of batch update.
<IP_ADDRESS>.10. Optimistic locking¶
Universal DAO automatically performs optimistic locking when an Entity with @Version is updated. Throws javax.persistence.OptimisticLockException if an exclusive error occurs in optimistic locking.
Important
@Version can be specified only for numeric type properties. It does not work properly with string type properties.
Screen transition during an exclusive error is performed using OnError.
// Specify the target exception in the type attribute and transition destination path
// in the path attribute.
@OnError(type = OptimisticLockException.class,
path = "/WEB-INF/view/common/errorPages/userError.jsp")
public HttpResponse update(HttpRequest request, ExecutionContext context) {
UniversalDao.update(user); // Before and after processing is omitted.
}
Important
Note that optimistic locking cannot be used in batch update process (batchUpdate) as described in Perform batch execution (batch registration, update and deletion).
<IP_ADDRESS>.11. Pessimistic locking¶
Universal DAO does not particularly provide the pessimistic locking function.
Pessimistic locking is done by using the database row locking (select for update). SQL with the row lock (select for update) executes using the UniversalDao#findBySqlFile method.
<IP_ADDRESS>.12. Concept of exclusive control¶
It is necessary to decide from a business perspective the table in which the version column used for exclusive control has to be defined.
Tables with version numbers are defined for each unit of exclusive control and the largest unit in which conflicts are allowed. For example, if business allows locking in a large unit called “user”, a version number is defined in the user table. However, note that the possibility of conflict increases if the unit is increased, and update failure (in the case of optimistic locking) and processing delay (in the case of pessimistic locking) will occur.
<IP_ADDRESS>.13. Register (update) binary data with a large data size¶
You may want to register (update) binary data with a large data size, such as BLOB of Oracle. In the case of Universal DAO, since registration (update) cannot be performed unless all data is loaded into memory, use the functions provided by the database to register (update) directly from a file.
For details, see Accessing columns of binary type.
<IP_ADDRESS>.14. Registration (update) of text data with a large data size¶
You may want to register (update) text data with a large data size, such as CLOB of Oracle. In the case of Universal DAO, since registration (update) cannot be performed unless all data is loaded into memory, use the functions provided by the database to register (update) directly from a file.
For details, see Access columns of string type with a large number of digits (e.g. CLOB).
<IP_ADDRESS>.15. Execute in a transaction different from the current transaction¶
This section explains how to perform the same process as Execute SQL in a transaction different from the current transaction of Database Access (JDBC Wrapper) with universal DAO.
The following procedures are required to use individual transactions.
- Define SimpleDbTransactionManager in the component configuration file.
- Use SimpleDbTransactionManager to execute Universal DAO in a new transaction.
An usage example is shown below.
- Component configuration file
Define SimpleDbTransactionManager in the component configuration file.
- Configure implementation class of ConnectionFactory to connectionFactory property. For details of implementation class of ConnectionFactory, see Connection configuration for the database.
- Configure implementation class of TransactionFactory to transactionFactory property. For details of implementation of TransactionFactory, see Perform transaction control for the database.
<component name="find-persons-transaction" class="nablarch.core.db.transaction.SimpleDbTransactionManager"> <!-- Configure ConnectionFactory implementation class in the connectionFactory property --> <property name="connectionFactory" ref="connectionFactory" /> <!-- Configure TransactionFactory implementation class in the transactionFactory property --> <property name="transactionFactory" ref="transactionFactory" /> <!-- Configure a name to identify the transaction --> <property name="dbTransactionName" value="update-login-failed-count-transaction" /> </component>
- Implementation examples
Use SimpleDbTransactionManager configured in the component configuration file and execute universal DAO. In addition, instead of using SimpleDbTransactionManager directly, use UniversalDao.Transaction to perform transaction control.
First, create a class that inherits UniversalDao.Transaction.
private static final class FindPersonsTransaction extends UniversalDao.Transaction { // Prepare a container to receive the result. private EntityList<Person> persons; FindPersonsTransaction() { // Specify SimpleDbTransactionManager as super (). // The name specified in the component definition or the SimpleDbTransactionManager object can be specified. // In this example, the name mentioned in the component definition is specified. super("find-persons-transaction"); } //This method is automatically executed in another transaction. // If the process is completed successfully, the transaction is committed. // If an exception or error is thrown, the transaction is rolled back. @Override protected void execute() { // Implement the process using UniversalDao in the execute method. persons = UniversalDao.findAllBySqlFile(Person.class, "FIND_PERSONS"); } // Prepare getter that returns the result. public EntityList<Person> getPersons() { return persons; } }
Then, call the class that inherits UniversalDao.Transaction.
// Executed in a different transaction after generation. FindPersonsTransaction findPersonsTransaction = new FindPersonsTransaction(); // Acquire the result. EntityList<Person> persons = findPersonsTransaction.getPersons();
<IP_ADDRESS>. Expansion example¶
<IP_ADDRESS>.1. Support when information cannot be obtained from DatabaseMetaData¶
Depending on the database, the primary key information cannot be acquired from java.sql.DatabaseMetaData due to the use of synonyms or permission problems. If the primary key information cannot be acquired, the search that specifies the primary key does not work properly. For such cases, support by creating an inherited class of DatabaseMetaDataExtractor. Refer to the product manual as the method to acquire the primary key information depends on the database.
Configuration is required to use the created class.
<!--
Configuration example when sample.dao.CustomDatabaseMetaDataExtractor is created
Configure the component name as "databaseMetaDataExtractor".
-->
<component name="databaseMetaDataExtractor" class="sample.dao.CustomDatabaseMetaDataExtractor" />
<IP_ADDRESS>. JPA annotation that can be used for Entity¶
JPA annotations that can be used for entity are as follows.
- Annotation configured in class
- Annotation configured in getter or field
Important
Using annotations and attributes that are not described here will not work.
When configuring in a field, specify explicitly with @Access. Refers to the field annotation only when explicitly specified with @Access.
Even when configuring an annotation in a field, since acquiring and configuring values are performed through properties in UniversalDao, getters and setters must be created.
Since the field and property are linked by name, if the names are different, the annotation of the field cannot be referenced by the property. Therefore, be sure to use the same field and property names (getXX, setXX).
Tip
For example, when using a library that generates boilerplate code such as Lombok, take full advantage of the library as configuring the annotation on the field eliminates the need to create a getter.
- javax.persistence.Entity
This annotation is configured in the Entity class corresponding to the database table.
When this annotation is configured, the table name is derived from the class name. The table name is the value obtained by converting the class name (Pascal case) into the snake case (all uppercase).
Book class -> BOOK BookAuthor class -> BOOK_AUTHOR
Tip
If the table name cannot be derived from the class name, specify the table name explicitly using @Table that is described later.
- javax.persistence.Table
This annotation is used to specify the table name.
If a value is specified in the name attribute, that value will be used as the table name. If a value is specified in schema attribute, access the table by specifying the specified schema name as a qualifier. For example, when work is specified in the schema attribute and the table name is users_work, work.users_work is accessed.
- javax.persistence.Access
This annotation is used to specify the location to configure the annotation.
Refers to the field annotation only when explicitly specified in the field.
- javax.persistence.Column
This annotation is used to specify the column name.
If a value is specified in the name attribute, that value will be used as the column name.
Tip
If this annotation is not set, the column name is derived from the property name. The derivation method is the same as the derivation method used for the table name. For details, see @Entity.
- javax.persistence.Id
This annotation is configured in the primary key.
In the case of a compound primary key, configure this annotation to multiple getters or fields.
- javax.persistence.Version
This annotation is configured in the version column used for exclusive control.
This annotation can be specified only for numeric type properties. It does not work properly with string type properties.
When this annotation is set, the version column is automatically added to the condition during update processing, and optimistic locking is performed.
Tip
Only one annotation can be specified in the Entity.
- javax.persistence.Temporal
This annotation specifies how to map the values of java.util.Date and java.util.Calendar types to the database.
Converts the value of the Java object to the database type specified in value attribute and registers it in the database.
- javax.persistence.GeneratedValue
This annotation indicates that the automatically numbered value is registered.
Configures the numbering method to the strategy attribute. When AUTO is configured, the numbering method is selected according to the following rules.
- If there is a Generator configuration corresponding to the generator attribute, performs the numbering process using that Generator.
- If generator is not configured or there is no corresponding Generator configuration, select the numbering method based on Dialect configured in the database function. The priority is in the order IDENTITY → SEQUENCE → TABLE.
Configure an arbitrary name in the generator attribute.
Tip
If @GeneratedValue cannot be used to acquire the sequence object name for sequence numbering or the value that identifies the record for table numbering, derive each value from the table name and column name to be automatically numbered.
Table name "USER", Column name to be numbered "ID" -> USER_ID
- javax.persistence.SequenceGenerator
This annotation has to be configured when using sequence numbering.
In the name attribute, configure the same value as the generator attribute of @GeneratedValue.
Configure the sequence object name created in the database to the sequenceName attribute.
Tip
The numbering function is used to perform sequence numbering. For this reason, numbering configuration must be performed separately.
- javax.persistence.TableGenerator
This annotation is configured when using table numbering.
In the name attribute, configure the same value as the generator attribute of @GeneratedValue.
In the pkColumnValue attribute, configure a value to identify the record in the numbering table.
Tip
The numbering function is used to perform table numbering. For this reason, numbering configuration must be performed separately.
<IP_ADDRESS>. Data types that can be used for Bean¶
Data types that can be used in Bean, which maps search results, are as follows.
Important
Search results cannot be mapped to data types not listed here (runtime exception is thrown).
- java.lang.String
- java.lang.Short
- Primitive types can also be specified. For primitive types,
null
is handled as0
. - java.lang.Integer
- Primitive types can also be specified. For primitive types,
null
is handled as0
. - java.lang.Long
- Primitive types can also be specified. For primitive types,
null
is handled as0
. - java.math.BigDecimal
- java.lang.Boolean
- Primitive types can also be specified. For primitive types,
null
is handled asfalse
. In the case of wrapper type (Boolean), the read method name must start with get. In the case of a primitive type, the read method name may start with ‘is’. - java.util.Date
- The data type has to be specified in the database with @Temporal of JPA.
- java.sql.Date
- java.sql.Timestamp
- byte[]
Be careful not to expand the data in the heap by using this function for the value of data type of very large size such as BLOB. When handling very large binary data, use database access directly and refer to the data through Stream.
For details, see Accessing columns of binary type.


Note
Click here to download the full example code
Example 8 - Warmstarting for MNIST¶
Sometimes it is desired to continue an already finished run because the optimization requires more function evaluations. In other cases, one might wish to use results from previous runs to speed up the optimization. This might be useful if initial runs were done with relatively small budgets, or on only a subset of the data to get an initial understanding of the problem.
Here we shall see how to use the results from example 5 to initialize BOHB’s model. What changed are - the number of training points is increased from 8192 to 32768 - the number of validation points is increased from 1024 to 16384 - the mimum budget is now 3 instead of 1 because we have already quite a few runs for a small number of epochs
Note that the loaded runs will show up in the results of the new run. They are all combined into an iteration with the index -1 and their time stamps are manipulated such that the last run finishes at time 0 with all other times being negative. That info can be used to filter those runs when analysing the run.
import os
import pickle
import argparse
import hpbandster.core.nameserver as hpns
import hpbandster.core.result as hpres
from hpbandster.optimizers import BOHB
import logging
logging.basicConfig(level=logging.DEBUG)
parser = argparse.ArgumentParser(description='Example 1 - sequential and local execution.')
parser.add_argument('--min_budget', type=float, help='Minimum number of epochs for training.', default=3)
parser.add_argument('--max_budget', type=float, help='Maximum number of epochs for training.', default=9)
parser.add_argument('--n_iterations', type=int, help='Number of iterations performed by the optimizer', default=4)
parser.add_argument('--worker', help='Flag to turn this into a worker process', action='store_true')
parser.add_argument('--run_id', type=str, help='A unique run id for this optimization run. An easy option is to use the job id of the clusters scheduler.')
parser.add_argument('--nic_name',type=str, help='Which network interface to use for communication.', default='lo')
parser.add_argument('--shared_directory',type=str, help='A directory that is accessible for all processes, e.g. a NFS share.', default='.')
parser.add_argument('--backend',help='Toggles which worker is used. Choose between a pytorch and a keras implementation.', choices=['pytorch', 'keras'], default='keras')
parser.add_argument('--previous_run_dir',type=str, help='A directory that contains a config.json and results.json for the same configuration space.', default='./example_5_run/')
args=parser.parse_args()
if args.backend == 'pytorch':
from example_5_pytorch_worker import PyTorchWorker as worker
else:
from example_5_keras_worker import KerasWorker as worker
# Every process has to lookup the hostname
host = hpns.nic_name_to_host(args.nic_name)
if args.worker:
import time
time.sleep(5) # short artificial delay to make sure the nameserver is already running
w = worker(run_id=args.run_id, host=host, timeout=120)
w.load_nameserver_credentials(working_directory=args.shared_directory)
w.run(background=False)
exit(0)
# This example shows how to log live results. This is most useful
# for really long runs, where intermediate results could already be
# interesting. The core.result submodule contains the functionality to
# read the two generated files (results.json and configs.json) and
# create a Result object.
result_logger = hpres.json_result_logger(directory=args.shared_directory, overwrite=False)
# Start a nameserver:
NS = hpns.NameServer(run_id=args.run_id, host=host, port=0, working_directory=args.shared_directory)
ns_host, ns_port = NS.start()
# Start local worker
w = worker(run_id=args.run_id, host=host, nameserver=ns_host, nameserver_port=ns_port, timeout=120)
w.run(background=True)
# Let us load the old run now to use its results to warmstart a new run with slightly
# different budgets in terms of datapoints and epochs.
# Note that the search space has to be identical though!
previous_run = hpres.logged_results_to_HBS_result(args.previous_run_dir)
# Run an optimizer
bohb = BOHB( configspace = worker.get_configspace(),
run_id = args.run_id,
host=host,
nameserver=ns_host,
nameserver_port=ns_port,
result_logger=result_logger,
min_budget=args.min_budget, max_budget=args.max_budget,
previous_result = previous_run, # this is how you tell any optimizer about previous runs
)
res = bohb.run(n_iterations=args.n_iterations)
# store results
with open(os.path.join(args.shared_directory, 'results.pkl'), 'wb') as fh:
pickle.dump(res, fh)
# shutdown
bohb.shutdown(shutdown_workers=True)
NS.shutdown()
Total running time of the script: ( 0 minutes 0.000 seconds)


{% extends path+"/../layout.html" %} {% block head %} {% endblock %} {% block fullcol %} Back {% if data['upload-attempt'] == 1 or data['upload-attempt'] == 2 %}
Try taking another photo.
{% else %}Try uploading another photo or scan.
{% endif %} {% if data['upload-attempt'] == 2 %}You photo must meet the rules for fit note photos.
Get more help to get your photo right
Possible error pages: Error 1: try again | Error 2: try again or post | Error 3: try again, use different device or post {% endblock %}


The CSV file you need can be downloaded from the batch report
1. Enter the month (eg. JAN, FEB, MAR, APR)
2. Open the CSV file you would like to analyze


CFTC Positioning Report: JPY net shorts kept climbing
by Pablo PiovanoThese are the main highlights of the latest CFTC Positioning Report for the week ended on November 19th:
- Speculations of a positive outcome from the US-China protracted trade war continued to sustain the exodus from the Japanese safe haven for yet another session, taking JPY net shorts to the highest level since June 11th. In the meantime, President Trump recently reiterated that a deal looks ‘close’ in spite of the stagnant negotiations around the ‘Phase One’ deal.
- Speculators kept scaling back their gross longs in USD, taking the net longs to the lowest level since mid-July amidst alternating risk-appetite trends. In addition, market participants seem unconvinced by the ‘wait-and-see’ stance from the Fed and could be anticipating further rate cuts in the next months, leaving the buck somewhat vulnerable.
- EUR net shorts climbed to fresh multi-week highs as investors shifted their focus to the region’s weak fundamentals. This view was also reinforced by the dovish tone from ECB’s C.Lagarde early last week.


KUNWAR
PARTH
SINGH
thinking, creating,
observing, collecting,
designing, editing,
adapting, improvising
Created Batch Overhaul, a web service to manage jobs in different pods while being able perform actions like hold, disable and clear batches and also visualize their performances real time using Datadog metrics.
Worked in the Ballistic Computer Division to set up the CSD Management System online. Developed the online portal from scratch using Flask, MySQL.
Organized Google IO Extended, 2018 with the help of Google Developers's Group, hosting students from all over the nation in the summer break of 2018.
As a technical official, I conducted various rounds of the game by making judgments on rule infringement, performance, time or ranking.
Managing the finance of the society by deciding annual budget allocations and clearing the bills. Started the weekly technical workshops for society members which turned out to be highly successful. I mentored a team of 20 students, along with whom we orgnaized technical competitions and hackathons.
Organize Technical Fests of Thapar Institute of Engineering and Technology. Conduct workshops on upcoming technologies and global trends in Computer Science
Organize Economics Fest of Thapar InStitute of Engineering and Technology. Meet weekly for discussions on global politics, business and finance
•Created a master-slave distributed system which assembles a cluster instantaneously without any hardware setup or software installation • The slave nodes are added which can perform any job assigned to them by the master • The master system accepts a job and disintegrates into smaller tasks which are then assigned to the slave nodes. Upon completion of the task, the output is sent back to the master which assembles all the outputs and displays the result
24 hour inter college Hackathon organized in TIET
Eduwave: A 20 hour hackathon where my team developed a web app which analyses the attention of a person viewing a video using the Brainwave EEG Headset. This helped the content providers to filter their content using the analyses of different viewers.Amongst top 4500 across the globe to make it into the 2nd round of Google Code Jam, 2018
An app for Postal Service to transport the mails from one H.O. to another H.O. using the shortest path and minimum number of trucks, thus minimizing the cost of transport
18 hour intra college Hackathon organized in TIET
Package Installer: A GUI provided to the package installion. A specified package can be installed from pip, easy-install or .whl files present in the system depending upon the users choice.Competitive Programming contest organized in TIET
A telegram bot which scraps values of two mutual funds- Reliance Top 200 and HDFC Small Caps, from moneycontrol.com and sends on telegram every hour describing the profit/loss
12 hour intra college Hackathon organized in TIET.
The Translator: A web app which converts the English content of website to any language for people who aren’t comfortable in English.
An inter college coding competition where teams were supposed to write complex codes while simultaneously cracking the codes of other teams
Used DarkSky API, Google geocode API and Flicker API which takes the location of user and gives the weather along with a picture of the area.
A calculator for basic and scientific calculations
Can throws any object upto 70m
Physics Project
Came 3rd in Mock IPO and winner in MAAA in Econvista '17, organizedby LSR, DU
Blinks whenever a cell phone in it's vicinity calls someone or gets a call from someone
Bagged 57th rank all India in 10m AIR PISTOL junior category
An active volunteer of the Ramakrishna Mission Ashram. Organized the Annual Durga Puja twice, while promoting the principle of Swami Vivekanand


Contact Us
MuseumStat is a powerful tool created to understand the impact and scope of museums in communities in the United States. We want to ensure that MuseumStat meets your needs and provides you with valuable information.
Please contact us to share any feedback you have regarding future features, data, and analysis that we can provide through MuseumStat.
MuseumStat is a collaborative research project of Drexel University and the Institute of Museum and Library Services. Professor Neville K. Vakharia of Drexel University’s graduate arts administration program is the principal investigator.
Contact Us


Experience
- Developed web pages and forms with functionalities like login, register, forgot password, Email, Filters using JavaScript and HTML5.
- Created HTML navigation menu that is role based menu items changes dynamically, derived from the database in the form of XML.
- Designed, developed and updated User Interface Web Forms using CSS, and JavaScript.
- Implemented faster mobile-friendly applications using Twitter Bootstrap framework.
- Used jQuery plug-ins to implement features as a light box, sliders and other intuitive features.
- Worked closely with Photoshop designers to implement mock-ups and the layouts of the application.
- Developed UI wireframes and HTML web components using Bootstrap framework
- Implemented front end logic that defines behavior of visual elements using Javascript
- Maintained existing UI Applications and upgraded them using CSS, jQuery, AJAX, JavaScript, JSON
- Worked on debugging JavaScript and HTML code with Firefox Firebug and Google chrome JavaScript Debugger
- Involved in resolving reporting issues and design issues throughout the reporting life cycle.
- Participated in design decisions like choosing colors, typography, fonts and layouts for website.