Artistic Style (or astyle for short) is a source code indenter, formatter, and beautifier for the C, C++, C# and Java programming languages. It is a great tool to ensure your code is beatifully and consistently formatted and indented, and can be used to replace any tabs with spaces, ensuring consistent indentation regardless of the editor you use to view the code.
You can apply astyle from command line simply by:
astyle file.cpp
which would format the file with 4 spaces per indent. You can configure the way of formatting either using command line options or you can place the default options into ~/.astylerc file.
It is also possible to run an external tool on a file in the editor window in Eclipse. Select Run > External Tools > External Tools Configurations..., create a new Program configuration, and fill in the boxes as below:
For convenience, the parameters we have used are here:
--indent=spaces=4 --style=allman --indent-labels --indent-preprocessor --indent-col1-comments \
--max-instatement-indent=60 --min-conditional-indent=0 --pad-oper --unpad-paren --pad-paren-in \
--break-closing-brackets --add-brackets --keep-one-line-blocks --keep-one-line-statements \
--convert-tabs --align-pointer=name --align-reference=name --suffix=none --options=none
You should probably remove the newlines and backslashes if you copy-paste the text into the Arguments box. This version requires version 2.02 or newer — to use version 2.01, drop the parameter --align-reference=name. Note that after pasting the above parameters in the Arguments box, you need to append ${container_loc}/${resource_name}, specific for configuring the tool in Eclipse.
Then configure the Refresh
and Build tabs.
Next, select Run > External Tools > Organize Favorites... and add the astyle tool.
Now you can run astyle for the file that is selected in the edit window by clicking this button. Note that you should save the file first as the input is taken from the file, not from the editor window. The content of the editor window is refreshed automatically.
Eclipse has a built-in formatter, but it is not as nice as astyle. Whereas astyle lets you format whitespace in the editor, such as aligning comments, assignments, or variable declarations in the consecutive lines and doesn’t disturb the edits, Eclipse’s formatter really reformats everything and doesn’t allow as much manual override. However, it’s nice if Eclipse’s default formatting is somewhat similar to what astyle will use. You can configure Eclipse by selecting Eclipse Window > Preferences > C/C++ > Code Style > Import and import this mvc_style.xml file. You can apply the formatter by selecting text and hitting CTRL-SHFT-F (or CMD-SHFT-F on Mac).
Git is a distributed version control system. If you are not familiar with git, it is recommended that you read the Getting started and Git basics chapters of the Git book. In this section we will cover:
EGit is a plugin for Eclipse that provides Git integration. To setup EGit go to Help -> Install New Software and select the http://download.eclipse.org/egit/updates site from the Work with drop down box. If you don’t see the site listed, click on Available software sites and enable it if it is already on the list (usually the case) or add it if it is missing.
To enable Git integration for a project, right-click on the project and
After you have shared the project through Git, you will see a decoration next to the project name that tells you the repository name and the current branch. You can now execute Git commands using the Team context menu, most typically Team -> Commit, Team -> Pull, and Team -> Switch To.
NVIDIA git server is ssh://git-master:12001. The fcam repository path is 3rdparty/fcam.git. If you want to connect to the server you must log in to http://git-master and add your ssh public key to the server. Once you log in to the server, go to Settings -> SSH Public Keys. Your public key is stored in your $HOME/.ssh/id_rsa.pub file.
To clone a repository that is on a remote server, you execute the git clone command:
git clone ssh://server:port/path/repo.git
You can do the same with the Eclipse Git plugin:
If you use the SSH protocol, you will need to upload your public SSH key to the server. Typically this is done by logging into http://git-master and going to Settings -> SSH Public Keys. To manage you public keys in Eclipse, go to Window -> Preferences -> Network connection -> SSH2, where you will be able to specify your keys store location and generate new keys if necessary. Once you have a key you can upload id_rsa.pub to the remote server.
When you work on a repository that you have cloned from a server, you will be working on a local copy of a remote branch. This local branch is a remote tracking branch. All commits that you make stay local until you push them to the remote server. The push operation will fail if the head of your local remote tracking branch is out of sync with the remote head:
$ git push origin dev/newdocs
To ssh://username@git-master:29481/path/repo.git
! [rejected] branchname -> branchname (non-fast-forward)
error: failed to push some refs to 'ssh://username@git-master:29481/path/repo.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
To bring your tree in sync, you will need to execute a git pull command. To keep a linear history for the branch it is a good idea to adopt a rebase strategy (as opposed to a merge). This means that during pull your local branch will be first updated to the top of the tree and your commits re-applied. This is good because you update your local source tree to the state your team has brought it to:
$ git pull --rebase origin branchname
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 16 (delta 10), reused 11 (delta 5)
Unpacking objects: 100% (16/16), done.
From git://server/path/repo
* branch branchname -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: tutorial: Add git section to sweng.rst
If there are any conflicts you will get a chance to fix them before finishing the rebase. After you finish the rebase you can push your changes to the server.
To summarize, the proposed workflow is:
You can configure your local branch to always rebased on a pull operation. Edit the .git/config file and look for your branch. Then add rebase = true:
[branch "branchname"]
remote = origin
merge = refs/heads/branchname
rebase = true
Sometimes you do frequent local commits at several stages of your work that you would like to push to the remote server as a single commit. This is where the git rebase -i FETCH_HEAD command comes very handy to update your local repository history before pushing your changes:
$git rebase -i FETCH_HEAD
pick c4e3c7b tutorial: Added git section to sweng.rst
pick 3ff25ef tutorial: spacing changes to sweng.rst
# Rebase 33afbde..3ff25ef onto 33afbde
#
# Commands:
# p, pick = use commit
# r, In this case, the proposed workflow becomes: reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
git rebase -i FETCH_HEAD will launch an editor with a list of recent commits that you have made since you last synchronized your source tree with the remote server (i.e. your local commits). For each commit, you can choose to pick it, squash it with the previous one, or delete it. To squash the second commit shown above with the previous one, change pick to squash:
pick c4e3c7b tutorial: Added git section to sweng.rst
squash 3ff25ef tutorial: spacing changes to sweng.rst
Then you will be prompted to create a new commit message for the new commit:
# This is a combination of 2 commits.
# The first commit's message is:
tutorial: Added git section to sweng.rst
# This is the 2nd commit message:
tutorial: spacing changes to sweng.rst
Enter the new message and save the file to proceed with the commit. The proposed workflow then becomes:
If for any reason there is a problem with the rebase and you find your self in a state that doesn’t seem correct, run git status and verify if you are in an unattached head state:
# Not currently on any branch.
If this is the case, your rebase is incomplete. To fix this, abort the rebase and do it again:
$git rebase --abort
Do not use git rebase -i to edit any commit that has already been pushed to the server by you or other team member. Only use git rebase -i FETCH_HEAD to see the local commits that are not yet pushed.
See rewriting history for more details.
Git allows you to define a series of hooks to run at different stages of the Git workflow. One such hook is called the pre-commit hook and can be executed when you invoke the git commit command.
Note
The hooks we cover here are shell scripts that are executed locally, and as such, you must ensure they work on all operating systems the project can be developed on. The EGit plugin for Eclipse doesn’t execute the hooks.
We now show a sample pre-commit hook that invokes Astyle on all files to be committed. Copy the code into .git/hooks/pre-commit to enable it.
#!/bin/sh
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# If you want to allow non-ascii filenames set this variable to true.
allownonascii=$(git config hooks.allownonascii)
# Cross platform projects tend to avoid non-ascii filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
# Note that the use of brackets around a tr range is ok here, (it's
# even required, for portability to Solaris 10's /usr/bin/tr), since
# the square bracket bytes happen to fall in the designated range.
test "$(git diff --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0')"
then
echo "Error: Attempt to add a non-ascii file name."
echo
echo "This can cause problems if you want to work"
echo "with people on other platforms."
echo
echo "To be portable it is advisable to rename the file ..."
echo
echo "If you know what you are doing you can disable this"
echo "check using:"
echo
echo " git config hooks.allownonascii true"
echo
exit 1
fi
version=`astyle --version 2> /dev/null`
if test "x$version" != "x"; then
echo "SDF3 git pre-receive hook:"
echo "Did not find astyle, please install it before continuing."
exit 1
fi
ASTYLE=astyle
case `$ASTYLE --version 2> /dev/null` in
Artistic*)
;;
default)
echo "SDF3 git pre-commit hook:"
echo "Did not find astyle, please install it before continuing."
exit 1
;;
esac
ASTYLE_PARAMETERS="\
--indent=spaces=4 \
--style=allman \
--indent-labels \
--indent-preprocessor \
--indent-col1-comments \
--max-instatement-indent=60 \
--min-conditional-indent=0 \
--pad-oper \
--unpad-paren \
--pad-paren-in \
--break-closing-brackets \
--add-brackets \
--keep-one-line-blocks \
--keep-one-line-statements \
--convert-tabs \
--align-pointer=name \
--align-reference=name \
--suffix=none \
--options=none "
ASTYLE_PARAMETERS_JAVA="\
--indent=spaces=4 \
--style=java \
--indent-labels \
--indent-preprocessor \
--indent-col1-comments \
--max-instatement-indent=60 \
--min-conditional-indent=0 \
--pad-oper \
--unpad-paren \
--pad-paren-in \
--break-closing-brackets \
--add-brackets \
--keep-one-line-blocks \
--keep-one-line-statements \
--convert-tabs \
--align-pointer=name \
--align-reference=name \
--suffix=none \
--options=none "
echo "--Formatting source code--"
files=`git-diff-index --diff-filter=ACMR --name-only -r --cached $against --`
for file in $files; do
x=`echo $file |grep -E '(\.c$|\.cc$|\.h$|\.cpp$|\.hpp$)'`
if test "x$x" != "x"; then
# Save a temp copy of the origin file
cp $file ${file}.orig
$ASTYLE ${ASTYLE_PARAMETERS} $file
git add $file
# If the saved copy and the new file are the same
# delete the temporary copy
if diff $file ${file}.orig >/dev/null ; then
rm ${file}.orig
fi
fi
x=`echo $file |grep -E '(\.java$)'`
if test "x$x" != "x"; then
# Save a temp copy of the origin file
cp $file ${file}.orig
$ASTYLE ${ASTYLE_PARAMETERS_JAVA} $file
git add $file
# If the saved copy and the new file are the same
# delete the temporary copy
if diff $file ${file}.orig >/dev/null ; then
rm ${file}.orig
fi
git add $file
fi
done
echo "--Formatting source code done--"
Documenting the code is important for many reasons: it clarifies your thinking of what the software really does, reminds you later of the same thing, and allows others to use your code. Writing documents separately from your code is error-prone, and quite often the documentation lags behind and gets stale as the code evolves. The solution is to automate as much of the process as possible, and tie the documentation and the program code together. Doxygen is the right tool for this task.
Let’s try using it: install doxygen, go to /tutorials/SimpleImageOpenCV_GL_Complete/jni, and run:
doxygen -g
to generate a default Doxyfile, with default configuration that you can edit, and:
doxygen
which generates the documentation. Then open html/index.html. Click Classes > Engine, and you’ll see the documentation for the Engine class.
The trick is the special syntax of the comment, where the comment starts with /**.
FCam documentation has been created using doxygen. Open fcam4tegra.zip and unzip it; then open modules/fcam/docs/html/index.html to see the documentation.
You can create documentation at many levels. If you open fcam/include/FCam/FCam.h, you see several types of tags. One of them is \mainpage, which produces the main page of FCam documentation. Various types of links are provided, and you can even include bitmap images. Every file can be documented with the \file tag. If you open fcam/include/FCam/Image.h, you see that a comment before the class definition is used to provide an overview of the class, a comment before a method documents the method, and a comment before a member variable documents that. There are keywords that support documenting function arguments and the return values. A detailed manual is provided. Here is an example of documented code, from that manual (you should set JAVADOC_AUTOBRIEF to YES in Doxyfile with this example):
/**
* A test class. A more elaborate class description.
*/
class Test
{
public:
/**
* An enum.
* More detailed enum description.
*/
enum TEnum
{
TVal1, /**< enum value TVal1. */
TVal2, /**< enum value TVal2. */
TVal3 /**< enum value TVal3. */
}
*enumPtr, /**< enum pointer. Details. */
enumVar; /**< enum variable. Details. */
/**
* A constructor.
* A more elaborate description of the constructor.
*/
Test();
/**
* A destructor.
* A more elaborate description of the destructor.
*/
~Test();
/**
* A normal member taking two arguments and returning an integer value.
* @param a an integer argument.
* @param s a constant character pointer.
* @see Test()
* @see ~Test()
* @see testMeToo()
* @see publicVar()
* @return The test results
*/
int testMe( int a, const char *s );
/**
* A pure virtual member.
* @see testMe()
* @param c1 the first argument.
* @param c2 the second argument.
*/
virtual void testMeToo( char c1, char c2 ) = 0;
/**
* A public variable.
* Details.
*/
int publicVar;
/**
* A function variable.
* Details.
*/
int ( *handler )( int a, int b );
};
The output will look like this. Click here for more details.
You can even include LaTeX formulas. Additional information, including quick-start guides, can be found here.
Unit test is one of the most important stages in any devlopment project. Unit test will reduce the number of bugs, the cost of change of the existing code, and even improve the design of the project. Here are good articles that show why writing unit tests is necessary: Top 12 reasons to Write Unit Tests, and Wrong reasons Not to Write Unit Tests
Google’s C++ unit test framework (we will call it as Gtest from now on) provides a variety of testing capabilities for C++ based projects. It supports automatic test discovery, a rich set of assertions, user-defined assertions, death tests, and various options for running the tests. In this tutorial, we show how to use Gtest library in an Android project.
To make use in Android easy for you, we have already built the library, and added the library, header files, and Android.mk in tutorials/UnitTestDriver. You can still download Gtest source code, then build it yourself if needed.
Now let’s start by importing our unit test driver project, tutorials/UnitTestDriver (if you need help, see importing a project into Eclipse).
Then, let’s first look into tutorials/UnitTestDriver/jni/gtest-1.6.0:
[...]
include
libs
[...]
Android.mk
There are other files inside the folder, but the pre-built library for Android, libgtest.a, can be found in gtest-1.6.0/libs/armeabi-v7a/. The paths for the library are defined in gtest-1.6.0/Android.mk as shown below.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gtest
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := ./libs/$(TARGET_ARCH_ABI)/libgtest.a
include $(PREBUILT_STATIC_LIBRARY)
Now, let’s check out if we correctly include gtest.h at the beginning of unittestdriver.h:
#include <gtest/gtest.h>
Then, let’s open and look at unittestdriver.cpp. This file is a driver file that loads and initializes Gtest, and runs the testing code. Because Gtest internally prints out the result streams, the driver function handles the output of the testing streams from Gtest, and prints them out on the display in Android app.
The following code shows the UnitTestDriver::run() function that runs unit test.
void UnitTestDriver::run()
{
char * argv[] =
{ ( char * ) "UnitTestDriver" };
int argc = sizeof( argv ) / sizeof( const char * );
logStream() << "*** Starting Unit Test ***" << std::endl << flush();
// Initialize the testing framework
::testing::InitGoogleTest( &argc, argv );
// Add this class as an event listener
::testing::UnitTest::GetInstance()->listeners().Append( this );
// Run all the tests.
mTestResult = RUN_ALL_TESTS();
}
In the code above, we first set the initial argument with the name of the whole test, then added the current driver class as an event listener to the Gtest class. Finally, we run all the tests by calling RUN_ALL_TESTS() function. By calling this function, Gtest will search all types of unit test (TEST(string, string)) that are shown in any source files inside jni directory.
Now we can write actual tests. In jni folder, we have added unittest.cpp. The following code shows some sample unit tests using Gtest.
#include<gtest/gtest.h>
unsigned int Fibonacci( unsigned int n )
{
if ( n == 1 ) return 1;
if ( n == 0 ) return 0;
return Fibonacci( n - 1 ) + Fibonacci( n - 2 );
}
// Tests Fibonacci of 0, 1
TEST(FibonacciTest, HandlesZeroInput)
{
EXPECT_EQ( 0, Fibonacci(0) );
EXPECT_EQ( 1, Fibonacci(1) );
}
// Tests Fibonacci of numbers greater than 1
TEST(FibonacciTest, HandlesGreaterThan1)
{
EXPECT_EQ( 1, Fibonacci(2) );
EXPECT_EQ( 2, Fibonacci(3) );
EXPECT_EQ( 21, Fibonacci(8) );
EXPECT_EQ( 55, Fibonacci(10) );
}
We first define a testing module as a function, Fibonacci (unsigned int n) at the beginning, and call this module inside each testing function TEST(). In each test function, the first argument refers to the module, and the second one refers to each unit test. Many types of assertion and comparison functions are introduced in GTest basic assertion page.
Next, modify jni/Android.mk as shown below.
[...]
# Driver source files
LOCAL_SRC_FILES := unittestdriver.cpp com_nvidia_unittest_UnitTestDriver.cpp
# Add your test files here
LOCAL_SRC_FILES += unittest.cpp
# GTest required library
LOCAL_STATIC_LIBRARIES := gtest
# Add your additional libraries here
LOCAL_STATIC_LIBRARIES +=
[...]
$(call import-add-path, $(LOCAL_PATH))
$(call import-module, gtest-1.6.0)
Now, let’s build and run the project. The following image shows the result.
The results shows that the tests for Fibonacci function was successful.
Now, you can test your own code by locating the source code at /jni folder. However, in practice, we may want to test existing codes from other projects. In next section, we will show how to construct a code organization to modulize the projects, then we will show that we can directly test the existing codes from each module.
Once you have decided that you want to have unit testing for your projects, you might find yourself tempted to just copy all your sources under the jni folder of the UnitTestDriver project and build your tests. Unfortunately, this approach is not good, you don’t want to have multiple copies of your sources, one for testing, and one for deployment.
A good practice is to put the core modules of your work into libraries. Then, both your final application and your unit-test code link against the same library sharing the same source. We will briefly show one possible way of organizing your code for such purpose. We suggest you set up your source tree as follows:
/
work/
modules/
module1/
Android.mk
include/
src/
module2/
Android.mk
include/
src/
module3/
Android.mk
include/
src/
apps/
app1/
src/
jni/
Android.mk
app2/
src/
jni/
Andorid.mk
unit-tests/
tests-module1/
src/
jni/
Android.mk
tests-module2/
src/
jni/
Android.mk
tests-module3/
src/
jni/
Android.mk
In the hierarchy shown above, we have separated the core functionality from the applications and the testing stubs. The Android makefile system allows us to define modules that can be imported from other modules, as we have done several times through this tutorial. In this section we will take a closer look at how to write the Android.mk files.
First, we will take a look at the Android.mk for module1:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#
# LOCAL_ variables with instructions to build module:
#
LOCAL_MODULE := module1
# Add all .c and .cpp files under ./src
MY_PREFIX := $(LOCAL_PATH)
MY_SOURCES := $(wildcard $(LOCAL_PATH)/src/*.cpp)
MY_SOURCES += $(wildcard $(LOCAL_PATH)/src/*.c)
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=%)
# Define include search path.
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
#
# LOCAL_EXPORT_ variables are appended to the corresponding LOCAL_
# variable of the calling module
#
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(BUILD_STATIC_LIBRARY)
The above make file looks very much like other makefiles we have written. But notice that in addition to defining sources and include paths it also has a LOCAL_EXPORT_C_INCLUDES. The value of this variable is appended to the corresponding local variable of the calling module, so that the calling module doesn’t need to know where the headers are located, for example.
Another module (e.g. module2) can import this module by referring to module1 under the LOCAL_STATIC_LIBRARIES:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#
# LOCAL_ variables with instructions to build module:
#
LOCAL_MODULE := module2
# Add all .c and .cpp files under ./src
MY_PREFIX := $(LOCAL_PATH)
MY_SOURCES := $(wildcard $(LOCAL_PATH)/src/*.cpp)
MY_SOURCES += $(wildcard $(LOCAL_PATH)/src/*.c)
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=%)
# Define include search path.
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES := module1
By extension, any module that imports module2 will need to link against module1. We define this under LOCAL_EXPORT_STATIC_LIBRARIES:
#
# LOCAL_EXPORT_ variables are appended to the corresponding LOCAL_
# variable of the calling module
#
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_STATIC_LIBRARIES := module1
Finally, we have to import module1:
include $(BUILD_STATIC_LIBRARY)
$(call import-module, module1)
It is very important that the $(call import-module, module) statement comes after include $(BUILD_....) to avoid variable conflicts and redefinitions between modules.
The search path for modules is defined by the NDK_MODULE_PATH environment variable. Before you can build a module that has an import you must make sure NDK_MODULE_PATH is set correctly. No spaces are allowed in NDK_MODULE_PATH, use a : as a path separator, and under Windows, use / as the directory separator. For the source hierarchy shown earlier, we would define:
NDK_MODULE_PATH=/work/modules
You can define NDK_MODULE_PATH as an environment variable in your development machine. In addition, you can define it as a build variable in Eclipse, if you would prefer not to pollute your environment. Go to Window > Preferences > C / C++ > Build > Environment and Add a new variable.
Also, you might have noticed that on our modules source trees we don’t have a jni folder. That is correct, and what happens is that $(call import-module, module1) is just telling the system to read $(NDK_MODULE_PATH)/module1/Android.mk. So the module1 in the import call defines a relative path with respect to a path in NDK_MODULE_PATH . The actual module name is defined by the LOCAL_MODULE := module1 inside Android.mk. In our case, both module name and directory name match, but this is not necessary. An Android.mk file could define multiple modules.
Finally, we will take a look at unit-tests/tests-module1/jni/Android.mk; we assume this is a modified version of the UnitTestDriver presented earlier:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tests-module1
# Driver source files
LOCAL_SRC_FILES := unittestdriver.cpp com_nvidia_unittest_UnitTestDriver.cpp
# Add your test files here
LOCAL_SRC_FILES += tests-module1.cpp
# GTest required library
LOCAL_STATIC_LIBRARIES := gtest
# Add your additional libraries here
LOCAL_STATIC_LIBRARIES += module1
# If you add shared libraries, don't forget to
# add a System.loadLibrary() call in UnitTestDriver.java
LOCAL_SHARED_LIBRARIES +=
LOCAL_LDLIBS := -landroid
include $(BUILD_SHARED_LIBRARY)
$(call import-add-path, $(LOCAL_PATH))
$(call import-module, gtest-1.6.0)
$(call import-module, module1)
The shared library that is built using imports gtest-1.6.0 and module1. We could even go further and move gtest-1.6.0 out of the UnitTestDriver/jni folder and into a separate 3rdparty-modules folder and have 3rdparty-modules added to our NDK_MODULE_PATH, try it out!
See also
For more details, see android_ndk_r8c/docs/IMPORT_MODULE.html. Also take a look at android_ndk_r8c/docs/PREBUILTS.html, which shows how to create modules out of pre-built libraries. You can import a module that refers to a pre-built library, as we have done with gtest.
In the above sections, we have shown how to perform unit testing, and to construct an organization of modules. Now we show how to test the modulized codes with our Gtest driver projects. First, let’s look at the organization of tutorials/UnitTestDriver_module folder.
/tutorials/UnitTestDriver_module/
/UnitTestDriver/
jni/
Android.mk
/modules/
OpenCVSupport/
include/
src/
Android.mk
OpenCVSupport2/
include/
src/
Android.mk
There are two folders, UnitTestDriver and modules inside the main folder. The project UniTestDriver is the same driver project used in previous sections. In the module folder, there are two modules called OpenCVSupport and OpenCVSupport2, and we assume that these two modules are existing codes. In this tutorial, the main driver project calls each module, which is built as a seperate static library and runs Gtest for the functions in each module. The modules contain several functions using OpenCV, and we will test the modules by calling functions that detect FAST features in the image lena.jpg (which is already used in the OpenCV tutorial) with fixed parameters. If you did not follow the OpenCV tutorial section and did not upload the image onto your Cardhu, please upload it now to /storage/sdcard0/DCIM.
However, each module also includes an external library such as OpenCV, therefore, we have to set the project so that (1) the driver can acceess the functions in each module, (2) the driver can also use libarary functions that are included in the module (OpenCV), and (3) the build settings in Android.mk for each module should avoid loading the same libraries (i.e., OpenCV in this example).
Let’s first import a unit testing driver projects from the folder in tutorials/UnitTestDriver_module/UnitTestDriver (if you need help, see importing a project into Eclipse). After importing the UnitTestDriver, open the Android.mk file in the /jni folder. Then, let’s specify the static libraries for unit testing. See the following example in Android.mk.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := unittestdriver
# Enable <memory>
LOCAL_CFLAGS += -std=gnu++0x
ifeq (1, $(NDK_DEBUG))
LOCAL_CFLAGS += -DWAIT_FOR_DEBUGGER
endif
# Driver source files
LOCAL_SRC_FILES := unittestdriver.cpp com_nvidia_unittest_UnitTestDriver.cpp
# Add your test files here
LOCAL_SRC_FILES += unittest.cpp opencv_test.cpp
# GTest required library
LOCAL_STATIC_LIBRARIES += gtest
# Add your additional libraries here
LOCAL_STATIC_LIBRARIES += OpenCVSupportLib OpenCVSupportLib2
# If you add shared libraries, don't forget to
# add a System.loadLibrary() call in UnitTestDriver.java
LOCAL_SHARED_LIBRARIES +=
LOCAL_LDLIBS := ./obj/local/armeabi-v7a/libgnustl_static.a -landroid
include $(BUILD_SHARED_LIBRARY)
$(call import-add-path, $(LOCAL_PATH))
$(call import-module, gtest-1.6.0)
# add here
$(call import-module, OpenCVSupport)
$(call import-module, OpenCVSupport2)
In the above example, LOCAL_SRC_FILES specifies a source file where the actual testing codes are located. Here opencv_test.cpp is supposed to call functions in module OpenCVSupport and OpenCVSupport2. The names of the libraries for both modules are then specified in LOCAL_STATAIC_LIBRARIES. At the end of the above code, we have also specified that we import these modules for testing.
Because all sources insisde UnitTestDriver do not recognize the location of modules at this moment, we have to specify the location of them. In Project > Properties > C/C++ Build > Environment, Click Add button, and define NDK_MODULE_PATH with the absolute paths for the module directory.
Now open the opencv_test.cpp which was added to the /jni folder. The following codes are added in the file.
#include<gtest/gtest.h>
#include<OpenCVSupport/OpenCV_native.h>
#include<OpenCVSupport2/OpenCV_native2.h>
TEST(OpenCVTest, FeatureDetection)
{
COpenCVSample pCv;
int i = pCv.FeatureDetecTest();
EXPECT_EQ( 141, i ) <<"number of features for this test1 = " << i;
}
TEST(OpenCVTest, FeatureDetection2)
{
COpenCVSample2 pCv;
int i = pCv.FeatureDetecTest();
EXPECT_EQ( 141, i ) <<"number of features for this test2 = " << i;
}
In the above code, we first include header files for our existing codes (OpenCV_native.h and OpenCV_native2.h) to test. Then two Gtest functions TEST(OpenCVTest, FeatureDetection) and TEST(OpenCVTest2, FeatureDetection2) are calling FeatureDetecTest() functions from both modules (for simplicity, we added the same function to both modules). Now the assertion function EXPECT_EQ(141,i) will print out “success” if the number of detected features in the image is equal to 141.
Now the unit test is ready to test the modules as long as it can access each library for the modules. Let’s look at the settings for both modules now.
The following code shows the settings for Android.mk in the module OpenCVSupport (which is almost identical to OpenCVSupport2).
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifeq ($(OPENCV_MODULES),)
OPENCV_CAMERA_MODULES := on
OPENCV_INSTALL_MODULES := on
OPENCV_LIB_TYPE := STATIC
include $(NVPACK_PATH)/OpenCV-2.4.2-Tegra-sdk/sdk/native/jni/OpenCV-tegra3.mk
OPENCV_LOCAL_STATIC_LIBRARIES := $(LOCAL_STATIC_LIBRARIES)
OPENCV_LOCAL_LD_LIBS := $(LOCAL_LD_LIBS)
endif
LOCAL_MODULE := OpenCVSupportLib
MY_PREFIX := $(LOCAL_PATH)
MY_SOURCES := $(wildcard $(LOCAL_PATH)/src/*.cpp)
MY_SOURCES += $(wildcard $(LOCAL_PATH)/src/*.c)
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=%)
LOCAL_LDLIBS += -lc -lm -llog -landroid -ldl -lGLESv2 -lEGL
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(OPENCV_LOCAL_C_INCLUDES)
# for the module test
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include $(OPENCV_LOCAL_C_INCLUDES)
LOCAL_EXPORT_STATIC_LIBRARIES := $(OPENCV_LOCAL_STATIC_LIBRARIES)
LOCAL_EXPORT_CFLAGS += -std=gnu++0x $(OPENCV_LOCAL_CFLAGS)
LOCAL_EXPORT_LDLIBS += $(OPENCV_LOCAL_LD_LIBS) -lc -lm -llog -landroid -ldl -lGLESv2 -lEGL -lz
include $(BUILD_STATIC_LIBRARY)
In the above settings, we first set the OpenCV library at the begining, to avoid the multiple load of same library (in case when a main application loads several modules that are using OpenCV seperately) by adding the condition, ifeq($(OPENCV_MODULES),). If the OpenCV libarary is not yet loaded, we set some flags used for OpenCV.mk, and specify the paths for the location of OpenCV library. Then, we specify the name of this module (LOCAL_MODULE), and also set the paths for sources and header files.
Finally, we have to specify the exporting set up because this module is built as a static library, and will be used in other applications outside this module. We first specify the paths of the headers in this module, then we also need to pass through the OpenCV library (LOCAL_EXPORT_STATIC_LIBRARIES := $(OPENCV_LOCAL_STATIC_LIBRARIES)) and its supporting libraries to the other applications.
Now we are done with the settings for one module. We can also apply the same set up to OpenCVSupportLib2.
Then, let’s build and run the UnitTestDriver application. After running the application, you will see the SUCESS message from both tests.


These terms of use ("Terms") govern the use of the content and material, which is located at www.mitoo.co and www.football.mitoo.co (the "Website") by Users. Please read these terms and conditions carefully to ensure that you understand and agree to them, as they contain the legal terms and conditions that you are deemed to have agreed to whenever you use the Site. If you do not accept these terms and conditions you should not use this Site.
Definitions:
"We, Us, Our" means Bluefields Inc.
"Content" means any content, personal and other information, data, text, software, music, sound, photographs, graphics, video, emails, messages, or other materials or Profiles submitted or sent by Users to Mitoo or any of their employees or agents, through their Use of the Website.
"Feedback" means all comments, information, feedback and ideas regarding Mitoo or the Website or products or services that you communicate to Mitoo.
"Profile" means the information held by Mitoo about a User or relevant league, such information having been submitted by either (i) the User to whom the information relates, or (ii) another User, permission having been obtained by the submitting User prior to such User's information being made available to other Users.
"Terms" means these terms and conditions set out herein.
"Trademarks" means the trademarks, logos, and service marks displayed on the Website.
"Use" means registering and updating Profiles, looking at the Profiles of other Users, updating league information, contacting other Users, Mitoo or its employees and/or its agents.
"User" means any person who registers their details with the Website and thereby agrees to comply with these Terms.
"Website" means the website www.mitoo.co and www.football.mitoo.co.
These terms and conditions govern your use of our website; by using our website, you accept these terms and conditions in full. If you disagree with these terms and conditions or any part of these terms and conditions, you must not use our website.
You must be at least 13 years of age to use our website. By using our website and by agreeing to these terms and conditions you warrant and represent that you are at least 13 years of age.
We offer you the Content via the Website. By using the Website, you are agreeing to accept and comply with the Terms and you warrant that you have the right, authority and capacity to enter into and be bound by these Terms, which We may update at any time without notice. You should visit this page periodically to review the current Terms of Use. By using this site after we post any changes to these Terms, you agree to accept those changes, whether or not you have reviewed them. If at any time you choose not to accept these Terms, please cease from using the Website. These Terms will remain in full force and effect while you are a User of the Website.
Bluefields Inc will operate the Website with the reasonable skill and care of an online service provider.
We will use reasonable endeavours to maintain the operation of the Website, however it may be necessary to temporarily suspend the Website for operational reasons, including but not limited to repairs, planed maintenance or upgrades. We will use reasonable endeavours to restore the Website as soon as possible after any suspension. We shall not be liable to you for any such suspension.
Unless otherwise stated, we or our licensors own the intellectual property rights in the website and material on the website. Subject to the licence below, all these intellectual property rights are reserved.
The Website is owned and managed by Bluefields Inc. We can be contacted by writing to Bluefields Inc. 353 East Bonneville Avenue, Suite 421, Las Vegas, 89101
or by email at info[at]mitoo[dot]co. We offer you the Content via the Website. By using the Website, you are agreeing to accept and comply with the Terms and you warrant that you have the right, authority and capacity to enter into and be bound by these Terms, which We may update at any time without notice. You should visit this page periodically to review the current Terms of Use.
You must not use our website in any way that causes, or may cause, damage to the website or impairment of the availability or accessibility of the website; or in any way which is unlawful, illegal, fraudulent or harmful, or in connection with any unlawful, illegal, fraudulent or harmful purpose or activity.
You must not use our website to copy, store, host, transmit, send, use, publish or distribute any material which consists of (or is linked to) any spyware, computer virus, Trojan horse, worm, keystroke logger, rootkit or other malicious computer software.
You must not conduct any systematic or automated data collection activities (including without limitation scraping, data mining, data extraction and data harvesting) on or in relation to our website without our express written consent.
You must not use our website to transmit or send unsolicited commercial communications.
You must not use our website for any purposes related to marketing without our express written consent.
By using this site after we post any changes to these Terms, you agree to accept those changes, whether or not you have reviewed them. If at any time you choose not to accept these Terms, please cease from using the Website. These Terms will remain in full force and effect while you are a User of the Website. Bluefields Inc will operate the Website with the reasonable skill and care of an online service provider.
We will use reasonable endeavours to maintain the operation of the Website, however it may be necessary to temporarily suspend the Website for operational reasons, including but not limited to repairs, planned maintenance or upgrades. We will use reasonable endeavours to restore the Website as soon as possible after any suspension. We shall not be liable to you for any such suspension.
Access to certain areas of our website is restricted. We reserve the right to restrict access to [other] areas of our website, or indeed our whole website, at our discretion.
If we provide you with a user ID and password to enable you to access restricted areas of our website or other content or services, you must ensure that that user ID and password is kept confidential.
We may disable your user ID and password in our sole discretion without notice or explanation.
Limited Right to Use The Website is owned and operated by Bluefields Inc. Unless otherwise specified, all Content on the Website is the property of Bluefields Inc and is protected by the copyright laws of the United Kingdom and, throughout the world by the applicable copyright laws. You may view, print and/or download one copy of the Content from the Website on any single computer solely for your personal, informational, non-commercial or general use, provided you keep intact all copyright and other proprietary notices. No Content published by Us on the Website, in whole or in part, may be copied, reproduced, modified, republished, uploaded, posted, transmitted, or distributed in any form or by any means without prior written permission from Bluefields Inc. The use of any such Content on any other website or networked computer environment or for any other purpose, without express permission from Bluefields Inc, is strictly prohibited and such unauthorized use may violate copyright, trademark and other similar laws. Bluefields Inc reserves the right to republish information entered on the Website on other sites belonging to Bluefields Inc including, but not limited to, www.mitoo.co.
In these terms and conditions, "your user content" means material (including without limitation text, images, audio material, video material and audio-visual material) that you submit to our website, for whatever purpose.
You grant to us a worldwide, irrevocable, non-exclusive, royalty-free licence to use, reproduce, adapt, publish, translate and distribute your user content in any existing or future media. You also grant to us the right to sub-license these rights, and the right to bring an action for infringement of these rights.
Your user content must not be illegal or unlawful, must not infringe any third party's legal rights, and must not be capable of giving rise to legal action whether against you or us or a third party (in each case under any applicable law).
You must not submit any user content to the website that is or has ever been the subject of any threatened or actual legal proceedings or other similar complaint.
We reserve the right to edit or remove any material submitted to our website, or stored on our servers, or hosted or published upon our website.
Notwithstanding our rights under these terms and conditions in relation to user content, we do not undertake to monitor the submission of such content to, or the publication of such content on, our website. This provision is intended to disclaim editorial responsibility for user content. This should (it is thought) give you a better chance of gaining the protection of the general defences in Regulations 17-19 of the Ecommerce Regulations and the libel-specific defence in Section 1 of the Defamation Act 1996.
We do not warrant the completeness or accuracy of the information published on this website; nor do we commit to ensuring that the website remains available or that the material on the website is kept up-to-date.
To the maximum extent permitted by applicable law we exclude all representations, warranties and conditions relating to this website and the use of this website (including, without limitation, any warranties implied by law of satisfactory quality, fitness for purpose and/or the use of reasonable care and skill).
Except for any disclosure by you as specified in our Privacy Policy Statement, all communications from you to the Website will be considered non-confidential and non-proprietary. You agree that any and all Feedback will be deemed, at the time of communication to Us, the property of Bluefields Inc, and Bluefields Inc shall be entitled to full rights of ownership, including without limitation, unrestricted right to use or disclose such Feedback in any form, medium or technology now known or later developed, and for any purpose, commercial or otherwise, without compensation to you. You are solely responsible for the content of your communications and their legality under all laws and regulations. You agree not to use the Website to distribute, link to or solicit content that is defamatory, harassing, unlawful, libellous, harmful to minors, threatening, obscene, false, misleading, or infringing a third party's intellectual or privacy rights.
By publishing or displaying any Content on any public area of the Website, you automatically grant, and you represent and warrant that you have the right to grant, to Us an irrevocable, perpetual, non-exclusive, fully paid, worldwide licence to use, copy, perform, display and distribute such Content and to prepare derivative works of, or incorporate into other works, such Content and to grant and authorise sublicenses of such Content. In respect of any such dealings by Us and our sub-licensees, you hereby unconditionally and irrevocably waive any moral rights which you may have in the Content under Part 1, Chapter IV of the Copyright Designs and Patents Act 1988 and any similar or corresponding foreign rights. We urge you to read our (Privacy Policy Statement Link)
You will receive a password and account designation upon completing the registration process directly with Us. You are responsible for maintaining the confidentiality of the password and account, and are fully responsible for all activities that occur under your password or account. You agree to (a) immediately notify Us of any unauthorized use of your password or account or any other breach of security, and (b) ensure that you exit from your account at the end of each session. We cannot and will not be liable for any loss or damage arising from your failure to comply with this section.
You understand that All content, whether publicly posted or privately transmitted, are the sole responsibility of the User submitting such information. The User submitting information is deemed to have all necessary consents of those individuals to whom the information relates. This means that you, and not Us, are entirely responsible for all Content that you upload, post, email, transmit or otherwise make available via the Website. We do not control the Content posted via the Website and, as such; do not guarantee the accuracy, integrity or quality of such Content. You understand that by using the Website, you may be exposed to Content that is offensive, indecent or objectionable. Under no circumstances will We be liable in any way for any Content, including, but not limited to, for any errors or omissions in any Content, or for any loss or damage of any kind incurred as a result of the use of any Content posted, emailed, transmitted or otherwise made available via the website. You agree to not use the Website to:
Upload, post, email or otherwise make available any Content that is unlawful, harmful, threatening, abusive, harassing, tortuous, defamatory, vulgar, obscene, libellous, invasive of another's privacy, hateful, or racially, ethnically or otherwise objectionable;
Upload, post, email or otherwise make available any Content that you do not have a right to make available under any law or under contractual or fiduciary relationships (such as inside information, proprietary and confidential information learned or disclosed as part of employment relationships or under nondisclosure agreements);
Upload, post, email transmit or otherwise make available any Content which is false;
Upload, post, email transmit or otherwise make available any Content that infringes any patent, trademark, trade secret, copyright or other proprietary rights of any party;
Upload, post, email or otherwise make available any unsolicited or unauthorized advertising, promotional materials, "junk mail," "spam," "chain letters," "pyramid schemes," or any other form of solicitation.
Upload, post, email or otherwise make available any material that contains software viruses or any other computer code, files or programs designed to interrupt, destroy or limit the functionality of any computer software or hardware or telecommunications equipment;
Post content that would be harmful to minors in any manner nor to harm minors in any way;
Impersonate any person or entity, including, but not limited to, Bluefields Inc, or falsely state or otherwise misrepresent your affiliation with a person or entity;
Forge headers or otherwise manipulate identifiers in order to disguise the origin of any Content transmitted through the Website;
Create and/or log in with multiple accounts;
Solicit passwords or personally identifying information from other Users for commercial or unlawful purposes; or
Interfere with or disrupt the Website or servers or networks connected to the Service, or disobey any requirements, procedures, policies or regulations of networks connected to the Service; or
Stalk or otherwise harass another.
You acknowledge that we may not pre-screen Content, but that we shall have the right (but not the obligation) in our sole discretion to refuse or move any Content that is available via the Website. Without limiting the foregoing, we shall have the right to remove any Content that violates the Terms or is otherwise objectionable. You agree that you must evaluate, and bear all risks associated with, the use of any Content, including any reliance on the accuracy, completeness, or usefulness of such Content. In this regard, you acknowledge that you may not rely on any Content created by Us or submitted to Us, and in all other parts of the Website.
You acknowledge, consent and agree that We may access, preserve, and disclose your account information and Content if required to do so by law or in a good faith belief that such access preservation or disclosure is reasonably necessary to: (a) comply with legal process; (b) enforce the Terms; (c) respond to claims that any Content violates the rights of third-parties; (d) respond to your requests for customer service; or (e) protect the rights, property, or personal safety of Us, the Users and the public.
You understand that the technical processing and transmission of the Website, including your Content, may involve (a) transmissions over various networks; and (b) changes to conform and adapt to technical requirements of connecting networks or devices.
We reserve the right, without notice and in our sole discretion, to terminate your account and your license to use the Website and to block or prevent future access to and use of the Website. Without limiting the foregoing, and in accordance with the Digital Millennium Copyright Act (DMCA), it is Bluefields Inc's policy to terminate, in appropriate circumstances as determined in our sole discretion, Users or account holders who we determine are repeat infringers. If any provision of these Terms shall be deemed unlawful, void, or for any reason unenforceable, then that provision shall be deemed severable from these Terms and shall not affect the validity and enforceability of any remaining provisions.
Although We are not obligated to do so, We will have the right to review your communications on the Website to determine whether you comply with our Terms. We shall have the right in our sole discretion to edit, refuse to post, or remove any material submitted to or posted on the Website. Without limiting the foregoing, We shall have the right to remove any material that We find to be in violation of the Terms.
Notwithstanding, Users shall remain solely responsible for the content of their messages. Each User acknowledges and agrees that neither We nor any third party content provider shall assume or have any liability for any action or inaction by Us or any third party content provider with respect to any conduct, communication or posting on the Website. We will comply with any court order in disclosing the identity of any person posting communications on the Website. It is advisable that you review our Privacy Policy Statement before posting any such communications. Please note that when you conduct transactions with other companies providing content via the Website, you will also be subject to their privacy policies.
The linked sites are not under Our control and We are not responsible for the content of any linked site or any link contained in a linked site. We reserve the right to terminate any link at any time. We may provide links from the Website to other sites as a convenience to you and in no way should this be interpreted as an endorsement of any company, content or products to which it links. If you decide to access any of the third party sites linked to the Website, you do this entirely at your own risk.
We display affiliate advertisements/links on the Website. Reviews of specific products published on the Website are for informational purposes only.
Some third party sites collect personal information about you and have their own privacy policies regarding the information they collect from you. Before you submit information to them, it is your responsibility to find, read, and understand their privacy policies, as We are not responsible for what those companies do with the personal information you submit to them. It is also your responsibility to discern the accuracy of any advertising claim before submitting your information to any third party site.
The Trademarks are the registered and unregistered trademarks of Bluefields Inc and others. Nothing contained on the Website should be construed as granting, by implication, or otherwise, any license or right to use (by implication, waiver, estoppels or otherwise) any Trademark displayed on the Website without the written permission of Bluefields Inc or such third party that may own the Trademarks displayed on the Website. Your misuse of the Trademarks displayed on the Website, or any other content on the Website, except as provided in these Terms, is strictly prohibited.
Images of people or places displayed on the Website are either the property of, or used with permission by, Bluefields Inc. The use of these images by you, or anyone else authorized by you, is prohibited unless specifically permitted by these Terms or specific permission provided elsewhere on the Website. Any unauthorized use of the images may violate copyright laws, trademark laws, the laws of privacy and publicity, and communications regulations and statutes.
We are committed to protecting (i) the privacy of Users; and (ii) the confidentiality of the information provided to it by Users Using the Website.
Bluefields Inc is the data controller of your data submitted using the Website. Mitoo is registered under the Data Protection Act 1998 (DPA) and comply with the DPA in all our dealings with your personal data.
When using the Website, you hereby consent to Us processing your personal data to the extent necessary to facilitate and enable Us to operate the Website for the purposes for which it is reasonably intended to be operated. We reserve the right to gather information relating to use of the Website. By using the Website you consent to collection and use of this information.
IN NO EVENT SHALL WE OR OUR SUPPLIERS OR ASSOCIATES BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES INCLUDING, WITHOUT LIMITATION, LOST PROFITS OR REVENUES, COSTS OF REPLACEMENT GOODS, LOSS OR DAMAGE TO DATA ARISING OUT OF THE USE OR INABILITY TO USE THE WEBSITE OR ANY LINKED SITE, DAMAGES RESULTING FROM USE OF OR RELIANCE ON THE INFORMATION OR MATERIALS PRESENTED ON THIS WEB SITE, WHETHER BASED ON WARRANTY, CONTRACT, TORT OR ANY OTHER LEGAL THEORY EVEN IF WE OR OUR SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
The limitations and exclusions of liability set out in this Section and elsewhere in these terms and conditions: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the terms and conditions or in relation to the subject matter of the terms and conditions, including liabilities arising in contract, in tort (including negligence) and for breach of statutory duty.
To the extent that the website and the information and services on the website are provided free-of-charge, we will not be liable for any loss or damage of any nature.
We will not be liable to you in respect of any losses arising out of any event or events beyond our reasonable control.
We will not be liable to you in respect of any business losses, including (without limitation) loss of or damage to profits, income, revenue, use, production, anticipated savings, business, contracts, commercial opportunities or goodwill.
We will not be liable to you in respect of any loss or corruption of any data, database or software.
We will not be liable to you in respect of any special, indirect or consequential loss or damage.
Whilst We endeavour to supply accurate information on the Website, We assume no responsibility for accuracy, correctness, timeliness of the Content provided on the Website. You should not assume that the Content on the Website are continuously updated or otherwise contain current information. We are not responsible for supplying content or materials from the Website that has expired or has been removed. The Content provided on the Website is provided "as is" and any warranty (express or implied), condition or other term of any kind, including without limitation, any warranty or merchantability, fitness for a purpose, non-infringement or titles is hereby excluded.
The Content may include facts, views, opinions, advice and recommendations. These views, opinions, advice and recommendations are not endorsed by Us and, to the maximum extent permitted by law, We shall not be liable on account of the accuracy, defamatory nature, completeness, timeliness or otherwise of the information provided on the Website.
We are not responsible for the conduct of Users either online or offline.
The Website may contain errors and, from time to time, may not be accessible by Users. The information provided on the Website by Us is intended as information only and does not constitute advice. Therefore, it must not be relied on to assist in making or refraining from making a decision, or to assist in deciding on a course of action.
Recognising the global nature of the Website and of the World Wide Web, each User agrees to comply with all local rules regarding online conduct and acceptable content. Specifically, each User agrees to comply with all applicable laws regarding the transmittal of technical data exported from the United Kingdom or the country in which such user resides.
You hereby indemnify us and undertake to keep us indemnified against any losses, damages, costs, liabilities and expenses (including without limitation legal expenses and any amounts paid by us to a third party in settlement of a claim or dispute on the advice of our legal advisers) incurred or suffered by us arising out of any breach by you of any provision of these terms and conditions [, or arising out of any claim that you have breached any provision of these terms and conditions].
Without prejudice to our other rights under these terms and conditions, if you breach these terms and conditions in any way, we may take such action as we deem appropriate to deal with the breach, including suspending your access to the website, prohibiting you from accessing the website, blocking computers using your IP address from accessing the website, contacting your internet service provider to request that they block your access to the website and/or bringing court proceedings against you.
We may revise these terms and conditions from time-to-time. Revised terms and conditions will apply to the use of our website from the date of the publication of the revised terms and conditions on our website. Please check this page regularly to ensure you are familiar with the current version.
We may transfer, sub-contract or otherwise deal with our rights and/or obligations under these terms and conditions without notifying you or obtaining your consent.
You may not transfer, sub-contract or otherwise deal with your rights and/or obligations under these terms and conditions.
If a provision of these terms and conditions is determined by any court or other competent authority to be unlawful and/or unenforceable, the other provisions will continue in effect. If any unlawful and/or unenforceable provision would be lawful or enforceable if part of it were deleted, that part will be deemed to be deleted, and the rest of the provision will continue in effect.
These terms and conditions are for the benefit of you and us, and are not intended to benefit any third party or be enforceable by any third party. The exercise of our and your rights in relation to these terms and conditions is not subject to the consent of any third party. This provision is designed to exclude any rights a third party may have under the Contracts Rights of Third Parties Act 1999.
These terms and conditions, together with our privacy policy, constitute the entire agreement between you and us in relation to your use of our website, and supersede all previous agreements in respect of your use of this website.
These terms and conditions will be governed by and construed in accordance with English law, and any disputes relating to these terms and conditions will be subject to the exclusive jurisdiction of the courts of England and Wales.
Bluefields Inc considers the security of youth users of utmost importance. Children between the ages of 13 and 18 We recommend that minors 13 years of age or older ask their parents for permission before sending any information about themselves to anyone over the Internet. Children aged under 13. Bluefields Inc does not knowingly collect or solicit personal information from anyone under the age of 13 or knowingly allow such persons to register. If you are under 13, please do not attempt to register or send any information about yourself to us, including your name, address, telephone number or email address. No one under the age of 13 may provide any personal information to or on Bluefields Inc. In the event that we learn that we have collected personal information from a child under the age of 13 without verification of parental consent, we will delete that information as quickly as possible. If you believe that we might have any information from or about a child under the age of 13, please contact us through the Site Feedback Button at the bottom of the page.
You may print and keep a copy of these Terms, which form the entire agreement between you and Us and supersede any other communications or advertising with respect to the Website.
Failure by Us to enforce these Terms does not constitute a waiver of such right.
We shall not incur any liability to any User on account of any loss or damage resulting from any delay or failure to perform all or any part of these Terms if such delay or failure is caused, in whole or in part, by events, occurrences, or causes beyond Our control. Such events, occurrences or causes will include, without limitation, acts of God, strikes, lockouts, riots, acts of war, earthquakes, fire and explosions.
If you have any questions regarding the Terms, please contact Bluefields Inc. For other general questions, please refer to our Contact Us page.
The full name of our company is Bluefields Inc, a Deleware Company
Our registered address is 353 East Bonneville Avenue, Suite 421, Las Vegas, 89101.
Our Corporate number is: 5212984
You can contact us by email to info[at]mitoo[dot]co.


Before Change
//the chols are diagonal matrices, with the same entries as the diag representation.
self.chol = theano.scan(lambda x : tf.diag(x), self.sqrt.T)[0].swapaxes(0,2)
def test_whiten(self):
with self.k.tf_mode():
After Change
//the chols are diagonal matrices, with the same entries as the diag representation.
self.chol = tf.pack([tf.diag(self.sqrt[:,i]) for i in range(self.num_latent)])
self.chol = tf.transpose(self.chol, perm=[1,2,0])
def test_whiten(self):
with self.k.tf_mode():
Fstar_mean_1, Fstar_var_1 = GPflow.conditionals.gaussian_gp_predict_whitened(self.Xs, self.X, self.k, self.mu, self.sqrt, self.num_latent)


Loading...
Click
HERE
to select a GB BOOT ROM
Click
HERE
to select a GBC BOOT ROM
Click
HERE
to select a ROM
Download Battery File
Upload Battery File


Bad shape
There are submitted but no active, less than 3 active with more than 3 submitted, or a failure rate >= 20%
Underused
Less than three actives, but no submitted waiting.
Good shape
Success rate >= 90%, or more than three actives with a failure rate < 20%.
Nothing special
No active, no submitted, success rate between 80% and 90%.


Hal - Version 2.6.4
What is Hal?
Hal is the deployment system we use to deploy many of our client-facing websites, including MyQL, Rocket Mortgage, QLMS, ORMS, Agent Insight, QuickenLoans.com and more!
Changelog
User Experience (UX) Enhancements
-
Email Notifications now use pretty names for deployments, which uses custom labels if set.
-
Add ability to filter kraken configuration history by environment.
Bugs
-
Enable kraken permission checks.
-
Fix error when deploying kraken as non-admin.
-
Allow leads to edit qks key settings for non prod environments.
-
When selecting an open PR when starting a build, the wrong tab is no longer selected.
Technical
-
Dependencies
The following components MUST go with this release:
- Hal 2.6.4
- Hal Agent 2.4.4
- Hal Core 2.8.1
Need Help?
If you find any bugs or want to request a feature, drop us a line in the hipchat room [Team] Web Core, or send us an email.
JIRA Tasklist
JIRA Release page for Hal 2.6.4
New Feature
- [HAL-237] - Add ability to see the current value of property in all environments.
Improvement
- [HAL-250] - Add ability to filter configuration history by environment
Bug
- [HAL-285] - Enable kraken permissions
- [HAL-286] - Fix bug preventing creation of sensitive properties in schema
- [HAL-287] - Fix error when deploying kraken as non admin
- [HAL-288] - Allow leads to edit QKS key for non prod environments
- [HAL-290] - Fix lead middleware always denying leads
- [HAL-292] - Start Build - closed PR tab selected when an open PR is selected
Task
- [HAL-293] - Update email template to include deployment name


The mdcIconButton directive creates a material designed icon buttons and toggle buttons.
mdcIconButton


Hi Everyone!
Special note for MacOS and Linux Users, the tfdl_env.yml file may give you this error:
Or something similar. If that is the case, I have created alternate environment files (.yml files) .
Link to alternate .yml file for MacOS Users:
https://www.dropbox.com/s/hoy95cr69z898no/mac_tfdl_env.yml?dl=0
Link to alternate .yml file for Linux Users:
https://www.dropbox.com/s/k4i3gmo0bvss7g7/linux_tfdl_env.yml?dl=0
Note: You don't need to sign up for dropbox, just click the "No Thanks, continue to view" button at the bottom, then go to the top right and click download. (I would have uploaded this direct to udemy, but .yml files aren't allowed).
Once you've downloaded that .yml file, just use it instead of the .yml file mentioned in the installation and setup lecture.
Alternative Option is to just download the few necessary libraries manually once you have Anaconda:
Step 1: Create an Environment
At the command line run:
conda create -n tfdeeplearning python=3.5
Step 2: Install the libraries as you need them (there are only 6 you need to do). At the command line (with you environment activated) run the following:
conda install jupyter conda install numpy conda install pandas conda install scikit-learn conda install matplotlib pip install --upgrade tensorflow
If you encounter any other issues, please post to the QA forums and we'll help you out!
Thanks!
Jose and Pierian Data Inc. Team


#1. Get server IP.
You can get IP from Random Beacon config.toml, "AnnouncedAddresses" section.
Also you can get primary IP from server:
curl ifconfig.co
If you haven't curl, just install it.
Debian/Ubuntu:
sudo apt-get install curl
MacOs:
brew install curl
#2. Get server port.
Random Beacon node.
Open config.toml, find "AnnouncedAddresses" section. After that find "/tcp/" and copy port number.
ECDSA node.
Open config.toml, find "[LibP2P]" section, then find "Port".
You can check both nodes: first Random Beacon, then ECDSA.
If you have only ipv6 address, it should also be verified.


Hello,
I am trying to do a very simple thing : using the very basic options of emontx V2 to fork a kWh pulse counter.
So starting very simple, just blinking the led for instance. I have assembled what I think are the basics for the atmega328 and ftdi programmer to work, I must have forgotten something. Picture is attached.
The only thing I get when trying to load code is :
"Problem uploading the code.
avrdude: stk500_recv(): programmer is not responding"
I have tried replacing atmega328 with a working one : didn't work.
I have tried uploading my blink sketch to a fully assembled emontx : did work.
Thanks you in advance for taking a look at the case. Suggestions welcome.
Léo
Re: Minimalistic emontx
Hi
The FTDI connector pin 2 is not connected on emontx v2 and you have no 5v to 3.3v components fitted.
You need to either fit the VCC components or create a temporary link from FTDI p2 to VCC to power the AVR. (assuming you are using a stock programmer with 3.3v out on p2)
Paul
Re: Minimalistic emontx
Hi Paul,
Thanks a lot for your quick and sharp answer.
I have tried both the options you suggested, they work.
Thanks again, regards,
léo


{% extends "Home/header.html" %} {% block content %} {% include "Home/includes/active2_bt.html" %} {% include "Home/includes/active3_IdeaWall.html" %} {{ post.title }} Posted on {{ post.date }} {{ post.body|safe|linebreaks}} {% endblock %}


BLOGIFY
Sign Out
This is supposed to be bio section but this functionality doesn't work yet.
Total posts : Not counting yet


HOME
TEST
PROFILE
ABOUT US
CONTACT
LOGOUT
e-mail<EMAIL_ADDRESS>Current Test Analysis
Last 10 Test Analysis


jiebaR is a package for Chinese text segmentation, keyword extraction and speech tagging. This package provides the data files required by jiebaR.
| Version: | 0.1 |
| Suggests: | jiebaR |
| Published: | 2015-01-04 |
| Author: | Qin Wenfeng |
| Maintainer: | Qin Wenfeng <mail at qinwenfeng.com> |
| BugReports: | https://github.com/qinwf/jiebaRD/issues |
| License: | MIT + file LICENSE |
| URL: | https://github.com/qinwf/jiebaRD/ |
| NeedsCompilation: | no |
| Materials: | README |
| CRAN checks: | jiebaRD results |
| Reference manual: | jiebaRD.pdf |
| Package source: | jiebaRD_0.1.tar.gz |
| Windows binaries: | r-devel: jiebaRD_0.1.zip, r-release: jiebaRD_0.1.zip, r-oldrel: jiebaRD_0.1.zip |
| OS X binaries: | r-release: jiebaRD_0.1.tgz, r-oldrel: jiebaRD_0.1.tgz |
| Reverse depends: | jiebaR |
Please use the canonical form https://CRAN.R-project.org/package=jiebaRD to link to this page.


Notebooks
Story: |xam names
|xam names
Title
|xam names
Collection
Summary
Names of various Bushmen and Bushman women, with information regarding them. Partly in Bushman by and partly in English after /han≠kass’o (L VIII.-1. 6078-6081, 4. 6370 rev., note, 11. 6969 rev., note 14. 7278 and 7277 rev., 20. 7749 and 7750, 7750 rev., 7748 rev. and 7749 rev., 27. 8437, 8435 rev. and 8436 rev., 31. 8744 rev., 8772 rev., 32. 8808 rev.). For example, p.7277v tells of a man who became paralysed and lost the use of an arm while carrying a springbok.
Comments
1) Date on p.7277v: 8 August, 2) This story is found in Book VIII-14
Contributors
|han≠kass'o (Klein Jantje) (VIII)
Date
8 August 1878 (given on or about)
Categories
Keywords
names (of |xam) , names (of groups of |xam) , |xam (names of groups) , |xam ('Flat Bushmen') , personal history (of different |xam) , personal history (names of |xam)
Story Pages
7277v & 7278


|
CivilOctave
|
Functions | |
| def | funSaog (soilType, timePrd) |
Variables | |
| tuple | _sage_const_2 = Integer(2) |
| tuple | A = Stiffness_matrix*Mass.inverse() |
| tuple | A_h = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | B = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| list | b = _sage_const_1+B[i,j] |
| tuple | color = hue(_sage_const_0p4 + _sage_const_0p6 *(i/_sage_const_10 )) |
| tuple | Design_lateral_force = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | e = (_sage_const_1 -B[i,j]**_sage_const_2 ) |
| tuple | Force = zero_vector(RR,Number_of_storeys) |
| tuple | Graph = plot([]) |
| tuple | J = zero_vector(RR,Number_of_storeys) |
| list | l = Peak_shear_force[:,i] |
| tuple | Lateral_force = zero_vector(RR,Number_of_storeys) |
| tuple | Level_floor = zero_vector(RR,Number_of_storeys) |
| list | m = X[j,:] |
| tuple | mid = q*Mass*q.transpose() |
| tuple | Modal_contribution = list() |
| tuple | Modal_mass = list() |
| tuple | Modal_participation_factor = list() |
| Modes_considered = Number_of_modes_to_be_considered | |
| tuple | Omega = zero_vector(RR,Number_of_storeys) |
| tuple | Omega_square = A.eigenvalues() |
| tuple | P = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | p = list() |
| list | P1 = P1+Mass[i] |
| list | P2 = P2+Mass[i] |
| tuple | Peak_shear_force = zero_matrix(RR,Number_of_storeys, Number_of_storeys) |
| tuple | q = Stiffness_matrix-(w**_sage_const_2 ) |
| list | r = Omega[j] |
| tuple | Sa_by_g = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | Stiffness_matrix = zero_matrix(QQ,Number_of_storeys,Number_of_storeys) |
| tuple | Storey_shear_force = zero_vector(RR,Number_of_storeys) |
| tuple | Storey_shear_force2 = zero_vector(RR,Number_of_storeys) |
| sum_modal_mass = _sage_const_0 | |
| tuple | Time_period = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | Time_periods = list() |
| string | Type_of_soil = '' |
| tuple | w = var('w') |
| tuple | X = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
| tuple | XX = X.transpose() |
| tuple | z = A.eigenvectors_left() |
| def main.funSaog | ( | soilType, | |
| timePrd | |||
| ) |
function to pick values according to type of soil selected ...
Definition at line 10 of file main.sage.py.
| tuple main._sage_const_2 = Integer(2) |
Definition at line 3 of file main.sage.py.
| tuple main.A = Stiffness_matrix*Mass.inverse() |
Definition at line 73 of file main.sage.py.
| tuple main.A_h = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 131 of file main.sage.py.
| tuple main.B = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 173 of file main.sage.py.
Definition at line 183 of file main.sage.py.
| tuple main.color = hue(_sage_const_0p4 + _sage_const_0p6 *(i/_sage_const_10 )) |
Definition at line 204 of file main.sage.py.
| tuple main.Design_lateral_force = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 142 of file main.sage.py.
| tuple main.e = (_sage_const_1 -B[i,j]**_sage_const_2 ) |
Definition at line 185 of file main.sage.py.
| tuple main.Force = zero_vector(RR,Number_of_storeys) |
Definition at line 191 of file main.sage.py.
| list main.Graph = plot([]) |
Definition at line 209 of file main.sage.py.
| tuple main.J = zero_vector(RR,Number_of_storeys) |
Definition at line 91 of file main.sage.py.
| list main.l = Peak_shear_force[:,i] |
Definition at line 189 of file main.sage.py.
| tuple main.Lateral_force = zero_vector(RR,Number_of_storeys) |
Definition at line 187 of file main.sage.py.
| tuple main.Level_floor = zero_vector(RR,Number_of_storeys) |
Definition at line 51 of file main.sage.py.
Definition at line 112 of file main.sage.py.
| tuple main.mid = q*Mass*q.transpose() |
Definition at line 95 of file main.sage.py.
| tuple main.Modal_contribution = list() |
Definition at line 121 of file main.sage.py.
| tuple main.Modal_mass = list() |
Definition at line 108 of file main.sage.py.
| tuple main.Modal_participation_factor = list() |
Definition at line 107 of file main.sage.py.
| main.Modes_considered = Number_of_modes_to_be_considered |
Definition at line 164 of file main.sage.py.
| tuple main.Omega = zero_vector(RR,Number_of_storeys) |
Definition at line 77 of file main.sage.py.
| tuple main.Omega_square = A.eigenvalues() |
Definition at line 74 of file main.sage.py.
| tuple main.P = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 172 of file main.sage.py.
| tuple main.p = list() |
Definition at line 199 of file main.sage.py.
| list main.P1 = P1+Mass[i] |
Definition at line 114 of file main.sage.py.
| list main.P2 = P2+Mass[i] |
Definition at line 115 of file main.sage.py.
| tuple main.Peak_shear_force = zero_matrix(RR,Number_of_storeys, Number_of_storeys) |
Definition at line 151 of file main.sage.py.
| tuple main.q = Stiffness_matrix-(w**_sage_const_2 ) |
Definition at line 72 of file main.sage.py.
Definition at line 177 of file main.sage.py.
| tuple main.Sa_by_g = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 130 of file main.sage.py.
| tuple main.Stiffness_matrix = zero_matrix(QQ,Number_of_storeys,Number_of_storeys) |
Definition at line 59 of file main.sage.py.
| tuple main.Storey_shear_force = zero_vector(RR,Number_of_storeys) |
Definition at line 161 of file main.sage.py.
| tuple main.Storey_shear_force2 = zero_vector(RR,Number_of_storeys) |
Definition at line 162 of file main.sage.py.
| list main.sum_modal_mass = _sage_const_0 |
Definition at line 109 of file main.sage.py.
| tuple main.Time_period = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 78 of file main.sage.py.
| tuple main.Time_periods = list() |
Definition at line 83 of file main.sage.py.
| string main.Type_of_soil = '' |
Definition at line 127 of file main.sage.py.
| tuple main.w = var('w') |
Definition at line 71 of file main.sage.py.
| tuple main.X = zero_matrix(RR,Number_of_storeys,Number_of_storeys) |
Definition at line 92 of file main.sage.py.
| tuple main.XX = X.transpose() |
Definition at line 119 of file main.sage.py.
| tuple main.z = A.eigenvectors_left() |
Definition at line 90 of file main.sage.py.


Chat Online
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.
Chat on Messenger
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.
Send Text Messages
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean.
Features
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts.
Easily accessible, No Hassle
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
Multiple Platforms
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
Developers Ready
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia
Good Language Processing
Far far away, behind the word mountains, far from the countries Vokalia and Consonantia


The highs and lows of the last decade for Jeff Bezos, from becoming the world's richest man to a high-profile divorce
by Mary Meisenzahl- Amazon founder and CEO Jeff Bezos has covered a lot of ground in the past decade.
- He became the richest man in the world, and a style icon for tech founders.
- Bezos also went through a public divorce, ending a 25 year marriage and starting a new relationship.
- Visit Business Insider’s homepage for more stories.
Amazon CEO Jeff Bezos has had a pretty big decade.
He saw Amazon turn 25, became the richest man in the world, and even became a meme; he introduced the world to Alexa and bought Whole Foods. But he also weathered an attempt at blackmail and a high-profile divorce.
As the decade draws to a close, let’s take a look back at what Jeff Bezos has been up to in the 2010s.
In 2010, Amazon launched Amazon Studios as something of a crowd-sourced, anti-Hollywood-studio.
Amazon Studios will acquire movies or series, or produce original ones. In the last few years, it’s made shows like “The Marvellous Mrs. Maisel” and movies like “Manchester by the Sea.”
Source: Seattle Business Magazine,Amazon
That year, Bezos and his wife, MacKenzie Bezos, attended “billionaires’ summer camp” at Sun Valley together. At this point, he was worth $US12.6 billion.
Source: Forbes
At some point in the early aughts, Bezos started shaving his head, but he hadn’t yet committed to the bald look — which is now key to his iconic style — at this November 2012 appearance on the Today Show.
In this photo from 2013, Bezos’ head seems to be recently shaved. We don’t really see him with hair again after this point.
In 2013, Bezos bought The Washington Post for $US250 million, which amounted to less than 1% of his net worth.
Source: Forbes
2014 was Amazon’s first, and so far last, attempt at releasing a smartphone. The Fire Phone flopped, but by this point, Bezos was worth $US30.5 billion.
Source: CNN
Amazon also bought streaming service Twitch that same year, which has launched popular streamers like Ninja.
Source: CNN
The company released the first generation Echo in 2014, one of the first mainstream smart speakers, and made “Alexa” a household phenomenon.
Source: TechCrunch
Amazon opened its first physical store in Seattle, and celebrated its 20th anniversary in 2015.
Bezos spent $US65 million on a private jet that seats eight in 2015.
Source: Yucatan Times
In 2016, Bezos used his personal jet to bring a detained Washington Post report home from Germany.
Source: Business Insider
In July 2017, Bezos became world’s richest person, surpassing Bill Gates. They switched back and forth briefly before Bezos retook the top spot, which he has mostly held onto ever since.
Source: Business Insider
The same year, Bezos’ space company Blue Origin unveiled a rocket designed to take tourists to space, called New Shepard.
Source: Forbes
2017 was also the year that Bezos’ transformation from tech nerd to buff, stylish dad became a meme.
Source: Business Insider
In August 2017, Amazon bought Whole Foods for $US13.7 billion.
Source: CNN
That same year, he also joined Instagram.
Source: Instagram
By 2018, The New York Times called Bezos a style icon, describing him as a “muscled-up, black-polo-shirt-and-shades digi-stud.”
Source: The New York Times
Bezos and MacKenzie Bezos also made one of their last public appearances together at the Vanity Fair Oscar Party in 2018.
Source: Forbes
In January 2019, the couple announced they were divorcing after 25 years of marriage.
Source: Business Insider
A day later, the National Enquirer published details about Bezos and his new girlfriend, Lauren Sanchez.
Source: Forbes
Shortly after, Bezos published a Medium post titled “No thank you, Mr. Pecker” that accused AMI, the publisher of the National Enquirer, of trying to extort him over naked photos.
Bezos said the publication was threatening to release naked photos it had obtained of him unless he stopped investigating the source of other leaks to the tabloid.
Bezos wrote, “Rather than capitulate to extortion and blackmail, I’ve decided to publish exactly what they sent me, despite the personal cost and embarrassment they threaten.”

Source: Forbes
These days, Bezos’ most recent net worth hovers around $US110 billion. He’s reportedly thinking about his next big purchase, and he’s said to be eyeing the Seattle Seahawks. Bezos also reportedly encouraged former New York City mayor Michael Bloomberg to jump into the presidential race. Meanwhile, Bezos’ girlfriend, Lauren Sanchez, is in the process of finalising her divorce.
Source: Business Insider, Business Insider,Page Six,Business Insider


Quick Photo Editor Tool for Quick Editing
No file uploaded, yet!
Crop
LightBulb
Eyedropper
Icicles
Undo
Redo
Delete
#quickphotoEditor


| Figure 1 |
Huemul distribution and sample points. Current huemul distri ... |
| Figure 2 |
MaxEnt estimated huemul distribution. Huemul habitat current ... |
| Figure 3 |
MaxEnt outcomes, current suitable habitat distribution and t ... |
| Figure 4 |
Binary map overlap with protected areas of Chile and Argenti ... |
| Figure 5 |
Total area estimated for each model and for protected areas. ... |


* CSS is the language that styles everything you see in your browser. If you’re really good, you can draw very real things, just with code
today’s Very Short List:
tech 3 Jun 2013
Karyn Campbell is a writer, designer, and investor at Collaborative Fund. She also edits VSL.
WEBSITE
Subscribe
* OK, so you’ve mastered realism. You can even use CSS to make a little game of pong
* Let’s face it. Using CSS to draw takes mad knowledge and most of us don’t know how. So, just itchaskitch
http://link.nyobserver.com/516ca68465217dc6e1b9a3a6110y9.ikv/T3zMZfEd5b0q8huqDb180 very short list is a
delightful e-mail that shares
cultural gems from a
different curator every day.
If you have any problems reading this e-mail, click here
http://link.nyobserver.com/516ca68465217dc6e1b9a3a6110y9.ikv/T3zMZfEd5b0q8huqE30c4
Subscribe
Forward
My Account
Unsubscribe
food 31 May 2013
The Canadian Food Scene is on the up and up.
culture 29 May 2013
The best in internet interview websites.
food 24 May 2013
Small-Batch Bourbon Sweets
Editorial Policy
Privacy Policy
Contact Us
Press
Terms + Conditions
very fine print: ©2013
Observer VSL LLC.
321 West 44th Street, 6th Floor
New York, NY 10036 USA
All rights reserved.
Questions?<PHONE_NUMBER>.
This message was intended for<EMAIL_ADDRESS>If you believe this has been sent to you in error, please safely unsubscribe


All Classes
AminoAcid
Fasta
Feature
FeatureI
FeatureList
Gff
Location
LocIterator
Log
Nucleotide
Nucleotide.Type
SeqBig
SeqFast
SeqI
SeqStranded


DIPHENHYDRAMINE HYDROCHLORIDE - diphenhydramine hydrochloride solution
Aurohealth LLC
Disclaimer: Most OTC drugs are not reviewed and approved by FDA, however they may be marketed if they comply with applicable regulations and policies. FDA has not evaluated whether this product complies.
Do not use
If pregnant or breast feeding, ask a health professional before use
In case of overdose, get medical help or contact a Poison Control Center (1-800-222-1222) right away.
|
Age (yr) |
Dose (mL) |
| Adult and children 12 years and older |
10 mL to 20 mL |
| Children under 12 years |
Consult a doctor |
Attention: use only enclosed dosing cup specifically designed for use with this product. Do not use any other dosing device.
anhydrous citric acid, flavor, high fructose corn syrup, poloxamer 407, purified water, sodium benzoate, sodium chloride, sodium citrate, sucralose
Questions or Comments?
1-855-274-4122
Distributed by:
Aurohealth LLC.
2572 Brunswick Pike,
Lawrenceville, NJ 08648
AUROHEALTH
NDC 58602-027-24
MAXIMUM STRENGTH
Dye-Free Adult
ALLERGY
LIQUID MEDICATION
DIPHENHYDRAMINE HYDROCHLORIDE
50 mg/20 mL ORAL SOLUTION
ANTIHISTAMINE
Relieves
Dye-Free
Grape
Flavor
Dye-Free &
Alcohol Free
4 FL OZ
(118 mL)
|
DIPHENHYDRAMINE HYDROCHLORIDE
diphenhydramine hydrochloride solution | ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
|
| Labeler - Aurohealth LLC (078728447) |
| Establishment | |||
| Name | Address | ID/FEI | Business Operations |
|---|---|---|---|
| Aurohealth LLC | 078728447 | MANUFACTURE(58602-027) |


6:00 pm
Visual Regression Testing with StoryBook using Chromatic
Arun Kumar Kumaraswamy
Quality Analyst, ThoughtWorks
My Motivation: Geek night is my favourite event, thats why presenting here
7:00 pm
Bayesian Techniques in Stats and ML
Jeremy Jackson
An application developer with 2+ years of experience and a keen interest in Data Science and Engineering.
My Motivation: Geek night is awesome


What is for dinner, Darling?
Request form
Please list your favorite cusines (separate them by comma)
Push the button to find out your current location
Location
How far are you looking? (in miles)
Let me see what I can find for you
Submit
Don't want restaurant food?
Search for Recipes
Click Here
Restaurant search results
List of restaurants based on your cuisine preference
Receipies search results
Great! Let's cook at home! It's better and safer this way.
Any preference with dishes or cocktails?
Please choose your favorite cuisines(multiple choice)
African
American
British
Cajun
Caribbean
Chinese
Eastern European
European
French
German
Greek
Indian
Irish
Italian
Japanese
Jewish
Korean
Latin American
Mediterranean
Mexican
Middle Eastern
Nordic
Southern
Spanish
Thai
Vietnamese
Dish Type
don know
main course
side dish
dessert
appetizer
salad
bread
breakfast
soup
beverage
sauce
marinade
fingerfood
snack
drink
Diet
Allergies
Dairy
Egg
Gluten
Grain
Peanut
Seafood
Sesame
Shellfish
Soy
Sulfite
Tree Nut
Wheat
Exclude Ingredients
Skip first n records (0..900)
Return number of results (1..100)
Let me see what I can find for you
Submit
Clear
Do not show Youtube videos
List of receipies
how-to videos list
Hmmm. I do not get it.
×
Submit
×
Scroll to Top


The brilliant student was always compliant in class, but at home, she was sometimes defiant of her parents' rules. [G|D]
The deviant behavior of the teenager was a departure from the invariant norms of the community, but her luxuriant hair and style made her stand out in a crowd. [G|D]
The pliant young sapling bent in the wind, but its radiant green leaves and sturdy trunk made it reliant in the face of the storm. [G|D]
The valiant knight rode forth to face the fire-breathing dragon, a fearsome supergiant among the smaller, more common variants of the mythical beast. [G|D]


These are the official spoilers for version 1.7 of Martin's Dungeon Bash. They provide a guide to the behaviours of various parts of the game in a more human-readable form than the source code.


Invoice
Invoice number
12345
Date
March 31, 2018
Description
Price
Quantity
Subtotal
Website design
€34.20
100
€3,420.00
Website development
€45.50
100
€4,550.00
Website integration
€25.75
100
€2,575.00
Due by
Account number
Total due
May 10, 2018
132 456 789 012
€10,545.00


We sell interfaces!
- innovate virtual niches
- engineer next-generation channels
- incentivize seamless solutions
- redefine innovative solutions
- visualize customized portals
- productize magnetic paradigms
- enhance mission-critical deliverables
- deliver granular paradigms
- benchmark customized infrastructures
- facilitate collaborative deliverables
- innovate scalable metrics
- mesh revolutionary applications
- benchmark user-centric methodologies
- drive 24/7 web-readiness
- grow robust mindshare


SEARCH
Cuisine
None
African
Chinese
Japanese
Korean
Vietnamese
Type
None
Main Course
Side Dish
Dessert
Appetizer
Breakfast
Diet
None
Vegan
Vegetarian
Pescetarian
Lacto Vegetarian
Ovo Vegetarian


| Desert survival training was part of the regular program of what-ifs. If any flight had ended with an emergency landing in a desert, sun-protective dress and tents could have been fashioned from spacecraft parachutes. The astronauts were taught the best tricks for survival in the desert. Left to right, seated: Borman, Lovell, Young, Conrad, McDivitt, White. Standing: training officer Zedehar, Stafford, Slayton, Armstrong, and See. |
| Saying a few words to a sea of friendly faces was the lot of the Apollo 11 astronauts, whose world tour aboard Air Force One took them to a dizzying 24 countries in 45 days. |
| Children of Kinshasa dance a special welcome for the men from the Moon. Tact, diplomacy, an iron constitution, and a knack for public speaking were what the astronauts needed on tours. |


vignettes/B_run-script-demo.Rmd
B_run-script-demo.Rmd
library(NMFSReports)
# library(ggplot2)
First, run NMFSReports::buildReport()
to produce our basic report outline. It should produce something like this:
library(NMFSReports)
# Input variables for buildReport()
sections = c("frontmatter", "abstract", "introduction", "methods", "results",
"discussion", "endmatter")
authors = "Me, Myself, and I"
title = "Awesome Report!"
styles_reference_pptx = "refppt_nmfs"
styles_reference_docx = "refdoc_noaa_tech_memo"
bibliography.bib = "bib_example"
csl = "bulletin-of-marine-science"
# Run buildReport() function
buildReport(
sections = sections,
support_scripts = support_scripts,
authors = authors,
title = title,
styles_reference_pptx = styles_reference_pptx,
styles_reference_docx = styles_reference_docx,
bibliography.bib = bibliography.bib,
csl = csl
)
We’ll navigate to the spine of this report, the run.R
file, in the code folder. This is where we run all of our files (.R, .Rmd, etc.) from.
source("./code/run.R")
#' ---
#' title: ''
#' author: ''
#' purpose: Run Scripts and R Markdown Files
#' start date: 2021-03-03
#' date modified: 2021-03-03 # CHANGE
#' Notes: # CHANGE
#' ---
######START#######
######***KNOWNS#########
report_title <- 'Awesome Report!'
report_authors <- 'Me, Myself, and I'
report_yr <- substr(x = Sys.Date(), start = 1, stop = 4) # CHANGE
report_office_location <- " > [Office Location]" # CHANGE
# For example:
# "National Oceanic and Atmospheric Administration\n
# 1315 East-West Highway [bldg./room]\n
# Silver Spring, MD 20910"\n
report_office <- "" # For example: AFSC, NEFSC # CHANGE
report_num <- "###" # CHANGE
report_NOAA_leaders <- "U.S. Department of Commerce
Wynn Coggins, Acting Secretary
National Oceanic and Atmospheric Administration
Benjamin Friedman, Acting NOAA Administrator
National Marine Fisheries Service
Paul Doremus, Acting Assistant Administrator for Fisheries"
#######***WHAT KIND OF OUTPUT#######
#Is this for InDesign?
indesign_flowin <- FALSE
#######SOURCE SUPPORT SCRIPTS#############
dir_in <- getwd()
source('./code/directories.R' )
source('./code/functions.R' )
source('./code/dataDL.R' )
source('./code/data.R' )
#######SAVE PACKAGES USED TO CREATE THIS REPORT#############
# renv::init()
# renv::snapshot()
######MAKE REPORT########
cnt_chapt <- "000" # Keep everything in a proper order
figure_list <- c() # This will help us by saving R-ready plots so we can easily go back and edit them if necessary.
table_list <- c() # This will help us by saving R-ready tables so we can easily go back and edit them if necessary.
cnt_figures <- 0 # This will autoname your figures with consecutive numbers (e.g., Figure 1.)
cnt_tables <- 0 # This will autoname your tables with consecutive numbers (e.g., Table 1.)
cnt_equ <- 0
####### RUN EACH SECTION#############
############# 0 - Example ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_example_")
rmarkdown::render(paste0(dir_code, "/0_example.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 1 - Frontmatter ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_frontmatter_")
rmarkdown::render(paste0(dir_code, "/1_frontmatter.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 2 - Abstract ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_abstract_")
rmarkdown::render(paste0(dir_code, "/2_abstract.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 3 - Introduction ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_introduction_")
rmarkdown::render(paste0(dir_code, "/3_introduction.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 4 - Methods ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_methods_")
rmarkdown::render(paste0(dir_code, "/4_methods.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 5 - Results ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_results_")
rmarkdown::render(paste0(dir_code, "/5_results.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 6 - Discussion ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_discussion_")
rmarkdown::render(paste0(dir_code, "/6_discussion.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 7 - Endmatter ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_endmatter_")
rmarkdown::render(paste0(dir_code, "/7_endmatter.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".docx"))
############# 8 - Presentation ####################
cnt_chapt<-auto_counter(cnt_chapt)
cnt_chapt_content<-"001"
filename0<-paste0(cnt_chapt, "_presentation_")
rmarkdown::render(paste0(dir_code, "/8_presentation.Rmd"),
output_dir = dir_out_chapters,
output_file = paste0(filename0, cnt_chapt_content, ".pptx"))
##### SAVE OTHER OUTPUTS#############
save(figure_list,
file=paste0(dir_out_figures, "/report_plots.rdata"))
save(table_list,
file=paste0(dir_out_tables, "/report_tables.rdata"))
########***MAKE MASTER DOCX################
#USE GUIDENCE FROM THIS LINK
#https://support.microsoft.com/en-us/help/2665750/how-to-merge-multiple-word-documents-into-one
###############***METADATA##################
# So we can
# 1. Go back and recreate this exactly with the libraries you used to create this script and
# 2. Cite the apropriate versions of the packages you used in your report
# More info here: https://rstudio.github.io/packrat/walkthrough.html
create_metadata(dir_out = paste0(dir_out_todaysrun, "/documentation"),
title = paste0(report_title, " Metadata ", Sys.Date()))
# setwd(paste0(dir_out_todaysrun))
When we run the above run.R
file (completely unaltered/fresh from NMFSReports::buildReport()), it produces the below content in our ./output/[YYY-MM-DD]/
folder.

To make sure we nice and neatly compartmentalize our work, the below supporting .R scripts are going to be created and will source into the ‘run’ file:
*note a ‘run’ file is automatically created. Think of this as the spine of your document.
functions: Where we will save all report-specific functions.
directories: Where we will systematically create and save objects describing all of our directories. I’ve found that it can be helpful to have these as objects to cut down on verboseness.
dataDL: Where we will download the data (e.g., from Oracle or an API). You may only want to run this every so often or regularly, up to you.
data: Where we will load that data kept locally that was either downloaded in “dataDL” or created locally.
Now that you have your initial run, you can start to modify and add to the structure with content specific to your project. Here are a few things to change: