Nix tutorial
Written by GRICAD calcultable of content
- Introduction
- Using Nix packages manager
- Nix basics
- Package development
- How to add a package to nixpkgs
- Nix for HPC (multiuser mode)
- Authors
Introduction
Introduction of this tutorial is currently in French, as the following PDF presentation:
Using Nix packages manager
In this first section, you will learn:
- how to install nix on your laptop,
- how to setup properly your working environment to use nix profiles,
- and obviously how to remove nix properly and completely.
Prerequisites
- Linux (64bits) / Mac OS
- Be a sudoer or have root access.
- Bash, curl installed
If this prerequisites are not fullfilled or if you don’t want to install nix on your system, you may try to run this tutorial inside a docker container. Try the following link, wich provides a Dockerfile and some directives :
Install Nix (single user mode)
Source : http://nixos.org/nix/manual/#chap-installation
In a terminal, run :
bash <(curl https://nixos.org/nix/install)
From this point, you should see something like this :
bash <(curl https://nixos.org/nix/install)
[...]
performing a single-user installation of Nix...
copying Nix to /nix/store...............................
initialising Nix database...
creating /home/<your_login>/.nix-profile
installing ‘nix-1.11.9’
building path(s) ‘/nix/store/7dv1lghxz40rbvv9ffg7fq2as972a4r7-user-environment’
created 6 symlinks in user environment
downloading Nix expressions from ‘https://d3g5gsiof5omrk.cloudfront.net/nixpkgs/nixpkgs-17.09pre106045.7369fd0b51/nixexprs.tar.xz’...
downloading ‘https://d3g5gsiof5omrk.cloudfront.net/nixpkgs/nixpkgs-17.09pre106045.7369fd0b51/nixexprs.tar.xz’... [6977/8550 KiB, 3474.3 KiB/s]
unpacking channels...
created 2 symlinks in user environment
Installation finished! To ensure that the necessary environment
variables are set, either log in again, or type
. /home/<your_login>/.nix-profile/etc/profile.d/nix.sh
in your shell.
The Nix package manager is now installed on your system and ready to be used.
The installation process only populates the directory /nix
and creates a symbolic link ~/.nix-profile
in your home directory.
Check their contents and try
ls -al ~/.nix-profile
ls -al /nix
Remark : If you don’t have sudo installed or if you’re not a sudoer, before installing nix, run as root :
mkdir -m 0755 /nix && chown <your_login> /nix
Uninstall Nix
Nix does not spread out all over your system, so you can easily uninstall it completely by doing:
sudo rm -rf /nix
rm -rf ~/.nix-*
Working with profiles : create several user environments
At this stage, nix is properly installed on your system, but some extra configuration is required, especially to activate the “profiles” feature.
As explained in the introduction of this tutorial, a profile is some kind of user-defined environment, where you’ll be able to ‘install’ and use a specific set of your choice of libraries, tools, binaries …
Consider for instance, the three profiles defined in the table below:
| profiles | installed packages |
|---|---|
| “my soft based on intel compilers” : | intel-devel 2015, mysoft-release-intel |
| “my soft based on gnu compilers” :’ | gcc-wrapper-6.3.0, mysoft-release-gnu |
| “my soft, debug mode, based on gnu compilers’ : | gcc-wrapper-6.3.0, mysoft-debug-gnu, valgrind |
In that case, assuming you have defined these profiles, you can switch easily between three different setups of the same software (mysoft), without any interference between them. Notice that each user can have as many profiles as he wants.
To activate this profile feature, we need to copy and update the nix.sh file provided by the installer:
cp /nix/var/nix/profiles/default/etc/profile.d/nix.sh ~/nix.sh
echo "export PATH=/nix/var/nix/profiles/default/bin:\$PATH" >> ~/nix.sh
echo "export NIX_USER_PROFILE_DIR=/nix/var/nix/profiles/per-user/\$USER " >> ~/nix.sh
# If you are under MACOS, also add:
echo "export NIX_SSL_CERT_FILE=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt" >> ~/nix.sh
Notice the environment variable NIX_USER_PROFILE_DIR that will be used later to define profiles. Under NiXOS or on some properly installed multi-user sites, this variable might be already set properly during install.
Finally, load nix environment:
source ~/nix.sh
You can safely add this line into the initialization script of your shell (for example ~/.bashrc
).
The installation and configuration process is over and you’re ready to use nix.
Your current profile is defined by the the .nix-profile symbolic link in your home directory. Nix automaticaly creates your first “default” profile : it’s a symbolic link pointing to /nix/var/nix/profiles/default.
ls -l ~/.nix-profile
lrwxr-xr-x 1 <your_login> staff 29 15 nov 2016 .nix-profile -> /nix/var/nix/profiles/default
To create a new profile, use nix-env command (remind that NIX_USER_PROFILE_DIR has been set to /nix/var/nix/profiles/per-user/
nix-env --switch-profile $NIX_USER_PROFILE_DIR/tuto-jdev
and check:
ls -l ~/.nix-profile
lrwxr-xr-x ... .nix-profile -> /nix/var/nix/profiles/per-user/<your-login>/tuto-jdev
Note: For the moment, this link may point to a non-existent directory as you don’t have installed any package yet. The profile directory will be created at the first installation of a package, you’ll see that in the next few lines of this tutorial!
You can now work with differents profiles and switch between them and have as many profiles as you want. That way, you can have many environments. Once you’ll be familiar to Nix, you’ll see that you’ll switch to a new profile each time you’re starting something new! And you will miss this on other systems ;-)
Summary
- Always create one (or more) profile(s), to organise properly your different environments
- What is my current profile?
ls -al ~/.nix-profile
- Create/switch between profiles?
nix-env --switch-profile $NIX_USER_PROFILE_DIR/some_name
- What are my available profiles?
ls -al $NIX_USER_PROFILE_DIR
Nix basics
In this section, you will learn …
- how to install, remove, update a package,
- how to list and find packages,
- how to check, rollback your profile.
At this point it’s important to understand the underlying mechanisms of nix for libraries installation and management. Nix is made to allow different users to have different configurations and to switch between them but with one and only one place where everything is installed : /nix.
One of the main benefits of using nix is that any user (understand non-root) is allowed to “install” packages in /nix. These packages will be available in the user environment through some trees of symlink between /nix and ~/.nix-profile and ready to be used by any other user.
Moreover, thanks to profiles, a single user can easily switch between different configurations.
Let us start using Nix with our new “tuto-jdev” profile. Make sure you’re using the right profile :
nix-env --switch-profile $NIX_USER_PROFILE_DIR/tuto-jdev
From that point, every new installed package will be available under this profile. The operation above just updates the link between ~/.nix-profile and some directories in /nix
Once again, check your profile and the linked directory:
ls -altr ~/.nix-profile
Search, install, remove a package with nix
Most of nix operations are carried out using nix-env
command.
To install a package, use nix-env -i <somename>
. For instance:
~$ nix-env -i hello
installing ‘hello-2.10’
...
And the ‘hello’ binary is now available in your path:
~$ hello
Hello, world!
~$ which hello
/home/<your_login>/.nix-profile/bin/hello
Sounds as if ‘hello’ has been installed in your home directory. But if you try
ls -altr ~/.nix-profile/bin
you will get something like
.nix-profile/bin -> /nix/store/3dlqv87hrrfjynj0brbn4h71g4g4g89z-hello-2.10/bin
Indeed, depending on what has been previously done on your system, the ```nix-env -i`` command will either download the corresponding package, install it in /nix/store and finally create the required links in your profile (.nix-profile/ …) or just create the links, if the package is already in /nix/store (previous install by you or another user).
It means that hello binary is installed “system wide”, in /nix/store, although you’re not root, which is one of the very interesting features of nix : you do not depend on some administrator to install and setup your working environment.
To remove a package, once again call nix-env
with ‘erase’ option:
nix-env -e hello
uninstalling ‘hello-2.10’
hello has disappear from your path:
hello
-bash: hello: command not found
and from your profile
ls -altr ~/.nix-profile/bin
ls: .nix-profile/bin: No such file or directory
But hello is still present in /nix/store:
ls /nix/store/*hello*
/nix/store/bh26bk4rcqlxja3chgn6a3jv7yiqshg4-hello-2.10:
bin share
And if you reinstall it, no download or install occurs, it only creates symbolic links in your .nix-profile. Try install and check output:
~$ nix-env -i hello
installing ‘hello-2.10’
...
Well, hello package is very interesting but you’re likely to search for a specific package, say for instance boost.
A complete list of all available packages, in the nix store, is returned by the command
nix-env -qaP
... **very long list**
Note: qaP : q as query, a as available and P as preserve-installed
A smarter usage of this command combined it with a grep to target a specific program or library:
nix-env -qaP | grep boost
nixpkgs.boost155 boost-1.55.0
nixpkgs.boost159 boost-1.59.0
nixpkgs.boost160 boost-1.60.0
nixpkgs.python27Packages.boost boost-1.62.0
nixpkgs.python36Packages.boost boost-1.62.0
nixpkgs.boost boost-1.62.0
nixpkgs.boost163 boost-1.63.0
nixpkgs.boost-build boost-build-2.0-m12
nixpkgs.boost_process boost-process-0.5
nixpkgs.pianobooster pianobooster-0.6.4b
nixpkgs.python27Packages.xgboost python2.7-xgboost-0.60
nixpkgs.python36Packages.xgboost python3.6-xgboost-0.60
nixpkgs.xgboost xgboost-0.60
Ok, now you’re able to choose the boost version that fits you. Notice on the right column, the complete name of the package and on the left column, the attributes of the package (channel and components name between dots).
As explained in the introduction a channel is no more than a “snapshot” of the nixpkgs reference repository.
The components attribute is important since it allows you to distinguish different configurations of the same library. Here for example, you can choose between different versions of boost (1.55, 1.59 …) or between different configurations of the same version of boost (1.62 with or without python and with python 2 or python 3 bindings).
Notice also that different packages (different by their attributes) may have the same name (e.g. boost-1.62.0).
==> a good pratice : always use install with complete attributes list to avoid confusion and unexpected behavior.
Choose one version and try to install it by calling nix-env -i
followed by the name of the package. For instance:
nix-env -i boost-1.60.0
Try also an explicit call, with attributes:
nix-env -iA nixpkgs.boost160
Check the consequences of these installations in ~/.nix-profile:
ls -ld ~/.nix-profile/lib
.nix-profile/lib -> /nix/store/h4c1bmm3qk0vifhs3xd5p6c8apciv1gq-boost-1.60.0/lib
Let us install another library, to populate a bit more our profile:
nix-env -iA nixpkgs.openblas
Now, check again your profile:
ls -ld ~/.nix-profile/lib
.nix-profile/lib
Since only one package with a lib path was installed, the lib directory in your profile was just a link to the same directory in boost package from nix store. But now that we have another package having a lib directory too, lib in your profile becomes a real directory, where nix created a bunch of symbolic links to the shared libraries in nix store:
ls -altr ~/.nix-profile/lib/libboost_atomic.*
.nix-profile/lib/libboost_atomic.so -> /nix/store/h4c1bmm3qk0vifhs3xd5p6c8apciv1gq-boost-1.60.0/lib/libboost_atomic.so
ls -altr ~/.nix-profile/lib/libopenblas.*
.nix-profile/lib/libopenblas.so -> /nix/store/jxm1c9ks0bkfzkv40jwgwv4yxg0paxkq-openblas-0.2.19/lib/libopenblas.so
Take a look at the dependencies :
ldd ~/.nix-profile/lib/libboost_atomic.so
# or if you use MAC OS:
otool -L ~/.nix-profile/lib/libboost_atomic.dylib
linux-vdso.so.1 (0x00007fff2c9cd000)
librt.so.1 => /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/librt.so.1 (0x00007f2fe05b7000)
libstdc++.so.6 => /nix/store/xfrkm34sk0a13ha9bpki61l2k5g1v8dh-gcc-5.4.0-lib/lib/libstdc++.so.6 (0x00007f2fe023f000)
libm.so.6 => /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/libm.so.6 (0x00007f2fdff2c000)
libgcc_s.so.1 => /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/libgcc_s.so.1 (0x00007f2fdfd16000)
libpthread.so.0 => /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/libpthread.so.0 (0x00007f2fdfaf6000)
libc.so.6 => /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25/lib/libc.so.6 (0x00007f2fdf757000)
/lib64/ld-linux-x86-64.so.2 (0x0000560272cb0000)
- libraries for boost, blas, and the hello binary are now available in your local (profile) environment
- this environment (.nix-profile) contains only symbolic links
- everything has been installed in /nix
List installed packages
To list installed packages in your current profile type :
nix-env -qs
Profile rollback and generations
Each time you perform a Nix operation in your profile, it creates a new generation of it. This concept of generation in profiles allows you to rollback to any previous state:
first check the entire profile history (called “links generations”) :
nix-env --list-generations
and then switch either to the previous step in profile or step to a chosen state:
Back to previous step:
~$ nix-env -q
boost-1.60.0
hello-2.10
openblas-0.2.19
~$ nix-env --rollback
switching from generation 5 to 4
~$ nix-env -q
boost-1.60.0
hello-2.10
As you can see, the last package we installed is no more here.
Back to a chosen step (assuming 3 is an existing stage in your list-generations)
nix-env --switch-generation 3
Update packages
The following command will update the named package and all its dependencies :
nix-env -uA the_package_you-re_searching_for
And if the new version of the package does not work, you can allways do a “–rollback”!
Channel and NIX_PATH
To understand the channel concept, it might be useful to understand how the NIX_PATH environment variable is used. Take a look at it:
echo $NIX_PATH
nixpkgs=/home/<your_login>/.nix-defexpr/channels/nixpkgs
In your default environment, it contains only one channel definition, the nixpkgs one. It gives a PATH that is actualy a link to the store:
readlink ~/.nix-defexpr/channels/nixpkgs
/nix/store/civk55fs0p07kjnvgjqfdvgws2qvxyq2-nixpkgs-17.09pre109811.ce88027294/nixpkgs
And this is where the channel currently used lives (remember: nix-env -iA nixpkgs.boost160). In this directory, you can find all the files (called expressions, we’ll see that later) with the code of the packages of the Nixpkgs distribution, and the code of the builtin tools (builders, patching tools, …). For example, let’s search for the code of the hello package:
find ~/.nix-defexpr/channels/nixpkgs/ -name hello
A file is particularily interesting to look at: all-packages.nix
. It’s the file where the default attributes of the packages are defined (what you put just after nix-env -iA). For example:
grep hello ~/.nix-defexpr/channels/nixpkgs/pkgs/top-level/all-packages.nix
This is not necessary to go further at this point, but remember that any time you wonder what is made inside a package, or how packages are called, you can take a look at this directory.
By the way, notice that the name of the directory can be used to check the version of the nixpkgs channel you are using. In our example it is 17.09pre109811 (/nix/store/civk55fs0p07kjnvgjqfdvgws2qvxyq2-nixpkgs-17.09pre109811.ce88027294/nixpkgs)
Summary
- Search for packages with
nix-env -qaP |grep ...
- Install packages with
nix-env -i <package_name>
ornix-env -iA <attribute>
- List installed packages with
nix-env -q
- Remove packages with
nix-env -e <package>
Rollback or jump to a specific version of your profile with
nix-env --rollback
ornix-env --switch-generation <id>
Package development
In this section, you will learn:
- What is a Nix expression and a Nix derivation
- How to create a local package
- How to debug a package and how the native builder works
Under a Nix environment, creating a package is often the best way to install an application. You should not be afraid about that, it is very easy and satisfying. How many times have you installed a software, locally on your home, and when it’s been done, you can’t remember how you did? If you do this directly by creating a Nix package, you can’t forget as everything will be described. Your application is built inside an isolated environment, with no dependency with the system. Furthermore, you can pass your package to a colleague, or to the Nix community!
Your first Nix expression: a basic ‘‘hello’’ package
A package is built from a nix “expression”. Nix expressions describe the actions to build packages (getting the sources, patching, compiling, installing…).
Here is a sample expression for a basic packaging of the ‘‘hello’’ program:
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
inherit stdenv fetchurl perl;
version = "2.1.1";
in
{
hello = stdenv.mkDerivation rec {
name = "hello-${version}";
buildInputs = [ perl ];
hardeningDisable = [ "format" ];
src = fetchurl {
url = "ftp://ftp.nluug.nl/pub/gnu/hello/${name}.tar.gz";
sha256 = "c510e3ad0200517e3a14534e494b37dc0770efd733fc35ce2f445dd49c96a7d5";
};
};
}
We can see 3 main blocks:
- In the first block, we basically tell that we are going to import
the whole ‘nixpkgs’ set of builtin functions and packages that are
available into your Nix environment. This is where the
$NIX_PATH
environment variable seen earlier makes sense. - In the next block, we are setting up attributes that will be available inside the third block
- The last block consists of the actual creation of the package: the derivation. A derivation is the name given by Nix to create something from other stuff. The builtin function .mkDerivation, provided by stdenv, is used to create a package starting from attributes which are key/value pairs.
Some attributes are required (like name). A lot of others are optional. It is the case of builder for example, that is not present in this example as we will use the builtin standard builder. The builder is the part of the packaging that creates the executables, typically “configure, make, make install”. The buildInputs attribute defines a list describing all the other packages required as a dependency for the build. In this example, we need “perl” during the build, so the “perl” package will be available into the build environment during the creation of this hello package.
Finally, the src attribute defines the sources of our program to build. It makes use here of the fetchurl builtin function provided by stdenv to get the sources from a url and check the integrity with a provided hash.
Let’s build our package!
Create a test directory and put the nix expression in a hello.nix file:
$ mkdir test
$ cd test
$ vi hello.nix
Then build the package:
$ nix-build hello.nix
The first time you start such a build, you should normally see Nix downloading packages that are required for this operation. Then, the sources of the hello program are fetched, then built. A post-installation script is automatically started to eventually fix the runpath (RPATH) of the binaries and libraries, and fix the interpreter paths of every scripts to ensure that every dependency will be resolved from the /nix store.
Note: nix-build provides a convenient --keep-failed, -K
option to keep the temporary build directory in case things goes wrong,
so you can inspect the logs if any. But we’ll see later another
powerful tool to debug failures…
A new link ‘‘result’’ has been created into the current directory. The destination of the link is the directory of the created package into the store.
$ ls -al result/bin/
total 16
dr-xr-xr-x 2 tuto tuto 19 janv. 1 1970 .
dr-xr-xr-x 4 tuto tuto 30 janv. 1 1970 ..
-r-xr-xr-x 1 tuto tuto 13552 janv. 1 1970 hello
$ ./result/bin/hello
Bonjour, le monde!
Installing the package is simple as:
$ nix-env -i ./result
installing ‘hello-2.1.1’
building path(s) ‘/nix/store/dqv9d96xmimb7xq4wj1jm3j7w4i9ik49-user-environment’
created 500 symlinks in user environment
$ hello --version
hello - GNU hello 2.1.1
What about trying to build again the same package?
rm result
nix-build ./hello.nix
Well, as we changed nothing into the source code, the hash of our
compiled expression is the same. So, Nix does nothing! It has just
re-created the ./result
link to
the corresponding package into the store. It means that if another user
creates the same package as you just did, no re-build is trigged and the
binaries will be efficiently shared!
Debugging with nix-shell
It’s easy when all goes well… but how to deal things when the build process does not work as expected?
Let’s introduce a bug into our expression. Simply comment the line with the buildInputs attribute, to remove the needed dependency with perl:
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
inherit stdenv fetchurl perl;
version = "2.1.1";
in
{
hello = stdenv.mkDerivation rec {
name = "hello-${version}";
# buildInputs = [ perl ];
hardeningDisable = [ "format" ];
src = fetchurl {
url = "ftp://ftp.nluug.nl/pub/gnu/hello/${name}.tar.gz";
sha256 = "c510e3ad0200517e3a14534e494b37dc0770efd733fc35ce2f445dd49c96a7d5";
};
};
}
Then, re-build the package:
nix-build ./hello.nix
Now, it should fail with:
[...]
make[2]: Entering directory '/tmp/nix-build-hello-2.1.1.drv-0/hello-2.1.1/man'
help2man --name="Friendly Greeting Program" ../src/hello >hello.1
/nix/store/wb34dgkpmnssjkq7yj4qbjqxpnapq0lw-bash-4.4-p12/bin/bash: help2man: command not found
make[2]: *** [Makefile:282: hello.1] Error 127
make[2]: Leaving directory '/tmp/nix-build-hello-2.1.1.drv-0/hello-2.1.1/man'
make[1]: *** [Makefile:175: all-recursive] Error 1
make[1]: Leaving directory '/tmp/nix-build-hello-2.1.1.drv-0/hello-2.1.1'
make: *** [Makefile:131: all] Error 2
builder for ‘/nix/store/zsp5846wm86p3fb408knmpa9nfl8k8lr-hello-2.1.1.drv’ failed with exit code 2
error: build of ‘/nix/store/zsp5846wm86p3fb408knmpa9nfl8k8lr-hello-2.1.1.drv’ failed
Ok, then, we need to go deeper into the build process to see exactly where it fails. The built-in builder defines several phases executed in a specific order: unpackPhase patchPhase configurePhase buildPhase checkPhase installPhase fixupPhase. Actually, there are more phases, allowing you more control of what is done before each main phase, but let’s keep it simple ;-). Those phases are defined as bash functions into the shell executed when you start nix-build. And guess what, you can go into this shell! It’s called nix-shell and it creates a completely isolated environment, with all the variables configured depending on the attributes you have put into your derivation.
Let’s try it:
nix-shell --pure ./hello.nix
[nix-shell:~/test]$
From that point, let’s check some interesting things.
[nix-shell:~/test]$ echo $out
OK, you’ve got a variable defining the path of the store where your
package will be installed!  Yes, this path contains directories of packages needed to build something, like for example a GCC compiler.
[nix-shell:~/test]$ unpackPhase
This magically get the source code and unpack it into your current directory!
[nix-shell:~/test]$ cd $sourceRoot
[nix-shell:~/test/hello-2.1.1]$ patchPhase
[nix-shell:~/test/hello-2.1.1]$ configurePhase
Got it? We are executing, phase by phase, the builtin builder.
Note: For cmake fans, don’t worry: if you put cmake into your buildInputs dependencies, the builder provides a cmakeConfigurePhase and cmakeBuildPhase to start the appropriate build process, and of course, you can provide a cmakeFlags attribute
And this is where things get wrong:
[nix-shell:~/test/hello-2.1.1]$ buildPhase
If you take a look into the man
directory, you’ll see the help2man
script starting with a call to perl
which is why we had perl as a buildInput dependency. But actually, here the error is that help2man
is not found. I suppose that this script is used as a fallback when no help2man
command is provided by the system. It might be cleaner to provide help2man instead of a full perl dependency.
So, let’s add the nix help2man
package as a dependency to check if it may work.
First, clean and exit from the nix-shell
[nix-shell:~/test/hello-2.1.1]$ cd ..
[nix-shell:~/test]$ rm -rf hello-2.1.1/
[nix-shell:~/test]$ exit
Then, comment out the line you commented earlier, and replace perl by help2man:
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
inherit stdenv fetchurl help2man;
version = "2.1.1";
in
{
hello = stdenv.mkDerivation rec {
name = "hello-${version}";
buildInputs = [ help2man ];
hardeningDisable = [ "format" ];
src = fetchurl {
url = "ftp://ftp.nluug.nl/pub/gnu/hello/${name}.tar.gz";
sha256 = "c510e3ad0200517e3a14534e494b37dc0770efd733fc35ce2f445dd49c96a7d5";
};
};
}
Then build!
nix-build ./hello.nix
Summary
- a package is made by writting a nix expression into a file
- stdenv.mkDerivation is a powerful function used to create a new package with a lot of possible attributes. See the Writing Nix Expressions part of the Nix documentation for more informations
- use
nix-build
to build your package- use
nix-shell
to enter into the environment of your package, check, debug and build manually
How to add a package to nixpkgs
In the previous section, you learned how to create what we call (here at the Gricad team) a local package. That’s a package that is based on the available nixpkgs distribution of your system Nix installation. We will now see how, with very minor differences, a such package could be integrated into the official nixpkgs repository.
Get a local copy of the nixpkgs tree
We’ve seen earlier that the packages are described into files located in a directory pointed by the current channel. You can directly get the content of the latest version of this directory by cloning the nixpkgs git repository of NixOS:
$ git clone git://github.com/NixOS/nixpkgs.git
Initialized empty Git repository in /home/rochf/nixpkgs/.git/
If this takes too long, you can directly copy your current channel:
# Alternative solution for this tutorial, preventing git overload...
cp -a ~/.nix-defexpr/channels/nixpkgs/ .
find . -type d -exec chmod 755 {} \;
Then, go to the nixpkgs directory :
$ cd nixpkgs
If you have cloned the Nixos/nixpkgs repository, you should go into a stable branch:
$ git checkout release-17.03
Find a good place for your package and write a nix expression
You can take a look at the existing Nix expressions in the pkgs/
subtree to see how packages are made. A good start-point is the pkgs/top-level/all-packages
which contains the default calls to all the packages.
For example, if your package is a library, you will probably place it under pkgs/development/libraries
while a monitoring service will be placed under pkgs/servers/monitoring
. Let’s say your package is called “mylib”, then you would create a new pkgs/development/libraries/mylib
directory.
The nix expression of a package is generally put inside a file called default.nix
, so pkgs/development/libraries/mylib/default.nix
in our example.
Copying the default.nix file of another library and modify it to adapt to your own library, is often a good start.
Once your expression is created, you have to add at least a line into the pkgs/top-level/all-packages.nix
file to define the call to your package.
For your first package, you may also have to add a line to the lib/maintainers.nix
file to add your name and e-mail address. You may also have to check the list of available licenses into the lib/licenses.nix
file.
The Nixpkgs Contributors Guide is the reference you should read to know more about writing Nix packages.
Example: the “oned” package derivation
Oned is a program which solves the Poisson equation using Jacobi method.
The code is available at https://www.pdc.kth.se/education/tutorials/mpi/hybrid-lab/oned.c
Let’s consider the following expression:
{ stdenv, fetchurl, openmpi }:
stdenv.mkDerivation rec {
name = "oned";
src = fetchurl {
url = "https://www.pdc.kth.se/education/tutorials/mpi/hybrid-lab/oned.c";
sha256 = "<HASH_HERE>";
};
buildInputs = [ openmpi ];
builder = builtins.toFile "builder.sh"
"
source $stdenv/setup
mpicc -w -o oned.exe $src
mkdir $out
mkdir $out/bin
cp oned.exe $out/bin
";
meta = {
description = "JDEV 2017 Nix tutoriel";
license = stdenv.lib.licenses.gpl2;
platforms = stdenv.lib.platforms.unix;
};
}
A good place for this expression, seems to be : pkgs/application/science/physics
$ mkdir pkgs/applications/science/physics/oned
$ emacs pkgs/applications/science/physics/oned/default.nix
First of all, you’ll need to compute the SHA-256 hash of your source
file, to be sure that your package will always be built from this unique
source file. The package built process will put this source file into
the NIX store, before actualy building the package. So, to avoid
downloading twice, let’s use the convenient nix-prefetch-url
command that does the download operation and the hash calculation, both at the same time:
$ nix-prefetch-url https://www.pdc.kth.se/education/tutorials/mpi/hybrid-lab/oned.c
downloading ‘https://www.pdc.kth.se/education/tutorials/mpi/hybrid-lab/oned.c’... [0/0 KiB, 0.0 KiB/s]
path is ‘/nix/store/iw1xyii9wqb1ly5w95ni7rlwsv4q2pp5-oned.c’
1585yzy1gkg3bxfg19mh3ag1x7yik2h3lg5kz705d3jk9dhjg03b
Or, in case you have already downloaded the source code, use the sha256sum
command:
sha256sum oned.c
Place this hash into the expression, in place of <HASH_HERE>
.
Regarding the expression, an important attribute is buildInputs
that defines a set of Nix packages dependencies for package build. You may also use propagatebuildInputs
for the dependencies that also need to be present at runtime.
In this example, we have provided our own build script into a
“builder” block, because configure and Makefile are not provided. The
builder starts with source $stdenv/setup
to setup the environment and process the buidInputs.
This also set up the $out
variable that gives the location of the package under the Nix store.
Generally, the last part of the expression contains a list of meta attributes. Meta attributes contain informations about the package, such a description, license, the reference of the maintainer,…. Check the documentation of meta attributes for more information.
Once your expression is written, you have to declare the package in the list of packages :
emacs ~/nixpkgs/pkgs/top-level/all-packages.nix
Add the following line (in the SCIENCE zone, with respect of the alphabetical order) :
oned = callPackage ../applications/science/physics/oned { };
Another derivation for oned
Here is another example for the same programm, but this time with
sources including a standard building process (configure, make, make
install) provided as a github repository, using the useful fetchgit
function. So, this time, we do not provide any custom builder, but use the generic one of stdenv.
{ stdenv, fetchgit, openmpi }:
stdenv.mkDerivation {
name = "oned";
src = fetchgit {
url = "https://github.com/pbeys/tuto.git";
rev = "0628826361cecebe8767307e417077b5ac279381";
sha256 = "1zw0d0jv98bxk9zhkp22f478hc1c3m8dij329lw014283anyq9p3";
fetchSubmodules = true;
};
buildInputs = [ openmpi ];
meta = {
description = "JDEV Nix tutoriel";
license = stdenv.lib.licenses.gpl2;
platforms = stdenv.lib.platforms.unix;
};
}
Building and installing the Package
The build process is started with the nix-build command:
$ nix-build -A oned
This nix-build -A
command uses the attribute path oned
(that you defined into the all-packages.nix
file), to find the derivation and build the package with some eventual options.
As seen earlier with the hello package, the built package is located in the store, in the subdirectory pointed by the ./result
link.
You can check that all the dynamically loaded libraries are inside the /nix/store directory:
$ ldd ./result/bin/oned.exe
Test the executable :
$ oned.exe
bash: oned.exe : command not found
The oned program is not available. Your environment path is not yet ready, you have to “install” the package.
$ nix-env -f . -iA oned
Now we can test the oned program:
$ oned.exe 200
Then a MPI run : We need a mpi environment to be installed:
$ nix-env -i openmpi
$ mpirun -np 2 oned.exe 200
Adding your package in the nixpkgs main repository
Read the Submitting changes part of the Nixpkgs Contributors Guide. Basically, you have now to create a pull request to have it reviewed and merged into the master branch of the nixpkgs repository. Of course, the previous work has to be made into a local branch of your nixpkgs clone.
Summary
In this section, we created another package, this time by including it into a local copy of the nixpkgs distribution. We learned how to import files into the store and getting the corresponding hash with the useful command
nix-prefetch-url
. Further reading of the Nixpkgs contributors guide is necessary to learn more in details how to submit your changes.
Apendix: Tips
Contributing
The CONTRIBUTING.md file contains guidelines for contributing.
More with nix-shell
nix-shell
can also be used to enter into the environment of one or several existing packages, without even installing them, for example:
nix-shell -p python27 -p python27Packages.numpy
opens a shell in an isolated environment which contains python2.7 with the numpy module: `
[nix-shell:~]$ python -i
Python 2.7.13 (default, Dec 17 2016, 20:05:07)
[GCC 5.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>>
You can even use nix-shell as the shebang of a script:
#! /usr/bin/env nix-shell
#! nix-shell -i python27 python27Packages.numpy
import numpy
...
Unfree packages
By default, unfree packages installation is not allowed. We can change this behaviour :
For nixos-rebuild
you can set
{ nixpkgs.config.allowUnfree = true; }
in configuration.nix to override this.
For nix-env
, nix-build
, nix-shell
or any other Nix command you can add
{ allowUnfree = true; }
to your ~/.config/nixpkgs/config.nix.
$ mkdir .config/nixpkgs
$ emacs .config/nixpkgs/config.nix
Here’s an example:
$ cat .config/nixpkgs/config.nix
{
allowUnfree = true;
allowBroken = true;
permittedInsecurePackages = [
"libplist-1.12"
"webkitgtk-2.4.11"
];
}
Warnings treated as errors
When compiling the code, some options of the standard environment provided by Nix makes some warnings to be treated as errors. The best thing to do is to create a patch to remove the warning. But, when you don’t have the time to fix, this behavior can be changed, adding this line in your derivation:
hardeningDisable = [ "format" ];
Then, don’t forget to make a patch later…
Nix for HPC (multiuser mode)
This part is for system administrators, responsible of an HPC cluster.
If you’re interested, please, check this article that describes the operations to set-up Nix on your Linux HPC system:
Authors
This tutorial is the result of a long labour by:
- Frederic Audra
- Philippe Beys
- Bruno Bzeznik
- Franck Perignon
- Francoise Roch
- Laure Tavard
Many thanks also to our testers:
- Pierre-Antoine Bouttier
- Romain Cavagna
- Glenn Cougoulat
- Oliver Henriot
- Albanne Lecointre
If you want to contact us: gricad-contact at univ-grenoble-alpes.fr


pgTAP is a unit testing framework for PostgreSQL written
in PL/pgSQL and PL/SQL. It includes a comprehensive collection of
TAP-emitting assertion functions, as well as the
ability to integrate with other TAP-emitting test frameworks. It can also be
used in the xUnit testing style. For detailed documentation, see the
documentation in doc/pgtap.md
or
online.
To build it, just do this:
make
make installcheck
make install
If you encounter an error such as:
"Makefile", line 8: Need an operator
You need to use GNU make, which may well be installed on your system as
gmake
:
gmake
gmake install
gmake installcheck
If you encounter an error such as:
make: pg_config: Command not found
Or:
Makefile:52: *** pgTAP requires PostgreSQL 8.0 or later. This is . Stop.
Be sure that you have pg_config
installed and in your path. If you used a
package management system such as RPM to install PostgreSQL, be sure that the
-devel
package is also installed. If necessary tell the build process where
to find it:
env PG_CONFIG=/path/to/pg_config make && make install && make installcheck
And finally, if all that fails (and if you're on PostgreSQL 8.1 or lower, it
likely will), copy the entire distribution directory to the contrib/
subdirectory of the PostgreSQL source tree and try it there without
pg_config
:
env NO_PGXS=1 make && make install && make installcheck
If you encounter an error such as:
ERROR: must be owner of database regression
You need to run the test suite using a super user, such as the default "postgres" super user:
make installcheck PGUSER=postgres
If you want to schema-qualify pgTAP (that is, install all of its functions
into their own schema), set the $TAPSCHEMA
variable to the name of the
schema you'd like to be created, for example:
make TAPSCHEMA=tap
make install
make installcheck
pgTAP requires PostgreSQL 8.0 or higher, with 8.4 or higher recommended for full use of its API. It also requires PL/pgSQL.
Copyright (c) 2008-2011 Kineticode, Inc. Some rights reserved.
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.
IN NO EVENT SHALL KINETICODE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF KINETICODE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
KINETICODE SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND KINETICODE HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.


Barrage
Rapidly throw a flurry of weapons at your victims, bombarding them with unavoidable, flesh-cutting projectiles.{^n}{^y}Requires dual-wielding ranged weapons.
Dual Wield Only, Thrown Weapon
${value}% Chance to be Used
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Launches ${value} Projectile(s)
1
+${value}% increased Pierce Ratio
25
MaxLevel
12
UltimateLevel
16


TaNAC NAC plants Plant expression transcription Arabidopsis plant gene resistance transgenic wheat Figure Pst leaves Col- factor root genes defense level lateral {border-style signaling acid different factors px;} #ffffff;} containing levels lines pathogen involved strain development disease domain family higher inoculated regulation significant stress stripe used vector Biol. Cell Chen control seedlings striiformis using TaNAC-overexpressing Zhang bacterial days increased infection plants. response responses significantly Kim Mol. ORA according activation differences enhanced indicate pathogens transcriptional MYC Xie growth multiple negative protein rust < FIGURE Physiol. WRKY analysis basal biological cDNA cells mock necrotrophic patterns range roles taking virulent ANOVA, Duncan’s Pseudomonas TaNAC. Wang abiotic expressed induced leaf marker novel one-way overexpression primer regulator replicates. results roots subgroup susceptibility Arabidopsis. ERF However, JA- NAC-type PDF. Res. SAR Van auxin biotic encoding functions fusion lower members pathway pathways positive px; region rice role sequence transformed uredinia wheat. {font-family AtWRKY BSMV BSMV- Hao NAC-TFs SA, Sci. barley compared decreased development. font-size function italics) observed present proteins thaliana treatment types virus wild-type (A) (B) ./j.-X...x ./s--- China DNA-binding Different MeJA, SA-signaling Tang Xia analyzed conserved controls defense-related determine double; hpt, including infected infiltrated infiltration isolated letter medium member mosaic performed plants, race seedling sequences software study, subgroup, suppressed transcript ∗/Taichung ATAF Arabidopsis, C-terminal DC, DNA Expression Feng Figures Genome-wide GmNAC Liu Mao N-terminal PCR Puranik Rev. TaNAC, University Zheng amino avirulent biosynthesis biotrophic border-color border-width bread characterized constructed downstream hpi independent infection. interaction jasmonic length lengths onion pGBKT pathway. plates population primary putative regulates regulating relative rice. samples showed site solid; syringae vectors yeast {font-style {font-weight (C) (OD (SPSS -/Ade -/His ./--- ./S-()- ./pp.. ./tpc.. ANAC ANALYSES Annu. BMC CYR Comprehensive ET, ET- EXPRESSION Error Fang HvNAC Inc., JA-signaling Kazan Kpn Lorenzo Ooka OsNAC Pieterse RESPONSE RNA SPSS Science Similar Singh TaNAC-knockdown USA Uauy VSP Xba Xue Yuan Zhao Zhou activated avrRpt; bars bold branch cell changes cloned collected confers controls. corresponding courier; defense. described did difference diploid dpi. early em; epidermal ethylene example, exogenous formation green highly http://spss.en.softonic.com/ identified important indicating negatively photoperiod play populations post pre-inoculated predicted primarily promotes pt;} qRT-PCR. races regulated reported repression resistance. responses. salicylic selected signals silencing sp. stresses strongly subdomains technical tests. times. tolerance tree upper wheat, °C, α-galactosidase


Bayern's Cuisance should have stayed at Gladbach, says Eberl
by BeSoccerSince joining Bayern Munich for a reported €10million from Borussia Monchengladbach, Michael Cuisance has made two Bundesliga appearances.
Michael Cuisance's lack of game time at Bayern Munich shows he should never have left Borussia Monchengladbach.
That is the view of Gladbach sporting director Max Eberl, who reluctantly sanctioned the French midfielder's €10million switch in August this year.
Cuisance has made a pair of Bundesliga substitute appearances for Bayern, remaining unused on the bench on 11 other occasions in all competitions.
Minor adductor and groin setbacks have also hindered the 20-year-old, whose former club sit four points ahead of Bayern at the top of the table after 11 matches.
Featured links
- BREAKING NEWS: Mourinho replaces Pochettino at Tottenham
- The latest football transfers news and rumours
- Wales, golf, Madrid... in that order
- Luis Enrique returns to Spain national team
"We told him for three months that he would have been better staying here because he had found in Gladbach a club where he could develop," Eberl told Sport1.
"He had a great development last season. He did not want to settle for that and had other goals in mind for himself, which he has now pursued."
Cuisance will hope the installation of interim head coach Hansi Flick brings about a change of fortunes.
Marco Rose's in-form Gladbach travel to the Allianz Arena to take on Bayern on December 7.


OFFICE SPACE RATING: 7 / 10 -->Good movie
For more reviews and movie trivia, visit http://www.joblo.com
Mike Judge, the man behind the infinitely stupid and funny BEAVIS & BUTTHEAD animated series, jots down his first live-action movie, based on his infamous "Milton" sketches from TV's "Saturday Night Live", and helms the picture to boot. This movie is made for anyone who has ever worked in a Dilbert-type office environment, hates their job, and doesn't mind laughing at it all.
PLOT: A guy working in a run-of-the-mill tech company hates his job. After some help from a relaxation expert, the guy develops the capacity to become indifferent to his stress, and ironically lands himself a position of higher power. But when his friends are slated for downsizing, our boy and his buddies decide to get even with a half-assed money-making virus scheme.
CRITIQUE: This movie has many chuckles, some laugh out loud scenes, other shrugs of the shoulder, in a humorous and poignant office setting, which touches upon much of the inhumanity and hypocrisy that permeates the high-tech cubicles environments of our day. I personally saw MUCH of myself in the main character, since I, much like him, find myself wondering about the worth of my cubey-employment every other high-tech-flying day. I sense this capacity to identify with the main characters in this film, as a strong correlation point to your appreciation of the humor within. And it is within that environment that the authenticity and parody of the actual office rapport, the insincere stooge bosses, the phony empowerment signs all over the walls, and the daily frustrations that people face with the technological office "advancements", were all dead-on perfect!
Having said all that, the plot of the film itself is actually quite thin, with an irrelevant and cheesy romance with Jennifer Aniston (wasted in this role) tossed in for effect. I would have liked to have seen more office scenarios and incidents, as opposed to the last third of the film, which essentially down-shifts into a semi-crime caper. The actors were all very good with Ron Livingston playing an excellent laid-back dude, and his Bill Gates Jr. buddy coming through as the geek with the love for the gangsta rap. All in all, I would recommend this movie to all people who live, or have survived, this kind of an office environment, are looking for a light comedy, and don't mind a thin plot. Either way, always try to remember that WORKS SUCKS!
Little Known Facts about this film and its stars: Director Mike Judge apparently plays the role of Jennifer Aniston's idiot manager at Chotchkie's in this film. He was born in Guayaquil, Ecuador. A nod to actor Ron Livingston's better-known role in SWINGERS (9/10), comes by the way of a button on Jennifer Aniston's restaurant costume which reads "We're not in Kansas anymore". An infamous line from the film featuring the then-unknown Vince Vaughn and Jon Favreau. The guy playing the spectacled-nerd in this film, David Herman, has directed two documentaries of his own. He's also done voices for the Mike Judge-created TV series "King of the Hill". The real-life Milton in this film, Stephen Root, has also done voices for "King of the Hill", and might be better known as his character of Jimmy James from TV's "NewsRadio". He's also had plenty of movie appearances in such films as BLACK RAIN, GHOST and BUFFY THE VAMPIRE SLAYER. Actor Gary Cole, who plays the condescending boss in this film, also played the role of Mike Brady, father of the Brady's, in both of THE BRADY BUNCH movies. Paul Willson, who plays the second "Bob" consultant in this film, may be best remembered as Paul, the character that he played in the wildly successful TV sitcom "Cheers". He was the "other fat guy", besides Norm. Goofy neighbor Diedrich Bader plays Oswald Harvey on TV's "The Drew Carey Show".
Review Date: February 23, 1999 Director: Mike Judge Writer: Mike Judge Producers: Michael Rotenberg and Daniel Rappaport Actors: Ron Livingston as Peter Gibbons, David Herman as Michael Bolton, Ajay Naidu as Samir, Jennifer Aniston as Joanne Genre: Comedy Year of Release: 1999
Visit JoBlo's Movie Emporium http://www.joblo.com
(c) 1999 Berge Garabedian
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Go to the source code of this file.
◆ MAX_LOG_SIZE
| #define MAX_LOG_SIZE 1024 |
each log line max string length
◆ logagent_log_add()
| void logagent_log_add |
( |
struct list_head * |
log_list, |
|
|
const char * |
log |
|
) |
| |
add a log into log list
- Parameters
-
| log_list | the log list shared with plugins |
| log | one line log |
◆ logagent_log_remove()
| void logagent_log_remove |
( |
struct list_head * |
pos | ) |
|
remove log from log list
- Parameters
-
| pos | the position of the log to be removed |
◆ logagent_plugin_env_destroy()
| int logagent_plugin_env_destroy |
( |
void ** |
context | ) |
|
plugin global environment destroy
- Parameters
-
| context | take global environment config in |
- Returns
- zero for success
when logagent exit, it will call all destroy function for all plugins in the plugin list.
◆ logagent_plugin_env_init()
| int logagent_plugin_env_init |
( |
void ** |
context | ) |
|
plugin global environment init
- Parameters
-
| context | take json in and plugin's global environment config out |
logagent will maintained a plugin list. This function is used for global init for plugin.
◆ logagent_plugin_exit()
| int logagent_plugin_exit |
( |
void * |
gconfig, |
|
|
void ** |
context |
|
) |
| |
plugin exit function
- Parameters
-
| gconfig | plugin global config structure |
| context | take plugin pconfig in |
- Returns
- zero for success
logagent will call exit function for all plugins, the context will take plugin's own config in, and you need to do some clean work, and remember to free the config structure.
- Note
- this function must be thread safety and noblocked.
◆ logagent_plugin_init()
| int logagent_plugin_init |
( |
void * |
gconfig, |
|
|
void ** |
context |
|
) |
| |
plugin init function
- Parameters
-
| gconfig | plugin global config structure |
| context | take json in and plugin pconfig out |
- Returns
- zero for success
logagent will save all plugin's config structure in it's own list node, each time when logagent call init function, context will take a json string in, when init done, you should send back the config structure's address.
- Note
- this function must be thread safety and noblocked.
◆ logagent_plugin_work()
| int logagent_plugin_work |
( |
void * |
gconfig, |
|
|
void * |
pconfig, |
|
|
struct list_head * |
log_list |
|
) |
| |
plugin work function
- Parameters
-
| gconfig | plugin global config structure |
| pconfig | your own plugin config structure |
| log_list | log list |
- Returns
- zero for success
logagent will call work function one by one till exit signal received, each plugin only need to add or remove log from the log list. No need to malloc or free, log_add and log_remove just do for you.
- Note
- this function must be thread safety and noblocked.


I’ve defected from blogger.com, so far I’m impressed. Categories, stats, lots of nice skins and the import feature just saved me a boat load of time!
Functionally testing SAP Enterprise Portal using Watir
It’s taken about a day but I’ve managed to get some functional tests running using Watir. It’s not been as easy as it could have been mainly due to the way the SAP Enterprise Portal uses iFrames and the anti cross site scripting in Internet Explorer. I got there in the end though! I can now logon to the portal and functionally test iViews using a fairly simple Watir (Ruby) script:
def logon
$ie.goto($html_root)
if $ie.contains_text("Log Off")
logoff()
end
$ie.text_field(:id, 'logonuidfield').set($user_id)
$ie.text_field(:id, 'logonpassfield').set($password)
$ie.button(:name, 'uidPasswordLogon').click
end
A couple of things to note:
Talk to the iView directly Due to the use of iFrames and IE anti cross site scripting accessing an iView which is embedded in a portal page is not possible with the current (1.4.1) version of Watir. Simply get the url of the iView and access it directly.
Problem with HTMLB Text Fields ID’s and Names of HTMLB Text Field controls appear to be generated on execution, so I had to write a little script which would find a text field using the title property:
def find_text_field_by_title(my_title)
found_text_field = nil
$ie.text_fields.each do |tf|
if tf.title == my_title then
found_text_field = tf
break
end
end
raise "No text field found with title = " +
my_title if found_text_field.nil?
return found_text_field
end
NOTE: I’m sure my Ruby/Watir scripts leave a lot to be desired, I don’t really know who to code in Ruby but they do seem to work!
Searching Google for Watir help
Having trouble finding help on Watir?
Try the following in google:
site:rubyforge.org "[Wtr-general]" your search
Installing Watir via the gem utility
The install should be as simple as dropping into dos, cd to your Ruby folder and run the command:
gem install watir
Unfortunately it wasn’t that simple for me, we work via a proxy here so I had to tell the gem utility about it.
Running gem install when you are behind a proxy
Set the HTTP_PROXY environment variable.
Example:
set HTTP_PROXY=http://mycache:8080
You can now run:
gem install watir
Or you can pass the proxy information as a parameter to gem via the -p switch:
gem install watir -p http://mycache:8080
Gem will now go off download and install the latest Watir package, version 1.4.1 in my case. Be patient this can take some time depending on server load.
Watir - Testing your website
I am hoping to use this software to test my web developments, from what I have read it looks very promising.
“WATIR stands for “Web Application Testing in Ruby”. Watir is a free, open-source functional testing tool for automating browser-based tests of web applications. It is pronounced water.”
The install…
Using the Ruby One-Click installer for windows (version ruby182-15.exe), just run standard install accepting all defaults.
NOTE: I tried the final version of Ruby 182-14 and had lots of install problems so use at least version 182-15!
Using the Watir One-Click installer for windows (version watir-1.4.1.exe), just run standard install accepting all defaults.
Now onto learning what can be done with this thing…
Removing PAR files from the SAP Portal
So you’ve accidentally uploaded a PAR file to the portal eh?
Here’s how to get rid…
(Top Menu) Java Development -> (Left Sub Menu) Tools -> Portal Archive Deployer&Remover
(Main Page) Archive Remover
Select the PAR file you wish to remove from the drop down list and click the “Clean” button
You should now see a message along the lines of:
INFO: Received clean-up request for application: “MyApp” INFO: MyApp has been successfully removed from the PCD.
The PAR is no more.
SAP Portal PAR locations
To find your PAR files once they are uploaded to the portal:
(Top Menu) Java Development -> (Left Sub Menu) Tools -> Portal Support Desk
(Main Page) Portal Runtime -> (Main Page) Browse Deployment
Now move to:
:ROOT/WEB-INF/deployment/pcd
You should now see a BIG list of files.
This is where your PAR files live!
Create a library project of SAP Portal PDK JARs
It is a good idea to create a library project which includes all the jar files needed for a portal project. Why? 1. The SAP consultant told us to do it this way 2. It means on each new project you just need to include the library project and we are good to go.
So this is what we need to do:
Step 1: Get the portal PDK JAR files These JAR files can de downloaded from the portal, they live under the following portal menu:
(Top Menu) Java Development -> (Left Sub Menu) Tools -> PDK Jars Download
Download the zip file and extract the JAR files to a folder on your PC for example c:\source\sap\devlibs
Step 2: Create the library project In SAP Netweaver Developer Studio create a new project:
File -> New -> Project…
You will now see a wizard dialog:
Select Java -> Java Project
Click Next
Give the project a name DevLibs for example and specify a folder to save the project to.
You should now have a blank project to work with.
Step 3: Import the SAP Portal PDK JAR files Right click your mouse on the new blank project you just created (in this case DevLibs) select Properties from the context menu.
You will now see the DevLibs properties dialog: Select Java Build Path from the left pane.
Select “Libaries” from the Tab.
Click the “Add External JARs” button.
The file open dialog will now appear, select the downloaded JAR files from Step 1.
Click the “Order and Export” tab, click the “Select all” button.
Finally click the “OK” button.
You now have a library project which can be included in new portal projects!
Add a new project to Subversion server in Windows XP
NOTE: You must have TortoiseSVN installed for these instructions to work!
First create your Project folder structure:
ProjectName
branches
tags
trunk
Place your source in the trunk folder.
In windows explorer right click on ProjectName folder and select TortiseSVN -> Import from the menu.
You will now see the import screen:
Enter the repository/ProjectName an import message and click OK.
You have now created the project in Subversion but you must still check out the source you just imported. This can be done via TortoiseSVN or directly in eclipse using the subclipse add in.
SAP Portal HTTP or HTTPS?
Want to tell if your iView is running over HTTP or HTTPS?
Try this:
WARNING: Untested code ahead! ` HttpServletRequest servletRequest = componentRequest.getServletRequest(); String requestURL = servletRequest.getRequestURL().toString(); String protocol = requestURL.substring(0, requestURL.indexOf(“:”));`
if(protocol.equals(“http”)) { // do HTTP stuff } else { // do HTTPS stuff }


H
Hung
Tester
Home
Resume
Portfolio
Blog
Contact
Contact
Get in Touch
0123456789
Please contact me..
Ha Noi, Vietnamese
I am currently working in Hanoi capital.
Email
<EMAIL_ADDRESS>How Can I Help You?


@(drugGroup: DrugGroup, genericType: GenericType)
@expressionTerms("Removing a generic type", "drugGroups") {
Are you sure you want to remove this generic type from group @drugGroup.name?
- GenericType
- @genericType.name
@helper.form(routes.DrugGroupGenericTypesController.delete(drugGroup.id.get, genericType.id.get)) {
Cancel
}
}


Griffon is a Grails like application framework for developing desktop applications in Groovy. Inspired by Grails, Griffon follows the Convention over Configuration paradigm, paired with an intuitive MVC architecture and a command line interface. Griffon also follows the spirit of the Swing Application Framework (JSR 296), it defines a simple yet powerful application life cycle and event publishing mechanism. Another interesting feature comes from the Groovy language itself: automatic property support and property binding (inspired by BeansBinding (JSR 295)), which makes creating observable beans and binding to their properties a snap! As if property binding was not enough Groovy's SwingBuilder also simplifies building multi-threaded applications, say goodbye to the ugly gray rectangle (the bane of Swing apps)!
Grails developers should feel right at home when trying out Griffon. Many of Grails' conventions and commands are shared with Griffon. Granted, Swing is not the same as HTML/GSP but Builders simplify the task of creating the UI.
Seasoned Java developers will also be able to pick up the pace quickly, as the framework relieves you of the burden of maintaining an application structure, allowing you to concentrate on getting the code right.
| Griffon | Groovy | Grails |


Data Structure¶
The data storage and state variables are stored in global accessible variables. This means they can (provided you follow the rules provided in this doc) accessed from anywhere in the framework. Every user can add, delete or alter variables. So be warned, do not meddle with variables you do not know! For the sake of dynamicallity of the software it is necessary for the data structures to be not thread safe. This means every variable can be deprecated or out of date after accessing it. Furthermore, fast writting and reading can lead to race conditions inside of the program, when badly written.
An easy rule of thumb to avoid race conditions and unnecessary variables declarations are:
- Do you really need this variable global accessible?
- Only one subprogram can alter the value, all others just reads from it
- Only binary states allowed for multi access variables
- Non state critical variables for multi access variables
With these simple rules you should not have problems with this state machine.
Main Files¶
The main data structure is the default_values_dict
it contains at least one dictionary called defaults.
In this dictionary all data stored in the defaults.yml
file are prevalent. Furthermore, additional parameters are created
which are not stored in the YAML file. These parameters are crucial parameters which are not part of a configuriation file,
since the have to be always be there or represent dumb variables. These variables can be extendend or reduced only in the
actual code (for now). In the boot_up.py
under the function update_defaults_dict.to_update()
these variables can be accessed.
Note
By placing more then one YAML file in the defaults
folder, more dictionaries will be created in the default_values_dict
. But you have to create at least the item Settings_name: name of the setting
entry. Otherwise the program does not know how to name these settings. These settings can then be accessed via the name.
Device Files¶
Like with the main dicts, which are more of general settings and state files, the devices_dict
is a more specialiced
dictionary. This main dict will be populated by the content of the devices
folder. So every YAML file in there will
have a entry in the dictionary. The basic structure or minimal structure of such a file is as follows:
{
"Device_name": "2410 Keithley SMU",
"Device_type": "SMU",
"Display_name": "SMU1",
"Device_IDN": "KEITHLEY INSTRUMENTS INC.,MODEL 2410,0854671,C33 Mar 31 2015 09:32:39/A02 /J/H",
"Output_ON": "OUTP ON",
"imp:default_voltage_mode": "FIXED",
"set_voltage_mode": "SOUR:VOLT:MODE ",
"default_terminal": "REAR",
"set_terminal": "ROUT:TERM",
}
So to round this up: You need at least the first four parameters. From the fifth parameter onwards it is a order type.
Display name fehlt noch zum erklaren
Ordertypes¶
The software is highly adaptable to input data and data structures for different codecs. To achieve this some parametes have to be set to teach the program how to be so intelligent. First the program features a initialization routine when starting the software or a measurement.
If you want to run a specific command on start up you have to prefix this command with default_
after that the command is
of your liking. The value of this item is the actual ASCII code which defines the command for the device. Each default_
value has to have a set_
command (otherwise the default command will be send without parameter). So each default_
and set_
pair define a full command. If the program encounters such a pair during initialization it tries to build a command.
In our case such a command can be build out of "default_terminal": "REAR"
and "set_terminal": "ROUT:TERM"
. In our case
this would result in the command: ROUT:TERM REAR
.
If it is necessary to send some order before some others, another prefix can be added, the imp:
prefix. With this
the program is ordered to send these parameters before all others.
Warning
If more then one imp:
parameter is defined, then these items will be send in a random order!
While using the program you will encounter the situation that you have to build your own commands with changing input.
This can be changing the bias voltage of a device etc. With the utility function build_command(device_dict, command_tuple):
the program can help you generates the full ASCII coded command which the device should recognize.
This function is designed to only take a bare minimum of input and build a fully functional command out of it, without you knowing the command structure of the device. Such a command can look like this:
helpfull_functions.build_command(devices_dict["SMU1"], ("set_voltage", 10))
This command then returns the string (for this demo case) SOUR:VOLT:LEV 10
.
The first parameter has to be the device which you want the command build for, the second parameter is a tuple, first
entry in this tuple beeing the key in the dictionary aka. the command and the second beeing the value you want it set to.
Note
This is only the simples usage of this function!!! A full list of the capabilities of this build function can be found in the dedicated doc section or the source-code file utilities.py
, in which a multitude of possibilities for input and output is shown.
Sensor Files¶
Yet another config files type are the Sensor or Pad files. In these files general information about the Sensor or to measure
device are stored as well as optional location information. This location information are for automated test in a probe station.
These files are stored in the Pad_files
folder, which again can contain subfolder with names of your liking. These
additional folder will be interpreted as different projects you are working on. (See accessing the data section below).
Such a Pad file can look like this:
Campaign: Hamamatsu 6inch Irradiation
Creator: Dominic Bloech 17.07.2018
reference pad: 1
reference pad: 32
reference pad: 64
# Additional parameters
implant_length: 20036
metal_width: 35
implant_width: 22
metal_length: 19332.35
pitch: 90
thickness: 240
type: p-type
strip x y z
1 0 0 0
2 0 90 0
3 0 180 0
4 0 270 0
5 0 360 0
6 0 450 0
7 0 540 0
8 0 630 0
9 0 720 0
10 0 810 0
11 0 900 0
12 0 990 0
13 0 1080 0
14 0 1170 0
In the first few lines of text the header is defined. Each line with a '#' is considered to be a comment line. The other lines having a semicolon represent a item type variable for additional information. Non of these parameters in the header are mandatory and you also can extend these parameters. How you use it in your workflow is to your liking.
If you want to make automated measurements in a probestation on the other hand you will need at least the reference_pad: 1
items. These specify (if correctly implemented) the three points/pad numbers for the coordinate transformation.
Note
This structure is implemented as a plugin, if you write your own plugins for the alignment you can exchange this mechanism with one you like!
The second part of this file are coordinates. Here the starting line is strip x y z
. This line HAS to start with
the word strip, otherwise the program will not know where the coordinates start. (Except you teach the program to).
Note
You can add more parameters if you want, e.g. an angle or so.
After that the program reads in the data separated by tabs or spaces in a list of lists. See accessing data part for clarification.
Accessing Pad data¶
The corresponding data structure is called pad_files_dict
. The type of this structure is again a dictionary containing
as items the different folders in the Pad_files
folder. These are as mentioned before interpreted as some kind of
projects you have. Inside those folders are then the individual pad files.
The accessing scheme is a hierarchical one. Meaning the keys of pad_files_dict
are the names of the project aka. folder
names. Inside the value to this key you find yet again a dictionary with the keys being the individual sensors. Inside those
you find also a dictionary with the keys reference_pads
, header
, data
and additional_params
.
- The
reference_pads
entry contains the pad and the locations of the defined reference pads- The
header
entry contains the whole header- The
additional_params
entry contains the parameters of the header with : as dictionary- The
data
entry is a list of the length of the coordinate lines in the pad file. Each list entry is another list, containing the tab or space separated values form the coordiante section of the pad file.
Wow, a lot of dictionaries and list, to clarify a small example how you access data.
xcor = pad_files_dict["My_project"]["Sensor_1"]["data"][2][1] # Will be 0
ycor = pad_files_dict["My_project"]["Sensor_1"]["data"][2][2] # Will be 90
zcor = pad_files_dict["My_project"]["Sensor_1"]["data"][2][3] # Will be 0
metal_width = pad_files_dict["My_project"]["Sensor_1"]["additional_params"]["metal_width"] # Will be 35
Warning
Be careful while accessing data from the dictionaries, if the key does not exist python will say No and the program stops. So make sure you check the availability while accessing!!!


Based on the Design Your Life course at Stanford, this app helps you figure out which activities bring you enjoyment, energy, and engagement. These clues are the first step you need to take to design your ideal life. The journal includes an activity log and a reflection log.
Activity logs record daily your main activities, and a gauge to show how engaged and energized you were.
Reflection logs are done once a week to record your trends, insights and surprises as to what activities work and don't work for you.
As you go through your days, recording activities and impressions. You will realize what brings you happiness and fulfillment in your life! The more you use Design Your Life, the more you will see where you can better spend your time.


Filters
PRICE
BRAND
COLOR
Showing 666 results for "shoes"
Sort By
Relevance
Price - Low to High
Price - High to Low
Transformed code using Babel
:
Loading...


Projects
A Simple Blog
A Simple blog that allows you to create, edit and delete posts. It's built on node, expressJS and Angular.
Vroomio
is a 2-D multiplayer game with chat web application.It is being built using Node.js, Socket.io, Phaser.io.
Beer Personality Test
is deployed on Heroku and was built using Ruby on Sinatra, Twitter Bootstrap, and SQLite3.
Rotten Mangoes
was built using Ruby on Rails and Bulma (flexbox) for most of the styling.
2 player Pong
is simple HTML 2 player pong game.


The New Netflix Shows Your Kids'll Want to Queue in 2019 — Including Holiday Specials
by Alessia SantoroNetflix's 2019 show lineup for kids is packing a serious punch, y'all. Family movie nights are great and all, but since the dawn of the streaming service, there really is nothing like a Netflix series binge. For your kids, depending on their screen time rules and how busy their schedules are, they may not have as much time (or the attention span) to watch an entire series in one sitting (probably for the best), but the fact that their new and old favorite shows can be thrown on at the touch of a button is pretty amazing (they don't even know how good they have it not needing to read the TV Guide or watch the channel list on a loop because they missed what they were looking for three times in a row).
Ahead, see what Netflix is bringing to the kids' table for the rest of 2019 in terms of TV series and Netflix original series for kids. (And if you are looking for kids' movies on Netflix, check out which Disney movies you can still stream now before Disney+ gets them!)
1 A Family Reunion Christmas
In this Family Reunion holiday special — which begins streaming Dec. 9 — "M'Dear and her sisters struggle to keep their singing act together before a church Christmas pageant while Grandpa teaches the kids a valuable lesson."
2 Spirit Riding Free: The Spirit of Christmas
This holiday special will begin streaming on Dec. 6.
3 Alexa & Katie
Seasons one and two of this Netflix Original are already streaming, and season three will be available on Dec. 30.
4 Team Kaylie
Part one of this Netflix Original is already streaming, and part two will be available on Dec. 2.
5 Fast & Furious Spy Racers
Season one of this animated Netflix Original inspired by the Fast and the Furious movie franchise begins streaming on Dec. 26.
6 Super Monsters Furever Friends
This adorable Super Monsters special is all about getting monster pets (cute!) on the first night of Spring, and is streaming now!
7 Super Monsters Back to School
The Super Monsters are headed to class just like your kids! This adorable-looking special is streaming now.
8 Carmen Sandiego
Seasons one and two of the animated reboot of the '90s show Where in the World Is Carmen Sandiego? features Gina Rodriguez as the voice of everyone's favorite superthief are streaming now.
9 True and the Rainbow Kingdom: Mushroom Town
It's True's birthday! This adorable Netflix Original is streaming now.
10 True: Happy Hearts Day
This adorable Valentine's Day special is streaming now!
11 A Series of Unfortunate Events
Seasons one through three of the original show based on the children's books by Lemony Snicket are streaming now.
12 Charlie's Colorforms City
Season one of this colorful Netflix Original for kids, which teaches shapes, is streaming now!
13 Kevin Hart's Guide to Black History
This family comedy special features Kevin Hart "discussing the fascinating contributions of lesser known individuals from Black history through the lens of various educational reenactments," and is streaming now.
14 Mighty Little Bheem
Seasons one and two of this Netflix Original, as well as Mighty Little Bheem: Diwali, a holiday special in which Bheem celebrates the festival of lights, are now streaming.
15 True and the Rainbow Kingdom: Wild Wild Yetis
This new True special is streaming now.
16 Free Rein: Valentine's Day
This Valentine's Day special of the popular Netflix original series is streaming now!
17 Chip & Potato
Season one of this adorable Netflix Original about a pug puppy and her mouse friend is streaming now, and season two will be available on Nov. 29.
18 Harvey Girls Forever!
Seasons one through three of this Netflix Original series are streaming now.
19 Super Monsters: Vida's First Halloween
In this new Halloween special, the Super Monsters share their Halloween traditions with Vida, then get invited to a Día de los Muertos party in the Howlers' backyard. Watch it now!
20 Super Monsters Monster Pets
The Super Monsters and their adorable new pets are featured in a series of "short and silly animated adventures," which is streaming now.
21 Dragon Prince
Seasons one and two of this original series are streaming now, and season three will be available on Nov. 22.
22 Invader Zim: Enter the Florpus
Another reboot coming to life on Netflix, this much-anticipated animated special is streaming now.
23 Larva Island
Seasons one and two of this quirky Netflix Original for kids are streaming now.
24 The InBESTigators
Season one of this new Netflix Original about four kids who start their own detective agency and vlog about their adventures is streaming now.
25 Robozuna
Seasons one and two of this high-tech Netflix Original for kids are streaming now.
26 True Tunes: Songs
True is back for another series, this time of short, silly music videos that put a spin on your child's favorite nursery rhymes — it's streaming now.
27 Super Monsters Save Christmas
The Super Monsters help Santa to save Christmas in this special that begins streaming on Nov. 26!
28 GO! Live Your Way
Season one and two of this Netflix Original are streaming now.
29 Trolls: The Beat Goes On!
Seasons one through seven are streaming now, and season eight will be available on Nov. 22.
30 Dragons: Rescue Riders
This Netflix Original featuring Hiccup and Toothless from How to Train Your Dragon begins streaming on Sept. 24.
31 Cupcake & Dino: General Services
Seasons one and two of this Netflix Original series are already streaming.
32 Motown Magic
Seasons one and two of this Netflix Original are streaming now.
33 She-Ra and the Princesses of Power
Seasons one through three of this Netflix Original are streaming now.
34 The Last Kids on Earth
The first part of this show — based on the first book in a series of the same name — about a group of kids who band together to survive a zombie apocalypse, is streaming now.
35 No Good Nick
Seasons one and two of this new Netflix Original show staring Melissa Joan Hart and Sean Astin are streaming now!
36 Rocko's Modern Life: Static Cling
After 23 years, Rocko is making a comeback, and he's a little confused about the modern ways of the world! This reboot special is streaming now.
37 Ask the StoryBots
Seasons one through three of this Netflix Original for kids are streaming now.
38 Archibald's Next Big Thing
Season one of this show about a young chicken who lives in the moment is streaming now.
39 True: Grabbleapple Harvest
It's Grabbleapple harvest season for True and her friends in this special that is streaming now.
40 Prince of Peoria
Part two of this Netflix Original for older kids and tweens is streaming now.
41 Dino Girl Gauko
This new original series begins streaming on Nov. 22.
42 Family Reunion
Season one of this Netflix Original staring Tia Mowry about a family that moves to a small town is streaming now.
43 Spirit Riding Free
Seasons one through eight of the Netflix Original are streaming now.
44 Llama Llama
Seasons one and two of this Netflix Original featuring the voice of Jennifer Garner as Mama Llama are streaming now.
45 Malibu Rescue
Season one of this new Netflix original about a Junior Rescue lifeguard team is streaming now.
46 Pinky Malinky
Seasons one through three of this hilarious series about Pinky Malinky, who sees the bright side of everything, are streaming now.
47 Free Rein
Seasons one through three are streaming now.
48 True: Winter Wishes
Catch True celebrating the Inter Wishfest when this holiday special begins streaming on Nov. 26.
49 The Worst Witch
Seasons one through three of this Netflix Original staring Game of Thrones's Bella Ramsey are streaming now.
50 3Below: Tales of Arcadia
Parts one and two of this Dreamworks animated Netflix Original series are streaming now.
51 Captain Underpants
Seasons one through three of this hilarious series are streaming now!
52 Pachamama
This series about a spirited boy who dreams of becoming a shaman is streaming now.
53 Super Monsters
Seasons one through three of this Netflix Original for kids are streaming now.
54 The Spooky Tale of Captain Underpants Hack-a-Ween
This Halloween special — about mean Principal Krupp and evil boy-genius Melvin making Halloween illegal — is streaming now!
55 Legend Quest: Masters of Myth
Season one of this Netflix Original for kids will is streaming now!
56 Spirit Riding Free: Pony Tales
The first two collections of sing-a-long tunes are streaming now!
57 Spirit Riding Free: The Spirit of Christmas
This holiday special begins streaming on Dec. 6.
58 Creeped Out
Seasons one and two of this ominous series for kids ages 7-9 and up are streaming now.
59 YooHoo to the Rescue
Seasons one and two of this adorable Netflix Original for kids are streaming now.
60 Greenhouse Academy
Seasons one and two of this Netflix Original are already streaming, and season three will be available on Oct. 25.
61 The Unlisted
In this Netflix Original, identical twin brothers uncover a secret government plot to control and track Australia's students. It's streaming now!


In order to request a virtual machine, please book a consultation with us to discuss details like the desired operating system, software, memory, storage and processing power. A consultation typically takes 30 minutes. No preparation on your side is necessary. If you have any questions please put them into the comments field.
Your virtual machine consultation request has been submitted and an acknowledgement e-mail sent to {{authService.user.mail}}.
We will contact you to confirm the time and arrange the location.
You may view your request here: {{response.ticketNumber}}


About
About Pizza Order
Created by:
Kevin Johnston
GitHub Username/URL:
kjohnston1149
Intro to Programming Test for:
Object-Oriented JavaScript
Virtual Pizza
Welcome to Virtual Pizza!
Create the pizza you
wish
you could be delivered to you!
Let's get started!
Step 1: Create Your Pizza
What Size?
-- select a size --
Small
Medium
Large
What type of Crust?
-- select a crust type --
Thin-crust
Regular-Crust
Deep-Dish
What Toppings?
Cheese
Pepperoni
Anchovies
Olives
Artichokes
Feta Cheese
Where should we take this?
Step 2: Enter Your Name and Address
Name:
Street:
City:
State:
Place your order
Alright
, here's what we got!
Your
pizza costs $
It has these toppings:
It will be delivered to
Home


 First choose a deck below of flashcards that you want to study (or create your own).
{% endif %}View decks created by other users
and add them to your collection.
Create a new deck of your own.
Add new cards to one of your decks.
{% if deck_list %}Create a deck first
or find a pre-made deck.


- A fresher, graduated from Tezpur University, looking forward to work with an organization which offers a fun and challenging environment for personal and professional development.
- Possesses strong verbal, analytical and problem-solving skills with constant growing knowledge in Computer Science and Electronics.
- Rich domain knowledge in Computer Programming, Object-Oriented Programming, Multithreading, Data Structures, Algorithms and Database Management System.
- Result oriented, smart, highly motivated, self learner, and hungry to learn new technologies and methodologies.
Koushik Kiran Kumar
Summary
Academia
Bachelor of Technology in Electronics and Communication Engineering
Higher Secondary (10+2) in Math, Physics and Chemistry
Matriculation (Class 10)
-Tezpur University, Assam, India. 2013-2017
➢ CGPA - 7.05
-Sri Chaitanya Junior College under Board of Intermediate Education, Andhra Pradesh, India. 2011-2013
➢ Percentage - 88.5%
➢ Scored 99.24 Percentile(All India) in JEE-Mains(2013) Paper-1 (Math, Physics and Chemistry).
➢ Scored 98.15 Percentile(All India) in JEE-Mains(2013) Paper-2 (Architecture).
-Sri Chaitanya Techno School under Board of Secondary Education, Andhra Pradesh, India. 2010-2011
➢ Percentage - 88.6%
Projects
Internship
Academic Projects
Self & Mini Projects
Web Design Projects
1. “Implementation of Digital Systems using FPGA”
➢ Industry: Defence Electronics Research Laboratory (DLRL), Hyderabad.
➢ Duration: 2 Months (June 2016 & July 2016)
➢ Description: Software and hardware approach to the implementation of digital filters and other digital system algorithms using MATLAB, VHDL and Xilinx FPGAs.
1. “Development of an E-Nose for Low Concentration Gas Classification”
➢ Duration: 4 Months (August 2016 to December 2016)
➢ Description: Developed an experimental E-Nose setup which can elevate the concentration level of gases, so that the sensor array can detect the available gases even at lower concentrations than the threshold concentrations.
2. “Micro-controller based Artificial Neural Network Implementation for Intelligent Flushing and Deodorizing System”
➢ Duration: 4 Months (January 2017 to May 2017)
➢ Description: Developed an Intelligent Flushing and Deodorizing System using the E-Nose setup and a PIC micro-controller based Artificial Neural Network (ANN). ANN is used to differentiate toilet gas with the deodorizer.
1. Face Counter using MATLAB.
2. Face Recognition using MATLAB.
3. Chat client and server using Python.
4. Lossless Image Compression using MATLAB.
5. Implementation of Huffmann Coding, Arithmetic Coding, Shannon Coding, LZ-77, LZ-78, LZW Coding in MATLAB (without using inbuilt functions) and JAVA.
6. 2D-DFT, 2D-DCT, 2D-KLT, 2D-Haar Transform of Images using MATLAB.
7. Hardware Implementation of 220v rectifier and DC-DC converter using Silicon Controlled Rectifier.8. Line Follower, Wall Follower, GSM and Bluetooth controlled robots using Atmega Micro-controller.
9. Hardware Implementation of Amplitude Modulation/Demodulation and Frequency Modulation/ Demodulation Circuits for message transmission.
10. Hardware Implementation of ASK and FSK Modulation/Demodulation Circuits.
Responsive web design projects
Skill Set
- Programming Languages: C, C++, Python, Core Java, VHDL, PIC Mikro C and Embedded C.
- Web Development: HTML5, CSS, JavaScript, Jquery, Bootstrap.
- Databases: MySQL, Oracle PL/SQL.
- Application Software: MATLAB, Simulink, NI Multisim, NI LabView, Tanner EDA, Proteus, DipTrace.
- Operating Systems: Windows (7,8,10), Ubuntu, Debian Linux.
- Other Skills: Adobe Photoshop, Adobe Illustrations, Adobe Premier Pro, Adobe After Effects, Adobe Indesign, Adobe Lightroom, MS Office.
Extra Curricular Activities & Achievements
- Have been the Vice-chairperson of IEEE Student Branch, Tezpur University for the year 2016-17.
- Have been the Head Coordinator for a technical event, Robophronesis 2.0 in Techxetra 2015.
- Have been a Design Coordinator for Techxetra 2015.
- Was one of the founding members and Designer of Scripture - Official Technical e-Magazine for Tezpur University (Edition 1&2).
- Served as a Mess Manager for Nilachal Men’s Hostel, Tezpur Central University for the month of February 2016. Have been an active member of Tezpur University Robotics Society.
- Participated in 2 Days Workshop on MEMS and Micro-Technology.
- Participated in 2 Days Workshop on Robotics using Atmega Micro-controller. Participated in Inter-District Hand-Ball Tournament held at Vishakhapatanam in 2009.
- Participated in Inter-zonal(Hyderabad) March-Past Competition held in 2009 and secured 2nd Position. An active volunteer for National Service Scheme (NSS).
- Regular Voluntary Blood Donor.
- Participated in National Memory Championship 2009.
- Secured All India Rank 4252 in 8th National Cyber Olympiad (2008).
Personal Details
- Date of Birth: 21st April, 1996
- Sex: Male
- Nationality: Indian
- Languages Known: English, Hindi, Telugu


On devices where you can't swipe left and right, use the keyboard left and right arrows to animate.
Chrome users may experience issues if their graphics card is blacklisted
Please refer to this post for an explaination of how it works.


Benefits of Joining or Subscribing
- Free Live Broadcasts. Watch every match live right here.
- Chatroom access during broadcasts.
- Live notifications for selected teams, competitions, players, and journalists.
- Access to news and article database.
- Ability to further support your favorite channels by subscribing or donating, giving you even more added benefits.


Snacks for the Socially Distanced
I’ve written extensively about this in other sections of this site, but this podcast is truly my pride and joy. (Vishnu and) I are obsessed with food, and finding an excuse to review grocery store snacks brought us (or at least me) a lot of serotonin over the past year in a time when that was scarce.
In case you missed this on other pages, we got a ton of free snacks from various companies that wanted us to review them, and we even had a (small but) loyal fanbase.
Extravagantly Decorated Parties
I’ll add to this more in the future, but Vishnu and I have a history of planning and executing on extravagant and (if I say so myself) incredibly impressive parties in our (previously shared) apartment. We even made a website for this Christmas party for the ages.
The Cube
The Cube is Duke’s entrepreneurship-focused living group. For a very young organization, it’s managed to spit out a ton of impressive companies, like Mati Energy, Sprout (previously Smart Metals Recycling), Carpe, and Farmshots.
I served as its President in 2015 and helped revitalize the group’s focus on building startups (rather than working for them or just thinking about them) and helped organize social events.
Solar Panel Research
I worked for 2 years under Kyle Bradbury in Duke’s Energy Data Analytics Lab to research how to identify solar panels in satellite imagery using remote sensing.
This work included a journal article I co-wrote, now published by Scientific Data, a Nature-owned journal, as well as a Kaggle competition.


Custom Tracks
finer grain control of features placement is possible by adding genes at the track or lane level


{% extends "container.html" %} {% block head %}
First Name |
{{player.first_name}} |
Last Name |
{{player.last_name}} |
Height |
{{player.height}} |
Weight |
{{player.weight}} |
Birth Date |
{{player.birth_date}} |
Number |
{{player.number}} |
Primary Position |
{{player.primary_position}} |
Secondary Posistions |
{{player.secondary_positions}} |
Nationality |
{{player.nationality}} |
Team |
{{player.team}} |


Package de.aicard.domains.learnset
Class LearnSetAbo
java.lang.Object
de.aicard.domains.BaseEntity
de.aicard.domains.learnset.LearnSetAbo
@Entity public class LearnSetAbo extends BaseEntity
Provides a LearnSet with further, account-specific information and is thus always embedded
into an account. The further information provided by the LearnSetAbo are an ArrayList of
CardStatus to safe the state of learning of the user for all the Cards in the LearnSet,
the LearnSet itself and the evaluation the Account has given the LearnSet.
primary place to save learnsets
- Author:
- Daniel Michel
-
Field Summary
Fields Modifier and Type Field Description private java.util.List<CardStatus>
cardStatus
The member-variable ardStatus is an ArrayList of CardStatus.private int
evaluation
The evaluation the Account has given to the LearnSet.private LearningSession
learningSession
private LearnSet
learnSet
The LearnSet the Account subscribed to. -
Constructor Summary
Constructors Constructor Description LearnSetAbo(LearnSet learnSet)
Constructor of the LearnSetAbo -
Method Summary
Modifier and Type Method Description private java.util.List<CardStatus>
createCardStatusListForSession(int numOfCards)
Creates an ArrayList of CardStatus with a specific Number of Cards.LearningSession
createLearningSession(int numOfCards)
Creates a LearningSession with a specific number of Cards.private java.util.List<CardStatus>
getCardStatusOfKnowledgeLevel(CardKnowledgeLevel level)
Method to get all Cards of the LearnSet with a specific CardKnowledgeLevel.CardStatus
removeCardStatusByCard(Card card)
removes a cardStatus with the given card from the cardStatusList
-
Field Details
-
cardStatus
The member-variable ardStatus is an ArrayList of CardStatus. It contains a CardStatus for each Card in the LearnSet m_learnSet. -
learnSet
The LearnSet the Account subscribed to. -
evaluation
private int evaluationThe evaluation the Account has given to the LearnSet. If the Account has not yet given an evaluation to the LearnSet, the variable m_evaluation has the value -1.is redundant because evaluation is calculated on the fly by calculating averages of comment recomondations
-
learningSession
-
-
Constructor Details
-
LearnSetAbo
Constructor of the LearnSetAbo- Parameters:
learnSet
- The LearnSet to which the Account subscribes.- Throws:
java.lang.Exception
-
-
Method Details
-
getCardStatusOfKnowledgeLevel
Method to get all Cards of the LearnSet with a specific CardKnowledgeLevel.Checks the KnowLedgeLevel of all Cards in the List. Puts the CardStatus with the wanted level in a new ArrayList of CardStatus. Returns this List.
- Parameters:
level
- The CardKnowledgeLevel we are looking for- Returns:
- A List of all CardStatus in the LearnSetAbo with the CardKnowledgeLevel level
-
createCardStatusListForSession
Creates an ArrayList of CardStatus with a specific Number of Cards.Checks the CardStatus List of the Abo for one CardKnowledgeLevel after another (lowest level first) and fills a new ArrayList of CardStatus with the CardStatus of the lowest level, until there are as many CardStatus in the List as wanted.
- Parameters:
numOfCards
- The number of CardStatus we want in the returned ArrayList.- Returns:
- List of the size _numOfCards, consists of the CardStatus in the LearnSetAbo with the lowest CardKnowledgeLevel.
-
createLearningSession
Creates a LearningSession with a specific number of Cards.First, it gets a List of the CardStatus in the LearnSetAbo of the lowest CardKnowledgeLevel. Then, it constructs a LearnSet of this CardStatus ArrayList.
- Parameters:
numOfCards
- how many Cards should be asked for in the LearningSession- Returns:
- The created LearningSession.
-
removeCardStatusByCard
removes a cardStatus with the given card from the cardStatusList- Parameters:
card
- /- Returns:
- CardStatus which is removed to be deleted
-