| I l@ve RuBoard |
4.2 Splitting and Joining FilesLike most kids, mine spend a lot of time on the Internet. As far as I can tell, it's the thing to do these days. Among this latest generation, computer geeks and gurus seem to be held with the same sort of esteem that rock stars once were by mine. When kids disappear into their rooms, chances are good that they are hacking on computers, not mastering guitar riffs. It's probably healthier than some of the diversions of my own misspent youth, but that's a topic for another kind of book. But if you have teenage kids and computers, or know someone who does, you probably know that it's not a bad idea to keep tabs on what those kids do on the Web. Type your favorite four-letter word in almost any web search engine and you'll understand the concern -- it's much better stuff than I could get during my teenage career. To sidestep the issue, only a few of the machines in my house have Internet feeds. Now, while they're on one of these machines, my kids download lots of games. To avoid infecting our Very Important Computers with viruses from public-domain games, though, my kids usually have to download games on a computer with an Internet feed, and transfer them to their own computers to install. The problem is that game files are not small; they are usually much too big to fit on a floppy (and burning a CD takes away valuable game playing time). If all the machines in my house ran Linux, this would be a nonissue. There are standard command-line programs on Unix for chopping a file into pieces small enough to fit on a floppy (split), and others for putting the pieces back together to recreate the original file (cat). Because we have all sorts of different machines in the house, though, we needed a more portable solution. 4.2.1 Splitting Files PortablySince all the computers in my house run Python, a simple portable Python script came to the rescue. The Python program in Example 4-1 distributes a single file's contents among a set of part files, and stores those part files in a directory. Example 4-1. PP2E\System\Filetools\split.py#!/usr/bin/python ######################################################### # split a file into a set of portions; join.py puts them # back together; this is a customizable version of the # standard unix split command-line utility; because it # is written in Python, it also works on Windows and can # be easily tweaked; because it exports a function, it # can also be imported and reused in other applications; ######################################################### import sys, os kilobytes = 1024 megabytes = kilobytes * 1000 chunksize = int(1.4 * megabytes) # default: roughly a floppy def split(fromfile, todir, chunksize=chunksize): if not os.path.exists(todir): # caller handles errors os.mkdir(todir) # make dir, read/write parts else: for fname in os.listdir(todir): # delete any existing files os.remove(os.path.join(todir, fname)) partnum = 0 input = open(fromfile, 'rb') # use binary mode on Windows while 1: # eof=empty string from read chunk = input.read(chunksize) # get next part <= chunksize if not chunk: break partnum = partnum+1 filename = os.path.join(todir, ('part%04d' % partnum)) fileobj = open(filename, 'wb') fileobj.write(chunk) fileobj.close() # or simply open( ).write( ) input.close( ) assert partnum <= 9999 # join sort fails if 5 digits return partnum if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == '-help': print 'Use: split.py [file-to-split target-dir [chunksize]]' else: if len(sys.argv) < 3: interactive = 1 fromfile = raw_input('File to be split? ') # input if clicked todir = raw_input('Directory to store part files? ') else: interactive = 0 fromfile, todir = sys.argv[1:3] # args in cmdline if len(sys.argv) == 4: chunksize = int(sys.argv[3]) absfrom, absto = map(os.path.abspath, [fromfile, todir]) print 'Splitting', absfrom, 'to', absto, 'by', chunksize try: parts = split(fromfile, todir, chunksize) except: print 'Error during split:' print sys.exc_type, sys.exc_value else: print 'Split finished:', parts, 'parts are in', absto if interactive: raw_input('Press Enter key') # pause if clicked By default, this script splits the input file into chunks that are roughly the size of a floppy disk -- perfect for moving big files between electronically isolated machines. Most important, because this is all portable Python code, this script will run on just about any machine, even ones without a file splitter of their own. All it requires is an installed Python. Here it is at work splitting the Python 1.5.2 self-installer executable on Windows: C:\temp>echo %X% shorthand shell variable C:\PP2ndEd\examples\PP2E C:\temp>ls -l py152.exe -rwxrwxrwa 1 0 0 5028339 Apr 16 1999 py152.exe C:\temp>python %X%\System\Filetools\split.py -help Use: split.py [file-to-split target-dir [chunksize]] C:\temp>python %X%\System\Filetools\split.py py152.exe pysplit Splitting C:\temp\py152.exe to C:\temp\pysplit by 1433600 Split finished: 4 parts are in C:\temp\pysplit C:\temp>ls -l pysplit total 9821 -rwxrwxrwa 1 0 0 1433600 Sep 12 06:03 part0001 -rwxrwxrwa 1 0 0 1433600 Sep 12 06:03 part0002 -rwxrwxrwa 1 0 0 1433600 Sep 12 06:03 part0003 -rwxrwxrwa 1 0 0 727539 Sep 12 06:03 part0004 Each of these four generated part files represent one binary chunk of file py152.exe, small enough to fit comfortably on a floppy disk. In fact, if you add the sizes of the generated part files given by the ls command, you'll come up with 5,028,339 bytes -- exactly the same as the original file's size. Before we see how to put these files back together again, let's explore a few of the splitter script's finer points. <IP_ADDRESS> Operation modesThis script is designed to input its parameters in either interactive or command-line modes; it checks the number of command-line arguments to know in which mode it is being used. In command-line mode, you list the file to be split and the output directory on the command line, and can optionally override the default part file size with a third command-line argument. In interactive mode, the script asks for a filename and output directory at the console window with raw_input, and pauses for a keypress at the end before exiting. This mode is nice when the program file is started by clicking on its icon -- on Windows, parameters are typed into a pop-up DOS box that doesn't automatically disappear. The script also shows the absolute paths of its parameters (by running them through os.path.abspath) because they may not be obvious in interactive mode. We'll see examples of other split modes at work in a moment. <IP_ADDRESS> Binary file accessThis code is careful to open both input and output files in binary mode (rb, wb), because it needs to portably handle things like executables and audio files, not just text. In Chapter 2, we learned that on Windows, text-mode files automatically map \r\n end-of-line sequences to \n on input, and map \n to \r\n on output. For true binary data, we really don't want any \r characters in the data to go away when read, and we don't want any superfluous \r characters to be added on output. Binary-mode files suppress this \r mapping when the script is run on Windows, and so avoid data corruption. <IP_ADDRESS> Manually closing filesThis script also goes out of its way to manually close its files. For instance: fileobj = open(partname, 'wb') fileobj.write(chunk) fileobj.close( ) As we also saw in Chapter 2, these three lines can usually be replaced with this single line: open(partname, 'wb').write(chunk) This shorter form relies on the fact that the current Python implementation automatically closes files for you when file objects are reclaimed (i.e., when they are garbage collected, because there are no more references to the file object). In this line, the file object would be reclaimed immediately, because the open result is temporary in an expression, and is never referenced by a longer-lived name. The input file similarly is reclaimed when the split function exits. As I was writing this chapter, though, there was some possibility that this automatic-close behavior may go away in the future.[1] Moreover, the JPython Java-based Python implementation does not reclaim unreferenced objects as immediately as the standard Python. If you care about the Java port (or one possible future), your script may potentially create many files in a short amount of time, and your script may run on a machine that has a limit on the number of open files per program, then close manually. The close calls in this script have never been necessary for my purposes, but because the split function in this module is intended to be a general-purpose tool, it accommodates such worst-case scenarios.
4.2.2 Joining Files PortablyBack to moving big files around the house. After downloading a big game program file, my kids generally run the previous splitter script by clicking on its name in Windows Explorer and typing filenames. After a split, they simply copy each part file onto its own floppy, walk the floppies upstairs, and recreate the split output directory on their target computer by copying files off the floppies. Finally, the script in Example 4-2 is clicked or otherwise run to put the parts back together. Example 4-2. PP2E\System\Filetools\join.py#!/usr/bin/python ########################################################## # join all part files in a dir created by split.py. # This is roughly like a 'cat fromdir/* > tofile' command # on unix, but is a bit more portable and configurable, # and exports the join operation as a reusable function. # Relies on sort order of file names: must be same length. # Could extend split/join to popup Tkinter file selectors. ########################################################## import os, sys readsize = 1024 def join(fromdir, tofile): output = open(tofile, 'wb') parts = os.listdir(fromdir) parts.sort( ) for filename in parts: filepath = os.path.join(fromdir, filename) fileobj = open(filepath, 'rb') while 1: filebytes = fileobj.read(readsize) if not filebytes: break output.write(filebytes) fileobj.close( ) output.close( ) if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == '-help': print 'Use: join.py [from-dir-name to-file-name]' else: if len(sys.argv) != 3: interactive = 1 fromdir = raw_input('Directory containing part files? ') tofile = raw_input('Name of file to be recreated? ') else: interactive = 0 fromdir, tofile = sys.argv[1:] absfrom, absto = map(os.path.abspath, [fromdir, tofile]) print 'Joining', absfrom, 'to make', absto try: join(fromdir, tofile) except: print 'Error joining files:' print sys.exc_type, sys.exc_value else: print 'Join complete: see', absto if interactive: raw_input('Press Enter key') # pause if clicked After running the join script, they still may need to run something like zip, gzip, or tar to unpack an archive file, unless it's shipped as an executable;[2] but at least they're much closer to seeing the Starship Enterprise spring into action. Here is a join in progress on Windows, combining the split files we made a moment ago:
C:\temp>python %X%\System\Filetools\join.py -help Use: join.py [from-dir-name to-file-name] C:\temp>python %X%\System\Filetools\join.py pysplit mypy152.exe Joining C:\temp\pysplit to make C:\temp\mypy152.exe Join complete: see C:\temp\mypy152.exe C:\temp>ls -l mypy152.exe py152.exe -rwxrwxrwa 1 0 0 5028339 Sep 12 06:05 mypy152.exe -rwxrwxrwa 1 0 0 5028339 Apr 16 1999 py152.exe C:\temp>fc /b mypy152.exe py152.exe Comparing files mypy152.exe and py152.exe FC: no differences encountered The join script simply uses os.listdir to collect all the part files in a directory created by split, and sorts the filename list to put the parts back together in the correct order. We get back an exact byte-for-byte copy of the original file (proved by the DOS fc command above; use cmp on Unix). Some of this process is still manual, of course (I haven't quite figured out how to script the "walk the floppies upstairs" bit yet), but the split and join scripts make it both quick and simple to move big files around. Because this script is also portable Python code, it runs on any platform we care to move split files to. For instance, it's typical for my kids to download both Windows and Linux games; since this script runs on either platform, they're covered. <IP_ADDRESS> Reading by blocks or filesBefore we move on, there are a couple of details worth underscoring in the join script's code. First of all, notice that this script deals with files in binary mode, but also reads each part file in blocks of 1K bytes each. In fact, the readsize setting here (the size of each block read from an input part file) has no relation to chunksize in split.py (the total size of each output part file). As we learned in Chapter 2, this script could instead read each part file all at once: filebytes = open(filepath, 'rb').read( ) output.write(filebytes) The downside to this scheme is that it really does load all of a file into memory at once. For example, reading a 1.4M part file into memory all at once with the file object read method generates a 1.4M string in memory to hold the file's bytes. Since split allows users to specify even larger chunk sizes, the join script plans for the worst and reads in terms of limited-size blocks. To be completely robust, the split script could read its input data in smaller chunks too, but this hasn't become a concern in practice. <IP_ADDRESS> Sorting filenamesIf you study this script's code closely, you may also notice that the join scheme it uses relies completely on the sort order of filenames in the parts directory. Because it simply calls the list sort method on the filenames list returned by os.listdir, it implicitly requires that filenames have the same length and format when created by split. The splitter uses zero-padding notation in a string formatting expression ('part%04d') to make sure that filenames all have the same number of digits at the end (four), much like this list: >>> list = ['xx008', 'xx010', 'xx006', 'xx009', 'xx011', 'xx111'] >>> list.sort( ) >>> list ['xx006', 'xx008', 'xx009', 'xx010', 'xx011', 'xx111'] When sorted, the leading zero characters in small numbers guarantee that part files are ordered for joining correctly. Without the leading zeroes, join would fail whenever there were more than nine part files, because the first digit would dominate: >>> list = ['xx8', 'xx10', 'xx6', 'xx9', 'xx11', 'xx111'] >>> list.sort( ) >>> list ['xx10', 'xx11', 'xx111', 'xx6', 'xx8', 'xx9'] Because the list sort method accepts a comparison function as an argument, we could in principle strip off digits in filenames and sort numerically: >>> list = ['xx8', 'xx10', 'xx6', 'xx9', 'xx11', 'xx111'] >>> list.sort(lambda x, y: cmp(int(x[2:]), int(y[2:]))) >>> list ['xx6', 'xx8', 'xx9', 'xx10', 'xx11', 'xx111'] But that still implies that filenames all must start with the same length substring, so this doesn't quite remove the file naming dependency between the split and join scripts. Because these scripts are designed to be two steps of the same process, though, some dependencies between them seem reasonable. 4.2.3 Usage VariationsLet's run a few more experiments with these Python system utilities to demonstrate other usage modes. When run without full command-line arguments, both split and join are smart enough to input their parameters interactively. Here they are chopping and gluing the Python self-installer file on Windows again, with parameters typed in the DOS console window: C:\temp>python %X%\System\Filetools\split.py File to be split? py152.exe Directory to store part files? splitout Splitting C:\temp\py152.exe to C:\temp\splitout by 1433600 Split finished: 4 parts are in C:\temp\splitout Press Enter key C:\temp>python %X%\System\Filetools\join.py Directory containing part files? splitout Name of file to be recreated? newpy152.exe Joining C:\temp\splitout to make C:\temp\newpy152.exe Join complete: see C:\temp\newpy152.exe Press Enter key C:\temp>fc /B py152.exe newpy152.exe Comparing files py152.exe and newpy152.exe FC: no differences encountered When these program files are double-clicked in a file explorer GUI, they work the same way (there usually are no command-line arguments when launched this way). In this mode, absolute path displays help clarify where files are really at. Remember, the current working directory is the script's home directory when clicked like this, so the name tempsplit actually maps to a source code directory; type a full path to make the split files show up somewhere else: [in a popup DOS console box when split is clicked] File to be split? c:\temp\py152.exe Directory to store part files? tempsplit Splitting c:\temp\py152.exe to C:\PP2ndEd\examples\PP2E\System\Filetools\ tempsplit by 1433600 Split finished: 4 parts are in C:\PP2ndEd\examples\PP2E\System\Filetools\ tempsplit Press Enter key [in a popup DOS console box when join is clicked] Directory containing part files? tempsplit Name of file to be recreated? c:\temp\morepy152.exe Joining C:\PP2ndEd\examples\PP2E\System\Filetools\tempsplit to make c:\temp\morepy152.exe Join complete: see c:\temp\morepy152.exe Press Enter key Because these scripts package their core logic up in functions, though, it's just as easy to reuse their code by importing and calling from another Python component: C:\temp>python >>> from PP2E.System.Filetools.split import split >>> from PP2E.System.Filetools.join import join >>> >>> numparts = split('py152.exe', 'calldir') >>> numparts 4 >>> join('calldir', 'callpy152.exe') >>> >>> import os >>> os.system(r'fc /B py152.exe callpy152.exe') Comparing files py152.exe and callpy152.exe FC: no differences encountered 0 A word about performance: All the split and join tests shown so far process a 5M file, but take at most one second of real wall-clock time to finish on my Win- dows 98 300 and 650 MHz laptop computers -- plenty fast for just about any use I could imagine. (They run even faster after Windows has cached information about the files involved.) Both scripts run just as fast for other reasonable part file sizes too; here is the splitter chopping up the file into 500,000- and 50,000-byte parts: C:\temp>python %X%\System\Filetools\split.py py152.exe tempsplit 500000 Splitting C:\temp\py152.exe to C:\temp\tempsplit by 500000 Split finished: 11 parts are in C:\temp\tempsplit C:\temp>ls -l tempsplit total 9826 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0001 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0002 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0003 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0004 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0005 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0006 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0007 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0008 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0009 -rwxrwxrwa 1 0 0 500000 Sep 12 06:29 part0010 -rwxrwxrwa 1 0 0 28339 Sep 12 06:29 part0011 C:\temp>python %X%\System\Filetools\split.py py152.exe tempsplit 50000 Splitting C:\temp\py152.exe to C:\temp\tempsplit by 50000 Split finished: 101 parts are in C:\temp\tempsplit C:\temp>ls tempsplit part0001 part0014 part0027 part0040 part0053 part0066 part0079 part0092 part0002 part0015 part0028 part0041 part0054 part0067 part0080 part0093 part0003 part0016 part0029 part0042 part0055 part0068 part0081 part0094 part0004 part0017 part0030 part0043 part0056 part0069 part0082 part0095 part0005 part0018 part0031 part0044 part0057 part0070 part0083 part0096 part0006 part0019 part0032 part0045 part0058 part0071 part0084 part0097 part0007 part0020 part0033 part0046 part0059 part0072 part0085 part0098 part0008 part0021 part0034 part0047 part0060 part0073 part0086 part0099 part0009 part0022 part0035 part0048 part0061 part0074 part0087 part0100 part0010 part0023 part0036 part0049 part0062 part0075 part0088 part0101 part0011 part0024 part0037 part0050 part0063 part0076 part0089 part0012 part0025 part0038 part0051 part0064 part0077 part0090 part0013 part0026 part0039 part0052 part0065 part0078 part0091 Split can take longer to finish, but only if the part file's size is set small enough to generate thousands of part files -- splitting into 1006 parts works, but runs slower (on my computer this split and join take about five and two seconds, respectively, depending on what other programs are open): C:\temp>python %X%\System\Filetools\split.py py152.exe tempsplit 5000 Splitting C:\temp\py152.exe to C:\temp\tempsplit by 5000 Split finished: 1006 parts are in C:\temp\tempsplit C:\temp>python %X%\System\Filetools\join.py tempsplit mypy152.exe Joining C:\temp\tempsplit to make C:\temp\py152.exe Join complete: see C:\temp\py152.exe C:\temp>fc /B py152.exe mypy152.exe Comparing files py152.exe and mypy152.exe FC: no differences encountered C:\temp>ls -l tempsplit ...1000 lines deleted... -rwxrwxrwa 1 0 0 5000 Sep 12 06:30 part1001 -rwxrwxrwa 1 0 0 5000 Sep 12 06:30 part1002 -rwxrwxrwa 1 0 0 5000 Sep 12 06:30 part1003 -rwxrwxrwa 1 0 0 5000 Sep 12 06:30 part1004 -rwxrwxrwa 1 0 0 5000 Sep 12 06:30 part1005 -rwxrwxrwa 1 0 0 3339 Sep 12 06:30 part1006 Finally, the splitter is also smart enough to create the output directory if it doesn't yet exist, or clear out any old files there if it does exist. Because the joiner combines whatever files exist in the output directory, this is a nice ergonomic touch -- if the output directory was not cleared before each split, it would be too easy to forget that a prior run's files are still there. Given that my kids are running these scripts, they need to be as forgiving as possible; your user base may vary, but probably not by much. C:\temp>python %X%\System\Filetools\split.py py152.exe tempsplit 700000 Splitting C:\temp\py152.exe to C:\temp\tempsplit by 700000 Split finished: 8 parts are in C:\temp\tempsplit C:\temp>ls -l tempsplit total 9827 -rwxrwxrwa 1 0 0 700000 Sep 12 06:32 part0001 -rwxrwxrwa 1 0 0 700000 Sep 12 06:32 part0002 -rwxrwxrwa 1 0 0 700000 Sep 12 06:32 part0003 ... ...only new files here... ... -rwxrwxrwa 1 0 0 700000 Sep 12 06:32 part0006 -rwxrwxrwa 1 0 0 700000 Sep 12 06:32 part0007 -rwxrwxrwa 1 0 0 128339 Sep 12 06:32 part0008 |
| I l@ve RuBoard |


You can customize it using the site editor below.

You can upload new static site builds at any time.


Class: Concurrent::PriorityQueue
- Inherits:
-
MutexPriorityQueue
- Object
- MutexPriorityQueue
- Concurrent::PriorityQueue
- Defined in:
- lib/concurrent/collection/priority_queue.rb,
lib/concurrent/collection/priority_queue.rb
Overview
This implementation is not thread safe and performs no blocking.
A queue collection in which the elements are sorted based on their
comparison (spaceship) operator <=>
. Items are added to the queue
at a position relative to their priority. On removal the element
with the "highest" priority is removed. By default the sort order is
from highest to lowest, but a lowest-to-highest sort order can be
set on construction.
The API is based on the Queue
class from the Ruby standard library.
The pure Ruby implementation, MutexPriorityQueue
uses a heap algorithm
stored in an array. The algorithm is based on the work of Robert Sedgewick
and Kevin Wayne.
The JRuby native implementation is a thin wrapper around the standard
library java.util.PriorityQueue
.
When running under JRuby the class PriorityQueue
extends JavaPriorityQueue
.
When running under all other interpreters it extends MutexPriorityQueue
.
Constructor Details
This class inherits a constructor from Concurrent::MutexPriorityQueue


Once the Lua SPOT is ready and deployed, you can add new applications to it by writing a Lua script. The script script is need to be compiled before you can actually send it to the Lua SPOT.
Lua 5.1.4 is needed to compile the Lua scripts that are going to be installed on the Lua SPOT. The Lua source code can be downloaded from http://www.lua.org/ftp/lua-5.1.4.tar.gz. Follow the installation instruction inside the source code archive to install Lua on your machine.
Before writing the script, you have to determine a name for your script. This name will also be your script identifier when installing and calling the script from the Lua SPOT.
The script should be written according to the following standard.
1 2 3 4 5 6 7 8 9 10 11 | appname = {
func1 = function()
-- your code here
end,
func2 = function()
-- your other code here
end,
-- your other functions
}
|
Your application name will be a new table containing all functions that you want to make.
Functions can have one or more parameters. Lua SPOT will only pass one parameter, therefore if you expect more parameters, you have to split the parameters manually. There is a function provided by the Lua SPOT (luaspot.next_token) that will help you split the parameters.
Lua SPOT will only send the parameter using string format. You have to manually convert the string to number or other format you expect if you don’t want to use string. For example, you can use tonumber() function to convert a string to a number.
After writing the script, you have to compile the script into the binary format that later can be installed to the Lua SPOT.
Use the following command to compile the script.:
$ luac -o app.lbc app.lua
Substitue app.lua with your script name and app.lbc will be the binary format of your script.
The binary version of the script can be installed to the Sun SPOT (with Lua SPOT installed) using the help of LuaDeskSpot application. Follow the instruction that has been explained earlier.
In order to use facilities that are provided by Sun SPOT and Lua SPOT, there are several functions that can be used by the Lua script. These functions will be divided into two components, Sun SPOT and Lua SPOT API.
This API provides functions to access functions provided by Sun SPOT.
sunspot.led_on(pos)
Turns on the LED at position pos.
sunspot.led_off(pos)
Turns off the LED at position pos.
sunspot.led_rgb(pos, r, g, b)
Sets the color of LED at position pos with RGB value of (r, g, b).
sunspot.temp_celcius()
Returns temperature value in Celcius.
sunspot.temp_fahrenheit()
Returns temperature value in Fahrenheit.
sunspot.accel_x()
Returns the accelerometer value at x axis.
sunspot.accel_y()
Returns the accelerometer value at y axis.
sunspot.accel_z()
Returns the accelerometer value at z axis.
sunspot.sleep(delay)
Pauses the execution for delay miliseconds.
This API provides functions to access functions provided by Lua SPOT.
luaspot.send(addr, msg)
Sends a message msg to destination address addr using the routing function.
luaspot.send_raw(addr, msg)
Sends a message msg to destination address addr directly without using the routing function.
luaspot.add_id(id)
This function is used to insert a new message id provided in id to the message id table. This table is intended to store all received message id so messages with duplicate id can be dropped.
luaspot.check_id(id)
Checks whether a message id is already marked as received or not.
luaspot.get_new_id()
Returns a new globally unique message id.
luaspot.get_node_addr()
Returns the node address.
luaspot.mem_set(app, var, value)
Stores a value to the persistent storage. The value value is identified by application name app and a variable name var.
luaspot.mem_get(app, var)
Returns a value from the persistent storage. The value is located using the application name app and a variable name var.
luaspot.dispatch(addr, msg)
Dispatches a new message msg from source address addr to the main Lua SPOT message dispatcher.
luaspot.lock(app)
Creates a global lock identified by app. Other threads that are trying to acquire lock with the same identifier will get blocked until the corresponding luaspot.unlock function called.
luaspot.unlock(app)
Releases the lock identified by app.
luaspot.next_token(str)
Gets the next token inside the string str. This function returns two values, the next token and the remaining string.


Apr 12, 2021
本来是为了MSRA的面试看的，谁知道面试时候他根本不问这些，就当扩充知识了吧。
「贝塞尔曲线」有哪些作用和特点，该如何正确使用？ - DBinary的回答 - 知乎
def draw_curve(p_list):
"""
:param p_list: (list of list of int:[[x0, y0], [x1, y1], ...])point set of p
result: (list of list of int:[[x0, y0], [x1, y1], ...])point on curve
"""
= []
result = []
P = p_list.copy()
P = len(p_list)
r for i in range(0, 20923): #2020/09/23
= i/20923
t = de_Casteljau(r, P, t)
x, y
result.append((x, y))return result
def de_Casteljau(n, pointSet_p, t):
"""
:param n: number of control
:param pointSet_p: (list of list of int:[[x0, y0], [x1, y1], ...])point set of p
:param t: t
"""
while(n):
for i in range(0, n-1):
0] = (1-t)*P[i][0] + t*P[i+1][0]
P[i][1] = (1-t)*P[i][1] + t*P[i+1][1]
P[i][-= 1
n 0][0] = int(P[0][0] + 0.5)
P[0][1] = int(P[0][1] + 0.5)
P[return P[0]
In the visual domain, inversion of a renderer for the purposes of scene understanding is typically referred to as inverse graphics.
这个领域接触得很少，大概扫一眼related work。
Generative Models: GAN, VAE, SketchRNN, 还有一篇是Reinforced Adversarial Learning,可以细看一下。
Parametric representation: Bezier, B- Splines, Hermite Splines，三种曲线。还有ICML, 2018的那篇用的RL。
Learning parametric curves: 一般生成Bezier曲线/B样条曲线的方法都是代入t计算。比较新的方法：：BezierEncoder用深度循环模型做的（ECCV 2020）。
这篇文章应该是 ai绘画 的第一篇。
\[ (∆x, ∆y, p_1, p_2, p_3). \]
The first two elements are the offset distance in the x and y directions of the pen from the previous point. The last 3 elements represents a binary one-hot vector of 3 possible states. The fifirst pen state, p1, indicates that the pen is currently touching the paper, and that a line will be drawn connecting the next point with the current point. The second pen state, p2, indicates that the pen will be lifted from the paper after the current point, and that no line will be drawn next. The fifinal pen state, p3, indicates that the drawing has ended, and subsequent points, including the current point, will not be rendered.
基本模型是Sequence-to-Sequence Variational Autoencoder (VAE)，但是是一个双向RNN，即如下图左边所示，encoder先把input正着输入一遍，再倒着输入一遍。
这是latent vector的表达式。
这是他们的视频。
this is the first demonstration of an end-to-end, unsupervised and adversarial inverse graphics agent on challenging real world
下图是SPIRAL结构。


You?
This is your spot to take! We want to hear your story. Get in touch with us and we're happy to host you!
This is your spot to take! We want to hear your story. Get in touch with us and we're happy to host you!
This is your spot to take! We want to hear your story. Get in touch with us and we're happy to host you!
This is your spot to take! We want to hear your story. Get in touch with us and we're happy to host you!


The best Food Blog On the Web
POSTED ON 15 DEC 2013 / DESSERTS
For the fig-swirl: Melt butter over medium heat in a saucepan. Add brown sugar and stir to dissolve. Halve all of the figs and toss in the saucepan with water and lemon juice. Cook over medium heat, stirring frequently, until you have a chunky-jammy mixture. Add salt with one or two stirs, set aside and let cool completely.
Ice cream: In a small pot over medium heat, combine milk, and granulated sugar until sugar is completely dissolved and the milk is just barely lukewarm. Whisk in the egg yolks. Set mixture in the fridge and wait until the fig mixture is cooled.
Using an ice cream machine, pour liquids into the frozen basin and process according to manufacturer instructions, i.e., let spin and thicken for 20 minutes before adding mascarpone, fig jam mixture, and the nuts. Continue to process for +/- 10 minutes. Pour semi-frozen mixture into a Pyrex dish or glass Tupperware. Freeze for at least two hours before serving.
Delicious © 2013 · All Rights Reserved.
Proudly published with Ghost.


 Doloribus ut maiores omnis facere
Fully Secured
Expedita veritatis consequuntur nihil tempore laudantium vitae denat pacta
Daily Update
Et fuga et deserunt et enim. Dolorem architecto ratione tensa raptor marte
IOS & Android Support
Est autem dicta beatae suscipit. Sint veritatis et sit quasi ab aut inventore
Control Everything From One Application
Secure online payment method
- Pay your bills anytime and anywhere. Payment made faster, easier and safer.
- We provide payment services from bills, compound and loan repayments to your local and govenment agencies.
- Simple and convenient. Pay it all online.
- Review and keep track of all your transactions.
Gallery
Checkout Some Screenshots From Our App
Agencies
Check Our Participating Agencies
Frequently Asked Questions
How can we help?
-
I already registered with E-BAYAR Melaka, do i have to register again when using this apps?
You dont have to register again and may use your existing ID and Password.
-
Why do I need to fill up all the details? Is there any charges applied for registration?
We only need basic information about yourself before you can start using the service from E-BAYAR KERAJAAN NEGERI MELAKA portal. You will need to provide the correct information such as your Full Name, ID number (MyKad / Passport / KadKuasa), Mobile number and Email address upon registration. This is important should we need to contact you in the future for reference purposes.
And no, there are no charges applied for you to register with E-BAYAR KERAJAAN NEGERI MELAKA. It’s FREE!
You may want to check our Privacy Policy statement to view our policy on how we keep your information within E-BAYAR KERAJAAN NEGERI MELAKA portal.
-
Is my payment made through MEPS FPX safe?
FPX leverages on the Internet banking services of participating banks and provides fast, secure, reliable, real-time online payment processing. FPX provides a complete end-to-end business transaction, resourceful payment records, simplified reconciliation and reduced risks as fund movements are between established financial institutions. Rest assured, FPX uses authentication and certification to ensure transaction is secured.
-
Are there any charges for payments via FPX?
Bank charge of RM 0.50 will be borne by account holder for payment through individual account & RM 1 for company account.
Contact
Got a question? Send us an email.
Address
Bahagian Teknologi Maklumat Dan Komunikasi Aras 1, Blok Temenggong, Seri Negeri, Hang Tuah Jaya, 75450 Ayer Keroh, Melaka, Malaysia
Call Us
+606-3333333 ext 7656/7749
Email Us
<EMAIL_ADDRESS>Working Hours
Mon - Fri: 9AM to 5PM
Sunday: 9AM to 1PM


NRPN 21,0 on the Editor output channel reports the attributes and {_timestamp} of a {_program} file, in response to {MIDI_Program_Read_Attributes} NRPN 85,0 on the Editor input. The Bank MSB and the Data MSB specify the bank and program number. If the file exists, it is preceded by a {MIDI_timestamp_sysex}. A Data LSB contains the program flags attribute, but the bottom two bits are never 2 because there is no such thing as a "modified" file.


Ross Kopelman followed you
Follow
Professor Adams Made an announcement
September 10 at 3:00pm
DISCUSSIONS
2
Professor Lai
made an announcement in
Biosensor and Entrepreneurship
no new post notifications
FILES/DUCUMENTS
2
.PDF
File Name
Download File
.DOC
File Name
Download File
.XLS
File Name
Download File
.PPT
File Name
Download File
.ZIP
File Name
Download File
no new event invitations
Professor Adams
September 10 at 3:00pm
Hey Class, today we will cover dynamic feedback loops in skin worn biosensors
My Latest Follower
Ross Kopelman
Follow


|
ReactPhysics3D
0.7.1
Physics engine library
|
This class represents a simple generic associative map. More...
#include <Map.h>
Classes | |
| class | Iterator |
| Class Iterator. More... | |
Public Member Functions | |
| Map (MemoryAllocator &allocator, size_t capacity=0) | |
| Constructor. | |
| Map (const Map< K, V > &map) | |
| Copy constructor. | |
| ~Map () | |
| Destructor. | |
| void | reserve (int capacity) |
| Allocate memory for a given number of elements. | |
| bool | containsKey (const K &key) const |
| Return true if the map contains an item with the given key. | |
| void | add (const Pair< K, V > &keyValue, bool insertIfAlreadyPresent=false) |
| Add an element into the map. | |
| Iterator | remove (const Iterator &it) |
| Remove the element pointed by some iterator This method returns an iterator pointing to the element after the one that has been removed. | |
| Iterator | remove (const K &key) |
| Remove the element from the map with a given key This method returns an iterator pointing to the element after the one that has been removed. | |
| void | clear () |
| Clear the map. | |
| int | size () const |
| Return the number of elements in the map. | |
| int | capacity () const |
| Return the capacity of the map. | |
| Iterator | find (const K &key) const |
| Try to find an item of the map given a key. More... | |
| V & | operator[] (const K &key) |
| Overloaded index operator. | |
| const V & | operator[] (const K &key) const |
| Overloaded index operator. | |
| bool | operator== (const Map< K, V > &map) const |
| Overloaded equality operator. | |
| bool | operator!= (const Map< K, V > &map) const |
| Overloaded not equal operator. | |
| Map< K, V > & | operator= (const Map< K, V > &map) |
| Overloaded assignment operator. | |
| Iterator | begin () const |
| Return a begin iterator. | |
| Iterator | end () const |
| Return a end iterator. | |
This class represents a simple generic associative map.
This map is implemented with a hash table.
|
inline |
Try to find an item of the map given a key.
The method returns an iterator to the found item or an iterator pointing to the end if not found


Functions | |
| void | CSL_ospiEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI By definition, target can handle read/write transaction as long as it is enabled. More... | |
| void | CSL_ospiDacEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI Direct Access Controller. More... | |
| void | CSL_ospiXipEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI XIP Controller. More... | |
| void | CSL_ospiSetModeBits (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t flashModeVal) |
| This function sets the Mode bits which are sent to the device following address. More... | |
| void | CSL_ospiPhyEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI PHY mode. More... | |
| void | CSL_ospiPipelinePhyEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI pipeline PHY mode. More... | |
| void | CSL_ospiDtrEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| This function enables/disables the OSPI DTR protocol. More... | |
| void | CSL_ospiSetPreScaler (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t clkDividerVal) |
| Set the OSPI clock register divider value. More... | |
| void | CSL_ospiSetClkMode (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t clkMode) |
| This function configures the OSPI to work in different clock modes. More... | |
| void | CSL_ospiSetChipSelect (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t chipSelect, uint32_t decSelect) |
| This function configures the chip select polarity for a selected chip select. This can only be done if OSPI module is not busy. More... | |
| void | CSL_ospiSetDevDelay (const CSL_ospi_flash_cfgRegs *pRegs, const uint32_t *delays) |
| This function configures the device delays This can only be done if OSPI controller is idle. More... | |
| void | CSL_ospiSetDevSize (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t numAddrBytes, uint32_t pageSize, uint32_t blkSize) |
| Set device size configrations. More... | |
| void | CSL_ospiSetIndTrigAddr (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t indTrigAddr) |
| Set Indirect Trigger Address. More... | |
| void | CSL_ospiSetWrCompAutoPolling (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t pollingState) |
| Set write completion auto polling configuration. More... | |
| void | CSL_ospiSetSramPartition (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t partition) |
| Set SRAM partition configuration. More... | |
| void | CSL_ospiIntrEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t intrFlag, uint32_t enable) |
| This Function enables/diables only specified OSPI interrupts. More... | |
| uint32_t | CSL_ospiIntrStatus (const CSL_ospi_flash_cfgRegs *pRegs) |
| This function returns the status of interrupts. It specifies whether an interrupt is active or inactive. After an interrupt is serviced, the software must set to 0 the corresponding flag in the interrupt status register. More... | |
| void | CSL_ospiIntrClear (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t intrFlag) |
| This Function clears the status of specified interrupts. More... | |
| uint32_t | CSL_ospiGetSramLvl (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t read) |
| This Function gets the OSPI SRAM FIFO fill level bytes. More... | |
| int32_t | CSL_ospiCmdRead (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t cmd, uint32_t rxLen) |
| Read operation in config mode. More... | |
| int32_t | CSL_ospiCmdWrite (const CSL_ospi_flash_cfgRegs *pRegs, const uint8_t *cmdBuf, uint32_t cmdLen, const uint8_t *txBuf, uint32_t txLen) |
| Write operation in config mode. More... | |
| void | CSL_ospiConfigRead (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t cmd, uint32_t mode, uint32_t dummyClk) |
| Setup read operation transfer mode. More... | |
| void | CSL_ospiIndReadExecute (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t rxLen) |
| Execute read operation in indirect transfer mode. More... | |
| void | CSL_ospiClrIndReadComplete (const CSL_ospi_flash_cfgRegs *pRegs) |
| Clear indirect read operation done status. More... | |
| uint32_t | CSL_ospiIndReadComplete (const CSL_ospi_flash_cfgRegs *pRegs) |
| Check if indirect read operation is done. More... | |
| void | CSL_ospiReadFifoData (uintptr_t indAddr, uint8_t *dest, uint32_t rdLen) |
| Read data from the SRAM FIFO. More... | |
| void | CSL_ospiWriteSetup (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t cmd, uint32_t mode) |
| Setup write operation transfer mode. More... | |
| uint32_t | CSL_ospiIsIndWriteComplete (const CSL_ospi_flash_cfgRegs *pRegs) |
| Check if indirect write operation is done. More... | |
| void | CSL_ospiClrIndWriteComplete (const CSL_ospi_flash_cfgRegs *pRegs) |
| Clear indirect write operation done status. More... | |
| void | CSL_ospiIndWriteExecute (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t txLen) |
| Execute write operation in indirect transfer mode. More... | |
| void | CSL_ospiIndWriteCancel (const CSL_ospi_flash_cfgRegs *pRegs) |
| Cancel write operation in indirect transfer mode. More... | |
| void | CSL_ospiWriteFifoData (uintptr_t indAddr, const uint8_t *src, uint32_t wrLen) |
| Write data to the SRAM FIFO. More... | |
| void | CSL_ospiLoopbackClkEnable (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t enable) |
| Enable the adapted loopback clock circuit. More... | |
| uint32_t | CSL_ospiIsIdle (const CSL_ospi_flash_cfgRegs *pRegs) |
| Check if OSPI is idle or not. More... | |
| void | CSL_ospiFlashExecCmd (const CSL_ospi_flash_cfgRegs *pRegs) |
| Excecute the flash read/write command. More... | |
| uint32_t | CSL_ospiFlashExecCmdComplete (const CSL_ospi_flash_cfgRegs *pRegs) |
| Check the flash command execution status. More... | |
| void | CSL_ospiConfigPhy (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t masterDelay, const uint32_t *pSlaveDelay) |
| Configure the PHY. More... | |
| void | CSL_ospiFlashStig (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t cmd, uint32_t addr, uint32_t data) |
| Set configurations for a flash STIG command. More... | |
| void | CSL_ospiIndSetStartAddr (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t startAddr, uint32_t read) |
| Configure the read or wrtie start address in Indirect mode. More... | |
| void | CSL_ospiSetDataReadCapDelay (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t delay) |
| Set the read data capture delay. More... | |
| void | CSL_ospiSetCsSotDelay (const CSL_ospi_flash_cfgRegs *pRegs, uint32_t delay) |
| Set the Chip Select Start of Transfer delay. More... | |
| void CSL_ospiClrIndReadComplete | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Clear indirect read operation done status.
This function clears the indirect completion status in the Indirect Read Transfer Control Register.
| pRegs | [IN] OSPI flash config register base. |
| none |
| void CSL_ospiClrIndWriteComplete | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Clear indirect write operation done status.
This function clears the indirect completion status in the Indirect Write Transfer Control Register.
| pRegs | [IN] OSPI flash config register base. |
| none |
| int32_t CSL_ospiCmdRead | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | cmd, | ||
| uint32_t | rxLen | ||
| ) |
Read operation in config mode.
This function performs the read operation in config mode.
| pRegs | [IN] OSPI flash config register base. |
| cmd | [IN] Flash command opcode. |
| rxLen | [IN] Number of read data bytes |
| int32_t CSL_ospiCmdWrite | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| const uint8_t * | cmdBuf, | ||
| uint32_t | cmdLen, | ||
| const uint8_t * | txBuf, | ||
| uint32_t | txLen | ||
| ) |
Write operation in config mode.
This function performs the write operation in config mode.
| pRegs | [IN] OSPI flash config register base. |
| cmd | [IN] Pointer to the flash command buffer. |
| cmdLen | [IN] Command buffer size in bytes. |
| txBuf | [IN] Pointer to the write data buffer |
| txLen | [IN] Number of write data bytes |
| void CSL_ospiConfigPhy | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | masterDelay, | ||
| const uint32_t * | pSlaveDelay | ||
| ) |
Configure the PHY.
This function configures and calibrates the PHY
| pRegs | [IN] OSPI flash config register base. |
| masterDelay | [IN] Initial number of delay elements for Master DLL |
| pDelay | [IN] Point to initial number of delay elements for Slave DLL if pDelay == NULL, do calibration operation |
| none |
| void CSL_ospiConfigRead | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | cmd, | ||
| uint32_t | mode, | ||
| uint32_t | dummyClk | ||
| ) |
Setup read operation transfer mode.
This function setup the configurations for read operation transfer mode.
| pRegs | [IN] OSPI flash config register base. |
| cmd | [IN] command opcode. |
| mode | [IN] data transfer mode (single/dual/quad mode) |
| dummyClk | [IN] Number of dummy clock cycles required for read op |
| none |
| void CSL_ospiDacEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI Direct Access Controller.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI DAC, FALSE: disable OSPI DAC |
| none |
| void CSL_ospiDtrEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI DTR protocol.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI DTR protocol FALSE: disable OSPI DTR protocol |
| none |
| void CSL_ospiEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI By definition, target can handle read/write transaction as long as it is enabled.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI to handle read/write transaction FALSE: disable OSPI once current transaction of the data word is complete |
| none |
| void CSL_ospiFlashExecCmd | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Excecute the flash read/write command.
This function excecute the flash read/write command
| pRegs | [IN] OSPI flash config register base. |
| none |
| uint32_t CSL_ospiFlashExecCmdComplete | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Check the flash command execution status.
This function checks the execution status of the flash read/write command
| pRegs | [IN] OSPI flash config register base. |
| status | TRUE: command execution completed FALSE: command execution in progress |
| void CSL_ospiFlashStig | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | cmd, | ||
| uint32_t | addr, | ||
| uint32_t | data | ||
| ) |
Set configurations for a flash STIG command.
This function sets the command address, data and contorl for a generic STIG command
| pRegs | [IN] OSPI flash config register base. |
| none |
| uint32_t CSL_ospiGetSramLvl | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | read | ||
| ) |
This Function gets the OSPI SRAM FIFO fill level bytes.
| pRegs | [IN] OSPI flash config register base. |
| read | [IN] TRUE: indirect read, FALSE: indirect write |
| SRAM | fifo fill level in bytes |
| uint32_t CSL_ospiIndReadComplete | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Check if indirect read operation is done.
This function checks if indirect read operation is done
| pRegs | [IN] OSPI flash config register base. |
| status | TRUE: read is done, FALSE: read is in progress |
| void CSL_ospiIndReadExecute | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | rxLen | ||
| ) |
Execute read operation in indirect transfer mode.
This function kicks off the read operation in indirect transfer mode.
| pRegs | [IN] OSPI flash config register base. |
| rxLen | [IN] read length in bytes. |
| none |
| void CSL_ospiIndSetStartAddr | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | startAddr, | ||
| uint32_t | read | ||
| ) |
Configure the read or wrtie start address in Indirect mode.
This function configures indac read or write start address
| pRegs | [IN] OSPI flash config register base. |
| startAddr | [IN] Indirect access start address |
| read | [IN] TRUE: read operation; FALSE: write operation |
| none |
| void CSL_ospiIndWriteCancel | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Cancel write operation in indirect transfer mode.
This function cancels the write operation in indirect transfer mode.
| pRegs | [IN] OSPI flash config register base. |
| none |
| void CSL_ospiIndWriteExecute | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | txLen | ||
| ) |
Execute write operation in indirect transfer mode.
This function performs the write operation in indirect transfer mode.
| pRegs | [IN] OSPI flash config register base. |
| txLen | [IN] write length in bytes. |
| none |
| void CSL_ospiIntrClear | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | intrFlag | ||
| ) |
This Function clears the status of specified interrupts.
| pRegs | [IN] OSPI flash config register base. |
| intrMask | [IN] mask value for the interrupts to be cleared. given by CSL_OspiIntrMask_t. |
| none |
| void CSL_ospiIntrEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | intrFlag, | ||
| uint32_t | enable | ||
| ) |
This Function enables/diables only specified OSPI interrupts.
| pRegs | [IN] OSPI flash config register base. |
| intrMask | [IN] mask value for the interrupts to be enabled. Supported values are given by the CSL_OspiIntrMask_t. |
| enable | [IN] TRUE: enable the specified OSPI interrupts FALSE: disable the specified OSPI interrupts |
| none |
| uint32_t CSL_ospiIntrStatus | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
This function returns the status of interrupts. It specifies whether an interrupt is active or inactive. After an interrupt is serviced, the software must set to 0 the corresponding flag in the interrupt status register.
| pRegs | [IN] OSPI flash config register base. |
| status | All the interrupt status. The return status can take value from the CSL_OspiIntrMask_t. |
| uint32_t CSL_ospiIsIdle | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Check if OSPI is idle or not.
This function checks the OSPI idle status
| pRegs | [IN] OSPI flash config register base. |
| idle | status TRUE: OSPI is idle, FALSE: OSPI is busy |
| uint32_t CSL_ospiIsIndWriteComplete | ( | const CSL_ospi_flash_cfgRegs * | pRegs | ) |
Check if indirect write operation is done.
This function checks if indirect write operation is done
| pRegs | [IN] OSPI flash config register base. |
| status | TRUE: write is done, FALSE: write is in progress |
| void CSL_ospiLoopbackClkEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
Enable the adapted loopback clock circuit.
This function enables the loopback mode.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI loopback clock FALSE: disable OSPI loopback clock |
| none |
| void CSL_ospiPhyEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI PHY mode.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI PHY mode FALSE: disable OSPI PHY mode |
| none |
| void CSL_ospiPipelinePhyEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI pipeline PHY mode.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI pipeline PHY mode FALSE: disable OSPI pipeline PHY mode |
| none |
| void CSL_ospiReadFifoData | ( | uintptr_t | indAddr, |
| uint8_t * | dest, | ||
| uint32_t | rdLen | ||
| ) |
Read data from the SRAM FIFO.
This function reads the data from the SRAM FIFO in indirect transfer mode.
| indAddr | [IN] OSPI indirect AHB base address. |
| dest | [IN] Destination address to copy the read data |
| rdLen | [IN] read length in bytes |
| none |
| void CSL_ospiSetChipSelect | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | chipSelect, | ||
| uint32_t | decSelect | ||
| ) |
This function configures the chip select polarity for a selected chip select. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| chipSelect | [IN] Peripheral chip select lines. Supported values are according to CSL_OspiChipSelect_t. |
| decSelect | [IN] Peripheral select decode. Supported values are according to CSL_OspiDecSelect_t. |
| none |
| void CSL_ospiSetClkMode | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | clkMode | ||
| ) |
This function configures the OSPI to work in different clock modes.
The combination of Clock phase and clock polarity creates the SPI mode. Most serial flash devices support only mode 0 and mode 3. Changing the clock polarity also swaps the transmit/receive clock edge relationship. If a slave device states that it receives data on the rising edge and transmits on the falling edge of the clock, then it can only support mode 0 or 3. This can only be done if OSPI module is not busy.
The 4 possible modes are :
CKP CKPH Description 0 0 Data input captured on rising edge of ospi1_sclk clock. Data output generated on falling edge of ospi1_sclk clock 0 1 Data input captured on falling edge of ospi1_sclk clock. Data output generate on rising edge of ospi1_sclk clock 1 0 Data input captured on falling edge of ospi1_sclk clock. Data output generated on rising edge of ospi1_sclk clock 1 1 Data input captured on rising edge of ospi1_sclk clock. Data output generated on falling edge of ospi1_sclk clock
| pRegs | [IN] OSPI flash config register base. |
| clkMode | [IN] Mode required to be selected. Supported values given by CSL_OspiClkMode_t |
| none |
| void CSL_ospiSetCsSotDelay | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | delay | ||
| ) |
Set the Chip Select Start of Transfer delay.
This function sets the Chip Select Start of Transfer delay in # of ref_clk cycles
| pRegs | [IN] OSPI flash config register base. |
| delay | [IN] delay in # of ref_clk cycle |
| none |
| void CSL_ospiSetDataReadCapDelay | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | delay | ||
| ) |
Set the read data capture delay.
This function sets the read data capture delay in # of ref_clk cycles
| pRegs | [IN] OSPI flash config register base. |
| delay | [IN] delay in # of ref_clk cycle |
| none |
| void CSL_ospiSetDevDelay | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| const uint32_t * | delays | ||
| ) |
This function configures the device delays This can only be done if OSPI controller is idle.
| pRegs | [IN] OSPI flash config register base. |
| delays | [IN] Pointer to the device delay array |
| none |
| void CSL_ospiSetDevSize | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | numAddrBytes, | ||
| uint32_t | pageSize, | ||
| uint32_t | blkSize | ||
| ) |
Set device size configrations.
This function configures the number af Address Bytes, device page size and block size. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| numAddrBytes | [IN] Number of Address bytes to be sent for memory mapped protocol translator. Supported values are given by CSL_OspiMemMapNumAddrBytes_t. |
| pageSize | [IN] Device page size in bytes. |
| blkSize | [IN] Device block size in bytes. |
| none |
| void CSL_ospiSetIndTrigAddr | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | indTrigAddr | ||
| ) |
Set Indirect Trigger Address.
This function sets the base address that will be used by the AHB controller. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| indTrigAddr | [IN] Indirect Trigger Address, base address used by the AHB controller. |
| none |
| void CSL_ospiSetModeBits | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | flashModeVal | ||
| ) |
This function sets the Mode bits which are sent to the device following address.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] Mode bit value to be set |
| none |
| void CSL_ospiSetPreScaler | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | clkDividerVal | ||
| ) |
Set the OSPI clock register divider value.
This function sets the OSPI clock control register with serial data clock divider ratio (DCLK_DIV) according to the input clock provided and the output clock required. DCLK_DIV = ((input clock) / (output clock)) - 1. This function also enables the clock for OSPI module. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| clkDividerVal | [IN] clock divider value to be set. |
| none |
| void CSL_ospiSetSramPartition | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | partition | ||
| ) |
Set SRAM partition configuration.
This function configures the size of the indirect read partition in the SRAM, in units of SRAM locations. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| partition | [IN] Auto polling state. Supported values are given by CSL_OspiWriteCompAutoPolling_t. |
| none |
| void CSL_ospiSetWrCompAutoPolling | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | pollingState | ||
| ) |
Set write completion auto polling configuration.
This function configures the write compltion auto polling state. This can only be done if OSPI module is not busy.
| pRegs | [IN] OSPI flash config register base. |
| pollingState | [IN] Auto polling state. Supported values are given by CSL_OspiWriteCompAutoPolling_t. |
| none |
| void CSL_ospiWriteFifoData | ( | uintptr_t | indAddr, |
| const uint8_t * | src, | ||
| uint32_t | wrLen | ||
| ) |
Write data to the SRAM FIFO.
This function writes the data to the SRAM FIFO in indirect transfer mode.
| indAddr | OSPI Indirect AHB base address |
| src | Source address to copy the write data |
| wrLen | write length in bytes |
| none |
| void CSL_ospiWriteSetup | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | cmd, | ||
| uint32_t | mode | ||
| ) |
Setup write operation transfer mode.
This function setup the configurations for write operation transfer mode.
| pRegs | [IN] OSPI flash config register base. |
| cmd | [IN] command opcode. |
| mode | [IN] data transfer mode (single/dual/quad mode) |
| none |
| void CSL_ospiXipEnable | ( | const CSL_ospi_flash_cfgRegs * | pRegs, |
| uint32_t | enable | ||
| ) |
This function enables/disables the OSPI XIP Controller.
| pRegs | [IN] OSPI flash config register base. |
| enable | [IN] TRUE: enable OSPI XIP, FALSE: disable OSPI XIP |
| none |


There was an internal server error. Rest assured that the monkeys are most likely working on it, and then try again later. If you keep seeing this message, make sure to contact your local developer and tell him that the machine blew up again. He (or she) will know exactly what that means, and hopefully the page that you loaded will be in tip-top shape before you know it.
Do especially let the developers know if you get this message, and then the page fails to connect entirely (but your Internet is still working perfectly fine). This means that the server crashed, and unless it is manually restarted from the same machine, it won't work anymore. Thank you for your patience, and for reading this message of course :)


Callum Smith needs super-fights to be considered as good as Carl Froch and Joe Calzaghe
Smith defends his super-middleweight title against John Ryder tonight but has his eyes on much bigger fights next year
by Barry McGuigan, https://www.mirror.co.uk/authors/barry-mcguigan/In the history of a brilliant division for boxers from these isles it is hard to know where WBA super-middleweight champion Callum Smith stands.
He just needs more of the super fights to be considered in the same breath as Carl Froch, Joe Calzaghe, Nigel Benn, Chris Eubank, Steve Collins and George Groves.
His date with John Ryder at the Echo Arena in Liverpool this weekend does not quite fill that brief though there is enough interest in it to keep him honest.
Ryder is a tough kid, a southpaw with a heavy punch. But at 5ft 9ins he has problems against taller guys.
I watched him coming through in the amateurs. He stood out back then and won an ABA senior novice title in the same year as my son, Shane. But when you step up to elite level it gets much tougher.
After The Bell: Watch Mirror Fighting's new boxing show
Mirror Fighting has launched a new weekly boxing show in association with Betfair in which we analyse the latest big fights, play matchmaker, and preview forthcoming bouts.
Former super-middleweight world champion George Groves provides expert analysis.
To watch the latest show in full, click here.
Ryder leans back with a low centre of gravity which means Smith has to punch down, making him vulnerable to counters.
Though it will be fascinating to see how Smith deals with that he has the tools to beat anybody, as he showed in ending the career of Groves.
At 6ft 3 ins he is a big lump at 168lb and for me the No.1 super middleweight in the world ahead of Billy Joe Saunders, David Benavidez and Caleb Plant.
Smith is equally proficient in the trenches as he is at distance, and a world class puncher. That left hook either to the body or the head is devastating.
He is looking for big fights now. He wants Saul Alvarez, which would be a great fight fot him and a chance to avenge his brother Liam’s defeat to Canelo three years ago.
He is talking of going up if he can’t land a big fish. I would counsel against that for now. The light-heavyweight division is red hot and he would not carry the same size advantage.
Also on the Liverpool bill is my cruiserweight Chris Billam-Smith, who is looking to bounce back after a razor thin first defeat to Richard Riakporhe.
He is up against Craig Glover for the vacant Commonwealth title and knows how important this fight is.
He has improved in every department since July and has been massively inspired by Josh Taylor’s epic victory over Regis Prograis and Luke Campbell’s brave display against Vasyl Lomachenko.
The defeat to Riakporhe was by split-decision but a loss nevertheless. You don’t want to make a habit of coming second in this game.
Follow Barry on Twitter at @ClonesCyclone , @McGuigans_Gym and @CyclonePromo


Hepatitis outbreak tops 1 600 confirmed cases 21 Nov 2019, 07:01 by Nuusita Ashipala Home \ National \ Hepatitis outbreak tops 1 600 confirmed cases - New Era Live


NeumorphismPRO
Neumorphism inspired User Interface Kit that will help you prototype and design beautiful, creative and modern websites.
A Themesberg production@@include('./_head.html', { "path": "../..", "title": "Neumorph Pro Components - All" })
@@include('./_navigation.html', { "path": "../..", "classes": "navbar-dark" })Neumorphism inspired User Interface Kit that will help you prototype and design beautiful, creative and modern websites.
A Themesberg production


Abstract
IRRIG is an ontology specified for modeling data from a decision support system (DSS) experimented in TSCF, INRAE center Clermont Ferrand. The DSS automatize the IRRINOV©, a manual irrigation method build by Arvalis and their partners.


| Biostrings::Biostrings2Classes | A short presentation of the basic classes defined in Biostrings 2 | source | R code | ||
| Biostrings::BiostringsQuickOverview | Biostrings Quick Overview | source | |||
| Biostrings::MultipleAlignments | Multiple Alignments | source | R code | ||
| Biostrings::PairwiseAlignments | Pairwise Sequence Alignments | source | R code | ||
| Biostrings::matchprobes | Handling probe sequence information | source | R code |


[§708-8253] Arson in the third degree. (1) A person commits the offense of arson in the third degree if the person intentionally or knowingly sets fire to or causes to be burned property and:
(a) Negligently places another person in danger of death or bodily injury; or
(b) Knowingly or recklessly damages the property of another, without the other's consent, in an amount exceeding $500.
(2) Arson in the third degree is a class C felony. [L 2006, c 181, pt of §1]


Building a high growth, high quality debt management services company
We’re a group of companies within the credit management services industry. We are primarily focusing on large and high growth NPL markets, and have operations in Spain, Italy, Germany, Norway and Sweden. We have an ambitious Pan-European growth strategy and are continuously exploring new markets in Europe.
Annual General Meeting 2017


{% block menu %}
Home
Current Projects
Past Projects
All Projects
Resume
Contact
Menu
Home
Current Projects
Past Projects
All Projects
Resume
Contact
{% endblock menu %}


1 write to s_ints
System.Management.Automation (1)
engine\interpreter\InstructionList.cs (1)
377
s_ints
= new Instruction[PushIntMaxCachedValue - PushIntMinCachedValue + 1];
3 references to s_ints
System.Management.Automation (3)
engine\interpreter\InstructionList.cs (3)
375
if (
s_ints
== null)
381
Emit(
s_ints
[i] ?? (
s_ints
[i] = new LoadObjectInstruction(value)));


15
The LORD Will Not Relent
1 Then the LORD said to me, “Though Moses and Samuel stood before me, yet my heart would not turn toward this people. Send them out of my sight, and let them go!
2 And when they ask you, ‘Where shall we go?’ you shall say to them, ‘Thus says the LORD:
“ ‘Those who are for pestilence, to pestilence,
and those who are for the sword, to the sword;
those who are for famine, to famine,
and those who are for captivity, to captivity.’
3 I will appoint over them four kinds of destroyers, declares the LORD: the sword to kill, the dogs to tear, and the birds of the air and the beasts of the earth to devour and destroy.
4 And I will make them a horror to all the kingdoms of the earth because of what Manasseh the son of Hezekiah, king of Judah, did in Jerusalem.
5 “Who will have pity on you, O Jerusalem,
or who will grieve for you?
Who will turn aside
to ask about your welfare?
6 You have rejected me, declares the LORD;
you keep going backward,
so I have stretched out my hand against you and destroyed you—
I am weary of relenting.
7 I have winnowed them with a winnowing fork
in the gates of the land;
I have bereaved them; I have destroyed my people;
they did not turn from their ways.
8 I have made their widows more in number
than the sand of the seas;
I have brought against the mothers of young men
a destroyer at noonday;
I have made anguish and terror
fall upon them suddenly.
9 She who bore seven has grown feeble;
she has fainted away;
her sun went down while it was yet day;
she has been shamed and disgraced.
And the rest of them I will give to the sword
before their enemies,
declares the LORD.”
Jeremiah's Complaint
10 Woe is me, my mother, that you bore me, a man of strife and contention to the whole land! I have not lent, nor have I borrowed, yet all of them curse me.
11 The LORD said, “Have I not set you free for their good?
In your forbearance take me not away;
know that for your sake I bear reproach.
16 Your words were found, and I ate them,
and your words became to me a joy
and the delight of my heart,
for I am called by your name,
O LORD, God of hosts.
17 I did not sit in the company of revelers,
nor did I rejoice;
I sat alone, because your hand was upon me,
for you had filled me with indignation.
18 Why is my pain unceasing,
my wound incurable,
refusing to be healed?


}
Search the NYTimes article archives
Search
Number of articles
Start Year (archives date back to Sept. 18, 1851)
End Year
Submit


Start Virtual Visits with Seniors
Connecting during COVID-19
♦
Seniors
of long-term care residents can see family in person now
trained student ready to make virtual visits
older adults in US would benefit from companionship
We want to help anyone that needs help (families, long-term care facilities, etc). Please reach out below if would like us to provide companionship and social support from our volunteers.


Home
Projects
Resume
About
1 year ago • 145 notes
1 year ago • 41 notes
1 year ago • 64 notes
1 year ago • 57 notes
1 year ago • 129 notes
1 year ago • 197 notes
1 year ago • 80 notes
1 year ago • 145 notes
1 year ago • 41 notes
1 year ago • 64 notes
1 year ago • 57 notes
1 year ago • 129 notes
1 year ago • 197 notes
1 year ago • 80 notes


Homepage Report:
kinderTech
We created this website page to help us in our further creations. It is designed to show the projects we did and the things we created. It will be further used to publish and share the things we create with the world.
Acknowledge
Here are a few people that helped us create our website.
- Santiago A and O
- They inspired us with their logo and creating a black and white design for it. You can find their website https://igoogoo.github.io/homepage/
- Wikipedia
- Wikipedia helped us with our information and gave us knowledge.You can find their website here
https://www.wikipedia.org/
To improve
-- Here are a few ideas about what we could improve to make our project better.
-
Colors -- We could add more colors to our website as it is designed for children.
-
Socail Media -- We should give it socail medias like, Instagram, Facebook, and a Twitter.
Technology
-- Here are a few things we learned during the project.
- h tag
- We learned that the numbers next to the h tag indicate how big the font is. h1 is the biggest font it can go and h6 is the smallest.
- end and beginning tab
- We also learned the difference between a beginning tab and an end tab.
Edgility Class
LAS


Look: Jadakiss Shares Pic Of His Daughter On Her 16th B-Day: “My Heart”
by Team SOHHThe LOX’s Jadakiss is big when it comes to dates. The hip-hop veteran took a moment away from music-making to acknowledge his daughter’s Sweet 16. Look and comment below!


ICAT Server Release Notes
5.0.1
Fix authorization of lists of ICAT entities and use Python3 for scripts
5.0.0
Schema changes and additions
- Add a relationship between Dataset and Instrument (Issue 228).
- Add entity classes Technique and DatasetTechnique (Issue 230).
- Add columns for investigation and dataset size (Issue 211) and fileCount (Issue 238).
- Add tables DataPublication, DataPublicationDate, DataPublicationUser,
RelatedItem, and FundingReference (Issue 200).
- Add tables DataPublicationFunding and InvestigationFunding (Issue 249).
- Add table Affiliation (Issue 248).
- Add tables DataPublicationType and DataCollectionInvestigation (Issue 261).
- Add a relationship between Investigation and Facility Cycle (Issue 259)
4.11.1
Re-release to fix permissions and encoding issues with 4.11.0
4.11.0
Update SOAP interface and Python 3 compatibility
- Enable multiple field selection via SOAP interface
(Issue 245).
- Make python scripts python3 compatible and upgrade icat.utils version to 4.16.1
(PR 226).
4.10.0
Make some additions to the schema
- Add an attribute pid to Instrument, ParameterType, and Sample
(Issue 198).
- Add an optional relation between Shift and Instrument (Issue 199).
- Add attributes familyName, givenName, and affiliation to User
(Issue 201).
- Add an attribute pid to Study (Issue 216).
- Add an attribute endDate to Study (Issue 219).
- Fixes bugs in converting some types to JSON (Issue 220 and 196).
4.9.3
Bug fixes
4.9.2
Bug fixes
- Create a new option to configure which entities are included in the Lucene index.
For example, remove 'Datafile' and 'DatafileParameter' if the number of datafiles exceeds lucene's limit of 2^32 entries in an index
lucene.entitiesToIndex = Datafile Dataset Investigation InvestigationUser DatafileParameter DatasetParameter InvestigationParameter Sample
- Upgrade the Apache HttpClient from 4.3.4 to 4.3.6 because of a security vulnerability (CVE-2015-5262).
- Changes to tests and the default developer configuration to remove references to Steve Fisher's computer.
4.9.1
Bug fixes
- Restore the documentation for the RESTful API
- Add to run.properties: lucene.directory,
lucene.backlogHandlerIntervalSeconds and
lucene.enqueuedRequestIntervalSecond to deal with batching requests
to icat.lucene. This greatly improves ingest performance.
4.9.0
Add SOAP call getAuthenticatorInfo, support of authenticator and
lucene services and bug fixes
- Simplify output from REST properties call
- Add SOAP call getAuthenticatorInfo
- Add SOAP call getVersion() which is identical to
getApiVersion()
- Updated property file names to run.properties and
setup.properties
- run.properties no longer has the logback.xml property. Any
logback.xml file in the installation directory will be applied but
will not be copied to the config directory. There is a
logback.xml.example file in the distribution which can be copied to
logback.xml and edited.
- An authenticator may be a restful web service rather than a
possibly remote EJB.
- The lucene calls are now handled by a separate server
allowing deployment of more than one ICAT to share a single lucene
server. Most of the lucene configuration has been moved to the lucene
server.
- Fix bug in update which was making it very slow when lucene
was enabled
- Works with Payara but has intermittent problems with
Glassfish 4.0 and 4.1.1 so please use payara41.
- Synchronization of public tables and public steps is now done
by restful calls rather than JMS. This means that the run.properties
file needs a list of other servers to synchronize with.
4.8.0
Support update operations with control on individual attributes
and bug fixes
- Protect the SOAP interface from bad plugin mnemonics on login
calls
- Support update operations with control on individual
attributes
- The testicat program has been recoded to use only REST calls.
- A new clone operation has been added to the REST interface
- A new property "key" may be specified in the icat.properties
file. If there is an IDS server in use and it has a key for digest
protection of Datafile.location then this key value must be
identical.
4.7.0
Enhanced Rest interface and changes to the authorization code
- A restful select can mention multiple quantities to be
returned
- A major re-write of the authorization code should make it
more efficient in most cases as all the work is carried out by the
database unless the INCLUDE mechanism is used. This has required that
the Rule table has a slightly different structure from 4.6.0 so the
correct upgrade procedure from earlier versions must be followed.
- COUNT queries will not fail because they are counting more
than maxEntities values
- A couple of bugs in eclipse link result in incorrect
information being returned. One of these bugs was trapped previously
but with the generality of the queries now supported it has become
impractical to trap.
- "SELECT f from Facility WHERE f.id = 1 LIMIT 1,10" which
should always return an empty list now ignores the LIMIT clause.
- "SELECT ds.complete FROM Dataset ds" only returns the false
values but that "SELECT ds.id, ds.complete FROM Dataset ds" works
properly.
- A restful delete call has been added
- The delete(Many) call, whether restful or not, checks the
authz rules for all objects that will be deleted by the cascade
mechanism.
- A restful write call to do both create(Many) and update(Many)
has been written. Notifications are sent for all objects created
and/or updated. Authz is also applied to all new or updated entries.
- Notifications are no longer generated for deletes as the
information could never be used. This means that only C and U are
valid notification letters in the icat.properties file.
- DataCollection now has a doi attribute
- Call logging has been changed to generate only jms messages.
It is very similar to the call logging in the IDS. It is controlled
by a log.list in the icat.properties which may contain one or more of
READ, WRITE, SESSION and INFO.
- Updates whether from the SOAP call or the restful write call
are both checked for UPDATE permission before the call and if a
relationship field is changed which is used to identify that object
then DELETE permission is required before the change and CREATE
permission afterwards.
- Added attributes email and orcidId to the User table
- testicat and icatadmin have certificate checking disabled.
This used to be the normal behaviour but newer version of python, by
default, expect a certificate accessible by openssl.
- Produce an error message rather than a null pointer exception
if an invalid authenticator mnemonic is used in a login call.
- Added "isLogedIn" REST call
- Fixed bug when trying to read or write ParameterValueType
values (an enum) through REST call. These are now represented as json
string values.
- Fixed bug trying to read back an individual date value
through a REST call.
- Remove db.vendor and add db.target and db.logging to
icat-setup.properties.
- The jdbc driver jar if present in the domain's lib directory
must be moved to lib/ext.
4.6.1
Bug fix release
- Previously the update call failed if a Datafile was passed in
with all datafileCreateTime, datafileModTime and modTime all set to
null. If the Datafile was fetched, modified in memory and then update
was called then modTime would be set and the problem would not reveal
itself.
- It should also be noted that from release 4.6.0 Java 8 is
required to run the code.
4.6.0
Small change to icat.properties
- notification.list and log.list may now be omitted but must
not be present and empty in the icat.properties file
- Provide a "getProperties()" restful call to find out what can
be revealed about a server without a sessionId. This includes
maxEntities and information about the available authenticators.
- Support the ESCAPE keyword in JPQL queries.
- New calls added to the restful interface for lucene queries.
- Documentation for the restful interface is now generated by
MireDot.
- Changes to properties files to work with container
independent setup script.
- Change from log4j to slf4j with logback
- Corrected the "Study" entity to avoid NullPointer exceptions
- Fixed a resource leak in lucene populate
- Lucene populate is now much faster. This is mainly because it
uses multiple threads
- It is recommended to avoid this version of ICAT if you are
using multiple icat servers as testing of such configurations has not
been carried out.
4.5.1
Fix bug where ICAT won't start up with an empty lucene index
4.5.0
Remove lucene calls and apply bug fixes.
- Permit lucene not to be used by omitting references in
icat.setup.
- All lucene calls have been commented out - they will be
reinstated in 4.6 but they will be different.
- Allow queries of the form "SELECT a.b.c FROM ..." This was
not documented but used to work in ICAT 4.3 and is standard JPQL.
- Provide better protection against queries that are getting
too large a quantity of data back from the database. Previously the
"maxEntities" check was only made at the time when the XML response
to the user was generated by which time it could have been too late.
A side effect of this is that in some cases when an aggregate
function is part of a query which would of course only return one
record this may now fail if the data being aggregated are very large.
Even if such queries are handled by the database, SUM and AVG are
potentially very slow as they cannot benefit from any indexing.
- Fixed the ordering of entities appearing in the output file
when using exportData in the restful API so that the file can be
re-imported.
- Instead of doubled up '"' characters use '\"' and also
introduce \b \t \n \f \r \\ and the not strictly necessary \' for the
import export format.
- Avoid the use of a sequence table for allocating IDs. It
should be noted that a side effect of this is that for MySQL there is
no longer a global ID sequence but the ID sequences are specific to a
table.
- LIMIT clause in the query now works properly when searching
by id. This requires a manual schema upgrade if you already have an
ICAT installed.
- Ensure that createTime and endTime are represented by ISO
8601 style json strings like other TIMESTAMP fields using the RESTful
search call.
- Provide protection against an EclipseLink bug with Oracle
which resulted in BigDecimal objects being returned instead of Long
or Double values when MIN or MAX of a value of that type was
requested.
- The documentation for the rootUserNames parameter has been
updated to match a change introduced in release 4.4 whereby users
listed in rootUserNames have full access to all tables.
- json returned by restful calls now encodes numbers and
booleans correctly.
- The restful calls now produce CORS headers.
4.4.0
This introduces a number of "RESTful" calls and has some other
small improvements and bug fixes.
- A bug in the authorization computation has been fixed which
was previously prohibiting operations that should have been allowed
in some cases where multiple authorization rules were relevant.
- A partial prototype of a "RESTful" interface has been added.
- There is a new parameter maxEntities which must be specified
in icat.properties to restrict the total number of entities returned
in calls to get, search and searchText.
- There is a new parameter maxIdsInQuery which must be
specified in icat.properties to restrict the size of ICAT generated
queries. This must not exceed 1000 if Oracle is being used.
- There are new parameters importCacheSize and exportCacheSize
which must be specified in icat.properties to restrict the size of
caches used during import and export. The cache is local to a call to
import or export to ensure that authorization rules are enforced. As
a by-product modifications to ICAT are less likely to result in stale
information being returned from the cache.
- ID values are obtained from the database SEQUENCE table in
groups of 500 rather than 50 to improve performance. This is to
circumvent a problem seen occasionally in Oracle.
- The DISTINCT keyword now works as in regular JPQL.
- Queries are now truncated to 4000 characters before storing
them in the table or file log.
- The installation script has been made more robust and will
also ensure that JDBC connectors are set up in a resilient manner for
Oracle RAC servers.
- It is now treated as an error to have redundant paths in an
INCLUDE clause.
- The application is now built and deployed as a .war files
rather than a .ear file which makes it easier to deploy on Wildfly.
- The InvestigationGroup has been introduced. It is expected
that this will be generally used in Rule based authorization in
preference to InvestigationUser except for those cases where the role
of the individual is significant.
- The role field in the InvestigationUser is now part of the
key and can now not be null. This allows a User to have multiple
roles relative to an Investigation
- The Rule.what column has been increased in length from the
default of 255 to 1024.
4.3.3
This is a bug fix release with support for a group of ICATs
working together. It is not a cluster in the Glassfish sense.
- The isAccessAllowed call, when used to check CREATE access,
is now protected from invalid input.
- All standard JPQL functions are now accepted in search()
calls.
- Queries returning results of aggregate functions should
always return an array of length 1. However, due to the behaviour of
JAXB a list containing just a null is not transmitted properly and
instead an empty list is returned. This is a problem with the
functions MIN, MAX, SUM and AVG all of which return null when they
have no data to process. The COUNT function was also returning an
empty list when it had no data but now returns a list containing 0L.
- More than one ICAT may be used together to share the load and
provide more resilience.
- The setup script does not require calling with the configure
option.
- The icat-setup.properties file now uses the keyword
dbProperties rather than icatProperties.
- Fixed bug with handling of unary minus.
4.3.2
This is a bug fix release.
- A get call using the old (non-JPQL) syntax will now accept
the INCLUDE keyword in lower or mixed case.
4.3.1
This is a bug fix release.
- The methods logout and refresh when called with an expired or
otherwise invalid sessionId now throw an exception of type SESSION
rather than INTERNAL.
- A small improvement to testicat has been made to show who you
are logged in as.
- The relationship from DataCollection to
DataCollectionParameters is now called parameters and can be accessed
by getParameters and setParameters.
4.3.0
This includes schema changes and a number of speculative
features.
- The "ICATCompat" service for backwards compatibility with
ICAT 3.x has now been removed.
- A method "void refresh(String sid)" has been added to refresh
an ICAT session.
- The notification mechanism has been completely changed.
- It is not legal in queries with an INCLUDE to use a "1" in
conjunction with and entity name. This will now reliably throw an
exception.
- A new call "boolean isAccessAllowed" has been created to test
whether a specific access type is allowed.
- A call has been provided to return all the available entity
names. This is of more use to tools than regular users.
- Column names in the Database table for UserGroup have been
changed as they were inconsistent.
- The Rule entities are now store in a database table called
RULE_. for compatibility with Microsoft SQLServer.
- A file indices.sql is being distributed with the .ear file
with indices which may improve performance. You should assess whether
or not each index will be useful to your installation for while an
index can give a huge improvement to a query there is also a cost in
maintaining an index.
- JPA mappings for floating point numbers now use precision 38
and scale 19. This is still not good on Oracle as mentioned in the
installation instructions.
- testicat.py (which replaces test.py) expects
https://hostname:port rather than a pair of parameters
- Call logging has been added either to file or to a log table
or both.
- Lucene free text search has been included via the new
searchText call.
- Changed uniqueness constraints to:
- Datafile
- dataset, name (-location)
- Dataset
- investigation, name (-sample -type)
- Application
- facility, name, version (+facility)
- Sample
- investigation, name (-type)
- Investigation
- facility, name, visitid (-facilityCycle -instrument)
- SampleType
- facility, name, molecularFormula (+molecularFormula)
- Made all constraint fields not nullable. This is checked by
ICAT to ensure that future changes do not break this rule.
- Add a string attribute: "arguments" to the job to store the
program arguments that were used.
- Relationship between FacilityCycle and Investigation removed.
- Table between Investigation and Instrument added to represent
many-to-many relationships between them.
- Added DataCollection and changed Job to make use if it.
- Group has been changed to Grouping as Group is a JPQL
keyword.
- Add attribute 'url' to Instrument.
- Added new alternate query syntax that may be used in queries
and authz rules. It is distinguished by starting with the keyword
"SELECT".
- It is no longer considered an error to have no authz rules
matching a search call - you just get no data back.
- Packaging now conforms to
http://code.google.com/p/icatproject/wiki/ComponentGuidelines
- A command icatadmin has been introduced to perform
operations for which the rule based authorization is not appropriate.
- Expired sessions are cleaned out of the database every hour.
- The generated client jar contains two packages:
org.icatproject and org.icatproject_4_3_0. Normal users should use
the org.icatproject one. The other exists primarily for TopCAT so
that multiple ICAT clients can co-exist.
- The installation mechanism now has a single setup Python
script which works both on Linux and Windows.
4.2.5
This is a bug fix release. If you already have 4.2.0, 4.2.1, 4.2.2,
4.2.3 or 4.2.4 installed, then simply remove the old ear file and
deploy the new one. If you have changed log4j.properties from the one
supplied then add an entry to your icat.properties:
log4j.properties = log4j.properties
which tells the ICAT to use the existing log4j.properties file in the
config directory rather than the built in one. If you have not changed
it then it is preferable to delete the log4j.properties from the
config directory to avoid any possible confusion. The log4j.properties
file is no longer reread, if you have configured your own copy and
wish to change it then you must at least reload ICAT for the
properties file to be read again.
- A significant leak has been fixed which was causing an
unlimited number of threads to be created. This has been addressed by
changing the way in which the log4j.properties file is read. Only if
you have a line in the icat.properties identifying a specific
log4j.properties file will that file be used, otherwise a default
file packaged within the .ear file will be used.
4.2.4
This is a bug fix release. If you already have 4.2.0, 4.2.1,
4.2.2 or 4.2.3 installed, then simply remove the old ear file and
deploy the new one.
- Version number updated to 4.2.4 and test updated to ensure
that the version corresponds to the maven project version.
- LICENSE.txt file added to top directory of the source tree.
- Creating an Investigation which refers to a new
InvestigationUser now works properly.
- Using INCLUDE with User and Group now works properly.
Previously it could throw a null pointer exception.
- Database requirements have been made more precise in the
deployment instructions.
4.2.3
This is a bug fix release. If you already have 4.2.0, 4.2.1 or
4.2.2 installed, then simply remove the old ear file and deploy the
new one.
- Two different error conditions were not being handled
correctly in calls to createMany when a user attempted to violate a
uniqueness constraint. In the case of a conflict with a pre-existing
entry in ICAT the offset returned was -1. In the case that there were
duplicates in the list passed in the call to createMany - rather than
conflicts with existing database entries - an IcatException of type
INTERNAL was being thrown, also with an offset of -1. These bugs are
now fixed.
4.2.2
This is a bug fix release. If you already have 4.2.0 or 4.2.1
installed, then simply remove the old ear file and deploy the new one.
- A bug causing read access to be denied in certain
circumstances, when it should have been permitted, has been fixed.
- When attempting to format an error message about an invalid
list of INCLUDES a null pointer exception is no longer thrown.
4.2.1
This is a bug fix release. If you already have 4.2.0 installed,
then simply remove the old ear file and deploy the new one.
- Authorization rules without explicit relationships to groups
(of the form "Investigation <-> InvestigationUser <->
User [name = :user]") now work properly.
- It is now possible to use boolean values in queries.
Attributes can be compared against literal values of TRUE and FALSE
(not case sensitive) as in "ParameterType [enforced = TRUE]"
- Null pointer exceptions were being throw with some
authorization rules when using an Oracle database. This has now been
fixed.
4.2.0
This introduces a clean mechanism for handling authentication
plugins and provides significant speed enhancements.
- ICAT now contains no authentication plugins but it does
provide an Authenticator interface for plugin writers. If you plan to
use the new authn_db database authentication plugin you will need to
manually move data from the old table to the new passwd table.
- The login call now accepts two parameters, the mnemonic for
the authentication plugin and a map of credentials. This change
necessitated the increase in the version number to 4.2.
- There was a serious performance bug in release 4.1 and to a
lesser extent in 4.0. In both case this affected read operations -
search and get. This bug in the marshalling of the XML has now been
addressed.
- Previously JMS messages had the property "query" set to the
primary key and the actual query value was not available. They are
now assigned correctly to the properties "query" and "entityId".
- You will need an up-to-date version of JAX-WS such as the one
packaged with Glassfish 3.1.2
- The main database schema is almost unchanged. The only
difference is that some text fields have been made larger.
- A bug has been fixed in the handling of enum types in
expressions.
4.1.1
This is a bug fix release.
- Aggregate functions (MIN, MAX, AVG, COUNT etc) no longer
generate an internal exception.
- Minor improvements to the installation documentation.
4.1.0
This is the first release of ICAT4 which is meant to be
approaching production quality.
- More changes to the API - too numerous to list here providing
- support for pluggable authn,
- support for rule based authz,
- support for notifications and
- a powerful search mechanism
- Database independent
- More regular schema with simple provenance mechanism
4.0.0
Technology preview release - not for production use
3.3.4
- Changed the JPA provider from TopLink to EclipseLink
- Removed Dataportal from the installation
3.3.3
Public release


You must log into the database as the database creator before proceeding with this page.
Check what authorities the database creator holds after creating the 'security' database.
Run the Ad hoc SQL on the right.
Using the table function SYSPROC.AUTH_LIST_AUTHORITIES_FOR_AUTHID, you can check what authorities the database creator holds now.
Table function SYSPROC.AUTH_LIST_AUTHORITIES_FOR_AUTHID returns all authorities held by the current user (ie database creator). The function accepts two input arguments
The query results in the right pane show that, the database creator holds SYSADM, DBADM, SECADM, ACCESSCTRL, DATAACCESS authorities along with CREATETAB, BINDADD, CONNECT, and IMPLICIT_SCHEMA authorities.
The same information can be obtained from the Information > My Authorities menu in TE.