This is a lightweight annotation-based expressjs extension for typescript.
It can be used to define your APIs using ES7 decorators.
Project Sponsors
This project is supported by Leanty's team and is widely used by its main product: The Tree Gateway API Gateway.
Table of Contents
This library only works with typescript. Ensure it is installed:
npm install typescript -g
To install typescript-rest:
npm install typescript-rest --save
Typescript-rest requires the following TypeScript compilation options in your tsconfig.json file:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
import * as express from "express";
import {Server, Path, GET, PathParam} from "typescript-rest";
@Path("/hello")
class HelloService {
@Path(":name")
@GET
sayHello( @PathParam('name') name: string): string {
return "Hello " + name;
}
}
let app: express.Application = express();
Server.buildServices(app);
app.listen(3000, function() {
console.log('Rest Server listening on port 3000!');
});
That's it. You can just call now:
GET http://localhost:3000/hello/joe
You can check this project to get started.
This library allows you to use ES7 decorators to configure your services using expressjs.
The Server class is used to configure the server, like:
let app: express.Application = express();
Server.setFileDest('/uploads');
Server.buildServices(app);
app.listen(3000, function() {
console.log('Rest Server listening on port 3000!');
});
Note that Server receives an express.Router
instance. Then it configures
all the routes based on the decorators used on your classes.
So, you can use also any other expressjs feature, like error handlers, middlewares etc without any restriction.
When you call:
Server.buildServices(app);
The service will expose all services that can be found in the imported module into the express router provided. But it is possible to choose which services you want to expose.
import * as express from "express";
import {Server} from "typescript-rest";
import {ServiceOne} from "./service-one";
import {ServiceTwo} from "./service-two";
import {ServiceThree} from "./service-three";
let app: express.Application = express();
Server.buildServices(app, ServiceOne, ServiceTwo, ServiceThree);
It is possible to use multiples routers:
Server.buildServices(adminRouter, ...adminApi);
Server.buildServices(app, ServiceOne);
And it is, also, possible to use glob expressions to point where your services are:
const app = express();
const apis = express.Router();
const admin = express.Router();
Server.loadServices(apis, 'lib/controllers/apis/*');
Server.loadServices(admin, 'lib/controllers/admin/*');
app.use('apis', apis);
app.use('admin', admin);
That will register all services exported by any file located under lib/controllers/apis
in the apis
router and services in lib/controllers/admin
in the admin
router.
Negation is also supported in the glob patterns:
Server.loadServices(app, ['lib/controllers/*', '!**/exclude*']);
// includes all controllers, excluding that one which name starts with 'exclude'
And it is possilbe to inform a base folder for the patterns:
Server.loadServices(app, 'controllers/*', `${__dirname}/..`]);
// Inform a folder as origin for the patterns
The @Path decorator allow us to define a router path for a given endpoint. Route paths, in combination with a request method, define the endpoints at which requests can be made. Route paths can be strings, string patterns, or regular expressions.
The characters ?, +, *, and () are subsets of their regular expression counterparts. The hyphen (-) and the dot (.) are interpreted literally by string-based paths.
We use path-to-regexp for matching the route paths; see the path-to-regexp documentation for all the possibilities in defining route paths.
Some examples:
@Path("/hello")
class HelloService {
}
@Path("/test/hello")
class TestService {
}
This route path will match acd and abcd:
@Path("ab?cd")
class TestService {
}
This route path will match abcd, abbcd, abbbcd, and so on:
@Path("ab+cd")
class TestService {
}
This route path will match abcd, abxcd, abRANDOMcd, ab123cd, and so on:
@Path("ab*cd")
class TestService {
}
This route path will match /abe and /abcde:
@Path("/ab(cd)?e")
class TestService {
}
This route path will match butterfly and dragonfly, but not butterflyman, dragonfly man, and so on:
@Path("/.*fly$/")
class TestService {
}
Route parameters are named URL segments that are used to capture the values specified at their position in the URL. The captured values are populated in the req.params object, with the name of the route parameter specified in the path as their respective keys. They can be refered through @PathParam decorator on a service method argument.
Some examples:
@Path("/users")
class UserService {
@Path("/:userId/books/:bookId")
@GET
getUserBook(@PathParam("userId") userId: number, @PathParam("bookId") bookId: number): Promise<Book> {
//...
}
}
The requested URL http://localhost:3000/users/34/books/8989 would map the parameters as:
userId: "34"
bookId: "8989"
Since the hyphen (-) and the dot (.) are interpreted literally, they can be used along with route parameters for useful purposes.
Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
Route path: /plantae/:genus.:species
Request URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }
The @Security decorator allow us to define a authorization for a given endpoint.
Security is using passport and it can be configured using
passportAuth
method in Server
Server.passportAuth(strategy, roleKey);
Some examples:
@Security()
class HelloService {
@Security("ROLE_ADMIN")
admin() {}
authorized() {}
}
@Security("ROLE_USER")
class TestService {
}
@Security(["ROLE_ADMIN", "ROLE_USER"])
class AuthService {
}
We have decorators for each HTTP method. Theses decorators are used on service methods already bound to a Path route to specify the endpoint at which requests can be made.
The following decorators can be used:
Also exists mapping options to use @Path and @Method together:
Some examples:
@Path("/users")
class UserService {
@GET
getUsers(): Promise<Array<User>> {
//...
}
@GET
@Path(":userId")
getUser(@PathParam("userId")): Promise<User> {
//...
}
@PUT
@Path(":userId")
saveUser(@PathParam("userId"), user: User): void {
//...
}
}
Using mappings:
@Path("/users")
class UserService {
@GET
getUsers(): Promise<Array<User>> {
//...
}
@GETMapping(":userId")
getUser(@PathParam("userId")): Promise<User> {
//...
}
@PUTMapping(":userId")
saveUser(@PathParam("userId"), user: User): void {
//...
}
}
Only methods decorated with one of this HTTP method decorators are exposed as handlers for requests on the server.
A single method can only be decorated with one of those decorators at a time.
There are decorators to map parameters to arguments on service methods. Each decorator can map a differente kind of parameter on request.
The following decorators are available:
| Decorator | Description |
|---|---|
| @PathParam | Parameter in requested URL path |
| @QueryParam | Parameter in the query string |
| @FormParam | Parameter in an HTML form |
| @HeaderParam | Parameter in the request header |
| @CookieParam | Parameter in a cookie |
| @FileParam | A File in a multipart form |
| @FilesParam | An array of Files in a multipart form |
| @Param | Parameter in the query string or in an HTML form |
Some examples:
@Path("/sample")
class Sample {
@GET
test(@QueryParam("limit") limit:number, @QueryParam("skip") skip:number) {
//...
// GET http://domain/sample?limit=5&skip=10
}
@POST
test(@FormParam("name") name:string) {
//...
// POST http://domain/sample
// body: name=joe
}
@POST
@Path("upload")
testUploadFile( @FileParam("myFile") file: Express.Multer.File,
@FormParam("myField") myField: string) {
//...
/* POST http://domain/sample/upload
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="myField"
Field Value
--AaB03x
Content-Disposition: form-data; name="myFile"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
*/
}
}
An argument that has no decorator is handled as a json serialized entity in the request body
@Path("/sample")
class Sample {
@POST
test(user: User) {
//...
// POST http://domain/sample
// body: a json representation of the User object
}
}
The @*Param
decorators can also be used on service class properties.
An example:
@Path("users/:userId/photos")
class TestService {
@PathParam('userId')
userId: string;
@GET
getPhoto(@PathParam('photoId')) {
// Get the photo and return
}
}
A Context object is created to group informations about the current request being handled. This Context can be accessed by service methods.
The Context is represented by the ServiceContext
class and has the following properties:
| Property | Type | Description |
|---|---|---|
| request | express.Request | The request object |
| response | express.Response | The response object |
| language | string | The resolved language to be used to handle the current request. |
| accept | string | The preferred media type to be used to respond the current request. |
| next | express.NextFunction | The next function. It can be used to delegate to the next middleware registered the processing of the current request. |
See Types and languages to know how the language and accept fields are calculated.
The @Context
decorator can be used on service method's arguments or on service class properties to bind
the argument or the property to the current context object.
A Context usage example:
@Path("context")
class TestService {
@Context
context: ServiceContext;
@GET
sayHello() {
switch (this.context.language) {
case "en":
return "Hello";
case "pt":
return "Olá";
}
return "Hello";
}
}
We can use the decorator on method arguments too:
@Path("context")
class TestService {
@GET
sayHello(@Context context: ServiceContext) {
switch (context.language) {
case "en":
return "Hello";
case "pt":
return "Olá";
}
return "Hello";
}
}
You can use, also, one of the other decorators to access directly one of the Context property. It is a kind of suggar syntax.
@Path("context")
class TestService {
@GET
sayHello(@ContextLanguage language: string) {
switch (language) {
case "en":
return "Hello";
case "pt":
return "Olá";
}
return "Hello";
}
}
This library can receive the return of your service method and handle the serialization of the response as long as handle the correct content type of your result and the response status codes to be sent.
When a primitive type is returned by a service method, it is sent as a plain text into the response body.
@GET
sayHello(): string {
return "Hello";
}
The response will contains only the String Hello
as a plain text
When an object is returned, it is sent as a json serialized string into the response body.
@GET
@Path(":id")
getPerson(@PathParam(":id") id: number): Person {
return new Person(id);
}
The response will contains the person json serialization (ex: {id: 123}
. The response
will have a application/json
context type.
When the method returns nothing, an empty body is sent withh a 204
status code.
@POST
test(myObject: MyClass): void {
//...
}
We provide also, some special types to inform that a reference to a resource is returned and that the server should handle it properly.
| Type | Description |
|---|---|
| NewResource | Inform that a new resource was created. Server will add a Location header and set status to 201 |
| RequestAccepted | Inform that the request was accepted but is not completed. A Location header should inform the location where the user can monitor his request processing status. Server will set the status to 202 |
| MovedPermanently | Inform that the resource has permanently moved to a new location, and that future references should use a new URI with their requests. Server will set the status to 301 |
| MovedTemporarily | Inform that the resource has temporarily moved to another location, but that future references should still use the original URI to access the resource. Server will set the status to 302 |
import {Return} from "typescript-rest";
@Path("test")
class TestService {
@POST
test(myObject: MyClass, @ContextRequest request: express.Request): Return.NewResource<void> {
//...
return new Return.NewResource<void>(req.url + "/" + generatedId);
}
@POST
testWithBody(myObject: MyClass, @ContextRequest request: express.Request): Return.NewResource<string> {
//...
return new Return.NewResource<string>(req.url + "/" + generatedId, 'The body of the response');
}
}
The server will return an empty body with a 201
status code and a Location
header pointing to
the URL of the created resource.
It is possible to specify a body to be sent in responses:
import {Return} from "typescript-rest";
interface NewObject {
id: string;
}
@Path("test")
class TestService {
@POST
test(myObject: MyClass, @ContextRequest request: express.Request): Return.NewResource<NewObject> {
//...
return new Return.NewResource<NewObject>(req.url + "/" + generatedId, {id: generatedId}); //Returns a JSON on body {id: generatedId}
}
}
You can use special types to download files:
| Type | Description |
|---|---|
| DownloadResource | Used to reference a resource (by its fileName) and download it |
| DownloadBinaryData | Used to return a file to download, based on a Buffer object |
For example:
import {Return} from "typescript-rest";
@Path("download")
class TestDownload {
@GET
testDownloadFile(): Return.DownloadResource {
return new Return.DownloadResource(__dirname +'/test-rest.spec.js', '/test-rest.spec.js');
}
@GET
testDownloadFile(): Promise<Return.DownloadBinaryData> {
return new Promise<Return.DownloadBinaryData>((resolve, reject)=>{
fs.readFile(__dirname + '/test-rest.spec.js', (err, data)=>{
if (err) {
return reject(err);
}
return resolve(new Return.DownloadBinaryData(data, 'application/javascript', 'test-rest.spec.js'))
});
});
}
}
The above section shows how the types returned are handled by the Server. However, most of the previous examples are working synchronously. The recommended way is to work asynchronously, for a better performance.
To work asynchronously, you can return a Promise
on your service method. The above rules to handle return types
applies to the returned promise resolved value.
Some examples:
import {Return} from "typescript-rest";
@Path("async")
class TestService {
@POST
test(myObject: MyClass, @ContextRequest request: express.Request): Promise<Return.NewResource> {
return new Promise<Return.NewResource>(function(resolve, reject){
//...
resolve(new Return.NewResource(req.url + "/" + generatedId));
});
}
@GET
testGet() {
return new Promise<MyClass>(function(resolve, reject){
//...
resolve(new MyClass());
});
}
}
It is important to observe that you can inform your return type explicitly or not, as you can see in the above example.
You can also use async
and await
:
@Path('async')
export class MyAsyncService {
@GET
@Path('test')
async test( ) {
let result = await this.aPromiseMethod();
return result;
}
@GET
@Path('test2')
async test2( ) {
try {
let result = await this.aPromiseMethod();
return result;
} catch (e) {
// log error here, if you want
throw e;
}
}
private aPromiseMethod() {
return new Promise<string>((resolve, reject) => {
setTimeout(() => {
resolve('OK');
}, 10);
});
}
}
This library provide some Error classes to map the problems that you may want to report to your clients.
| Type | Description |
|---|---|
| BadRequestError | Used to report errors with status code 400. |
| UnauthorizedError | Used to report errors with status code 401. |
| ForbiddenError | Used to report errors with status code 403. |
| NotFoundError | Used to report errors with status code 404. |
| MethodNotAllowedError | Used to report errors with status code 405. |
| NotAcceptableError | Used to report errors with status code 406. |
| ConflictError | Used to report errors with status code 409. |
| InternalServerError | Used to report errors with status code 500. |
| NotImplementedError | Used to report errors with status code 501. |
If you throw any of these errors on a service method, the server you log the problem and send a response with the appropriate status code an the error message on its body.
import {Errors} from "typescript-rest";
@Path("async")
class TestService {
@GET
@Path("test1")
testGet() {
return new Promise<MyClass>(function(resolve, reject){
//...
throw new Errors.NotImplementedError("This operation is not available yet");
});
}
@GET
@Path("test2")
testGet2() {
return new Promise<MyClass>(function(resolve, reject){
//...
reject(new Errors.NotImplementedError("This operation is not available yet"));
});
}
@GET
@Path("test3")
testGet3() {
throw new Errors.NotImplementedError("This operation is not available yet");
}
}
All the three operations above will return a response with status code 501
and a message on the body
This operation is not available yet
If you want to create a custom error that report your own status code, just extend the base class HttpError
.
import {HttpError} from "typescript-rest";
class MyOwnError extends HttpError {
static myNoSenseStatusCode: number = 999;
constructor(message?: string) {
super("MyOwnError", MyOwnError.myNoSenseStatusCode, message);
}
}
You must remember that all uncaught errors are handled by a expressjs error handler. You could want to customize it to allow you to inform how the errors will be delivered to your users. For more on this (for those who wants, for example, to send JSON errors), take a look at this question;
If you need to inform any options to the body parser, you can use the @BodyOptions decorator.
You can inform any property accepted by bodyParser
For example:
import {HttpError} from "typescript-rest";
import {Errors} from "typescript-rest";
@Path("async")
class TestService {
@POST
@Path("test1")
@BodyOptions({limit:'100kb'})
testPost(myData) {
return new Promise<MyClass>(function(resolve, reject){
//...
throw new Errors.NotImplementedError("This operation is not available yet");
});
}
@GET
@Path("test2")
@BodyOptions({extended:false})
testPost2(@FormParam("field1")myParam) {
return new Promise<MyClass>(function(resolve, reject){
//...
reject(new Errors.NotImplementedError("This operation is not available yet"));
});
}
@GET
@Path("test3")
testGet3() {
throw new Errors.NotImplementedError("This operation is not available yet");
}
}
It can be used, for example, to inform the bodyParser that it must handle date types for you:
function dateReviver(key, value) {
let a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
}
@Path('test')
class MyRestService {
@POST
@BodyOptions({reviver: dateReviver})
myHandler(param) {
//...
}
}
It is possible to use decorators to inform the server which languages or mime types are supported by each service method.
These decorators can be used on the service class or on a service method (or both).
The following decorators are available:
| Decorator | Description |
|---|---|
| AcceptLanguage | Tell the Server that a class or a method should only accept requests from clients that accepts one of the supported languages. |
| Accept | Tell the Server that a class or a method should only accept requests from clients that accepts one of the supported mime types. |
See some examples:
@Path("test")
@AcceptLanguage("en", "pt-BR")
class TestAcceptService {
@GET
testLanguage(@ContextLanguage language: string): string {
if (language === 'en') {
return "accepted";
}
return "aceito";
}
}
In the above example, we declare that only English
and Brazilian Portuguese
are supported.
The order here is important. That declaration says that our first language is English
. So, if nothing
was specified by the request, or if these two languages has the same weight on the
resquest Accept-Language
header, English
will be the choice.
If the request specifies an Accept-Language
header, we will choose the language that best fit the
header value, considering the list of possible values declared on @AcceptLanguage
decorator.
If none of our possibilities is good for the Accept-Language
header in the request, the server
throws a NotAcceptableError
and returns a 406
status code for the client.
You can decorate methods too, like:
@Path("test")
@AcceptLanguage("en", "pt-BR")
class TestAcceptService {
@GET
@AcceptLanguage("fr")
testLanguage(@ContextLanguage language: string): string {
// ...
}
}
On the above example, the list of accepted languages will be ["en", "pt-BR", "fr"]
, in that order.
The @Accept
decorator works exaclty like @AcceptLanguage
, but it inform the server about the mime type
that a service can provide. It uses the Accept
header in the request to decide about the preferred media to use.
@Path("test")
@Accept("application/json")
class TestAcceptService {
@GET
testType(@ContextAccept accept: string): string {
//...
}
}
It is possible to delegate to typescript-ioc the instantiation of the service objects.
First, install typescript-ioc:
npm install --save typescript-ioc
Then, you can configure it in two ways:
rest.config
and put it on the root of your project:{
"useIoC": true
}
or
Server.useIoC()
in the begining of your code, before any service declaration/* Ensure to call Server.useIoC() before your service declarations.
It only need to be called once */
Server.useIoC();
@AutoWired
class HelloService {
sayHello(name: string) {
return "Hello " + name;
}
}
@Path("/hello")
@AutoWired
class HelloRestService {
@Inject
private helloService: HelloService;
@Path(":name")
@GET
sayHello( @PathParam('name') name: string): string {
return this.sayHello(name);
}
}
It is also possible to inform a custom serviceFactory to instantiate your services. To do this,
call Server.registerServiceFactory()
instead of Server.useIoC()
and provide your own ServiceFactory implementation.
You can also use the serviceFactory
property in rest.config file to configure it:
{
"serviceFactory": "./myServiceFactory"
}
And export as default your serviceFactory class on ./myServiceFactory.ts
file.
It could be used to allow the usage of other libraries, like Inversify.
It is possible to extends services like you do with normal typescript classes:
@Path('users')
class Users{
@GET
getUsers() {
return [];
}
}
@Path('superusers')
class SuperUsers{
@GET
@Path('privilegies')
getPrivilegies() {
return [];
}
}
It will expose the following endpoints:
GET http://<my-host>/users
GET http://<my-host>/superusers
GET http://<my-host>/superusers/privilegies
A note about abstract classes
A common scenario is to create an abstract class that contains some methods to be inherited by other concrete classes, like:
abstract class MyCrudService<T> {
@GET
@Path(':id')
abstract getEntity(): Promise<T>;
}
@Path('users')
class MyUserService<User> {
@GET
@Path(':id')
async getEntity(): Promise<User> {
return myUser;
}
}
MyCrudService, in this scenario, is a service class that contains some exposed methods (methods that are declared to be exposed as endpoints). However, the intent here is not to expose the method for MyCrudService directly (I don't want an endpoint GET http://<myhost>/123
exposed). We want that only its sublclasses have the methods exposed (GET http://<myhost>/users/123
).
The fact that MyCrudService is an abstract class is not enough to typescript-rest library realize that its methods should not be exposed (Once it is compiled to javascript, it becomes a regular class). So you need to explicitly specify that this class should not expose any endpoint directly. It can be implemented using the @Abstract
decorator:
@Abstract
abstract class MyCrudService<T> {
@GET
@Path(':id')
abstract getEntity(): Promise<T>;
}
@Path('users')
class MyUserService<User> {
@GET
@Path(':id')
async getEntity(): Promise<User> {
return myUser;
}
}
Even if MyCrudService was not a typescript abstract class, if it is decorated with @Abstract
, its methods will not be exposed as endpoints.
If you don't want to use @Abstract
, another way to achieve the same goal is to specify which services you want to expose:
let app: express.Application = express();
Server.buildServices(app, MyUserService);
or
let app: express.Application = express();
Server.loadServices(apis, 'lib/controllers/apis/impl/*');
It is possible to add a function to process the request before the handler on an endpoint by endpoint basis. This can be used to add a validator or authenticator to your application without including it in the body of the handler.
function validator(req: express.Request): express.Request {
if (req.body.userId != undefined) {
throw new Errors.BadRequestError("userId not present");
} else {
req.body.user = Users.get(req.body.userId)
return req
}
}
@Path('users')
export class UserHandler {
@Path('email')
@POST
@Preprocessor(validator)
setEmail(body: any) {
// will have body.user
}
}
Preprocessors can also be added to a class, applying it to all endpoints on the class
@Path('users')
@Preprocessor(validator)
export class UserHandler {
@Path('email')
@POST
setEmail(body: any) {
// will have body.user
}
}
Typescript-rest can expose an endpoint with the swagger documentation for your API.
For example:
let app: express.Application = express();
app.set('env', 'test');
Server.buildServices(app);
Server.swagger(app, './test/data/swagger.yaml', '/api-docs', 'localhost:5674', ['http']);
You can provide your swagger file as an YAML or a JSON file.
Now, just access:
http://localhost:5674/api-docs // Show the swagger UI to allow interaction with the swagger file
http://localhost:5674/api-docs/json // Return the swagger.json file
http://localhost:5674/api-docs/yaml // Return the swagger.yaml file
If needed, you can provide options to customize the Swagger UI:
const swaggerUiOptions = {
customSiteTitle: 'My Awesome Docs',
swaggerOptions: {
validatorUrl: null,
oauth2RedirectUrl: 'http://example.com/oauth2-redirect.html',
oauth: {
clientId: 'my-default-client-id'
}
}
};
Server.swagger(app, './swagger.yaml', '/api-docs', undefined, ['http'], swaggerUiOptions);
See
swagger-ui-express
for more options andswagger-ui
for moreswaggerOptions
. Note: Not allswagger-ui
options are supported. Specifically, any options with aFunction
value will not work.
To generate the swagger file, you can use the typescript-rest-swagger tool.
npm install typescript-rest-swagger -g
`
swaggerGen -c ./swaggerConfig.json
typescript-rest-swagger tool can generate a swagger file as an YAML or a JSON file.
Starting from version 1.0.0, it is required to inform the body type on all ReferencedResources, like:
interface NewObject {
id: string;
}
class TestService {
@POST
test(myObject: MyClass): Return.NewResource<NewObject> {
//...
return new Return.NewResource<NewObject>(req.url + "/" + generatedId, {id: generatedId}); //Returns a JSON on body {id: generatedId}
}
}
Even when you do not provide a body on a ReferencedResouce, you need to inform <void>
class TestService {
@POST
test(myObject: MyClass): Return.RequestAccepted<void> {
//...
return new Return.RequestAccepted<void>(req.url + "/" + generatedId);
}
}
Generated using TypeDoc


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.innowhere.jnieasy.core.cgen.NativeJavaCodeGeneratorCmd
public class NativeJavaCodeGeneratorCmd
NativeJavaCodeGeneratorCmd
generates code of user defined classes
with methods working usually as proxies of DLL methods, using the command line.
| Constructor Summary | |
|---|---|
NativeJavaCodeGeneratorCmd()
|
| Method Summary | |
|---|---|
static void |
main(java.lang.String[] args)
Generates code of native classes using the command line. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public NativeJavaCodeGeneratorCmd()
| Method Detail |
|---|
public static void main(java.lang.String[] args) throws java.lang.Throwable
Usage:
java com.innowhere.jnieasy.core.NativeJavaCodeGeneratorCmd [-enhanceOnLoad includeImportList [-excludeImports excludeImportList]] xmlDescriptorPath outputDir
Where includeImportList
is the ';' separated list of import
expressions, as specified in NativeEnhancer.enableOnLoad(String[],String[],ClassLoader)
,
and excludeImportList
is the excluded list.
xmlDescriptorPath
is the XML generation descriptor file of classes to
generate, and outputDir is the directory root to save generated classes,
as described in NativeJavaCodeGenerator.generate(String,String)
.
args
- the command line arguments
java.lang.Throwable
NativeJavaCodeGenerator.generate(String,String,String[],String[])
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


GUILTY BY SUSPICION A film review by Mark R. Leeper Copyright 1991 Mark R. Leeper
Capsule review: Perhaps this is the wrong film on the right subject. Irwin Winkler could not go too far wrong having DeNiro play a top director whose career is ruined by blacklisting, but the film does not go too far right either, not having sufficient rage to be engaging. Rating: +1 (-4 to +4).
An artist painting a picture has the option of reproducing exactly what the eye sees or of distorting reality to reach a deeper truth. The artist who just reproduces reality may be little more than a human camera; the artists whom we consider to be great have known how to distort reality to show a greater truth. It is possible to make a film about a subject that is realistic and at the same time does a disservice by being so realistic. Irwin Winkler's GUILTY BY SUSPICION, based on his own script, is a very realistic and at the same time subdued portrait of a blacklisted film director. But what is called for is a howl of rage against the government subversion of the Bill of Rights. Martin Ritt's THE FRONT, which starred Woody Allen, does have that release at its climax.
GUILTY BY SUSPICION mixes real Hollywood figures such as Darryl Zanuck with purely fictional ones and ones who are thinly disguised versions of real actors like cowboy star Jerry Cooper. The story begins as one of Zanuck's best directors, David Merrill (played by Robert DeNiro) returns to Hollywood in 1951 after having been in Paris for a while. However, Hollywood is not the town he remembers. The House Un-American Activities Committee and the FBI are conducting a witch-hunt to find Communist sympathizers in the film industry. Careers are being destroyed and marriages broken up by the paranoia and the government pressure. David sees the family of a friend destroyed and soon he too is called upon to explain his attendance at a few meetings of what is now accused of being a Communist front organization. He is willing to cooperate until he is required to start by giving names of involved associates. For refusing to draw others into the net, he finds himself blacklisted. The project he is working on is canceled and the studio nearly bankrupts him by insisting he return a $50,000 advance. What follows is a long and not entirely interesting siege of unemployment seasoned with FBI harassment. The film builds to his eventual hearing with HUAC.
Winkler spent a fair amount of the budget recreating the early 1950s, much more than Martin Ritt did, or needed to do, for THE FRONT. I thought while watching the film that some of the women's hair styles were anachronistic, but I could easily be wrong. The period feel was somehow just missing, as was the dramatic edge of the film. DeNiro's character is weak and indecisive and spending so much time showing him not finding work just does not grab the audience the way it could. I give the film a flat +1 on the -4 to +4 scale.
Mark R. Leeper att!mtgzy!leeper<EMAIL_ADDRESS>.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Honolulu council and mayor approve $214M for rail project
HONOLULU (AP) - The Honolulu City Council and Mayor Kirk Caldwell have approved a $214 million spending bill for a city rail project.
The Honolulu Star-Advertiser reported Tuesday that the bill approves an annual maximum of $26 million toward the $9.2 billion project for rail service from East Kapolei to Ala Moana.
The bill is expected to be funded through the sale of bonds that would be repaid from the general fund, which primarily includes revenue from property taxes.
The council passed the measure by a 5-2 vote Wednesday and Caldwell signed the bill Thursday.
Honolulu Authority for Rapid Transportation officials say their projections did not show a need for money from the city’s general fund.
The Federal Transit Administration insisted the city make the commitment to pay a subsidy on the line.
Information from: Honolulu Star-Advertiser, http://www.staradvertiser.com
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


Next: update-instance-for-redefined-class, Previous: shared-initialize, Up: Objects Dictionary
update-instance-for-different-class
previous current
&rest initargs
&key &allow-other-keys ⇒ implementation-dependent
update-instance-for-different-class
(previous standard-object)
(current standard-object)
&rest initargs
previous—a copy of the original instance.
current—the original instance (altered).
initargs—an initialization argument list.
The generic function update-instance-for-different-class is not intended to be called by programmers. Programmers may write methods for it. The function update-instance-for-different-class is called only by the function change-class.
The system-supplied primary method on update-instance-for-different-class checks the validity of initargs and signals an error if an initarg is supplied that is not declared as valid. This method then initializes slots with values according to the initargs, and initializes the newly added slots with values according to their :initform forms. It does this by calling the generic function shared-initialize with the following arguments: the instance (current), a list of names of the newly added slots, and the initargs it received. Newly added slots are those local slots for which no slot of the same name exists in the previous class.
Methods for update-instance-for-different-class can be defined to specify actions to be taken when an instance is updated. If only after methods for update-instance-for-different-class are defined, they will be run after the system-supplied primary method for initialization and therefore will not interfere with the default behavior of update-instance-for-different-class.
Methods on update-instance-for-different-class can be defined to initialize slots differently from change-class. The default behavior of change-class is described in Changing the Class of an Instance.
The arguments to update-instance-for-different-class are computed by change-class. When change-class is invoked on an instance, a copy of that instance is made; change-class then destructively alters the original instance. The first argument to update-instance-for-different-class, previous, is that copy; it holds the old slot values temporarily. This argument has dynamic extent within change-class; if it is referenced in any way once update-instance-for-different-class returns, the results are undefined. The second argument to update-instance-for-different-class, current, is the altered original instance. The intended use of previous is to extract old slot values by using slot-value or with-slots or by invoking a reader generic function, or to run other methods that were applicable to instances of the original class.
See the example for the function change-class.
The system-supplied primary method on update-instance-for-different-class signals an error if an initialization argument is supplied that is not declared as valid.
change-class, shared-initialize, Changing the Class of an Instance, Rules for Initialization Arguments, Declaring the Validity of Initialization Arguments
Initargs are declared as valid by using the :initarg option to defclass, or by defining methods for update-instance-for-different-class or shared-initialize. The keyword name of each keyword parameter specifier in the lambda list of any method defined on update-instance-for-different-class or shared-initialize is declared as a valid initarg name for all classes for which that method is applicable.
The value returned by update-instance-for-different-class is ignored by change-class.
Next: update-instance-for-redefined-class, Previous: shared-initialize, Up: Objects Dictionary


{% extends theme("_base.html") %} {% set current = 'about' %} {% block title %}{{ super() }} -- static website generator{% endblock %} {% block body %}
Folio is an static website builder from dynamic templates written in Python and it's Open Source (ISC license).
It's written with simplicity and freedom in mind. The core tries to solve only one problem, and features are implemented as extensions. This makes a base code very small, simple and easy to read. The large number of extensions gives the possibility to only use the requirements you website needs.
It's developer-oriented. You will start creating a Python module that will concentrate all your website configuration, the extensions in use, and advanced features you might develop.
{% highlight 'python' %} from folio import Folio proj = Folio(__name__) if __name__ == "__main__": proj.build() {% endhighlight %}The core of Folio is quite small but provides powerful features:


...
Though we express this as nested controllers, the actual nesting happens in scopes. The $scope passed to a nested controller prototypically inherits from its parent controller’s $scope . In this case, this means that the $scope passed to ChildController will have access to all the properties of the $scope passed to ParentController .


Printable Directions (Driving & Public Transit)
EYU 2016 Map & Program of Events
Exploring Your Universe (EYU) is an annual science outreach day held on the UCLA campus, filled with exciting science demos, fun activities, and interesting talks. EYU has family-friendly activities that provide a wonderful look into real science for all ages, “from K through Gray”!


public class GameMaster
extends java.lang.Object
| Modifier and Type | Field and Description |
|---|---|
static int |
MAX_PLAYER
The Constant MAX_PLAYER.
|
| Constructor and Description |
|---|
GameMaster()
Instantiates a new game master.
|
| Modifier and Type | Method and Description |
|---|---|
void |
btnBuyHouseClicked()
Btn buy house clicked.
|
Card |
btnDrawCardClicked()
Btn draw card clicked.
|
void |
btnEndTurnClicked()
Btn end turn clicked.
|
void |
btnGetOutOfJailClicked()
Btn get out of jail clicked.
|
void |
btnPurchasePropertyClicked()
Btn purchase property clicked.
|
void |
btnRollDiceClicked()
Btn roll dice clicked.
|
void |
btnTradeClicked()
Btn trade clicked.
|
void |
completeTrade(TradeDeal deal)
Complete trade.
|
Card |
drawCCCard()
Draw cc card.
|
Card |
drawChanceCard()
Draw chance card.
|
Player |
getCurrentPlayer()
Gets the current player.
|
int |
getCurrentPlayerIndex()
Gets the current player index.
|
GameBoard |
getGameBoard()
Gets the game board.
|
MonopolyGUI |
getGUI()
Gets the gui.
|
int |
getInitAmountOfMoney()
Gets the inits the amount of money.
|
int |
getNumberOfPlayers()
Gets the number of players.
|
int |
getNumberOfSellers()
Gets the number of sellers.
|
Player |
getPlayer(int index)
Gets the player.
|
int |
getPlayerIndex(Player player)
Gets the player index.
|
java.util.ArrayList<Player> |
getSellerList()
Gets the seller list.
|
int |
getTurn()
Gets the turn.
|
int |
getUtilDiceRoll()
Gets the util dice roll.
|
static GameMaster |
instance()
Instance.
|
void |
movePlayer(int playerIndex,
int diceValue)
Move player.
|
void |
movePlayer(Player player,
int diceValue)
Move player.
|
void |
playerMoved(Player player)
Player moved.
|
void |
reset()
Reset.
|
int[] |
rollDice()
Roll dice.
|
void |
sendToJail(Player player)
Send to jail.
|
void |
setGameBoard(GameBoard board)
Sets the game board.
|
void |
setGUI(MonopolyGUI gui)
Sets the gui.
|
void |
setInitAmountOfMoney(int money)
Sets the inits the amount of money.
|
void |
setNumberOfPlayers(int number)
Sets the number of players.
|
void |
setTestMode(boolean b)
Sets the test mode.
|
void |
setUtilDiceRoll(int diceRoll)
Sets the util dice roll.
|
void |
startGame()
Start game.
|
void |
switchTurn()
Switch turn.
|
void |
updateGUI()
Update gui.
|
void |
utilRollDice()
Util roll dice.
|
public static final int MAX_PLAYER
public static GameMaster instance()
public void btnBuyHouseClicked()
public Card btnDrawCardClicked()
public void btnEndTurnClicked()
public void btnGetOutOfJailClicked()
public void btnPurchasePropertyClicked()
public void btnRollDiceClicked()
public void btnTradeClicked()
public void completeTrade(TradeDeal deal)
deal
- the dealpublic Card drawCCCard()
public Card drawChanceCard()
public Player getCurrentPlayer()
public int getCurrentPlayerIndex()
public GameBoard getGameBoard()
public MonopolyGUI getGUI()
public int getInitAmountOfMoney()
public int getNumberOfPlayers()
public int getNumberOfSellers()
public Player getPlayer(int index)
index
- the indexpublic int getPlayerIndex(Player player)
player
- the playerpublic java.util.ArrayList<Player> getSellerList()
public int getTurn()
public int getUtilDiceRoll()
public void movePlayer(int playerIndex, int diceValue)
playerIndex
- the player indexdiceValue
- the dice valuepublic void movePlayer(Player player, int diceValue)
player
- the playerdiceValue
- the dice valuepublic void playerMoved(Player player)
player
- the playerpublic void reset()
public int[] rollDice()
public void sendToJail(Player player)
player
- the playerpublic void setGameBoard(GameBoard board)
board
- the new game boardpublic void setGUI(MonopolyGUI gui)
gui
- the new guipublic void setInitAmountOfMoney(int money)
money
- the new inits the amount of moneypublic void setNumberOfPlayers(int number)
number
- the new number of playerspublic void setUtilDiceRoll(int diceRoll)
diceRoll
- the new util dice rollpublic void startGame()
public void switchTurn()
public void updateGUI()
public void utilRollDice()
public void setTestMode(boolean b)
b
- the new test mode


Before Change
"of self.mean. Expected ...{} but got {}".format(self.loc.size(), base_samples.size())
)
sample_shape = torch.Size(tuple(base_samples.size(i) for i in range(base_samples.dim() - self.mean.dim())))
base_samples = base_samples.view(*sample_shape, *self.loc.shape)
samples = super(MultitaskMultivariateNormal, self).rsample(sample_shape=sample_shape, base_samples=base_samples)
After Change
// Make sure that the base samples agree with the distribution
mean_shape = self.mean.shape
base_sample_shape = base_samples.shape[-self.mean.ndimension() :]
if mean_shape != base_sample_shape:
raise RuntimeError(
"The shape of base_samples (minus sample shape dimensions) should agree with the shape "
"of self.mean. Expected ...{} but got {}".format(mean_shape, base_sample_shape)
)
sample_shape = base_samples.shape[: -self.mean.ndimension()]
base_samples = base_samples.view(*sample_shape, *self.loc.shape)
samples = super().rsample(sample_shape=sample_shape, base_samples=base_samples)


For Suffolk Day (Thursday 21 June), we asked four local authors how the county has inspired their writing.
Mary-Jane Riley
Mary-Jane Riley is the author of The Bad Things, set in Southwold, as well as follow-ups After She Fell and Dark Waters, set just over the border in Norfolk. She has also worked as a radio presenter. She says about Suffolk:
“I love it here. I love the isolated villages, the desolate salt marshes and reedbeds, the mysterious forests, the sandy beaches, the crumbling cliffs. The sky is wide and often grey, the air is crisp, the winds sharp from the North Sea.
“Suffolk, with its contrasts and edginess, is the perfect place to set a crime novel - as many writers have discovered: PD James, Ruth Rendell, Nicki French, Dorothy L Sayers - to name only four. So it’s no surprise I based my first crime novel in Southwold.
“With children and dogs, we have spent many hours charging along beaches in summer and winter. The seaside has a very different feel about it in the cold months, and that is what I wanted to capture with The Bad Things. I didn’t want the light and sunny feel of a town in the summer, I wanted whey-faced people huddled in coats, waves crashing on the shore, slate sky meeting slate sea. I wanted isolation, desolation.
“But I wanted a holiday place too, where a family should be happy, but who had dark secrets lurking just below the surface. Southwold was perfect.”
Ruth Dugdall
Ruth Dugdall has written a series of crime novels set in Suffolk. The first is The Woman Before Me and the latest is The Things You Didn’t See. She has also worked as a probation officer, a freelance journalist and in theatre.
“Suffolk does not have the easy beauty of chocolate-box counties, its huge skies can be dizzying, narrow roads reach remote villages via vast fields of rape and snuffling pigs, the North Sea is grey and cold. No surprise, then, that this landscape has attracted the dark imaginations of Ruth Rendell, P. D. James, Patricia Highsmith … and me! Suffolk is a major character in all seven of my crime novels.
“My home is Felixstowe, which has one just one major road leading in or out of it. It sits on the edge of the country, wedged between farmland and the cold sea. Perfect for a crime novelist, the town is like an Agatha Christie closed-room drama and the setting of my debut novel The Woman Before Me.
“Suffolk has a low crime rate - our county is one of the safest in the UK - yet we lay claim to the Suffolk Strangler, one of Britain’s most prolific serial killers. Perhaps understandably, Suffolk is conflicted about itself, and crime drama is about conflict – it is a genre that reflects the concerns of the world, holding a mirror to life. My Suffolk thrillers ask: how can bad things happen, even here?”
Francesca Armour-Chelu
Francesca Armour-Chelu has published two children’s novels, Fenn Halfin and the Fearzero and Fenn Halflin and the Seaborn. She also works for Suffolk Libraries.
“I had a pretty unfettered childhood and spent lots of it exploring Suffolk, particularly Aldeburgh where my parents, both painters, held exhibitions. So Suffolk’s marshlands inspired the settings for the Fenn Halflin series and even specific landmarks, like the Ionia, an old houseboat that ran aground in the river Alde, make an appearance. Now that just her ribs remain, I wanted to resurrect her - if only in words.
“Numerous writers have made Suffolk their home and the countryside clearly gives stories a wonderful visual anchorage but, being born and bred here, that’s only part of it for me. Growing up, Suffolk felt stranger than other places, less reasonable and more magical than the picture-postcard villages suggest. I think people from here feel this instinctively, hence our legends: Devil’s dogs, wild men snared in fishing nets, ghosts of drummer-boys, green children babbling in strange tongues, to name a few.
“There’s a lovely line in The Little Prince by Antoine de Saint-Exupéry: “It is only with the heart that one can see rightly, what is essential is invisible to the eye”. Essential Suffolk, brimful of old magic, made me a writer; growing up amidst mystery and magic, storytelling inevitably seeps into you.”
Edward Wilson
Edward Wilson was born in Baltimore and served as an officer in the US Special Forces before becoming an English literature teacher in Suffolk in 1976. He has written a series of spy novels, the most recent of which is A Very British Ending.
“I first came to Suffolk 43 years ago for an interview at Lowestoft College – and it was love at first sight. The landscape echoed a line from Philip Larkin’s Whitsun Weddings: ‘Where sky and Lincolnshire and water meet’.
“Although I’m now a UK citizen, I was born in America and served as a Special Forces officer in Vietnam. After leaving the army, I led a troubled existence swapping jobs and countries, but as soon as I saw Suffolk I knew I had come home.”
“My second novel, The Envoy, is an homage to Suffolk. Kit Fournier, an American diplomat/spy, is sent to Suffolk to spy on Orford Ness, but becomes enamoured of the place instead. Kit buys a boat to facilitate his snooping on the secret test site, but shirks his duty to explore the winding creeks and rivers. Butley Creek, ‘in turn desolate, wild and mysterious’, becomes his favourite.
“William Catesby, Lowestoft born and bred, is the main character of my next five novels. Traumatised by his experiences as an SOE officer in France and later as an MI6 spy, he always comes back to Suffolk – and not just for healing. Suffolk is Catesby’s ancestral home and he understands its mysteries. He explains to a colleague that the breaking waves are the ghost voices of an old couple:
“They’re trapped down there where the sea meets the shingle. They’re talking gently tonight, but when the autumn gales come they’ll be shouting at each other.”
“Catesby, like his childhood neighbour Benjamin Britten, knows that Suffolk is also about Peter Grimes and the Red Barn. The dark secrets of Suffolk are just as inspiring for a writer or composer as its gentle soothing beauty.
“My favourite film is Peter Greenaway’s Drowning by Numbers – and its wonderful soundtrack by Michael Nyman. Greenaway captures the dark magic of Suffolk in the very first scene and never lets go. Suffolk’s quiet beauty is never bland: the ordinary cheerfully jogs along beside the sinister; the quirky and bizarre are never questioned, but simply accepted as part of life.
“Unlike the alps, Suffolk isn’t a place that shouts its beauty at the artist or writer. The appeal of Suffolk is understated, subtle and nuanced. It’s a fine wine rather than a cocktail brimming with fruit and spirits. I am sure this subtlety and its hidden surprises – as well as the incredible light! – are qualities that attract so many artists here. It is, for artists and writers, vital that a place inspires them.
“A great example of such inspiration is W.G. ‘Max’ Sebald’s The Rings of Saturn. I think that Max, whom I knew, was not just inspired by Suffolk, but a little frightened of it.
“I’m not sure that I would have become a writer if it hadn’t been for Suffolk. I need the rural isolation and quiet – and also the sea, the rivers and the marshes. Unlike other landscapes, Suffolk is one that is constantly changing owing to the tides, the light and the coastal erosion. In my four decades here, I have a seen a dozen different Covehithes. But what inspires me most is the sense of mystery of a people and land that never reveals all.”
If you’ve been inspired to write a novel, short story or poetry by living in Suffolk, why not self-publish your novel for Suffolk borrwers as an eBook with our Suffolk Writes project?
See also: Top titles to read for Suffolk Day 2017


API
Element
closest
closest
.closest(
selector
)
selector
find the closest parent element matches with the selector.


A web developer based in the Bay Area • A UC Berkeley Extension Full Stack Coding Program graduate • A UC Davis alumni • A video game hobbyist • A part time hip-hop dancer • A tech enthusiast • A Day Late Friend • A student of life
Integrate UI/UX designs and APIs to a webpage.
Establish servers + Manage SQL/NoSQL databases.
User focused, responsive, modern design for any site.
Is the Rebuild series a sequel to Neon Genesis??
I'm available for hire. Send me an email or message me on LinkedIn for more details.


| Seal Owner |
Maximum Deployment Number |
| All Cases |
Teleporter (Fix)
Inner Wall (East)-Outer Wall (West)-Holy Item Repository (1 person)
Outer Wall-Inner Wall (East)-Outside-Holy Item Repository (1 person)
Outer Wall-Outer Wall (West)-Outside-Holy Items Repository (1 person)
Outer Wall-Inner Wall (West)-Holy Item Repository (1 person)
Outer Wall-Inner Wall (East)-Outer Wall (West)-Outside (1 person)
|
| None |
Elite Mercenary Guild Members (Fix/Move)
Inspection (4 persons/4 persons)
Pikemen (10 persons/10 persons)
Archers (10 persons/10 persons)
Clerics (2 persons/2 persons)
Wizards (2 persons/2 persons)
Mercenary Guild Members (Fix/Move)
Inspection (10 persons/10 persons)
Pikemen (6 persons/6 persons)
Archers (20 persons/20 persons)
Clerics (4 persons/4 persons)
Wizards (4 persons/4 persons)
|
| Dawn |
Nephilim Mercenaries (Move)
Warriors (2 persons)Wizards (2 persons)
Mercenaries of Dawn (Fix/Move)
Inspection (10 persons/10 persons)
Pikemen (4 persons/4 persons)
Archers (20 persons/20 persons)
Clerics (4 persons/4 persons)Wizards (4 persons/4 persons)
Elite Mercenary Guild Members (Fix/Move)
Inspection (4 persons/4 persons)
Pikemaen (4 persons/4 persons)
Archers (10 persons/10 persons)
Clerics (2 persons/2 persons)Wizards (2 persons/2 persons)
Mercenary Guild Members (fix/Move)
Inspection (10 persons/10 persons)
Pikemen (6 persons/6 persons)
Archers (20 persons/20 persons)
Clerics (4 persons/4 persons)
Wizards (4 persons/4 persons)
|
| Dusk |
Greater Recruits (Fix/Move)
Inspection (4 persons/4 persons)
Pikemen (4 persons/4 persons)
Archers (10 persons/10 persons)
Clerics (2 persons/2 persons)
Wizards (2 persons/2 presons)
Recruits (Fix/Move)
Inspection (10 persons/10 persons)
Pikemen (6 persons/6 persons)
Archers (20 persons/20 persons)
Clerics (4 persons/4 persons)
Wizards (4 persons/4 persons)
|


Big success for production scheduling training in Vieux Fort and Soufriere
by Embassy of the Republic of China (Taiwan) in Saint Lucia(PRESS RELEASE) – After the training of GAPs, marketing and business strategy, post-harvest and food safety, cultivation management and pesticide management, farmers in St. Lucia have not only learned much information in agriculture but also knew the needs from market.
However, even though the farmers have already knew the needs from market, they still don’t know when to produce the vegetables and fruits at the right timing, so Taiwan Technical Mission have brought an amazing training in production scheduling to the farmers.
The course was held on October 23rd in Vieux Fort and Soufriere. Both regions are very important production area in agriculture, this training have provided farmers to know how to scheduled their production in order to increase the yield and provide a stable quantity of vegetables and fruits during the peak season, so the people in St. Lucia can have more chance to get the fresh local vegetables and fruits everyday
There were 120 farmers attended the training, and this course got very good feedback. After training, some farmers even expressed their thanks to the instructors. They also would like to have more trainings in the future! The Taiwan Technical Mission heard your voice! We will keeping hold more different and excellent trainings in St. Lucia, please look forward to it
More Agriculture Stories
-
New Castries market nears completion: officials November 8, 2019
-
Saint Lucia gets help from Argentina to boost honey production, marketing November 7, 2019
-
Broader horizons for Black Bay Farmers November 6, 2019
-
Bee City Project to boost Saint Lucia’s apiary industry November 5, 2019
-
Former Saint Lucia agriculture minister bats for increasing local food production October 16, 2019
-
OECS farmers, stakeholders trained in ICTs for climate-smart agriculture October 11, 2019
-
Agriculture ministry conducts workshop to enhance St. Lucia’s cocoa sector October 8, 2019
-
Farmer’s market — part of the Saint Lucia gov’t’s strategy to reduce the national food import bill September 28, 2019
-
Saint Lucian farmers’ skills expected to be boosted through Taiwan Technical Mission training program September 27, 2019


WEB RTC EXPERIMENT
Basic
Motion Detection (Basic Explanation)
Face tracking using headtrackr.js and Three.js
Motion Detection
Canvas source
Used for blend mode difference
Blended Canvas
The blended that returns white on the difference instead of the color differential.


These contact details aare not shared publicly and are only used for internal communications
Use a seperate number to receive SMS updates.
After setting your custom domain, please login to your domain management portal and add the record listed below. If you have trouble doing this Read this article on setting up your shop with a custom domain.
| Record Type | Name | Value |
|---|---|---|
| CNAME | {{ vm.shop.alias }} | {{ vm.oneshop_ip_addr }} |
Your settings are not saved.
| Account Status | Active Not Active |
| Current Subscription | {{ vm.subscription.type | uppercase }} Upgrade plan |
| Expires | {{ vm.subscription.date_expires }} |
| Site status | Published Not Published |
Your shop is currently inactive - this means that only you
Publishing your shop means it will be active and anyone can view your site.
If you choose to unpublish your
site, all visitors will be shown a page stating that the site is currently unavailable.


Great podcast episode by FiveThirtyEight- Gerrymandering Project
What is gerrymandering? This is the first episode in a six-part series exploring the effects of gerrymandering and how reformers hope to change the system.
Great podcast episode by FiveThirtyEight- Gerrymandering Project
What is gerrymandering? This is the first episode in a six-part series exploring the effects of gerrymandering and how reformers hope to change the system.
🚀 “SpaceX will launch its first Falcon Heavy rocket early in the new year and founder Elon Musk is betting the eternal resting place of his personal cherry red Tesla Roadster on the successful outcome of the test flight…” – Musk Parks His Tesla In Orbit - AVweb
🚀 “The Dream Chaser flight test demonstrated excellent performance of the spacecraft’s aerodynamic design and the data shows that we are firmly on the path for safe, reliable orbital flight…” – Dream Chaser Flies Free, Again
✈ “Now the NASM is due for its first major upgrade, the Museum has announced. The seven-year project, which begins next summer, will transform the exterior of the building, and all 23 galleries will get a makeover…” – NASM To Get A Makeover - AVWeb
✈ “After stopping production more than 20 years ago, Aero Vodochody is preparing to bring an updated version of the L-39 Albatros jet trainer back to the market.” – Aero Vodochody Selecting Suppliers for New L-39NG - AVweb
Hey there!
Paul Manafort, Who Once Ran Trump Campaign, Indicted on Money Laundering and Tax Charges - The New York Times
✈ “a plan that had evidently not been run past Air Force leadership…” – USAF Rejects Retired Pilot Recall - AVweb
🚗 “Adasky is developing a far infrared thermal camera called Viper that it says can expand the conditions that automated cars will be able to operate in, and improve safety.” – Night Vision for Self-Driving Cars - IEEE Spectrum
✈ “Experts have hailed the deal as hugely significant and described it as akin to a supervolcano exploding in the aviation world.” – Bombardier to partner Airbus on C-Series jets - BBC
✈ “It’s been 70 years since Chuck Yeager squeezed into the sharply tapered cockpit of the Bell X-1 rocket plane and cracked a physical and psychological barrier that busted aircraft development wide open.” – Supersonic Flight 70 Years Old - AVweb


Chapter 1 Introduction
Circular layout is very useful to represent complicated information. First, it elegantly represents information with long axes or a large amount of categories; second, it intuitively shows data with multiple tracks focusing on the same object; third, it easily demonstrates relations between elements. It provides an efficient way to arrange information on the circle and it is beautiful.
Circos is a pioneer tool widely used for circular layout representations implemented in Perl. It greatly enhances the visualization of scientific results (especially in Genomics field). Thus, plots with circular layout are normally named as “circos plot”. Here the circlize package aims to implement Circos in R. One important advantage for the implementation in R is that R is an ideal environment which provides seamless connection between data analysis and data visualization. circlize is not a front-end wrapper to generate configuration files for Circos, while completely coded in R style by using R’s elegant statistical and graphic engine. We aim to keep the flexibility and configurability of Circos, but also make the package more straightforward to use and enhance it to support more types of graphics.
In this book, chapters in Part I give detailed overviews of the general circlize functionalities. Part II introduces functions specifically designed for visualizing genomic datasets. Part III gives comprehensive guilds on visualizing relationships by Chord diagram.
1.1 Principle of design
A circular layout is composed of sectors and tracks. For data in different categories, they are allocated into different sectors, and for multiple measurements on the same category, they are represented as stacked tracks from outside of the circle to the inside. The intersection of a sector and a track is called a cell (or a grid, a panel), which is the basic unit in a circular layout. It is an imaginary plotting region for drawing data points.
Since most of the figures are composed of simple graphics, such as points, lines, polygon, circlize implements low-level graphic functions for adding graphics in the circular plotting regions, so that more complicated graphics can be easily generated by different combinations of low-level graphic functions. This principle ensures the generality that types of high-level graphics are not restricted by the software itself and high-level packages focusing on specific interests can be built on it.
Currently there are following low-level graphic functions that can be used for
adding graphics. The usage is very similar to the functions without circos.
prefix from the base graphic engine, except there are some enhancement
specifically designed for circular visualization.
circos.points()
: adds points in a cell.circos.lines()
: adds lines in a cell.circos.segments()
: adds segments in a cell.circos.rect()
: adds rectangles in a cell.circos.polygon()
: adds polygons in a cell.circos.text()
: adds text in a cell.circos.axis()
andscircos.yaxis()
: add axis in a cell.
Following function draws links between two positions in the circle:
circos.link()
Following functions draw high-level graphics:
circos.barplot()
: draw barplots.circos.boxplot()
: draw boxplots.circos.violin()
: draws violin plots.circos.heatmap()
: draw circular heatmaps.circos.raster()
: draw raster images.circos.arrow()
: draw circular arrows.
Following functions arrange the circular layout.
circos.initialize()
: allocates sectors on the circle.circos.track()
: creates plotting regions for cells in one single track.circos.update()
: updates an existed cell.circos.par()
: graphic parameters.circos.info()
: prints general parameters of current circular plot.circos.clear()
: resets graphic parameters and internal variables.
Thus, theoretically, you are able to draw most kinds of circular figures by the above functionalities. Figure 1.1 lists several complex circular plots made by circlize. After going through this book, you will definitely be able to implement yours.
1.2 A quick glance
Before we go too deep into the details, I first demonstrate a simple example with using basic functionalities in circlize package to help you to get a basic idea of how the package works.
First let’s generate some random data. There needs a character vector to represent categories, a numeric vector of x values and a vectoe of y values.
set.seed(999)
n = 1000
df = data.frame(sectors = sample(letters[1:8], n, replace = TRUE),
x = rnorm(n), y = runif(n))
First we initialize the circular layout. The circle is split into sectors
based on the data range on x-axes in each category. In following code, df$x
is split by df$sectors
and the width of sectors are automatically calculated
based on data ranges in each category. Be default, sectors are positioned
started from \(\theta = 0\) (in the polar coordinate system) and go along the circle
clock-wisely. You may not see anything after running following code because no
track has been added yet.
We set a global parameter track.height
to 0.1 by the option function
circis.par()
so that all tracks which will be added have a default height of
0.1. The circle used by circlize always has a radius of 1, so a height of
0.1 means 10% of the circle radius. In later chapters, you can find how to set the
height with physical units, e.g. cm.
Note that the allocation of sectors only needs values on x direction (or on the circular direction), the values on y direction (radical direction) will be used in the step of creating tracks.
After the circular layout is initialized, graphics can be added to the plot in
a track-by-track manner. Before drawing anything, we need to know that all
tracks should be first created by circos.trackPlotRegion()
or, for short,
circos.track()
, then the low-level functions can be added afterwards. Just
think in the base R graphic engine, you need first call plot()
then you can
use functions such as points()
and lines()
to add graphics. Since x-ranges
for cells in the track have already been defined in the initialization step,
here we only need to specify the y-range for each cell. The y-ranges can be
specified by y
argument as a numeric vector (so that y-range will be
automatically extracted and calculated in each cell) or ylim
argument as a
vector of length two. In principle, y-ranges should be same for all cells in a
same track. (See Figure 1.2)
circos.track(df$sectors, y = df$y,
panel.fun = function(x, y) {
circos.text(CELL_META$xcenter,
CELL_META$cell.ylim[2] + mm_y(5),
CELL_META$sector.index)
circos.axis(labels.cex = 0.6)
})
col = rep(c("#FF0000", "#00FF00"), 4)
circos.trackPoints(df$sectors, df$x, df$y, col = col, pch = 16, cex = 0.5)
circos.text(-1, 0.5, "text", sector.index = "a", track.index = 1)
Axes for the circular plot are normally drawn on the most outside of the
circle. Here we add axes in the first track by putting circos.axis()
inside
the self-defined function panel.fun
(see the code above). circos.track()
creates plotting region in a cell-by-cell manner and the panel.fun
is
actually executed immediately after the plotting region for a certain cell is
created. Thus, panel.fun
actually means adding graphics in the “current
cell” (Usage of panel.fun
is further discussed in Section 2.7).
Without specifying any arguments, circos.axis()
draws x-axes
on the top of each cell (or the outside of each cell).
Also, we add sector name outside the first track by using circos.text()
.
CELL_META
provides “meta information” for the current cell. There are
several parameters which can be retrieved by CELL_META
. All its usage is
explained in Section 2.7. In above code, the sector names are
drawn outside the cells and you may see warning messages saying data points
exceeding the plotting regions. That is total fine and no worry about it. You
can also add sector names by creating an empty track without borders as the
first track and add sector names in it (like what
circos.initializeWithIdeogram()
and chordDiagram()
do, after you go through
following chapters).
When specifying the position of text on the y direction, an offset of
mm_y(5)
(5mm) is added to the y position of the text. In circos.text()
, x and y
values are measured in the data coordinate (the coordinate in cell), and there
are some helper functions that convert absolute units to corresponding values
in data coordinate. Section
2.8.2 provides more information of converting units in
different coordinates.
After the track is created, points are added to the first track by
circos.trackPoints()
. circos.trackPoints()
simply adds points in all cells
simultaneously. As further explained in Section 3.2, it can be
replaced by putting circos.text()
in panel.fun
, however,
circos.trackPoints()
would be more convenient if only the points are needed
to put in the cells (but I don’t really recommend). It is quite straightforward to understand that this
function needs a categorical variable (df$sectors
), values on x direction
and y direction (df$x
and df$y
).
Low-level functions such as circos.text()
can also be used outside
panel.fun
as shown in above code. If so, sector.index
and track.index
need to be specified explicitly because the “current” sector and “current”
track may not be what you want. If the graphics are directly added to the
track which are most recently created, track.index
can be ommitted because
this track is just marked as the “current” track.
OK, now we add histograms to the second track. Here circos.trackHist()
is a
high-level function which means it creates a new track (as you can imagin hist()
is also a high-level function). bin.size
is explicitly set so that the bin
size for histograms in all cells are the same and can be compared to each
other. (See Figure 1.3)
bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)
circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
In the third track and in panel.fun
, we randomly picked 10 data points in
each cell, sort them by x-values and connect them with lines. In following
code, when sectors
(the first unnamed argument), x
and y
arguments are set in
circos.track()
, x values and y values are split by df$sectors
and
corresponding subset of x and y values are sent to panel.fun
through
panel.fun
’s x
and y
arguments. Thus, x
an y
in panel.fun
are
exactly the values in the “current” cell. (See Figure
1.4)
circos.track(df$sectors, x = df$x, y = df$y,
panel.fun = function(x, y) {
ind = sample(length(x), 10)
x2 = x[ind]
y2 = y[ind]
od = order(x2)
circos.lines(x2[od], y2[od])
})
Now we go back to the second track and update the cell in sector “d”.
This is done by circos.updatePlotRegion()
or the short version
circos.update()
. The function erases graphics which have been added.
circos.update()
can not modify the xlim
and ylim
of the cell as well as
other settings related to the position of the cell. circos.update()
needs
to explicitly specify the sector index and track index unless the “current”
cell is what you want to update. After the calling of circos.update()
,
the “current” cell is redirected to the cell you just specified and you
can use low-level graphic functions to add graphics directly into it.
(See Figure 1.5)
circos.update(sector.index = "d", track.index = 2,
bg.col = "#FF8080", bg.border = "black")
circos.points(x = -2:2, y = rep(0.5, 5), col = "white")
circos.text(CELL_META$xcenter, CELL_META$ycenter, "updated", col = "white")
Next we continue to create new tracks. Although we have gone back to the
second track, when creating a new track, the new track is still created after
the track which is most inside. In this new track, we add heatmaps by
circos.rect()
. Note here we haven’t set the input data, while simply set
ylim
argument because heatmaps just fill the whole cell from the most left
to right and from bottom to top. Also the exact value of ylim
is not
important and x
, y
in panel.fun()
are not used (actually they are both
NULL
). (See Figure 1.6)
circos.track(ylim = c(0, 1), panel.fun = function(x, y) {
xlim = CELL_META$xlim
ylim = CELL_META$ylim
breaks = seq(xlim[1], xlim[2], by = 0.1)
n_breaks = length(breaks)
circos.rect(breaks[-n_breaks], rep(ylim[1], n_breaks - 1),
breaks[-1], rep(ylim[2], n_breaks - 1),
col = rand_color(n_breaks), border = NA)
})
In the most inside of the circle, links or ribbons are added. There can be links from single point to point, point to interval or interval to interval. Section 3.11 gives detailed usage of links. (See Figure 1.7)
circos.link("a", 0, "b", 0, h = 0.4)
circos.link("c", c(-0.5, 0.5), "d", c(-0.5,0.5), col = "red",
border = "blue", h = 0.2)
circos.link("e", 0, "g", c(-1,1), col = "green", border = "black", lwd = 2, lty = 2)
Finally we need to reset the graphic parameters and internal variables, so that it will not mess up your next plot.


From the Death Certificate
for John C. Latta
#62134 Malaga Twp., Monroe
Co., OH*
Married
Born Aug. 13, 1837, W Va
Age: 78 years 2 months 27 days
Farmer
Son of John Latta and Anna
Hillbury, both from Pa.
Informant: T. L. Latta,** Calais, Ohio
Date of death: November 10, 1915
Cause of death: No physician called. Third Stroke Paralysis
Burial: Calais, Nov 12th. 1915
Notes:
* This certificate was marked
RETURNED. The 2d one was in completely
different, large, flowing handwriting and even the signature of the informant
was not the same. The new one had this additional statement
under the "Third Stroke Paralysis:
"As to the information . . .? . . . he died a natural death." [Submitter
had difficulty reading the one or two words.]
** T. L. Latta was his son Thomas Leroy Latta.
Provided by Betty Latta Kitchen
Click here for the Short-Cut Table of Contents


[Gecode] int/count
Christian Schulte
schulte at imit.kth.se
Thu Nov 20 11:42:35 CET 2003
I just updated from CVS and noticed that the modifications by Gabor broke
the system badly (you forgot a method for Distinct::dom but still compiled
as Dom is a subclass of Bnd so onlt Bnd propgators were created) as well as
somethings were nonsensical. Things are delicate with distinct, if you don't
know what purposes some flags serve, please don't touh it at all!
I have fixed it but I think that the approach that I have to fix every
morning things that shouldn't have been touched to start with is going
nowhere.
Cheers
Christian
--
Christian Schulte, http://www.imit.kth.se/~schulte/
> -----Original Message-----
> From: gecode-bounces at ps.uni-sb.de
> [mailto:gecode-bounces at ps.uni-sb.de] On Behalf Of Christian Schulte
> Sent: Thursday, November 20, 2003 11:15
> To: gecode at ps.uni-sb.de
> Subject: RE: [Gecode] int/count
>
>
> This is definitely handwritten and as said I see currently no
> need to change it in any way.
>
> While I do appreciate your enthusiasm I think that you should
> not try to do structural changes to Gecode at your current
> level of expertise on your own. It might be a good idea to
> seek discussion first.
>
> Christian
>
> --
> Christian Schulte, http://www.imit.kth.se/~schulte/
>
> > -----Original Message-----
> > From: gecode-bounces at ps.uni-sb.de
> > [mailto:gecode-bounces at ps.uni-sb.de] On Behalf Of Gabor Szokoli
> > Sent: Tuesday, November 18, 2003 16:55
> > To: gecode at ps.uni-sb.de
> > Subject: [Gecode] int/count
> >
> >
> > Hi!
> >
> > Is all that source code in int/count handwritten or
> > generated? (I'd hate
> > to waste effort modifying it only to be overwritten when
> > re-generated...)
> >
> > Gabor
> > _______________________________________________
> > Gecode mailing list
> > Gecode at ps.uni-sb.de http://www.ps.uni-sb.de/mailman/listinfo/gecode
> >
>
> _______________________________________________
> Gecode mailing list
> Gecode at ps.uni-sb.de http://www.ps.uni-sb.de/mailman/listinfo/gecode
>
More information about the gecode-users
mailing list


[CANDIDATE_NAME]
Candidate certificates and overrall experience.
[CANDIDATE_CERT]
[INTERVIEWER_NAME]
[DATE]
[INTERVIEW_RESULT]
Area
Technology
None
Beginner
Intermediate
Advanced
Test
Some
Otto
X
Jacob
Thornton
@fat
Otto
@mdo
Larry the Bird
@twitter
Otto
@mdo
Business experience (Transaction systems, B2B, Telecom, etc.)
[BUSSINESS_COMMENTS]
Comments and Observations
[COMMENTS]
Conclusions
Grade
[GRADE]
[STATUS]
Rejected


U-Flood
Florida Keys
View Map
Houston
View Map
I-45 Corridor
View Map
Galveston
View Map
Beaumont
View Map
Lake Charles
View Map
Baton Rouge
View Map
New Orleans
View Map
A project to visualize flood reports using open data and interactive maps
Fork me


Birmingham fans react to reports Leeds want David Stockdale
by Jordan HarrisA number of Birmingham City fans have taken to Twitter to comment on reports from the Sunday People (17/11; page 50) suggesting that Leeds United want David Stockdale in January.
Stockdale has endured a difficult time since moving to St Andrew’s. He played 39 times in all competitions during his first year with the club. But he has not made a league appearance for Birmingham since May 2018.
Pep Clotet has used him once this season. And it appears that there may be a good chance that the 3-0 Carabao Cup defeat to Portsmouth in August could prove to be his final appearance for the club.
The Sunday People (17/11; page 50) reports that Leeds want Stockdale in January. Kiko Casilla has been outstanding for Marcelo Bielsa’s side this term. But the Whites are certainly lacking an experienced backup option.
A move for Stockdale looks to make good sense for Leeds. He may not play much, but there are few around who boast more experience in the Championship.
Nevertheless, plenty of Birmingham fans appear to be in favour of Stockdale moving to Leeds. They believe that he needs to be offloaded in the near future, and hope that the Whites do make a move.
It is perhaps telling that, despite wanting Lee Camp to be dropped as number one, several Blues supporters would still not mind seeing Stockdale move to Elland Road.
If Leeds are determined to land a more experienced backup option, it would appear that a move for Stockdale could prove to be best for all parties.
Here is what some of the Birmingham fans make of the reports…
Have something to tell us about this article?
Let us know


|
A |
B |
C |
D |
E |
F |
|
1 |
2 |
3 |
4 |
5 |
6 |
Above is the code with the fix. Below is the code without the fix.
|
A |
B |
C |
D |
E |
F |
|
1 |
2 |
3 |
4 |
5 |
6 |


Unathi releases memoir on her birthday
Graye Morkel
Cape Town - Idols SA judge Unathi Nkayi released her memoir on Wednesday - which also happened to be her birthday.
Titled, I Keep Learning, Unathi joins the likes of Letshego Zulu and Rolene Strauss who have both released books in 2019.
Following the release of the book Unathi's celebrity friends have sent their congratulations on social media.
I Keep Learning takes us through some of the most memorable and career-defining moments of Unathi's life, as she speaks about her career, marriage, family, friends and other influential people.
"Today you launch your memoir, a story I can't wait to read to piece together the many beautiful memories you describe of your childhood that took you [to] countries African people couldn't imagine," Minnie Dlamini wrote on Instagram.


the and for was were The with {background virus using margin {border-style Î¼L []. fever px;} #ffffff;} detection DENV from each min samples study Â°C Detection between dengue mobile this Medina added patients Gounass RNA febrile performed Dengue Infect. NMFI O.F. [], laboratory results viral ÂµL DENV- Virus has incubated positive px; real-time {font-family (Oumar After Clin. Figure For RPA This amplification care children enrolled font-size malaria sequences Faye), I.D., RT-RPA With are been double; illness kit min. polymerase rapid specific three well years (Figure (Qiagen, ... A.A.S.; Africa, African Dakar ELISA IgM PBS Phylogenetic all antibody antigen arbovirus assay before border-color border-width capture cells collected confirmed determined epidemic extraction gene health into isolation obtained plate point prevalence solid; suitcase yellow yielded {font-style {font-weight (%; Antigen Asian Assay C-prM Data Fever Health Hilden, PCR Pasteur Time []; acute after also analysis arboviral area bold can cases centre conducted courier; diagnosis diluted due during em; following human infected infection isolates located low not nucleotide our pt;} recombinase sample studies supported symptoms tested that two which


{% extends "webapp/admin/_confirm_page.html" %} {% set color_scheme = 'success' %} {% block breadcrumb %}
{% endblock %} {% block action_title %} You are about to publish {% if bulk %}all tasks in the set{% else %}«{{ task.name }}»{% endif %} {% endblock %} {% block action_text %} {% if bulk %}
Please note that this action is irreversible. Once the task is published it can only be archived.
Archived tasks will be accessible to subscribed users by a direct (brute forcible) link.
Be aware of any sensible information {% if bulk %}those tasks{% else %}this task{% endif %} may contain in the description.


Both theoretical probability and empirical probabilities have similar building blocks. The sample space is the collection of all possible outcomes. An event consists of one or more outcomes. The probability is a ratio of the specific event of interest over the total number of outcomes. In this module, while we recognize the importance of understanding the underlying formulas for probability, we rely on simulations to develop skills that link initial statements of probability and the outcomes of experiments.
in-context


COM4521 Parallel Computing with Graphical Processing Units (GPUs)
| Summary |
Accelerator architectures are discrete processing units which supplement a base processor with the objective of providing advanced performance at lower energy cost. Performance is gained by a design which favours a high number of parallel compute cores at the expense of imposing significant software challenges. This module looks at accelerated computing from multi-core CPUs to GPU accelerators with many TFlops of theoretical performance. The module will give insight into how to write high performance code with specific emphasis on GPU programming with NVIDIA CUDA GPUs. A key aspect of the module will be understanding what the implications of program code are on the underlying hardware so that it can be optimised. Students should be aware that there are limited places available on this course. |
| Session |
Spring 2018/19 |
| Credits |
15 |
| Assessment |
80% for project assignment of which 40% is for the delivery of course work (code) and 40% is for written report describing methods and techniques
Two 10% multiple choice quizzes. |
| Lecturer(s) |
Dr Mozhgan Kabiri-Chimeh |
| Resources |
|
| Aims |
- To introduce modern accelerator architectures, explain the difference between data and task parallelism and raise awareness into how the practical and theoretical performance of architectures differs.
- To give practical knowledge of how GPU programs operate and how they can be utilised for high performance applications.
- To develop an understanding of the importance of benchmarking and profiling in order to recognise factors limiting performance and to address these through optimisation.
|
| Objectives |
By the end of this course students will be able to:
- Understand how to write C programs and manage memory allocation manually.
- Utilise OpenMP to write programs for multi core architectures to improve code performance.
- Be able to describe and discuss performance techniques for multi core processors.
- Program GPUs for general purpose use with the CUDA language.
- Appreciate how GPU program performance can be improved through intelligent caching.
- Appreciate the scope, potential and limitations of accelerators for improving code performance.
- Benchmark and profile GPU programs.
- Identify limiting factors to code performance and address these through architecture specific optimisation techniques.
- Recognise and understand the importance of parallel primitives (such as scan and reduce) and understand how these can be implemented with data parallelism.
|
| Content |
- Introduction to accelerated computing
- Introduction to programming in C
- Pointer and Memory
- Optimising C programs
- Multi core programming with OpenMP
- Introduction to Accelerated Computing
- Introduction to CUDA
- GPU memory systems
- Caching and Shared Memory
- Synchronisation and Atomics
- Parallel Primitives
- Asynchronous programming
- Profiling and Optimisation of GPU programs
|
| Restrictions |
This module has a large amount of practical programming. Only students with a strong programming background should participate. |
| Teaching Method |
Weekly lectures will introduce students to the background on CPU and GPU architectures and programming techniques. Lectures will highlight key design principles for parallel and GPU programming to give students the necessary insight to be able to constructively look at problems and understand the implications of parallel computing.
Lab sessions will facilitate hands on learning of practical skills through targeted exercises |
| Feedback |
Students will receive continuous feedback from lab sessions and Google discussion groups. Feedback will also be given on marked quiz assignments and for the main assignment. |
| Recommended Reading |
- Edward Kandrot, Jason Sanders, "CUDA by Example: An Introduction to General-Purpose GPU Programming", Addison Wesley 2010.
- Brian Kernighan, Dennis Ritchie, “The C Programming Language (2nd Edition)”, Prentice Hall 1988.
|
|


I believe in the quote which says "Creativity is thinking up new things. Innovation is doing new things". The quote inspires me to be always creative, innovative and a learner. I always keep myself busy learning new things and doing research on little what I know.
 I’m curious, and I enjoy work that challenges me to learn something new and stretch in a different direction. I do my best to stay on top of changes in the state of the art so that I can meet challenges with tools well suited to the job at hand. The list of projects I follow on GitHub will give you a good idea of the types of tools I’d prefer to be using
Hire Me! Download my ResumeHi, i’m Sushant Mall an avid follower of technology and a developer by trade.
Don’t limit yourself. Many people limit themselves to what they think they can do. You can go as far as your mind lets you. What you believe, remember, you can achieve.
Android app developer


Modify the previous program. At this stage, you need to add a user menu.
The menu should display the following actions:
1. Search information.
2. Print all data.
0. Exit.
The user must select a menu item and then enter data if necessary. Your program must not stop until the corresponding option (the exit option) is chosen.
Decompose the program into separate methods to make it easy to understand and add to or edit later.
In the example below, we use people as a dataset example. The lines that start with > represent the user input.
Enter the number of people:
> 6
Enter all people:
> Dwight Joseph<EMAIL_ADDRESS>> Rene Webb<EMAIL_ADDRESS>> Katie Jacobs
> Erick Harrington<EMAIL_ADDRESS>> Myrtle Medina
> Erick Burgess
=== Menu ===
1. Find a person
2. Print all people
0. Exit
> 3
Incorrect option! Try again.
=== Menu ===
1. Find a person
2. Print all people
0. Exit
> 1
Enter a name or email to search all suitable people.
> KATIE
Katie Jacobs
=== Menu ===
1. Find a person
2. Print all people
0. Exit
> 2
=== List of people ===
Dwight Joseph<EMAIL_ADDRESS>Rene Webb<EMAIL_ADDRESS>Katie Jacobs
Erick Harrington<EMAIL_ADDRESS>Myrtle Medina
Erick Burgess
=== Menu ===
1. Find a person
2. Print all people
0. Exit
> 0
Bye!


patients headache ICHD CPH Headache diagnosis children years < MOH chronic (.%) data {border-style criteria px;} #ffffff;} age migraine pediatric Chronic adolescents study Figure .). significant (.%), clinical daily duration frequency frequent headaches prevalence prophylactic University associated attack did drug drugs efficacy features overuse symptoms topiramate Pain amitriptyline population primary px; treatment undefined {font-family (ICHD Italy font-size higher possible risk .–.; Neurol. Neurology Papetti age. compared diagnosed double; included main medical medication patients. probable therapy used version vs. (%) (.% (OR .%, ./j.-...x Cephalalgia Children Insubria Rome age, and/or attacks border-color border-width collection effective episodic groups including obtained pCM patients, qualitative response results solid; younger {font-style {font-weight > .), ./head. According Amitriptyline Bambino CTTH Child Classification Congress Gesù However, International Medication Study according adolescent adolescents: adult bold concerning conducted considered courier; criteria. criterion different distribution duration, em; females, follow-up followed history increase pharmacological presence present prophylaxis pt;} receive reported shorter showed statistical subtypes therapies topiramate, years, young


Hmm... Are you questioning my past achievements?
I have heard how your power and skill have already surpassed those of the Spiculas.


Work Day Scheduler
A simple calendar app for scheduling your work day
09:00 AM
💾
10:00 AM
💾
11:00 AM
💾
12:00 PM
💾
01:00 PM
💾
02:00 PM
💾
03:00 PM
💾
04:00 PM
💾
05:00 PM
💾


Portraits of life on SF's streets
These portraits provide glimpses into the lives of 12 people whose experiences help tell the story of the streets.
June 28, 2016
Alberto Terrell
“It’s difficult being homeless,” says Alberto Terrell, 55. “I have medical problems and I needed a new pair of shoes, and that is the honest-to-God truth. It’s hard, but you know what, if you try to at least go to some of the places that will help you, you feel a little better. ... It’s good because I have a quarter of a bone missing in my leg, so new shoes help me balance because I have a lift in my left leg. It will be very helpful, and I really appreciate it.”
Photographer
{{ credit.info("Lea Suzuki", "lsuzuki", 'Lea_Suzuki' ) }}Interactive producers
{{ credit.info('Lucio Villa', 'lvilla', 'luciovilla' ) }} {{ credit.info('Benjamin Din', 'bdin', 'benjamindin' ) }} {{ credit.info("Emma O'Neill", "eoneill", "emmaruthoneill" ) }}


Home
Diet
Exercises
About
Contact
Martin Hokman, proffessional fitness trainer
My Story
My name is Martin Hokman. I am 18 years old.
Food and Diet
This is the diet I used.
Exercises
These are the exercises I did.
Martin in action!


Toggle navigation
Room
Booking
Home
About
Rooms
Gallery
Contact
ROOM CATEGORIES
We basically offer the best affordable prices on the market. Comm'on take a look.
Min Double
Executive
Extra Double
Single
Double
Rates and Booking
Min Double
$
9
1 Night
Book Now
Single
$
7
1 Night
Book Now
Double
$
11
1 Night
Book Now
Extra Double
$
14
1 Night
Book Now
Executive
$
28
1 Night
Book Now
Book a Reservation
Name :
Email :
Arrival Date :
Choose a Room :
Min Double
Single
Double
Extra Double
Executive
Book Now


| UK GDP - YoY (%) | ||||||
| Release Date | For period | Market Expectation | Kshitij Expectations | Previous | Released | Revised |
| 22-Dec-17 | Q3 17 Final | - | - | 1.87 | 1.76 | 1.76 |
| 26-Jan-18 | Q4 17 Adv | - | 2.74 | 1.76 | 1.46 | - |
| 22-Feb-18 | Q4 17 Pre | - | 0.09 | 1.46 | 1.36 | - |
| 29-Mar-18 | Q4 17 Final | - | - | 1.36 | - | - |
| Copyright: Kshitij Consultancy Services |


Download the latest Sahi zip file from sourceforge
JRE 1.5 or above
is needed for running Sahi.
if the module is to be rebuilt from source, JDK 1.5 or above, ant 1.6 or above, log4j.jar and junit.jar are also
needed.
1) Unzip sahi.zip to a desired location


MDM_OWNER
Tables
Views
Indexes
Packages
Procedures
Functions
Triggers
Types
Sequences
Synonyms
Database Links
Public Database Links


ASGM-WFU Portal
Menu
About
Documentation
Search
Logout
Video Upload
Select a video
Remove video
Upload video
Success! video uploaded to bucket.
Date
Region
--Region--
Manu
Tambopata
Iquitos
What Kind of Videos?
--Video Type--
Known Mine
Deforestation
Unsorted
Questionable Data


A <tc:tabGroup/>
can contain several
<tc:tab/>
tags.
Switching between tabs can be done on the client or by server request.
For server requests there are two ways. Reload the whole page and reload only the tab (Ajax).
To set the switching type, use the switchType
attribute. By default it's client side.
<tc:tabGroup>
Content of tab one.
Content of tab two.
This tab shouldn't be rendered.
Content of tab three.
<tabGroup switchType="reloadTab">
Content of tab one.
Content of tab two.
This tab shouldn't be rendered.
Content of tab three.
<tabGroup switchType="reloadPage">
Content of tab one.
Content of tab two.
This tab shouldn't be rendered.
Content of tab three.


Registration Number :
Flat Number :
Block Number :
Tax Number :
Meter Number :
Membership Fee Paid :
.
Name of Owner :
E-Mail Id :
Phone / Mobile :
Permanent Address Of Owner :
Current Address of Owner :
Name :
Phone / Mobile :
E-Mail Id :
Occupation :
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC


This is an input box with default text
This is an input box where a log text can fit it
This is a drop down menu
This is a radio button example
This is a checkbox


Copyright 2018 Chaoran Chen
The product includes:
Apache License, Version 2.0
You may obtain a copy of the license at
http://www.apache.org/licenses/LICENSE-2.0
Firebase Android SDK
Copyright © Google, Inc. All rights reserved.
https://github.com/firebase/firebase-android-sdk/blob/master/LICENSE
Google Maps SDK for Android
Copyright © Google, Inc. All rights reserved.
https://developers.google.com/maps/documentation/android-sdk/intro
Android Support Library
Copyright © 2005 The Android Open Source Project. All rights reserved.
http://developer.android.com/tools/extras/support-library.html
Picasso
Copyright 2013 Square, Inc. All rights reserved.
https://github.com/square/picasso
Apache 2.0. See the LICENSE file for details.
Google Material Design Icons
Copyright © Google, Inc. All rights reserved.
https://material.io/icons/


---
layout: page
title: "About"
description: "Try to light up the dark"
header-img: "img/about-bg.jpg"
---
中文 Chinese
英文 English
至人无己，神人武功，圣人无名。——《荀子 劝学》
倚楼听风雨，淡看江湖路。 ——《风云》
Hello world！
我是russell ，程序员、攻城狮预备役。于武汉大学 学习图像处理中的黑魔法。
大学之道，在明明德，在亲民，在止于至善。
喜清净，避熙攘，求至善。弃盗版，入开源，窥宇宙。独西行，寻人师，路漫漫。
雾凇沆砀，天与云与山与水，上下一白。湖上影子，惟长堤一痕、湖心亭一点、与余舟一芥、舟中人两三粒而已。
《道德经》
上善若水。水善利万物而不争，处众人之所恶，故几於道。居善地，心善渊，与善仁，言善信，正善治，事善能，动善时。夫唯不争，故无尤。
知人者智，自知者明。胜人者有力，自胜者强。知足者富。强行者有志。不失其所者久。死而不亡者，寿。
大道泛兮，其可左右。万物恃之以生而不辞，功成而不名有。衣养万物而不为主，常无欲可名於小。万物归焉，而不为主，可名为大。以其终不自为大，故能成其大。
昔之得一者。天得一以清。地得一以宁。神得一以灵。谷得一以盈。万物得一以生。侯王得一以为天下贞。其致之。天无以清将恐裂。地无以宁将恐废。神无以灵将恐歇。谷无以盈将恐竭。万物无以生将恐灭。侯王无以贞将恐蹶。故贵以贱为本，高以下为基。是以侯王自称孤、寡、不谷。此非以贱为本邪？非乎。至誉无誉。不欲琭琭如玉，珞珞如石。
上士闻道勤而行之。中士闻道若存若亡。下士闻道大笑之。不笑不足以为道。故建言有之。明道若昧。进道若退。夷道若纇。上德若谷。大白若辱。广德若不足。建德若偷。质真若渝。大方无隅。大器晚成。大音希声。大象无形。道隐无名。夫唯道善贷且成。
道生一。一生二。二生三。三生万物。万物负阴而抱阳，冲气以为和。人之所恶，唯孤、寡不谷，而王公以为称，故物或损之而益，或益之而损。人之所教，我亦教之，强梁者，不得其死。吾将以为教父。
Let your arm enfold us, through the dark of night
Will you angel hold us, till we see the light.
What's up
My name is russell ，you can call me rus . I studied dark magic of Image Processing in Wuhan University
Soon to be an engineer, I'm learning to use several powerful tools, such as GNU Emacs, Vim, LaTeX, Lua, C/C++, Matlab and Python. Hacking by oneself is essential, but hacking after masters is also rewarding, here are my personal masterlist:
Who is Russell?
not just mental illness about using Emacs and vim
looking for truth and knowledge within the coming decade
focus on big ideas of problem discovery and solving
try to chase and learn from masters on humanity, perseverance and freedom
amazed at using computer in an elegant and efficient way
being kind (but limited with premises) to people around
keep discoverying personal drawbacks and improving myself
try to avoid dependence of computer, pls leave your filco
Skills
[ ] Emacs and Vim (google Purcell, redguardtoo, and vimawesome)
[x] Git version control for personal docs (see jekyll-now repo)
[x] LaTeX basics (actually we are marching forward)
[x] Linux usage, server configuration (from birdman)
[ ] Lua and C/C++ (from lua-user.org)
[ ] Torch (currently only CNN model, will concentrate on C library in the future)
[x] CN calligraphy (from Mr. G. Chen(?-2014))
[x] Speed cube (from doreamon society, avg cuber)
[x] russellf at typeracer.com (official BP: 80wppm, unofficial 83wpm)
[x] Slide design and innovation
[ ] Go (Google has AlphaGo and FAIR has Darkforest, all tree searching based)
Interests
Machine Learning, Computer Vision and Image Processing
Simple yet elegant Hacker skills
Great designed things (apps, websites, repos)
Why blogging?
Fearness arises from arrogance, arrogance arises from shallowness
Rediscovery myself on the road to the common destination we all share
Keep seeking and thinking about society and orientation
Almost few people know this site, but what you see is what you surprised.
Talks
Get your CVPS in the right way. 2015
Resumes
Contact me
yangwanggauss at gmail
{% if site.duoshuo_username %}


UTC -3, UTC -2 April to October.
Voltage is 220v, 50 Hz.
The sockets are Standard French.
Most businesses are open Monday to Friday, from 9:00 am to 12:00 pm and from 1:30 pm to 6:00 pm.
Most shops are closed Saturday afternoons and Sundays.
Euro
US and Canadian dollars are widely accepted, as are credit cards and travellers cheques.
Displayed prices include taxes.
There are ATMs in banks and several businesses in Saint-Pierre, one ATM is available at the Banque des îles in Miquelon.
International Dialing Code for St Pierre Miquelon is +508.
Purchase a new cell phone and SIM card for St. Pierre & Miquelon (France) and take advantage of the low rates that the local cellular phone users are paying, regardless of the length of your trip.
Taxis
Daireaux - 05 08 41 22 41
Didier Derouet - 05 08 41 38 39
Antoine Hayes - 05 08 41 54 47
Bernard Lebars - 05 08 41 35 15
Kevin Poirier - 05 08 41 22 25
SPM Express, Quai Mimosa - Tel 05 08 41 44 00
SPM Expess offers a year round service transportation between Saint Pierre and Miquelon. The Atlantic Jet ferry offers a very comfortable service even in rough weather conditions.
Police - Dial 17
Medical Emergencies - Dial 15
Fire Department - Dial 18
IMRAY AND ADLARD COLES PILOT BOOKS are available at a discounted price for Noonsite.com users via World Cruising Club
Noonsite welcomes information and updates especially regarding clearance,
customs and immigration procedures from cruisers visiting this country.
Please E-mail noonsite with any new
information, updates or corrections. Even just a short email confirming
that the current data is accurate would be most helpful.


{% extends 'device.html' %} {% block title %} Device overview {% endblock %} {% block device_content %}
| Device name | {{ selected_device.name }} | |
| Last received packet | {% if latest_packet is not None %}{{ latest_packet.time_diff }} seconds ago | {% else %}No packets received | {% endif %}
| Total data sent | STUFF |


MOGASHOA F M MR STUDENT NUMBER : 5851-637-9
13764 CORNWELL STR ENQUIRIES<EMAIL_ADDRESS>TSAKANE EXT 9
1550 FAX :<PHONE_NUMBER>
2018-12-12
Dear Student
Dear student
Thank you for your application to study at Unisa.
I regret to inform you that you cannot be offered a space to register in 2019 for your proposed
qualification. This is based on the Unisa approved Enrolment Management Policy which limits the
number of spaces offered for all qualifications. The University will endeavour to contact you if
a space for your proposed qualification becomes available for the 2019 academic year later on.
Qualification over-enrolled. Space not offered for qualification:
98908 - BSC HONOURS IN COMPUTING
Yours faithfully
for Registrar