Description: In this exercise, we apply basic counts and some association statistics to a small corpus. We will:
Prerequisites: This exercise assumes basic familiarity with typical Unix commands, and the ability to create text files (e.g. using a text editor such as vi or emacs). No programming is required.
Notational Convention: The symbols <== will be used to identify a comment from the instructor, on lines where you're typing something in. So, for example, in
% cp file1.txt file2.txt <== The "cp" is short for "copy"
what you're supposed to type at the prompt (identified by the percent sign, here) is
cp file1.txt file2.txtfollowed by a carriage return.
Here are the steps:
% mkdir stats <== Create a subdirectory called "stats" % cd stats <== Go into that directory % ftp umiacs.umd.edu <== Invoke the "ftp" program Name (yourname): anonymous <== Type "anonymous" (without quotes) Password: name@address <== Type your e-mail address ftp> cd pub/resnik/723 <== Go to directory pub/resnik/723 ftp> binary <== USe binary transfer mode ftp> get ngrams.tar <== Download the file ftp> bye <== Exit from ftp % tar xvf ngrams.tar <== Extract code from the file % rm ngrams.tar <== Delete to conserve space % chmod u+x *.pl <== Make perl scripts executable
If Perl you cannot run the perl scripts (the files that have a .pl suffix), you probably have Perl installed at a different path than we do. You can fix this by using pickperl script. First find out the path for Perl that you are using, and then run pickperl as follows:
% pickperl /usr/imports/bin/perl /your/perl/path/here <== get correct perl
% more corpora/GEN.EN(Type spacebar for more pages, and "q" for "quit".) This contains an annotated version of the book of Genesis, King James version. It is a small corpus, by current standards -- somewhere on the order of 40,000 or 50,000 words. What words (unigrams) would you expect to have high frequency in this corpus? What bigrams do you think might be frequent?
% mkdir genesis
Then run the Stats program to analyze the corpus. The program requires an input file, and a "prefix" to be used in creating output files. The input file will be corpora/GEN.EN, and the prefix will be genesis/out, so that output files will be created in the genesis subdirectory. That is, you should execute the following:
% Stats corpora/GEN.EN genesis/outThe program will tell you what it's doing, as it counts unigrams, counts bigrams, computes mutual information, and computes likelihood ratio statistics. Depending on the machine you're working on, this may take differing amount of time to run, but it should be less than 5 minutes.
% ftp umiacs.umd.edu <== Invoke the "ftp" program Name (yourname): anonymous <== Type "anonymous" (without quotes) Password: name@address <== Type your e-mail address ftp> cd pub/resnik/723 <== Go to directory pub/resnik/723 ftp> binary <== Use binary transfer mode ftp> get ngram_out.tar <== Download the file ftp> bye <== Exit from ftp % tar xvf ngram_out.tar
% cd genesis
% more out.unigramsSeeing the vocabulary in alphabetical order isn't very useful, so let's sort the file by the unigram frequency, from highest to lowest:
% sort -nr out.unigrams > out.unigrams.sorted % more out.unigrams.sortedNow examine out.unigrams.sorted. Note that v (verse), c (chapter), id, and GEN are part of the markup in file GEN.EN, for identifying verse boundaries. Other than those (which are a good example of why we need pre-processing to handle markup), are the high frequency words what you would expect?
% sort -nr out.bigrams > out.bigrams.sorted % more out.bigrams.sortedMarkup aside, again, are the high frequency bigrams what you would expect?
Low-frequency bigrams (bigram count less than 5) were excluded.
As an exercise, compute mutual information by hand for the first bigram on the list, "savoury meat". Recall that
I(x,y) = log2 [p(x,y)/(p(x)p(y))]and that the simplest estimates of probabilities, the maximum likelihood estimates, are given by
p(x) = freq(x)/N p(y) = freq(y)/N p(x,y) = freq(x,y)/Nwhere N is the number of observed words in the corpus, 44850. (You can get this by counting the words in file out.words; it's also what you get by summing the frequencies in either out.unigrams or out.bigrams.)
You can get a calculator on your screen on some systems (at least sunos and solaris) by executing:
% xcalc &Here's a sequence you can use to do the calculation:
Compute p(savoury) = freq(savoury)/N Compute p(meat) = freq(meat)/N Compute p(savoury meat) = freq(savoury,meat)/N Compute p(savoury)p(meat) = p(savoury) * p(meat) Divide p(savoury,meat) by this value Take the log of the result (which in xcalc is log to the base 10) Convert that result to log base-2 by dividing by 0.30103 This uses the fact that for all M, N: logM(x) = logN(x)/logN(M).At some point, the calculator may give you scientific notation for a number. If you need to enter a number in scientific notation, you use EE:
EE Used for entering exponential numbers. For example to get "-2.3E-4" you'd enter "2 . 3 +/- EE 4 +/-".The number you some up with should be close to the mutual information reported in out.mi. It may be slightly different because your calculation used different precision than the program's.
log(a * b) = log(a) + log(b) log(a / b) = log(a) - log(b)Try converting the formula for mutual information using these identities so that probabilities are never multiplied or divided, before reading further.
Solution: log[p(x,y)/p(x)p(y)] = log p(x,y) - log p(x) + log p(y)
To really get a feel for things, first first substitute the maximum likelihood estimates in and then convert to using log probabilities, i.e.
log[ (freq(x,y)/N)/(freq(x)/N)(freq(y)/N) ]
% ln -s ../filter_stopwords <== Creates a symbolic link % ln -s ../stop.wrd <== Creates a symbolic linkThen run it:
% filter_stopwords stop.wrd < out.lr > out.lr.filtered
How does out.lr.filtered look as a file containing bigrams that are characteristic of this corpus?
% cat GEN.EN | tr "A-Z" "a-z" > GEN.EN.lcTo save disk space, assuming you're done with GEN.EN, delete the original:
% rm GEN.ENTry re-doing the exercise with this version. What, if anything, changes?
% cd corpora % ftp umiacs.umd.edu Name (yourname): anonymous Password: name@address ftp> cd pub/resnik/723/ebooks ftp> dir ftp> get adventures.dyl <== Choose one or more ftp> get hound.dyl ftp> get study.dyl ftp> bye <== Exit from ftp
Now get back into your stats directory, create an output directory, say, holmes1, and run the Stats program for the file of interest, e.g.:
% cd .. % mkdir holmes1 % Stats corpora/study.dyl holmes1/out % cd holmes1
Or perhaps convert to lowercase before running Stats:
% cd corpora % cat study.dyl | tr "A-Z" "a-z" > study.lc % rm study.dyl % cat hound.dyl | tr "A-Z" "a-z" > hound.lc % rm hound.dyl % cat adventures.dyl | tr "A-Z" "a-z" > adventures.lc % rm adventures.dyl % cd ..
Look at out.lr, etc. for this corpus. Now go through the same process again, but creating a directory holmes2 and using a different file. Same author, same main character, same genre... how do the high-association bigrams compare between the two cases? If you use filter_stopwords, how do the results look -- what kinds of bigrams are you getting? What natural language processing problems might this be useful for?


Active Record – Object-relational mapping in Rails
Active Record connects classes to relational database tables to establish an almost zero-configuration persistence layer for applications. The library provides a base class that, when subclassed, sets up a mapping between the new class and an existing table in the database. In the context of an application, these classes are commonly referred to as models. Models can also be connected to other models; this is done by defining associations.
Active Record relies heavily on naming in that it uses class and association names to establish mappings between respective database tables and foreign key columns. Although these mappings can be defined explicitly, it’s recommended to follow naming conventions, especially when getting started with the library.
You can read more about Active Record in the Active Record Basics guide.
A short rundown of some of the major features:
-
Automated mapping between classes and tables, attributes and columns.
class Product < ActiveRecord::Base end
The Product class is automatically mapped to the table named “products”, which might look like this:
CREATE TABLE products (
id bigint NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
This would also define the following accessors: Product#name
and Product#name=(new_name)
.
-
Associations between objects defined by simple class methods.
class Firm < ActiveRecord::Base has_many :clients has_one :account belongs_to :conglomerate end
-
Aggregations of value objects.
class Account < ActiveRecord::Base composed_of :balance, class_name: 'Money', mapping: %w(balance amount) composed_of :address, mapping: [%w(address_street street), %w(address_city city)] end
-
Validation rules that can differ for new or existing objects.
class Account < ActiveRecord::Base validates :subdomain, :name, :email_address, :password, presence: true validates :subdomain, uniqueness: true validates :terms_of_service, acceptance: true, on: :create validates :password, :email_address, confirmation: true, on: :create end
-
Callbacks available for the entire life cycle (instantiation, saving, destroying, validating, etc.).
class Person < ActiveRecord::Base before_destroy :invalidate_payment_plan # the `invalidate_payment_plan` method gets called just before Person#destroy end
-
Inheritance hierarchies.
class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
-
Transactions.
# Database transaction Account.transaction do david.withdrawal(100) mary.deposit(100) end
-
Reflections on columns, associations, and aggregations.
reflection = Firm.reflect_on_association(:clients) reflection.klass # => Client (class) Firm.columns # Returns an array of column descriptors for the firms table
-
Database abstraction through simple adapters.
# connect to SQLite3 ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3') # connect to MySQL with authentication ActiveRecord::Base.establish_connection( adapter: 'mysql2', host: 'localhost', username: 'me', password: 'secret', database: 'activerecord' )
Learn more and read about the built-in support for MySQL, PostgreSQL, and SQLite3.
-
Logging support for Log4r and Logger.
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
-
Database agnostic schema management with Migrations.
class AddSystemSettings < ActiveRecord::Migration[6.0] def up create_table :system_settings do |t| t.string :name t.string :label t.text :value t.string :type t.integer :position end SystemSetting.create name: 'notice', label: 'Use notice?', value: 1 end def down drop_table :system_settings end end
Philosophy
Active Record is an implementation of the object-relational mapping (ORM) pattern by the same name described by Martin Fowler:
"An object that wraps a row in a database table or view,
encapsulates the database access, and adds domain logic on that data."
Active Record attempts to provide a coherent wrapper as a solution for the inconvenience that is object-relational mapping. The prime directive for this mapping has been to minimize the amount of code needed to build a real-world domain model. This is made possible by relying on a number of conventions that make it easy for Active Record to infer complex relations and structures from a minimal amount of explicit direction.
Convention over Configuration:
-
No XML files!
-
Lots of reflection and run-time extension
-
Magic is not inherently a bad word
Admit the Database:
-
Lets you drop down to SQL for odd cases and performance
-
Doesn’t attempt to duplicate or replace data definitions
Download and installation
The latest version of Active Record can be installed with RubyGems:
$ gem install activerecord
Source code can be downloaded as part of the Rails
project on GitHub:
License
Active Record is released under the MIT license:
Support
API documentation is at:
Bug reports for the Ruby on Rails
project can be filed here:
Feature requests should be discussed on the rails-core mailing list here:


THE ADVENTURES OF PRISCILLA, QUEEN OF THE DESERT A film review by Serdar Yegulalp Copyright 1997 Serdar Yegulalp
CAPSULE: Far better than the unfunny TO WONG FOO..., PRISCILLA combines a Damon Runyan-ized version of the drag life with some really heartfelt moments.
"The Sixty-Four Thousand Dollar Question," drawls transsexual Bernadette (Terence Stamp), in response to the simple query: "Why? Why do you do it?" What, indeed, would possess anyone to dress up in outlandish costumes and lip-synch to Abba and CeCe Peniston? PRISCILLA, QUEEN OF THE DESERT, doesn't really have an Answer, but it has an aggregate of little bits of understanding that sorta kinda add up to an entertaining story.
Bernadette and her two cohorts (Hugo Weaving and Guy Pierce) have a drag stage show in Sydney. Hugo's character's wife runs a casino in Alice Springs, and they're desperate for cash -- they need some kind of attraction. With the kind of headstrong fortitude that's rarely seen anywhere except in the movies, they throw themselves into a customized bus and set out through the desert.
The movie then turns into a kind of outback-meets-drag version of EASY RIDER, but with a lot more predictability.  Even odder is a stopover with a mechanic and her deranged mail-order bride, although where that scene ends, the movie takes some interesting new detours. Unfortunately, a good deal of what comes in between is filler -- the breakdown in the desert, the warm reception by a gang of aborigines, etc.
The mechanic, Bob (Bill Hunter) is one of the more sympathetic people in the movie, and he winds up sticking around and putting the antics of the others into context.  Also interesting is Hugo's character -- his wife and child are far more comfortable with the idea of his way of life than he is, and it takes him a long time to get used to that.
PRISCILLA is loopy and funny in places, but the real substance of the movie lies in Terence Stamp's character -- a credible person trapped in some very oddball circumstances. And once that hits home, a lot of the rest of the movie seems a little superfluous. PRISCILLA is not a bad movie, but not an exceptionally good one, either. I suspect the definitive movie about drag really has yet to come along.
Two and a half out of four sequined slippers.
<EMAIL_ADDRESS>EFNet IRC: GinRei http://www.io.com/~syegul another worldly device...
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


CS205 Computing Foundations for Computational Science Final Project
Group 4: Weihang Zhang, Xuefeng Peng, Jiacheng Shi and Ziqi Guo
Harvard University, Spring 2018
In this project, we want to use big compute techniques to parallelize the algorithms of image stitching, so that we can stream videos from adjascent camera into a single panoramic view.
Image stitching or photo stitching is the process of combining multiple photographic images with overlapping fields of view to produce a segmented panorama or high-resolution image (example below).
Image stitching is a rather complicated application in computer vision. It is composed of several key stages, some of which involve heavy computation. We will give an intuitive explanation of each of the key procedures below. Please follow the links provided for more technical details, and please refer to the Design Approach section for a complexity profiling of these tasks.
As a first step, keypoints on the two images you want to stitch together need to be identified. These keypoints usually correspond to the most distinguish features of an image, such as corners and edges of an object. There are several famous algorithms that dedicately achieve this task, including Harris Corner Detection, Scale Invariant Feature Transform (SIFT) and Speed-Up Robust Features (SURF). SIFT and SURF are the state-of-the-art due to their robustness.
Not only do these algorithms identify the keypoints, they will also generate a descriptor vector for each of the keypoints. These descriptors will capture information about the keypoints' location, orientation and relation to their surroundings.
After keypoint detection, each image will have a set of keypoints together with their descriptor vectors. We will then need to establish matching relations between these descriptors. Most methods are based on Euclidean distance between descriptors. For each keypoint in image 1, if its best match is significantly better than the second best match, then we consider the best match valid.
Once we have establish matching keypoints between images, we want to estimate a transformation matrix H that will be used to warp the image. Normally, Random Sample Consensus (RANSAC) will be used to derive reliable transformation matrix after removing false matches. The algorithm basically iteratively try out different match combinations and only keep the one that is the best-fitting to the matches.
With the transformation matrix, we can project the image to the right to the plane that the image to the left is at. This is called warping.
Finally, we have the original image 1, and the warped image 2. We can stitch them together by placing pixels from both images on a blank canvas.
Border blending is to smooth out the differences in light and hue across the stitching seam, so that the stitched image can look more homogeneous.
The key idea of our project is to focus on the word ‘real-time’. Although there are existing algorithms for the application, doing it in ‘real-time’ can still be challenging.
Imagine the scenario where we need a real-time panorama streaming view, this would require the backend application to stitch the view of different cameras together frame by frame. For a laggy video of 5 frames per second, we will need processing time of at most 0.2 seconds for each pair of images. This would be very difficult to achieve with regular computational resources. With a faster stitching process of one pair of images, we can process more image pairs per second, which would result in a higher Frames Per Second (FPS). FPS is a direct measure of how fluid the video looks to human eyes.
In addition, most of the existing real-time stitching solution assume all of the cameras stay still during the whole streaming process. In this way it only require one single iteration of detecting features, matching features and estimating transformation. However, this assumption posed too much limitation on the application of this problem. We, however, do not have such assumption in our project. Ideally, we want to be able to stitch the view of several handheld cameras. The price we need to pay, is that we will need to detect features, match features and estimate transformations at each frame of the video. This will require us to further accelerate the code while ensuring the quality of the overall stitching result.
In addition, with high performance computing, we can stitch images of higher resolution, at a visually fluid speed. This is the whole motivation of parallelizing the task of image stitching.
There are several challenges associated with our project:
We base our parallelization based on a sequential implementation of keypoint detection using Speed-Up Robust Features (SURF) as well as matching. The code can be found at https://github.com/abhinavgupta/SURF.
To finish up the whole stitching process, we implemented our own transformation estimation, warping and stitching algorithm. For transformation estimation, we relied on OpenCV's implementation as this step is not one of the computationally heaviest ones. For warping and stitching, we implemented them without using any vision libraries so that we can have full control of the parallelization.
As for data, we shot images and videos on 2 Logitech HD Laptop Webcam C615. It is capable of shooting up to 1080p video.
We run the sequential code of stitching on two images of different resolutions and plot the execution time of each stage. We omitted transformation estimation, as OpenCV has a very efficient implementation of it, which takes negligible time compared to the other stages.
With the larger image, keypoint detection, keypoint description and keypoint matching are the three most time-consuming steps. With the smaller image, the running time of matching decreases so much that it even takes shorter than warping. This is expected, as when the image is larger, there will be exponentially more interest points, which takes exponentially more time to match. Given that the maximum video resolution we are targeting is 1080p, which is smaller than the small image, we shouldn't be concerned too much about parallelizing it. As for stitching, it is clearly negligible compared to the other steps.
From this profiling, it tells us we should be more concerned about keypoint detection, keypoint description and warping.
Based on the profiling results shown above, we can see that keypoint detection, descriptor extraction and warping are the computationally heaviest and thus should be parallelized the most.
On a code level we will use OpenMP and OpenACC, and as an advanced feature we will employ multi-threading for pipeline. However, we will not delve too deep into distributed memory parallelization with MPI. With some experimentation, we found out that the cost of communicating high resolution videos and keypoint vectors is too high for achieving a real-time program.
Below we detailed our use of the parallel computing paradigms.
For shared memory parallelization, we just need to add directives to independent loops. Shared variables and private variables need to be differentiated. We also need to specify region that should be executed one thread at a time to be critical.
GPU acceleration is very suitable for this type of task. The many cores in GPU provide fundamentally larger computing power. However, we need to pay special attention to the following aspects:
The whole task of image stitching can be broken down to various stages. In addition to the algorithms mentioned previously, we still need to extract frames from webcam video stream, and output video from stitched images.
In the sequential version, after one task is finished, it needs to wait for all the downstream steps to be completed in order to be restarted. In this case, the critical path is all the stages of the entire workflow.
By pipelining the different stages with the multiple CPU threads available, we can achieve task-level parallelization so that idle time is reduced. Each adjacent task thread share a variable pointer between them and update the pointer once they finish their current iteration and jump right into the next. In this way, the total execution time will be constrained by the bottleneck of the four threads. We designed our pipeline to be the following diagram:
The pipeline utilizes three threads that focus on different tasks. The main thread has to render images due to the constraint of OpenCV. The main thread will continuously render images inside a critical section secured by mutex lock that contains the stitched images, which prevent threads from potential race conditions. The capture threads shared pointers with stitching thread to pass the captured image in the cameras to the stitiching thread.
To achieve maximum speedup, we can integrate task-level parallelization with procedure/loop level parallelization.
The way we designed our task-level pipeline allows for integration with GPU acceleration. In our pipeline, the stitching thread is the only thread that needs to do heavy computation. Therefore, we can accelerate the stitching thread by letting it operate on GPU. The other threads such as image i/o are less compute-intensive, and thus will be just fine operating on CPU. The only constraint here is that OpenACC only allows to be called from only one thread. It does not support the existence of CUDA stream. For one of the future work, we are aiming at implementing pure CUDA version of this code and therefore could further divide the computationally expensive stitiching thred into more concurrent threads running tasks of different stages in different CUDA streams.
To evaluate the performance of our parallelized program, we will use videos captured at different resolutions. The higher the resolution, the more computationally heavy it is to stitch the videos. We will use the average execution time of each frame to calculate speedup, and use the FPS as a measure of throughput.
As for testing platform, we will use the AWS EC2 t2.2xlarge instance for baseline and shared memory parallel program. For GPU involved programs, we will evaluate the performance on two devices, a local PC with GPU and an AWS EC2 g3.4xlarge instance. The specifications of the local PC in comparison to the AWS instance are tabulated below:
| Variable Name | Local PC | AWS g3.4xlarge |
|---|---|---|
| Operating system | Ubuntu 16.04 | Ubuntu 16.04 |
| CPU model | Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz | Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz |
| vCPU(s) | 8 | 8 |
| GPU model | NVIDIA GeForce GTX 1070 | NVIDIA Tesla M60 |
| GPU architecture | Pascal | Maxwell 2.0 |
| Core clock / boost Clock (MHz) | 1506/1683 | 930/1180 |
| Floating-point performance (gflops) | 6463 | 4833 |
All used codes and test cases are documented with detailed instructions, which can be found at our Github repository.
In this section, we see the performance results of the serial version as a baseline.
First let's see the execution time of each stage in the stitching process for videos of different resolutions. We only include stages that involve heavier computation.
| Resolution | 480p | 720p | 1080p |
|---|---|---|---|
| Keypoint detection | 0.255 | 0.565 | 1.299 |
| Keypoint description | 0.187 | 0.239 | 0.347 |
| Keypoint matching | 0.025 | 0.040 | 0.081 |
| Homography | 0.005 | 0.007 | 0.034 |
| Warping | 0.051 | 0.115 | 0.261 |
| Stitching | 0.001 | 0.004 | 0.007 |
| Total | 0.524 | 0.970 | 2.029 |
From this benchmarking of serial version, we can see that most stages in the stitching process grows linearly with the height of the video, which indicates the problem size. Among all the stages, keypoint detection, keypoint description and warping are the most computationally heavy stages that we should focus on parallelizing.
Then let's see the how Frames Per Second varies for videos of different resolutions.
| Resolution | 480p | 720p | 1080p |
|---|---|---|---|
| FPS | 1.7 | 1 | 0.5 |
We can see that, with the serial version, even with 480P videos, we can only achieve a FPS of 1.7. This is clearly not enough for a visually fluid video.
In this section, we show the performance results after implementing shared memory parallelization with OpenMP.
| Resolution | 480p | 720p | 1080p |
|---|---|---|---|
| Keypoint detection | 0.064 | 0.129 | 0.229 |
| Keypoint description | 0.272 | 0.502 | 0.928 |
| Keypoint matching | 0.017 | 0.021 | 0.031 |
| Homography | 0.001 | 0.003 | 0.008 |
| Warping | 0.010 | 0.024 | 0.057 |
| Stitching | 0.001 | 0.004 | 0.007 |
| Total | 0.365 | 0.683 | 1.260 |
Below we plotted the speedup of each stage against the serial version:
From the graph above, we can see that OpenMP achieves some speedup to some extent. However, for keypoint description, which is a rather costly stage, OpenMP did not do very well accelerating it. This might be due to the fact that keypoint description is memory bound, so assigning loops to different threads will not fundamentally speedup the program.
Then let's see the how Frames Per Second varies for videos of different resolutions.
| Resolution | 480p | 720p | 1080p |
|---|---|---|---|
| FPS | 2.5 | 1.4 | 0.7 |
Based on FPS, OpenMP results in a more fluid video. But this is still not enough for our goal of "real-time".
In this section, we show the performance results after implementing GPU acceleration with OpenACC.
| Platform | AWS g3.4xlarge | GTX 1070 | ||||
|---|---|---|---|---|---|---|
| Resolution | 480p | 720p | 1080p | 480p | 720p | 1080p |
| Keypoint detection | 0.016 | 0.033 | 0.073 | 0.011 | 0.027 | 0.061 |
| Keypoint description | 0.020 | 0.024 | 0.030 | 0.010 | 0.014 | 0.018 |
| Keypoint matching | 0.003 | 0.004 | 0.009 | 0.0007 | 0.003 | 0.006 |
| Homography | 0.003 | 0.006 | 0.024 | 0.009 | 0.009 | 0.034 |
| Warping | 0.005 | 0.011 | 0.026 | 0.003 | 0.008 | 0.023 |
| Stitching | 0.002 | 0.0025 | 0.007 | 0.0007 | 0.001 | 0.013 |
| Total | 0.055 | 0.125 | 0.267 | 0.048 | 0.109 | 0.264 |
Below we plot the speedup for the two types of GPU:
For both GPUs, we achieve significant speedup on keypoint detection, description, matching as well as warping. We did not focus too much on homography and stitching because their OpenCV implementations are already very efficient.
If we look at different video resolutions, we can also see that the speedup is pretty homogeneous. This demonstrates that we controlled overhead like memory copies pretty well so that it does not shrink the speedup.
Finally, if we compare the results of the two GPUs, with GTX 1070, which has more computing power, a higher speedup can be achieved. This shows the scalability of the program - with GPU that has higher clock rate and more Gflops, we can always scale up to accommodate videos of higher quality and potentially incorporate more complicated video processing techniques.
| Platform | AWS g3.4xlarge | GTX 1070 | ||||
|---|---|---|---|---|---|---|
| Resolution | 480p | 720p | 1080p | 480p | 720p | 1080p |
| FPS | 18 | 8 | 3.74 | 20 | 10 | 3.8 |
Based on the FPS table, we can see that with GTX 1070, we can stream stitched images at a rate of 20 frames per second for 480P, and 10 frames per second for 720P. Videos of this FPS is very fluid and will not show apparent delays to human eyes. For video of 1080P, the FPS is not as good, but we have shown that the program is highly scalable with the GPU's computing power.
In this section, we show the performance results after implementing task-level parallelization with our multi-threading pipeline, on top of GPU acceleration.
With task-level parallelization, we will not be able to further speed up the execution time of individual task. In fact, we even observe some slight slowdown on individual tasks, potentially due to frequent context switches between threads.
However, what's important about task-level parallelization is that it isolates the image capturing and rendering from the entire pipeline so that they can be carried out independently. As a result, we see some improvement in the rendering speed of the stitched images, which can be seen from the table below:
| Resolution | 480p | 720p | 1080p |
|---|---|---|---|
| FPS | 35 | 14 | 5 |
One option of our developed software is stitching the images without recomputing the keypoints and homography at every frame. In such cases, image rendering will become the bottleneck of the pipeline. With faster image rendering libraries, we could further improve the video FPS.
In this section, we compare the performance results across all parallel versions. First, we tabulated the speedup of all stages for different parallel versions at a resolution of 720P:
| Parallel Version | OpenMP | OpenACC (Tesla M60) | OpenACC (GeForce GTX 1070) |
|---|---|---|---|
| Keypoint detection | 4.4 | 17.1 | 20.9 |
| Keypoint description | 0.5 | 10.0 | 17.1 |
| Keypoint matching | 1.9 | 10.0 | 13.3 |
| Homography | 2.3 | 1.2 | 0.8 |
| Warping | 4.8 | 10.5 | 14.4 |
| Stitching | 1 | 1.6 | 4 |
| Total | 1.4 | 8 | 9 |
We can see that on time-consuming stages including keypoint detection, keypoint description and warping, OpenACC is able to achieve significant speedup from the serial version.
In the previous sections, we have shown that with parallel computing techniques and mainly GPU acceleration, we are able to achieve 9x speedup on 720P videos.
Below we show how does the stitching two videos from two webcams look like with different versions of the software. For all the videos below, the 2 frames on the top are the inputs from webcams, whereas the frame below is the stitched output.
Before parallelization, the stitched video looks very bad due to significant delays.
With OpenACC, the stitched video is very fluid. Almost no delays can be detected by human eyes.
With moving camera, the stitched video has some perturbations. This can be improved by either mechanicalizing the movement or setting the moving average coefficient higher, which is an option built in our software.
With blending, the color difference between cameras and the stitching seam can be blurred. The output video seems more homogeneous. The downside is the extra computation it incurs. With our pipeline structure, future work can parallelizing blending as well.
Through this project, we conquered quite a few obstacles and obtained some precious insights from the process:
There are of course some areas for improvement that call for future endeavors. For example, although we do not favor the idea of distributed memory parallelization with MPI due to the amount of data that have to be communicated, it might still be worth a try.
In addition, a lateral comparison of the scalability of different keypoint detection algorithms (SIFT, SURF, corner detection) might be interesting. Possibly more advanced operations like bundle adjustment can be assigned to the rest of the CPU threads available.


[§486-115] Sale by net measure. Commodities or services shall be offered for sale on a net weight or net measure basis. [L 1991, c 153, pt of §6]


Birding
Ear
Navigation
My Bird Mixes
31
Learned
34
Total
CoB
Coastal Birds
66
333
PNW
Washington and Oregon
31
34
AZ
Arizona and Utah
31
34
hrn
Herons
6
6
f
Everglades
1
33
Hwk
Hawks
6
7
FAV
Favorites
+
ADD NEW


When you feel that your personal data is being watched and trampled on ...Then the solution is...
fullfacebook
f
fullfacebook.com


About
Star Wars
Senate Baseball Cards
Star Wars Films
An exercise in JavaScript objects
Film Franchise Totals
total box office income:
0
total number planets seen in films:
0
total starship types:
0
total vehicles:
0
total species:
0


## Setting up Vagrant
* Install VirtualBox
* Install Vagrant
* Windows: Vagrant_1.3.1.msi
* OS X: Vagrant_1.3.1.dmg
* Debian/Ubuntu: use apt-get
* Open a terminal
* Navigate to the vagrant directory
* Windows: dir, cd
* OS X/Linux: ls, cd
* Type in
* vagrant box add precise32 precise32.box
* vagrant up
* vagrant ssh
Note:
But if you have yet to set up Vagrant, we are passing USBs around, and in them are what you need to install vagrant. So copy the vagrant folder to your user folder or home folder (for convenience), and run the appropriate installer. For Debian and Ubuntu, I suggest you do sudo apt-get vagrant instead.
So once you have Vagrant installed fire up a terminal and navigate to the folder. For Windows users that means cmd.exe, and for OS X and Linux users that means your Terminal. To go into a folder, use the cd command. To list the commands in your current folder, use dir.
When you're in the vagrant directory in your terminal, type in these commands.
The first will tell your Vagrant installation to add the precise32.box image to your installation's virtual machines.

## Overview
* Setup
* UNIX
* bash
* writing bash scripts
* some uses of bash
Note:
So for this session I'll be going through several things, a bit about UNIX, a bit about bash, and a bit about writing bash scripts.
But before we get to this, I'd like to ensure that you have your Vagrant installation set up.
## Why Vagrant?
* Vagrant is a virtual machine tool
* We'll be using a 32-bit Ubuntu Precise as our environment
* Ubuntu is a common choice if you're administrating cloud servers.
Note:
Now, I want to talk a bit on why we are using Vagrant.
Now why use Vagrant and why Ubuntu? We use vagrant so that we can all run in the same environment; there are differnces between the tools used in OS X and cygwin and Solaris and Ubuntu. Using the same OS will make it easier for you and me.
Why Ubuntu? That's quite an arbitrary choice, but it's about the most popular free OS you can find. That means that if you're doing something like spinning up a cloud server on Amazon Web Services you'll most likely want to use an Ubuntu instance.
## UNIX
* UNIX and Unix-like systems
* Unix directory structure
* Unix programs
## UNIX and Unix-like systems
* Unix
* Solaris
* BSD
* Darwin / OS X
* OpenBSD
* Linux (GNU utilities)
* Ubuntu
* Red Hat Enterprise Linux
Note:
So now that we're done with setting up the virtual machine, let's take a step back. So, broadly, UNIX and Unix-like operating systems can be classified under three families, the original, proprietary Unix line, the BSD family, and the GNU/Linux family. I'll just refer to all of them as Unix.
So, what I've heard is that there is a lot of overlap between Unix and BSD and that commands in both those systems behave somewhat the same.
Linux, however, has of its programs a lot different from Unix and BSD. I won't talk about that right now, though.
## Directory Structure
Note:
Now let's talk about the filesystem. Unix filesystems don't have a C: drive or a D: drive. In windows your C: and D: drives corresponded to actual partitions on your hard disks. So if you draw a map for a Windows filesystem, it will look like several trees. In Unix, however, as opposed to having multiple trees, there is only one tree, and the topmost directory is called the root directory, noted by '/'.
If you connect a drive to your computer, and mount it, most often you will be mounting it in a folder, e.g. '/media/'
## Unix programs
* Run with arguments
* Exposed to environment
* File descriptors and file streams
* 0, 1, 2 connected to STDIN, STDOUT, STDERR
* The shell can redirect file streams
* return value
$ cat
Hello World!
$ cat file1 file2
$ cat nosuchfile
$ cat file1 nosuchfile 2>&1 1> output.log | tee error.log
Note:
Now that we know a bit of how a Unix filesystem looks like, let's talk about the programs that run in Unix. So Unix programs, are run from the shell, which in our case is the bash shell. When we run these programs, we can send it arguments.
In addition, these programs run in an environment, which I will talk about kater.
So in the above example, at line 2, I have passed into the cat program it two arguments, file1 and file2.
When it runs, by default it opens three streams, standard input, standard output, and standard error. This is how a Unix program usually interacts with the shell and user input.
And later on I'll talk about the return value of a program.
# Redirection
echo 'This is standard output'
echo 'This is file 1' > file1
echo 'This is file 2' > file2
Note:
We performed redirection just now. This is a shell "feature".
## The bash shell
Note:
Great! We've just run a couple programs from the bash shell! Now let's learn more about the shell.
## The prompt
$
user@hostname:~$
# '~' is shorthand for user directory
root@hostname:~#
user@hostname:~$ command arg1 arg2 "arg 3" arg4 5
Press ↑ to look at previous commands.
Note:
So here's the prompt you're seeing on your screen.
If you're a normal user, it's usually a dollar sign.
There's sometimes some information before the dollar sign, and you are able to customize it. I won't be telling you how to do that, but if we have free time you can ask me.
In this case, user is my username, and hostname is the name of the computer. The tilde sign means that I'm at my user home directory.
If you're the superuser root, you'll usually see a hash sign just so to remind you to be careful.
## Some basic commands
echo 'Hello World'
pwd
ls
cd [folder in current location]
cd /[folder in root directory]
# help commands
man pwd
help cd
head --help | less
Note:
So here are some basic commands that you will probably be using.
Here's echo, which prints its arguments to standard output.
pwd tells you your current location.
ls shows you all the files and folders in your current directory. But if you
if you run cd, and your argument does not start with a slash, you are going to go to that directory, relative to your current location. That means that say I run ls and I see a folder1, if I type cd folder1 I will go to that directory. Now ls shows me that there isn't anything in this newly created directory.
But some commands you give to bash are not programs. For that you use help.
Another way to get help is to tack on the --help argument to the end of a program.
## Redirection
command 1> output.log # redirect to output.log
command 2>&1 # redirect 2 to 1.
Note:
Remember the greater than and vertical bar symbols in the previous chapter?
This is shell functionality. Redirecting standard input and standard output to either a file or another program is handled by the shell.
## Variables
* Variable names consist of digits [0-9], letters [A-Za-z], or an underscore _, but cannot begin with a digit.
MY_VAR="this string" # defining a variable
# There must not be any whitespace around the equals sign
echo $MY_VAR # equivalent to "echo this string"
echo "$MY_VAR" # equivalent to 'echo "this string"'
echo '$MY_VAR' # equivalent to "echo '$MY_VAR'"
echo ${MY_VAR}er # equivalent to "echo this stringer"
echo $I_AM_NOT_DEFINED
Note:
You can define variables in the shell. Variables in bash are always strings. To use them in a command, add a dollar sign before the variable name. When you run a command with a variable, bash will first substitute the variable's value wherever it sees the variable name. We call this substitution interpolation.
However, bash does not interpolate anything in single quotes.
If you have letters, digits, or underscores after the variable, you have to escape the variable name by enclosing it in curly braces.
If the variable is not yet defined, it interpolates to an empty string.
## Environment
* shell contains an environment; environment is a name-value array.
* programs can see and change environment. In C, getenv(), setenv()
* e.g. man uses $PAGER
* e.g. git commit launches $VISUAL (if $GIT_EDITOR is not defined)
* to make a shell variable an environment variable, use the keyword export
export MY_VAR
export ANOTHER_VAR="variable value"
printenv
unset ANOTEHR_VAR
Note:
But sometimes you want to change the environment. The environment can affect the execution of programs. For example, when you run the man program, it looks at $PAGER and uses it to launch a program that will help you scroll through files.
Let's have a try. As you can see, PAGER is currently set to less. Let's try looking at the man page of which. As you can see, man has launched the less program. If I press j I scroll down. Let me change $PAGER to cat. export PAGER=cat Let's try that again.
If you want to have a look at the environment, type env.
## Search path and return value
echo $PATH
echo $(IFS=:; set -- $line; printf "%s\n" "$@") # one-liner to print on separate lines
notaprogram
echo $?
Note:
There's one super important environment variable and that is the search path. Let's have a look at PATH. It's a colon separated list of locations. What do these mean?
These locations are directories, not individual files. When you type in a command like cat, what happens is that the shell looks into each of these directories from left to right for a file named cat. If it finds such a file and it has permission to execute it, the shell tries to execute that program. Otherwise it looks into the next directory. If it is not found, an error is printed, and the previous return value is set to 127.
The previous return value is stored in the variable $?. Programs that execute successfully often have a return value of 0, while programs that execute unsuccessfully have a return value of 1.
## More on programs
which cat
which cd
which bash
Note:
If you want to know the exact location of the program that you've just executed, you can use the which program. It will print to you the location of the program that you will execute when you type it.
## Intermission: repositories and installing software
* Using sed to find and replace
* Repositories are "app stores" for Linux programs
Note:
Okay, we've gone through quite a bit. We'll be having a break, but first let's try to install some software.
You need an Internet connection for this, so for those who aren't NUS students, you might want to tether. It's a couple hundred megabytes of data. You can tether from my phone, but I'd appreciate it if you used your own.
A little bit about repositories. Repositories were the first app stores. A Ubuntu and Debian system had what we call a package manager that helped you install and uninstall stuff cleanly. To get software, and to update software, you connect to a repository and download a list that told you what packages have been updated, then you can choose to download and install the new software itself.
So, just like an app store.
## Using sed to find and replace
cd /etc/apt
cat sources.list
sudo cp sources.list sources.list.bak
sed 's/us.archive.ubuntu.com/mirror.nus.edu.sg/' sources.list.bak
sed 's/\(us.archive.ubuntu.com\|security.ubuntu.com\)/mirror.nus.sg' \
sources.list.bak
sed 's/\(us.archive.ubuntu.com\|security.ubuntu.com\)/mirror.nus.sg' \
sources.list.bak > ~/sources.list
sudo mv sources.list .
Note:
Now, how does Ubuntu know where the repository is located? It looks into the /etc/apr/sources.list file. Let's have a look at it.
You see these URLs? They refer to some server located in the US. Now, NUS has its own Ubuntu repository as well, that mirrors the default ones. So let's change these urls to NUS's repository by replacing the url.
sed stands for stream editor. What it does, is it reads a file line by line, then does some stuff to each line before outputting it to standard output.
Now what I've just typed replaces all instances of us.archive.ubuntu.com with mirror.nus.edu.sg and then prints it to the standard output.
This next line, with the escaped parentheses and the vertical bar, is a form of what we call regular expressions. In this case, what this means is that you substitute all instances of us.archive.ubuntu.com and security.ubuntu.com with mirror.nus.edu.sg . If you want to know more about regular expressions, there are many resources on it on the internet.
## Installing
sudo apt-get update
sudo apt-get install vim exiv2
Note:
So let's start installing! The first command fetches the list of packages mirror.nus.edu.sg has to offer, while the second command installs the vim and exov2 programs. Vim is a text editor, while exiv2 is a program that reads the metadata of JPEG files.
## What we've done so far
* Setup Vagrant
* Unix filesystem
* Unix program
* bash redirection
* variables
* environment
* PATH
Next: Writing a script.
### But first a break.
Note:
While your programs are downliading and installing, let's go through what we've done so far.
## Writing a script
* The shebang
* Permissions
* Executing a script from the shell
Note:
Is everyone back? Right. We'll get started writing a couple scripts.
## The shebang
vim hello_world.sh
echo "Hello World."
bash hello_world.sh
Adding a shebang
#!/bin/bash
echo "Hello World Again."
./hello_world.sh
bash hello_world.sh
Note:
So let's write a 'Hello World script'. Open your editor. I like vim, and type 'echo "Hello World."'. Then close your editor, and then type "bash hello_world.sh" But thats really too slow and tedious.
We can execute it directly, but you will have to add something. You have to add a shebang to the top of your file. It's just one line and looks like that. When the shell is trying to execute hello_world.sh, it looks in the first line for the path to the program it should be execued under.
After that, you will be able to execute the file by ./hello_world.sh ; but not right now. I'll talk about that in a bit.
One popular alternative is using the env command. Sometimes users have special versions of the program that they want to use, and these may perhaps not be in the $PATH. The env command, when used like this, will get bash to execute the script.
If you try executing it with bash, it does indeed work.
So let's try to find out why ./hello_world.sh doesn't work.
## Permissions
ls -l | grep hello_world.sh
* Files:
* r 4 (is readable)
* w 2 (is writable)
* x 1 (is executable)
chmod 764 hello_world.sh
chmod u+x hello_world.sh
* Directories
* r 4 (able to list files in directory)
* w 2 (able to edit, add, delete files in directory)
* x 1 (required to access files in directory)
Note:
ls -l gives us quite a bit of metadata information about our files. It prints the information of each file each in its own line. Since we're only interested in hello_world.sh, we'll pipe it to grep; and grep will filter away all the lines that does not contain the substring hello_world.sh .
So the reason why it doesn't work is that it does not have any executable permissions. Let's look at the permissions of hello_world.sh . The first column reads -rw-rw-r-- . The second to fourth character means that you have read and write permissions but no execute permissions. The next rw- means that the same applies to users who share the same group as you. The last r-- means that everyone else only has permissions to read this file.
To give yourself execute permissions, you can run chmod u+x hello_world.sh . Alternatively, you can use numbers. Just add up the numbers. 7 is 4+2+1 for the user, 6 is 4+2 for the group, and 4 is just read permission for others.
## Executing it
./hello_world.sh
cd /
$OLDPWD/hello_world.sh
mkdir bin
export PATH="~/bin:$PATH"
mv hello_world.sh bin/hello_world
hello_world
Note:
So now that we have permissions, let's try executing it. Now the sintax here is a little interesting. The dot means the current directory, and hello_world.sh refers to the script that we've just created.
One of the interesting things you can do is ha
## Creating a script
cat <<'EOS' > hello_world.sh
#!/bin/bash
echo "Hello World"
EOS
chmod u+x hello_world.sh
alias chx='chmod u+x'
./hello_world.sh
Note:
Here's a short summary on how to create a hello_world script. The double left arrows mean that what's going to follow is a heredoc. Everything until the EOS line will be turned into a string and passed into cat as standard input. And the output will be written into hello_world.sh
We make hello_world.sh executable, and then we run it.
## Writing a script
* The shebang
* Permissions
* Executing a script from the shell
### Break time!
Note:
Is everyone back? Right. We'll get started writing a couple scripts.
## A more interesting script
### Motivation
Rename an entire folder of JPEG photo files based on their timestamp.
wget http://bit.ly/15d2lrN # image1.jpg
wget http://bit.ly/16vrIW0 # image2.jpg
exiv2 15d2lrN
exiv2 16vrIW0
* Getting the timestamp
* Intermission: subshell
* Testing
* Reading in arguments
* Get options
Note:
Now let's get our hands dirty with a more interesting script.
Let's download two image files using wget.
Let's open them using exiv2. exiv2 shows you the EXIF metadata attached to pictures that you've taken with a camera. Now, I've artificially generated the EXIF metadata for these two files, so it looks quite sparse.
So maybe you're a photographer, and you have some photos to transfer over, but your different cameras take photos and write them to different filenames that tell you nothing. You want to rename these files so that they are sorted by time.
## Getting the timestamp
exiv2 15d2lrN | grep "Image timestamp" | cut -d ' ' -f 4,5
exiv2 15d2lrN | grep "Image timestamp" | cut -d ' ' -f 4,5 \
| sed 's/\(.*\) \(.*\)/\1T\2.jpg/'
# alternatively, without substituting space with T
exiv2 15d2lrN | grep "Image timestamp" | cut -d ' ' -f 4,5 \
| sed 's/$/\1.jpg/'
Note:
Let's see if we can get the timestamp of the file. We use exiv2 to print the metadata, grep to filter the part that we're interested, then we use cut to get the column that we're interested.
The -d option tells cut to separate fields by spaces. The -f 4,5 tells cut that we're interested in the 4th and fifth columns.
This timestame is almost the ISO format for date and time. One cool thing about the ISO format is that if you sort these timestamps alphabetically, you will display them from the oldest to the newest.
Now I don't like spaces in my filenames, so I'm going to use sed to replace spaes with a T.
## Intermission: subshell
* Problem: Not all files contain EXIF data
echo $(cat nosuchfile file1)
# STDIN piped into an argument
echo $(cat nosuchfile $PWD/file1 2> /dev/null)
echo $(exiv2 file1 2> /dev/null | grep "Image timestamp")
#no output
man null
Note:
There's a problem. Not all files are image files, and not all image files contain EXIF data. You can't rename these files. We cannot expect the file passed into exiv2 to have an EXIF timestamp.
We can handle these cases, and one way to do it is use a subshell.
When bash sees a $ followed by a single pair of parentheses, what it does is invoke another bash shell, and run the commands within the parentheses. We call this other bash shell a subshell. The subshell will collect the standard output, but immediately print standard error to the terminal.
Then, it interpolates the everything in the $() with the standard output.
The /dev/null you see here is a special file. You can see what it does by looking at man null.
Data written to a null or zero special file is discarded.
It is a common practice to redirect unwanted output to /dev/null.
## Testing
* Problem: Not all files contain EXIF data
[ "$(exiv2 file1 2> /dev/null | grep "Image timestamp" \
| cut -d ' ' -f 4,5)" == '' ]
echo $?
[ "$(exiv2 file1 | grep "Image timestamp" \
| cut -d ' ' -f 4,5)" == '' ]
echo $?
man [
Note:
There's a unix program called test, which has an alternate form, which is this left bracket. The test program reads in the arguments, and evaluates it like an expression. Its return value tells you whether it is true or false. 0 means true, and 1 means false. Note that this is opposite from the true and false values of C.
And so now we know how to test if the file can be renamed.
## Reading in arguments
vim rename_images
#!/bin/bash
echo "$@"
echo "with quotes:"
for FILENAME in "$@"
do
echo "$FILENAME"
done
echo "without quotes:"
for FILENAME in $@
do
echo "$FILENAME"
done
* running it
chx rename_images
./rename_images arg1 "arg 2" arg3
Note:
You can read arguments into a script with<EMAIL_ADDRESS>Now $@ is a little special. It preserves arguments with spaces in them if you quote it.
So let's try running this.
## Putting it together
vim rename_images
#!/bin/bash
for FILENAME in "$@"
do
export FILENAME
NEWNAME="$(exiv2 $FILENAME | grep "Image timestamp" |"\
" cut -d ' ' -f 4,5 | sed 's/\(.*\) \(.*\)/\1T\2.jpg/')"
# don't forget to quote
if [ "$NEWNAME" != "" ] # equivalent to [ -n "$NEWNAME" ]
then
mv "$FILENAME" "$NEWNAME"
elif [ ! -e "$FILENAME" ] # file does not exist
then
echo "$0: $FILENAME: No such file" 1>&2
else
echo "$0: $FILENAME: No EXIF timestamp" 1>&2
fi
done
Note:
for loop
if, based on return value
quotes around variables
## Using getopts
vim rename_images
#!/bin/bash
while getopts "e:" opt "$@"
do
case $opt in
e)
export EXTENSION="$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
for FILENAME in "${@:$OPTIND}"
do
export FILENAME
# this line is changed
NEWNAME="$(exiv2 $FILENAME | grep "Image timestamp" | cut -d ' ' -f 4,5 | sed 's/\(.*\) \(.*\)/\1T\2'"$EXTENSION"'/')"
# don't forget to quote
if [ "$NEWNAME" != "" ] # equivalent to [ -n "$NEWNAME" ]
then
mv "$FILENAME" "$NEWNAME"
elif [ ! -e "$FILENAME" ] # file does not exist
then
echo "$0: $FILENAME: No such file" >&2
else
echo "$0: $FILENAME: No EXIF timestamp" >&2
fi
done
## Script to rename files by EXIF timestamp
* More piping, piping through sed
* Subshells
* Shell Tests
* Reading in arguments
* Get options
### Time for another break!
Last part's gonna be less hands on.
Note:
## Other interesting stuff
* .bash_profile or .bashrc
* setup.sh
* other bash features
* more unix programs
* other scripting languages (Python, Ruby)
* make and Makefiles
* cron and crontab
## .bash_profile or .bashrc
Shell variables are not persistent!
cat /etc/profile # systemwide init
cat ~/.bash_profile # user init
cat /etc/bash.bashrc # systemwide interactive
cat .bashrc # user interactive
if [[ -r ~/.bash_aliases ]]; then
. ~/.bash_aliases
fi
## setup.sh
postinstall.sh
cd $HOME
curl https://raw.github.com/startup-class/setup/master/setup.sh | less
curl https://raw.github.com/startup-class/setup/master/setup.sh | bash
# Be careful about executing code from the internet!
Note:
If you're using virtual machines sometimes what you want to do is create a script that initializes a development environment that you're confortable with.
## other bash stuff and Unix programs
$ { command1; command2; } > new_file # group commands
$ ${$string:0_index_start:end} # substring
#Linux only
$ find . -name '*.sh' | xargs -0 cat
## Other scripting languages
Python
cat <<'EOS' > hello_world.py
#!/usr/bin/env python2
print "Hello World!"
EOS
chx hello_world.py
./hello_world.py
Ruby
cat <<'EOS' > hello_world.rb
#!/usr/bin/env ruby
puts "Hello World!"
EOS
chx hello_world.rb
./hello_world.rb
# We're done!
These slides will be available after the workshop.
Questions?


This analysis is a placeholder with a sample set. If you want to contribute new analyses for the site, contact Disaster Area on Discord.
Level: 25
- Surf
- Blizzard
- Double-Edge
- Explosion
This analysis is a placeholder with a sample set. If you want to contribute new analyses for the site, contact Disaster Area on Discord.
Shellder can be bumped up to at least L29 to avoid a Dragon Rage 2HKO, but this usually means making it L30, which makes Explosion a big risk. Clamp is a valid option for forcing switch situations and cheesing Pokemon in the endgame, but it's much more effective in Yellow Petit Cup.
This analysis is a placeholder with a sample set. If you want to contribute new analyses for the site, contact Disaster Area on Discord.
Author: Plague von Karma
HTML by: Plague von Karma
Publish Date: 22nd October 2020


NASA Science to Return to Earth aboard SpaceX Dragon Spacecraft
SpaceX's Dragon cargo spacecraft is scheduled to splash down in the Pacific Ocean on Saturday, Jan. 13, west of Baja California, with approximately 4,100 pounds of NASA cargo, science and technology demonstration samples from the International Space Station.
The Dragon spacecraft will be taken by ship to Long Beach, California, where some cargo will be removed immediately for return to NASA. Dragon then will be prepared for a return trip to SpaceX's test facility in McGregor, Texas, for final processing.
A variety of technological and biological studies are returning in Dragon. Hardware from the Made in Space Fiber Optics payload, which demonstrated manufacturing fiber optic filaments in a microgravity environment. Designed by the company Made in Space and sponsored by the Center for the Advancement of Science in Space (CASIS), the investigation pulled fiber optic wire from ZBLAN, a heavy metal fluoride glass commonly used to make fiber optic glass. Research indicates that ZBLAN fiber pulled in microgravity may not crystalize as much, giving it better optical qualities than the silica used in most fiber optic wire. Results from this investigation could lead to the production of higher-quality fiber optic products both in space and on Earth.
Samples from APEX-05 were used to study a stress reaction in plants when experiencing reduced oxygen availably (hypoxia), which occurs for example, during times of soil flooding. Such natural hypoxic events are sensed by plants and can lead to either changes in growth and development to aid in the plant’s survival, or in extreme cases, lead to significant losses in productivity and even death. These spaceflight experiments may help provide molecular targets for manipulation to help make plants more tolerant of low oxygen conditions and so contribute to agriculturally important traits such as crop flood tolerance.
Mice from NASA’s Rodent Research-6 study also will return live to Earth for additional study. The investigation, which was conducted jointly with the U.S. National Lab, evaluated a new drug delivery device for administering continuous low doses, which could help counteract muscle wasting and prevent the need for daily or frequent drug administration. A tiny capsule, implanted under the skin, delivers a constant, low dose of a drug via a silicone membrane, with channels as narrow as 1/50,000 the width of a human hair. The drug, called formoterol, is a common therapy in asthma inhalers and for other lung diseases that relaxes muscles responsible for tightening a patient’s airways. The low-dose delivery also could help avoid the known side effects of taking high doses long-term.
Dragon is the only space station resupply spacecraft currently able to return cargo to Earth. The spacecraft lifted off from Space Launch Complex 40 at Cape Canaveral Air Force Station in Florida Dec. 15 carrying about 4,800 pounds of supplies and scientific cargo on the company’s 13th commercial resupply mission to the station. It arrived on station Dec. 17.
For more than 17 years, humans have lived and worked continuously aboard the station, advancing scientific knowledge and demonstrating new technologies, making research breakthroughs not possible on Earth that will enable long-duration human and robotic exploration into deep space. A global endeavor, more than 200 people from 18 countries have visited the unique microgravity laboratory that has hosted more than 2,100 research investigations from researchers in more than 95 countries.
Keep up with the International Space Station, and its research and crew members, at:
http://www.nasa.gov/station


#Build: Synplify Pro J-2015.03M-SP1-2, Build 266R, Dec 14 2015 #install: C:\Microsemi\Libero_SoC_v11.8\SynplifyPro\fpga_J-2015.03M-SP1-2 #OS: Windows 8 6.2 #Hostname: LAPTOP-UCQD4H1A #Implementation: synthesis Synopsys HDL Compiler, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode Copyright (C) 1994-2015 Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Synopsys VHDL Compiler, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode Copyright (C) 1994-2015 Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. @N:CD720 : std.vhd(146) | Setting time resolution to ns @N: : CU_Main.vhd(17) | Top entity is set to CU_Main. File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\hdl\WOLF_CONTROLLER.vhd changed - recompiling File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\component\work\CU_Main\CU_Main.vhd changed - recompiling File C:\Microsemi\Libero_SoC_v11.8\SynplifyPro\fpga_J-2015.03M-SP1-2\lib\proasic\proasic3.vhd changed - recompiling VHDL syntax check successful! File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\hdl\WOLF_CONTROLLER.vhd changed - recompiling File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\component\work\CU_Main\CU_Main.vhd changed - recompiling @N:CD231 : std1164.vhd(890) | Using onehot encoding for type mvl9plus ('U'="1000000000") @N:CD630 : CU_Main.vhd(17) | Synthesizing work.cu_main.rtl @N:CD630 : WOLF_CONTROLLER.vhd(22) | Synthesizing work.wolf_controller.architecture_wolf_controller @N:CD231 : WOLF_CONTROLLER.vhd(60) | Using onehot encoding for type state (start="100000") @W:CD434 : WOLF_CONTROLLER.vhd(77) | Signal rocket_pin in the sensitivity list is not used in the process @W:CD604 : WOLF_CONTROLLER.vhd(141) | OTHERS clause is not synthesized @W:CD434 : WOLF_CONTROLLER.vhd(93) | Signal clk_1hz in the sensitivity list is not used in the process Post processing for work.wolf_controller.architecture_wolf_controller @W:CL169 : WOLF_CONTROLLER.vhd(97) | Pruning register rocket_pin_old_4 @A:CL282 : WOLF_CONTROLLER.vhd(97) | Feedback mux created for signal next_state[0:5] -- possible set/reset assignment for signal missing. Specifying a reset value will improve timing and area. @N:CD630 : System_clock.vhd(44) | Synthesizing work.system_clock.behaviour Post processing for work.system_clock.behaviour @N:CD630 : CUTTER_PWM.vhd(23) | Synthesizing work.cutter_pwm.logic Post processing for work.cutter_pwm.logic @A:CL282 : CUTTER_PWM.vhd(48) | Feedback mux created for signal half_duty_new[4:0] -- possible set/reset assignment for signal missing. Specifying a reset value will improve timing and area. @A:CL282 : CUTTER_PWM.vhd(48) | Feedback mux created for signal half_duty_0[4:0] -- possible set/reset assignment for signal missing. Specifying a reset value will improve timing and area. @N:CD630 : proasic3.vhd(2858) | Synthesizing proasic3.clkint.syn_black_box Post processing for proasic3.clkint.syn_black_box Post processing for work.cu_main.rtl @W:CL168 : CU_Main.vhd(199) | Pruning instance CUTTER_PWM_inst_0 -- not in use ... @W:CL189 : CUTTER_PWM.vhd(48) | Register bit half_duty_new(4) is always 0, optimizing ... @W:CL260 : CUTTER_PWM.vhd(48) | Pruning register bit 4 of half_duty_new(4 downto 0) @W:CL189 : CUTTER_PWM.vhd(48) | Register bit half_duty_0(4) is always 0, optimizing ... @W:CL260 : CUTTER_PWM.vhd(48) | Pruning register bit 4 of half_duty_0(4 downto 0) @W:CL246 : CUTTER_PWM.vhd(33) | Input port bits 3 to 0 of duty(7 downto 0) are unused @W:CL159 : WOLF_CONTROLLER.vhd(30) | Input rocket_pin is unused At c_vhdl Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 74MB peak: 75MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:46 2017 ###########################################################] Synopsys Netlist Linker, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode At syn_nfilter Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 67MB peak: 68MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:46 2017 ###########################################################] @END At c_hdl Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 3MB peak: 4MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:46 2017 ###########################################################] Synopsys Netlist Linker, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\synwork\CU_Main_comp.srs changed - recompiling At syn_nfilter Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 67MB peak: 68MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:48 2017 ###########################################################] Pre-mapping Report Synopsys Microsemi Technology Pre-mapping, Version mapact, Build 1659R, Built Dec 10 2015 09:42:41 Copyright (C) 1994-2015, Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Product Version J-2015.03M-SP1-2 Mapper Startup Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 99MB) Reading constraint file: C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\constraint\CU_Main_32.sdc Linked File: CU_Main_scck.rpt Printing clock summary report in "C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\CU_Main_scck.rpt" file @N:MF248 : | Running in 64-bit mode. @N:MF667 : | Clock conversion disabled Design Input Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 100MB peak: 102MB) Mapper Initialization Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 100MB peak: 102MB) Finished netlist restructuring (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 109MB) @S |Clock Summary ***************** Start Requested Requested Clock Clock Clock Frequency Period Type Group ------------------------------------------------------------------------------------------------------- main_clk 32.8 MHz 30.500 declared default_clkgroup system_clock|m_time_inferred_clock[25] 100.0 MHz 10.000 inferred Inferred_clkgroup_0 ======================================================================================================= @W:MT530 : wolf_controller.vhd(79) | Found inferred clock system_clock|m_time_inferred_clock[25] which controls 13 sequential elements including WOLF_CONTROLLER_inst_0.sec_since_eject[12:0]. This clock has no specified timing constraint which may adversely impact design performance. Finished Pre Mapping Phase. @N:BN225 : | Writing default property annotation file C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\CU_Main.sap. Pre-mapping successful! At Mapper Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 45MB peak: 109MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:48 2017 ###########################################################] Map & Optimize Report Synopsys Microsemi Technology Mapper, Version mapact, Build 1659R, Built Dec 10 2015 09:42:41 Copyright (C) 1994-2015, Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Product Version J-2015.03M-SP1-2 Mapper Startup Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 99MB) @N:MF248 : | Running in 64-bit mode. @N:MF667 : | Clock conversion disabled Design Input Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 101MB) Mapper Initialization Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 101MB) Starting Optimization and Mapping (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 110MB) Available hyper_sources - for debug and ip models None Found Finished RTL optimizations (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 110MB) @N: : system_clock.vhd(64) | Found counter in view:work.system_clock(behaviour) inst l_time[17:1] @N:MF238 : system_clock.vhd(94) | Found 8-bit incrementor, 'un1_s_time_0[7:0]' @N:MF238 : system_clock.vhd(94) | Found 7-bit incrementor, 'un1_s_time[6:0]' @N: : wolf_controller.vhd(79) | Found counter in view:work.WOLF_CONTROLLER(architecture_wolf_controller) inst sec_since_eject[12:0] Finished factoring (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Finished gated-clock and generated-clock conversion (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 108MB peak: 110MB) Finished generic timing optimizations - Pass 1 (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Starting Early Timing Optimization (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Finished Early Timing Optimization (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 110MB peak: 110MB) Finished generic timing optimizations - Pass 2 (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Finished preparing to map (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 110MB peak: 110MB) Finished technology mapping (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) High Fanout Net Report ********************** Driver Instance / Pin Name Fanout, notes ------------------------------------------------------------- CLKINT_1 / Y 52 : 46 asynchronous set/reset ============================================================= Finished technology timing optimizations and critical path resynthesis (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Added 0 Buffers Added 0 Cells via replication Added 0 Sequential Cells via replication Added 0 Combinational Cells via replication Finished restoring hierarchy (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) #### START OF CLOCK OPTIMIZATION REPORT #####[ Clock optimization not enabled 1 non-gated/non-generated clock tree(s) driving 39 clock pin(s) of sequential element(s) 1 gated/generated clock tree(s) driving 13 clock pin(s) of sequential element(s) 0 instances converted, 13 sequential instances remain driven by gated/generated clocks ========================================== Non-Gated/Non-Generated Clocks =========================================== Clock Tree ID Driving Element Drive Element Type Fanout Sample Instance --------------------------------------------------------------------------------------------------------------------- ClockId0002 CLK clock definition on port 39 WOLF_CONTROLLER_inst_0.current_state[0] ===================================================================================================================== =========================================================================================== Gated/Generated Clocks ============================================================================================ Clock Tree ID Driving Element Drive Element Type Fanout Sample Instance Explanation --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ClockId0001 system_clock_inst_0.s_time_0[7] DFN0E1C1 13 WOLF_CONTROLLER_inst_0.sec_since_eject[12] No generated or derived clock directive on output of sequential instance =============================================================================================================================================================================================================== ##### END OF CLOCK OPTIMIZATION REPORT ######] Start Writing Netlists (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Writing Analyst data base C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\synwork\CU_Main_m.srm Finished Writing Netlist Databases (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Writing EDIF Netlist and constraint files J-2015.03M-SP1-2 Finished Writing EDIF Netlist and constraint files (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 111MB) Start final timing analysis (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 111MB) Found clock main_clk with period 30.50ns @W:MT420 : | Found inferred clock system_clock|m_time_inferred_clock[25] with period 10.00ns. Please declare a user-defined clock on object "n:system_clock_inst_0.m_time[25]" @S |##### START OF TIMING REPORT #####[ # Timing Report written on Thu Jun 08 17:28:49 2017 # Top view: CU_Main Library name: PA3 Operating conditions: COMWCSTD ( T = 70.0, V = 1.42, P = 1.74, tree_type = balanced_tree ) Requested Frequency: 32.8 MHz Wire load mode: top Wire load model: proasic3 Paths requested: 5 Constraint File(s): C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\constraint\CU_Main_32.sdc @N:MT320 : | Timing report estimates place and route data. Please look at the place and route timing report for final timing. @N:MT322 : | Clock constraints cover only FF-to-FF paths associated with the clock. Performance Summary ******************* Worst slack in design: 0.911 Requested Estimated Requested Estimated Clock Clock Starting Clock Frequency Frequency Period Period Slack Type Group --------------------------------------------------------------------------------------------------------------------------------------------- main_clk 32.8 MHz 56.8 MHz 30.500 17.608 6.446 declared default_clkgroup system_clock|m_time_inferred_clock[25] 100.0 MHz 110.0 MHz 10.000 9.089 0.911 inferred Inferred_clkgroup_0 ============================================================================================================================================= Clock Relationships ******************* Clocks | rise to rise | fall to fall | rise to fall | fall to rise ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Starting Ending | constraint slack | constraint slack | constraint slack | constraint slack ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- main_clk main_clk | 30.500 24.708 | 30.500 15.034 | 15.250 12.266 | 15.250 6.446 system_clock|m_time_inferred_clock[25] main_clk | Diff grp - | No paths - | No paths - | No paths - system_clock|m_time_inferred_clock[25] system_clock|m_time_inferred_clock[25] | 10.000 0.911 | No paths - | No paths - | No paths - ========================================================================================================================================================================= Note: 'No paths' indicates there are no paths in the design for that pair of clock edges. 'Diff grp' indicates that paths exist but the starting clock and ending clock are in different clock groups. Interface Information ********************* No IO constraint found ==================================== Detailed Report for Clock: main_clk ==================================== Starting Points with Worst Slack ******************************** Starting Arrival Instance Reference Type Pin Net Time Slack Clock ------------------------------------------------------------------------------------------------------ system_clock_inst_0.l_time[1] main_clk DFN0C1 Q m_time[1] 0.527 6.446 system_clock_inst_0.l_time[2] main_clk DFN0C1 Q m_time[2] 0.527 6.724 system_clock_inst_0.l_time[3] main_clk DFN0C1 Q m_time[3] 0.527 7.103 system_clock_inst_0.l_time[4] main_clk DFN0C1 Q m_time[4] 0.527 8.380 system_clock_inst_0.l_time[8] main_clk DFN0C1 Q m_time[8] 0.653 8.479 system_clock_inst_0.l_time[12] main_clk DFN0E0C1 Q m_time[12] 0.653 8.656 system_clock_inst_0.l_time[5] main_clk DFN0C1 Q m_time[5] 0.527 8.702 system_clock_inst_0.l_time[16] main_clk DFN0E0C1 Q m_time[16] 0.653 8.935 system_clock_inst_0.l_time[10] main_clk DFN0E0C1 Q m_time[10] 0.653 9.477 system_clock_inst_0.l_time[14] main_clk DFN0E0C1 Q m_time[14] 0.653 9.491 ====================================================================================================== Ending Points with Worst Slack ****************************** Starting Required Instance Reference Type Pin Net Time Slack Clock --------------------------------------------------------------------------------------------------------------- system_clock_inst_0.flag main_clk DFN1C1 D flag_RNO 14.711 6.446 system_clock_inst_0.s_time[0] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[1] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[2] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[3] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[4] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[5] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time[6] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.s_time_0[7] main_clk DFN0E1C1 E flag 14.642 12.266 system_clock_inst_0.l_time[16] main_clk DFN0E0C1 E l_time_RNO_0[16] 29.892 15.034 =============================================================================================================== Worst Path Information View Worst Path in Analyst *********************** Path information for path number 1: Requested Period: 15.250 - Setup time: 0.539 + Clock delay at ending point: 0.000 (ideal) = Required time: 14.711 - Propagation time: 8.265 - Clock delay at starting point: 0.000 (ideal) = Slack (non-critical) : 6.446 Number of logic level(s): 6 Starting point: system_clock_inst_0.l_time[1] / Q Ending point: system_clock_inst_0.flag / D The start point is clocked by main_clk [falling] on pin CLK The end point is clocked by main_clk [rising] on pin CLK Instance / Net Pin Pin Arrival No. of Name Type Name Dir Delay Time Fan Out(s) ------------------------------------------------------------------------------------------------------- system_clock_inst_0.l_time[1] DFN0C1 Q Out 0.527 0.527 - m_time[1] Net - - 1.184 - 4 system_clock_inst_0.l_time_RNIAI8D1[3] OR3C A In - 1.710 - system_clock_inst_0.l_time_RNIAI8D1[3] OR3C Y Out 0.525 2.235 - N_21 Net - - 0.806 - 3 system_clock_inst_0.l_time_RNIBEEB2[5] OR3B C In - 3.041 - system_clock_inst_0.l_time_RNIBEEB2[5] OR3B Y Out 0.751 3.792 - N_23 Net - - 0.386 - 2 system_clock_inst_0.l_time_RNITDHQ2[6] OR2A B In - 4.178 - system_clock_inst_0.l_time_RNITDHQ2[6] OR2A Y Out 0.646 4.824 - N_24 Net - - 0.386 - 2 system_clock_inst_0.l_time_RNIGEK93[7] OR2A B In - 5.210 - system_clock_inst_0.l_time_RNIGEK93[7] OR2A Y Out 0.646 5.857 - N_25 Net - - 0.806 - 3 system_clock_inst_0.l_time_RNIPBUK4[7] NOR2A B In - 6.663 - system_clock_inst_0.l_time_RNIPBUK4[7] NOR2A Y Out 0.407 7.070 - l_N_13_mux Net - - 0.386 - 2 system_clock_inst_0.flag_RNO NOR2B A In - 7.456 - system_clock_inst_0.flag_RNO NOR2B Y Out 0.488 7.944 - flag_RNO Net - - 0.322 - 1 system_clock_inst_0.flag DFN1C1 D In - 8.265 - ======================================================================================================= Total path delay (propagation time + setup) of 8.804 is 4.529(51.4%) logic and 4.275(48.6%) route. Path delay compensated for clock skew. Clock skew is added to clock-to-out value, and is subtracted from setup time value ==================================== Detailed Report for Clock: system_clock|m_time_inferred_clock[25] ==================================== Starting Points with Worst Slack ******************************** Starting Arrival Instance Reference Type Pin Net Time Slack Clock ---------------------------------------------------------------------------------------------------------------------------------------------------- WOLF_CONTROLLER_inst_0.sec_since_eject[2] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[2] 0.580 0.911 WOLF_CONTROLLER_inst_0.sec_since_eject[0] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[0] 0.580 1.052 WOLF_CONTROLLER_inst_0.sec_since_eject[1] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[1] 0.580 1.097 WOLF_CONTROLLER_inst_0.sec_since_eject[3] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[3] 0.580 2.609 WOLF_CONTROLLER_inst_0.sec_since_eject[4] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[4] 0.580 2.654 WOLF_CONTROLLER_inst_0.sec_since_eject[6] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[6] 0.737 3.392 WOLF_CONTROLLER_inst_0.sec_since_eject[5] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[5] 0.737 4.133 WOLF_CONTROLLER_inst_0.sec_since_eject[8] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[8] 0.737 4.178 WOLF_CONTROLLER_inst_0.sec_since_eject[7] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[7] 0.737 4.406 WOLF_CONTROLLER_inst_0.sec_since_eject[9] system_clock|m_time_inferred_clock[25] DFN1C1 Q sec_since_eject[9] 0.737 4.463 ==================================================================================================================================================== Ending Points with Worst Slack ****************************** Starting Required Instance Reference Type Pin Net Time Slack Clock --------------------------------------------------------------------------------------------------------------------------------------------------------------- WOLF_CONTROLLER_inst_0.sec_since_eject[9] system_clock|m_time_inferred_clock[25] DFN1C1 D N_58_i 9.427 0.911 WOLF_CONTROLLER_inst_0.sec_since_eject[8] system_clock|m_time_inferred_clock[25] DFN1C1 D N_57_i 9.461 1.450 WOLF_CONTROLLER_inst_0.sec_since_eject[7] system_clock|m_time_inferred_clock[25] DFN1C1 D N_56_i 9.461 2.482 WOLF_CONTROLLER_inst_0.sec_since_eject[6] system_clock|m_time_inferred_clock[25] DFN1C1 D N_55_i 9.427 3.017 WOLF_CONTROLLER_inst_0.sec_since_eject[10] system_clock|m_time_inferred_clock[25] DFN1C1 D sec_since_eject_n10 9.461 3.135 WOLF_CONTROLLER_inst_0.sec_since_eject[5] system_clock|m_time_inferred_clock[25] DFN1C1 D N_51_i 9.461 3.556 WOLF_CONTROLLER_inst_0.sec_since_eject[11] system_clock|m_time_inferred_clock[25] DFN1C1 D sec_since_eject_n11 9.461 3.830 WOLF_CONTROLLER_inst_0.sec_since_eject[12] system_clock|m_time_inferred_clock[25] DFN1E0C1 E sec_since_eject_RNO_0[12] 9.392 4.246 WOLF_CONTROLLER_inst_0.sec_since_eject[4] system_clock|m_time_inferred_clock[25] DFN1C1 D N_49_i 9.427 4.505 WOLF_CONTROLLER_inst_0.sec_since_eject[3] system_clock|m_time_inferred_clock[25] DFN1C1 D N_48_i 9.461 5.043 =============================================================================================================================================================== Worst Path Information View Worst Path in Analyst *********************** Path information for path number 1: Requested Period: 10.000 - Setup time: 0.573 + Clock delay at ending point: 0.000 (ideal) = Required time: 9.427 - Propagation time: 8.516 - Clock delay at starting point: 0.000 (ideal) = Slack (critical) : 0.911 Number of logic level(s): 5 Starting point: WOLF_CONTROLLER_inst_0.sec_since_eject[2] / Q Ending point: WOLF_CONTROLLER_inst_0.sec_since_eject[9] / D The start point is clocked by system_clock|m_time_inferred_clock[25] [rising] on pin CLK The end point is clocked by system_clock|m_time_inferred_clock[25] [rising] on pin CLK Instance / Net Pin Pin Arrival No. of Name Type Name Dir Delay Time Fan Out(s) ------------------------------------------------------------------------------------------------------------------- WOLF_CONTROLLER_inst_0.sec_since_eject[2] DFN1C1 Q Out 0.580 0.580 - sec_since_eject[2] Net - - 1.423 - 6 WOLF_CONTROLLER_inst_0.sec_since_eject_RNISF2I[1] OR3C C In - 2.004 - WOLF_CONTROLLER_inst_0.sec_since_eject_RNISF2I[1] OR3C Y Out 0.666 2.669 - N_26 Net - - 0.806 - 3 WOLF_CONTROLLER_inst_0.sec_since_eject_RNI9A4U[4] OR3B C In - 3.476 - WOLF_CONTROLLER_inst_0.sec_since_eject_RNI9A4U[4] OR3B Y Out 0.751 4.227 - N_28 Net - - 0.806 - 3 WOLF_CONTROLLER_inst_0.sec_since_eject_RNIQ86A1[6] OR3B C In - 5.033 - WOLF_CONTROLLER_inst_0.sec_since_eject_RNIQ86A1[6] OR3B Y Out 0.751 5.784 - N_31 Net - - 0.386 - 2 WOLF_CONTROLLER_inst_0.sec_since_eject_RNIK97G1[7] OR2A B In - 6.170 - WOLF_CONTROLLER_inst_0.sec_since_eject_RNIK97G1[7] OR2A Y Out 0.646 6.816 - N_32 Net - - 0.386 - 2 WOLF_CONTROLLER_inst_0.sec_since_eject_RNO[9] AX1 A In - 7.202 - WOLF_CONTROLLER_inst_0.sec_since_eject_RNO[9] AX1 Y Out 0.992 8.194 - N_58_i Net - - 0.322 - 1 WOLF_CONTROLLER_inst_0.sec_since_eject[9] DFN1C1 D In - 8.516 - =================================================================================================================== Total path delay (propagation time + setup) of 9.089 is 4.960(54.6%) logic and 4.129(45.4%) route. Path delay compensated for clock skew. Clock skew is added to clock-to-out value, and is subtracted from setup time value ##### END OF TIMING REPORT #####] Finished final timing analysis (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 111MB) Finished timing report (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 111MB) -------------------------------------------------------------------------------- Target Part: A3P250_VQFP100_STD Report for cell CU_Main.rtl Core Cell usage: cell count area count*area AND2 1 1.0 1.0 AND3 7 1.0 7.0 AOI1B 7 1.0 7.0 AX1 5 1.0 5.0 AX1C 2 1.0 2.0 CLKINT 2 0.0 0.0 GND 3 0.0 0.0 INV 14 1.0 14.0 NOR2 1 1.0 1.0 NOR2A 5 1.0 5.0 NOR2B 11 1.0 11.0 NOR3 2 1.0 2.0 NOR3A 1 1.0 1.0 NOR3B 3 1.0 3.0 NOR3C 9 1.0 9.0 OA1 1 1.0 1.0 OA1B 2 1.0 2.0 OA1C 1 1.0 1.0 OAI1 1 1.0 1.0 OR2 6 1.0 6.0 OR2A 12 1.0 12.0 OR2B 1 1.0 1.0 OR3 3 1.0 3.0 OR3B 3 1.0 3.0 OR3C 3 1.0 3.0 VCC 3 0.0 0.0 XNOR2 8 1.0 8.0 XOR2 9 1.0 9.0 DFN0C1 7 1.0 7.0 DFN0E0C1 9 1.0 9.0 DFN0E1C1 9 1.0 9.0 DFN1 1 1.0 1.0 DFN1C1 18 1.0 18.0 DFN1E0 5 1.0 5.0 DFN1E0C1 2 1.0 2.0 DFN1P1 1 1.0 1.0 ----- ---------- TOTAL 178 170.0 IO Cell usage: cell count INBUF 2 OUTBUF 7 ----- TOTAL 9 Core Cells : 170 of 6144 (3%) IO Cells : 9 RAM/ROM Usage Summary Block Rams : 0 of 8 (0%) Mapper successful! At Mapper Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 46MB peak: 111MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Thu Jun 08 17:28:49 2017 ###########################################################]


Apex Resources Inc. is committed to maximizing the performance of
our
customers' most critical resources through development projects,
as well
as sourcing and distributing agricultural commodities, raw
materials,
medical devices, petroleum products, and LED lights.
Active in the oil and gas sector since the 1970's, Apex Resource
Inc.
is in a unique position to capitalize on trends in the petroleum
industry.
We bring decades of experience to drug and medical device sales
both
in the private and non-profit sectors.
We are licensed by the Office of Foreign Asset Control (OFAC) to
trade
over 150 agricultural products, including all varieties of:
we work with mines throughout the Americans, Asia and Africa to
source
products for our customers based on their needs. Available
products
include coal precious metals, and iron ore. We are currently
developing
a 60,000-acre steel and iron ore mill in Kenya.
Apex Resource Inc.'s President and CEO, John J. Ghaznavi, resides
over
12 partnerships that own over 4,300 commercial, residental and
industrial properties throughout the US, Canada, and the Middle
East.
Through JV partnerships with construction and architecture firms,
such
as dynamic Building Corp., Mr Ghaznavi leverages relationships
across
the world to pursue development opportunities. Current projects
include:
Through partner company Soltron Corporation, we can deliver the
highest quality LED lights and batteries in the industry.
Since these beginnings, Mr. Ghaznavi has developed and managed 23 companies and 32 partnerships worldwide.
2000 Corporate Dr #240
Wexford, PA 15090
Phone +1(724)719-2153
Fax +1(724)19-2162
<EMAIL_ADDRESS>Mon-Sun: 8am - 5pm


Our agency is a company that rents automobiles for short periods of time, generally ranging from a few hours to a few weeks. We have numerous local branches (which allow a user to return a vehicle to a different location), we are located near Riga airport and near city center, also our website allowing online reservations.
Easy Car Rent is an ongoing Latvian success story. Our guiding principles, and humble beginning, revolve around personal honesty and integrity. We believe in strengthening our communities one neighborhood at a time, serving our customers as if they were our family, and rewarding hard work. These things are as true today as they were when we were founded in 2004.
Today, our developed network means Easy Car Rent is the largest transportation solutions provider in Latvia. We offer car and vans rentals, as well as car sharing.
| Name | Passengers | Baggage | Transmission | Conditioning | Fuel consumption | CO2 |
|---|---|---|---|---|---|---|
| {{dish1.name}} | {{dish1.description[0].passengers}} | {{dish1.description[0].baggage}} | {{dish1.description[0].transmission}} | {{dish1.description[0].conditioning}} | {{dish1.description[0].fuel}} | {{dish1.description[0].co2}} |
| {{dish2.name}} | {{dish2.description[0].passengers}} | {{dish2.description[0].baggage}} | {{dish2.description[0].transmission}} | {{dish2.description[0].conditioning}} | {{dish2.description[0].fuel}} | {{dish2.description[0].co2}} |
| {{dish3.name}} | {{dish3.description[0].passengers}} | {{dish3.description[0].baggage}} | {{dish3.description[0].transmission}} | {{dish3.description[0].conditioning}} | {{dish3.description[0].fuel}} | {{dish3.description[0].co2}} |
| {{dish4.name}} | {{dish4.description[0].passengers}} | {{dish4.description[0].baggage}} | {{dish4.description[0].transmission}} | {{dish4.description[0].conditioning}} | {{dish4.description[0].fuel}} | {{dish4.description[0].co2}} |


Dynamic Tabs
Discount Profile
Premium Profile
Last Profile
Discount_Profile
Premium Profile
Last Profile - no chart here


Viewing Back House / HYLA Architects
- Curated by Paula Pintos
- about 4 hours
- version="1.0" encoding="UTF-8"? Architects: HYLA Architects
- AreaArea of this architecture projectArea: 567.0 m2
- version="1.0" encoding="UTF-8"?YearCompletion year of this architecture project Year: 2019
- version="1.0" encoding="UTF-8"?PhotographsPhotographs: Derek Swalwell
- version="1.0" encoding="UTF-8"?ManufacturersBrands with products used in this architecture project Manufacturers: AutoDesk, Big Ass Fans, Chaos Group, Duravit, Hansgrohe, Kawajun, Occhio, Trimble, Villeroy & Boch
- Lead Architect Han Loke Kwang
- Design Team Tran Thi Thu Trang, Amanda Tay, Wesley Fong, Chong Wen Jin, Thomas Ong
- Engineering GCE Consulting Engineers
- Landscape Nyee Phoe Flower Garden Pte Ltd
- Main Contractor V-tech Construction Pte Ltd
- Interior Custom joinery designed by HYLA Architects built by Kcf&R Pte Ltd
More Specs Less Specs
Text description provided by the architects. Nestled behind an unassuming face of granite and glass, this 2-storey brick structure conceals a mesmerising view; offering a glimpse into the garden of Singapore’s former Command House. Situated on a long plot, the "Viewing Back" house capitalises on its length to accentuate its view to the north.
Upon entering, floating timber steps tease at the landscape ahead, framing the corridor of trees that blur the boundary between indoor and outdoor space. Bordered on one side by dark face brick, the foyer is abundant with light, owing to the double-volume void that terminates at an intricate rectilinear screen and pergola.
Stretching across the building, the pattern of vertical and horizontal lines provides privacy and sun shading whilst visually connecting each space to the scenery outside. Unconventionally, the full length living and dining is situated on the second floor, allowing its open plan to free up the space and frame the landscape ahead.
Finished with a modern interior, the contrast between luxurious marble, warm timber and textured brick evoke a timeless and modern atmosphere. Overlooking the stairwell, a glass study and three bedrooms occupy the top floor. As screen transitions from wall to roof, an interplay of shadows dance atop the infinity pool below, overlooking a glass-less window of picturesque nature.


{% extends "base.html" %} {% block body %}
It looks like you're trying to add a new log-in mechanism to an existing Rebble account, but the log-in mechanism that you just tried to add is already in use by a different Rebble account. (An external log-in can only be associated with one Rebble account at a time!)
You can log out if you want to switch Rebble accounts, or you can try again with another external account, or you can just gaze blissfully on the accounts you have already amassed.
{% endblock %}


CAPTUR
Capture Life
Designed for adventure
Captur is a fun and sporty crossover, inspired by the concept car of the same name. Explore the world with Captur.
TECHNOLOGY
Onboard Captur, choose between two innovative touchscreen multimedia systems: MEDIANAV and Renault R-Link.
PERFORMANCE
Experience Captur's innovative engines, combining driving pleasure with fuel efficiency and reduced CO2 emissions.
CAPTUR SIGNATURE
A TOUCH OF LUXURY
DESIGN
Want to drive a crossover with go-anywhere looks? Discover the new Flame Red body colour, exclusive to Signature, along with the grey painted lower bumbers and 17” black diamond-cut wheels.
ATTENTION TO DETAIL
Looking to travel in the height of comfort? Sit back on the exclusive part-leather seats of the Captur Signature, and you will feel the difference. The red touches on the dashboard add a sporty feel to the cabin, while the part-leather upholstery ensures a touch of class.
BUILT FOR ADVENTURE
Captur Signature was born for adventure. Head off the beaten track with the Extended Grip traction control system. On dry, snow-covered or muddy roads, three grip modes deliver a relaxed driving experience: 'roads', 'soft ground' and 'expert' with specially developed tyres. To ensure that driving remains a pleasure at all times.
EQUIPMENT
Adventures are fun, especially when you're equipped for them! We've provided everything you need to make life easier: the Extended Grip traction system, R-Link connected touch-screen navigation, climate control, rear-parking sensors and the reversing camera all await you on board the Captur Signature.
CAPTUR AT A GLANCE
MEDIA GALLERY
Discover Captur from every angle.
An adventurous selection
The Captur Range
How will you ever choose?!
Ready to take Captur for a spin?
Go even further
I'd like to
Why choose Renault?
Design & Innovation
Renault 4+ Package
Environmental commitment
*Model shown CAPTUR Dynamique S Nav from £16,795. Price does not include the cost of Renault i.d. Ivory non-metallic paint at £225, Renault i.d. Arizona metallic paint, Renault i.d. Tahoe Blue metallic paint, Mercury metallic paint, Oyster Grey metallic paint, Stone metallic paint and Diamond Black metallic paint at £495. Flame Red metallic paint at £595 is only available on Captur Signature from £18,395.


who am I..
what I am doing..
Zenopsis
calabro
what is on this site..
${ET(pages_widget.display(pages=pages, site=site))}
${ET(admin_widget.display(site=site))}
what I am writing..
${ET(tags_widget.display(tags=tags, site=site))}
what I have done..
Resume
what people are saying..
${ET(recent_comments_widget.display(recent_comments=recent_comments, site=site))}


Enjoy your garden gallery to keep track your garden.
This photo upload is only limited to 2MB per photo and it is only limited in image format such as JPG, PNG and GIF
Privacy Term