清华学生在极棒2017全球极客大赛“AI仿声验声攻防赛”中斩获佳绩:
'via Blog this'
Blog Archive
-
▼
2017
(115)
-
▼
October
(14)
- 清华学生在极棒2017全球极客大赛“AI仿声验声攻防赛”中斩获佳绩
- Bash Shell - Test if File or Directory Exists – Te...
- 说话人识别中的VAD - 程序园
- Understanding Git: Repositories
- Tutorial on how to create a simple ASR system in K...
- kaldi learning materials
- Basic Valgrind Tutorial
- Shared libraries with GCC on Linux
- What if you linked external hard drive and can not...
- New tools & data for soundscape synthesis and onli...
- 14.04 - How to install Anaconda on Ubuntu? - Ask U...
- 美股新手必备利器 (app & 网站)
- A Simple Makefile Tutorial
- C++ Primer_Ed4 习题答案
-
▼
October
(14)
Tuesday, October 31, 2017
Sunday, October 29, 2017
Bash Shell - Test if File or Directory Exists – TecAdmin
Bash Shell - Test if File or Directory Exists – TecAdmin: "Bash Shell – Test if File or Directory Exists"
For File:
1 | [ ! -f /tmp/testfile.log ] && touch /tmp/testfile.log |
For Directory:
1 | [ ! -d /tmp/mydir ] && mkdir -p /tmp/mydir |
Wednesday, October 25, 2017
Tuesday, October 24, 2017
Saturday, October 14, 2017
Tutorial on how to create a simple ASR system in Kaldi toolkit from scratch using digits corpora (Kaldi for dummies)
Tutorial on how to create a simple ASR system in Kaldi toolkit from scratch using digits corpora (Kaldi for dummies)
Friday, October 13, 2017
kaldi learning materials
the best thing to do is to go to Kaldi website and follow the tutorial
here is some useful lectures and example of how to create your own ASR system
Basic Valgrind Tutorial
Basic Valgrind Tutorial:
Valgrind Valgrind is a memory mismanagement detector. It shows you memory leaks, deallocation errors, etc. Actually, Valgrind is a wrapper around a collection of tools that do many other things (e.g., cache profiling); however, here we focus on the default tool, memcheck. Memcheck can detect:
Valgrind can detect many kinds of errors. Here's an explanation of the various error messages.
'via Blog this'
- Use of uninitialised memory
- Reading/writing memory after it has been free'd
- Reading/writing off the end of malloc'd blocks
- Reading/writing inappropriate areas on the stack
- Memory leaks -- where pointers to malloc'd blocks are lost forever
- Mismatched use of malloc/new/new [] vs free/delete/delete []
- Overlapping src and dst pointers in memcpy() and related functions
- Some misuses of the POSIX pthreads API
gcc -o test -g test.cThis creates an executable named test. To check for memory leaks during the execution of test, try
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./testThis outputs a report to the terminal like
==9704== Memcheck, a memory error detector for x86-linux. ==9704== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al. ==9704== Using valgrind-2.2.0, a program supervision framework for x86-linux. ==9704== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. ==9704== For more details, rerun with: -v ==9704== ==9704== ==9704== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1) ==9704== malloc/free: in use at exit: 35 bytes in 2 blocks. ==9704== malloc/free: 3 allocs, 1 frees, 47 bytes allocated. ==9704== For counts of detected errors, rerun with: -v ==9704== searching for pointers to 2 not-freed blocks. ==9704== checked 1420940 bytes. ==9704== ==9704== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2 ==9704== at 0x1B903D38: malloc (vg_replace_malloc.c:131) ==9704== by 0x80483BF: main (test.c:15) ==9704== ==9704== ==9704== 19 bytes in 1 blocks are definitely lost in loss record 2 of 2 ==9704== at 0x1B903D38: malloc (vg_replace_malloc.c:131) ==9704== by 0x8048391: main (test.c:8) ==9704== ==9704== LEAK SUMMARY: ==9704== definitely lost: 35 bytes in 2 blocks. ==9704== possibly lost: 0 bytes in 0 blocks. ==9704== still reachable: 0 bytes in 0 blocks. ==9704== suppressed: 0 bytes in 0 blocks.Let's look at the code to see what happened. Allocation #1 (19 byte leak) is lost because p is pointed elsewhere before the memory from Allocation #1 is free'd. To help us track it down, Valgrind gives us a stack trace showing where the bytes were allocated. In the 19 byte leak entry, the bytes were allocate in test.c, line 8. Allocation #2 (12 byte leak) doesn't show up in the list because it is free'd. Allocation #3 shows up in the list even though there is still a reference to it (p) at program termination. This is still a memory leak! Again, Valgrind tells us where to look for the allocation (test.c line 15).
Valgrind can detect many kinds of errors. Here's an explanation of the various error messages.
'via Blog this'
Thursday, October 12, 2017
Shared libraries with GCC on Linux
Link: Shared libraries with GCC on Linux -
Cprogramming.com
By anduril462
Libraries are an indispensable tool for any programmer. They are
pre-existing code that is compiled and ready for you to use. They often provide
generic functionality, like linked lists or binary trees that can hold any data, or
specific functionality like an interface to a database server such as MySQL.
Most larger software projects will contain several components,
some of which you may find use for later on in some other project, or that you
just want to separate out for organizational purposes. When you have a reusable
or logically distinct set of functions, it is helpful to build a library from
it so that you don’t have to copy the source code into your current project and
recompile it all the time and so you can keep different modules of your
program disjoint and change one without affecting others. Once it’s been
written and tested, you can safely reuse it over and over again, saving the
time and hassle of building it into your project every time.
Building static libraries is fairly simple, and since we rarely
get questions on them, I won’t cover them.
I’ll stick with shared libraries, which seem to be more confusing for most people.
I’ll stick with shared libraries, which seem to be more confusing for most people.
Before we get started, it might help to get a quick rundown of
everything that happens from source code to running program:
1. C
Preprocessor: This stage processes all the preprocessor directives. Basically, any line
that starts with a #, such as #define and #include.
2. Compilation
Proper: Once the source file has been preprocessed, the result is then
compiled. Since many people refer to the entire build process as compilation, this
stage is often referred to as ‘compilation proper.’ This stage turns a .c file
into an .o (object) file.
3. Linking:
Here is where all of the object files and any libraries are linked together to
make your final program. Note that for static libraries, the actual library is
placed in your final program, while for shared libraries, only a reference to
the library is placed inside. Now you have a complete program that is ready to
run. You launch it from the shell, and the program is handed off to the loader.
4. Loading:
This stage happens when your program starts up. Your program is scanned for
references to shared libraries. Any references found are resolved and the
libraries are mapped into your program.
Steps 3 and 4 are where the magic (and confusion) happens with
shared libraries.
Now, on to our (very simple) example.
foo.h:
1
2
3
4
5
6
|
#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif // foo_h__
|
##foo.c:
1
2
3
4
5
6
7
|
#include <stdio.h>
void foo(void)
{
puts("Hello, I'm a shared
library");
}
|
##main.c:
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include "foo.h"
int main(void)
{
puts("This is a shared library
test...");
foo();
return
0;
}
|
foo.h defines the interface to our library, a single function,
foo().
foo.c contains the implementation of that function, and
main.c is a driver program that uses our library.
foo.c contains the implementation of that function, and
main.c is a driver program that uses our library.
For the purposes of this example, everything will happen in
/home/username/foo
Step 1:
Compiling with Position Independent Code
We need to compile our library source code into
position-independent code (PIC):1
$
gcc -c -Wall -Werror -fpic foo.c
Step 2:
Creating a shared library from an object file
Now we need to actually turn this object file into a shared
library. We’ll call it libfoo.so:
gcc
-shared -o libfoo.so foo.o
Step 3:
Linking with a shared library
As you can see, that was actually pretty easy. We have a shared
library. Let’s compile our main.c and link it with libfoo. We’ll call our final
program ‘test.’
Note that the -lfoo option is not looking for foo.o, but libfoo.so.
GCC assumes that all libraries start with ‘lib’ and end with .so or .a (.so is for shared object or shared libraries, and .a is for archive, or statically linked libraries).
Note that the -lfoo option is not looking for foo.o, but libfoo.so.
GCC assumes that all libraries start with ‘lib’ and end with .so or .a (.so is for shared object or shared libraries, and .a is for archive, or statically linked libraries).
$
gcc -Wall -o test main.c -lfoo
/usr/bin/ld:
cannot find -lfoo
collect2:
ld returned 1 exit status
Telling
GCC where to find the shared library
Uh-oh! The linker doesn’t know where to find libfoo. GCC has a
list of places it looks by default, but our directory is not in that list.2We need to tell GCC where to find
libfoo.so. We will do that with the -L option. In this example, we will use the
current directory, /home/username/foo:
$
gcc -L/home/username/foo -Wall -o test main.c -lfoo
Step 4:
Making the library available at runtime
Good, no errors. Now let’s run our program:
$
./test
./test:
error while loading shared libraries: libfoo.so: cannot open shared object
file: No such file or directory
Oh no! The loader can’t find the shared library.3 We didn’t install it in a
standard location, so we need to give the loader a little help. We have a
couple of options: we can use the environment variable LD_LIBRARY_PATH for
this, or rpath. Let’s take a look first at LD_LIBRARY_PATH:
Using
LD_LIBRARY_PATH
$
echo $LD_LIBRARY_PATH
There’s nothing in there. Let’s fix that by prepending our working
directory to the existing LD_LIBRARY_PATH:
$
LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH
$
./test
./test:
error while loading shared libraries: libfoo.so: cannot open shared object
file: No such file or directory
What happened? Our directory is in LD_LIBRARY_PATH, but we didn’t
export it. In Linux, if you don’t export the changes to an environment
variable, they won’t be inherited by the child processes. The loader and our
test program didn’t inherit the changes we made. Thankfully, the fix is easy:
$
export LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH
$
./test
This
is a shared library test...
Hello,
I'm a shared library
Good, it worked!
LD_LIBRARY_PATH is great for quick tests and for
systems on which you don’t have admin privileges.
As a downside, however,
exporting the LD_LIBRARY_PATH variable means it may cause problems with other
programs you run that also rely on LD_LIBRARY_PATH if you don’t reset it to its
previous state when you’re done.
Using
rpath
Now let’s try rpath (first we’ll clear LD_LIBRARY_PATH to ensure
it’s rpath that’s finding our library). Rpath, or the run path, is a way of
embedding the location of shared libraries in the executable itself, instead of
relying on default locations or environment variables. We do this during the
linking stage. Notice the lengthy ‘-Wl,-rpath=/home/username/foo’ option. The
-Wl portion sends comma-separated options to the linker, so we tell it to send
the -rpath option to the linker with our working directory.
$
unset LD_LIBRARY_PATH
$
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c
-lfoo
$
./test
This
is a shared library test...
Hello,
I'm a shared library
Excellent, it worked. The rpath method is great because each
program gets to list its shared library locations independently, so there are
no issues with different programs looking in the wrong paths like there were
for LD_LIBRARY_PATH.
rpath vs.
LD_LIBRARY_PATH
There are a few downsides to rpath, however.
- First, it requires that shared libraries be installed in a fixed location so that all users of your program will have access to those libraries in those locations. That means less flexibility in system configuration.
- Second, if that library refers to a NFS mount or other network drive, you may experience undesirable delays or worse on program startup.
Using
ldconfig to modify ld.so
What if we want to install our library so everybody on the system
can use it? For that, you will need admin privileges. You will need this for
two reasons: first, to put the library in a standard location, probably
/usr/lib or /usr/local/lib, which normal users don’t have write access to.
Second, you will need to modify the ld.so config file and cache. As root, do
the following:
$
cp /home/username/foo/libfoo.so /usr/lib
$
chmod 0755 /usr/lib/libfoo.so
Now the file is in a standard location, with correct permissions,
readable by everybody. We need to tell the loader it’s available for use, so
let’s update the cache:
$
ldconfig
That should create a link to our shared library and update the
cache so it’s available for immediate use. Let’s double check:
$
ldconfig -p | grep foo
libfoo.so
(libc6) => /usr/lib/libfoo.so
Now our library is installed. Before we test it, we have to clean
up a few things:
Clear our LD_LIBRARY_PATH once more, just in case:
$
unset LD_LIBRARY_PATH
Re-link our executable. Notice we don’t need the -L option since
our library is stored in a default location and we aren’t using the rpath option:
$
gcc -Wall -o test main.c -lfoo
Let’s make sure we’re using the /usr/lib instance of our library
using ldd:
$
ldd test | grep foo
libfoo.so
=> /usr/lib/libfoo.so (0x00a42000)
Good, now let’s run it:
$
./test
This
is a shared library test...
Hello,
I'm a shared library
That about wraps it up. We’ve covered how to build a shared
library, how to link with it, and how to resolve the most common loader issues
with shared libraries, as well as the positives and negatives of different
approaches.
1. What is
position independent code? PIC is code that works no matter where in memory it
is placed. Because several different programs can all use one instance of your
shared library, the library cannot store things at fixed addresses, since the
location of that library in memory will vary from program to program. ↩
2. GCC first
searches for libraries in /usr/local/lib, then in /usr/lib. Following that, it
searches for libraries in the directories specified by the -L parameter, in the
order specified on the command line. ↩
3. The
default GNU loader, ld.so, looks for libraries in the following order: ↩
1. It looks in the DT_RPATH section of the executable, unless there is a DT_RUNPATH section.
2. It looks in LD_LIBRARY_PATH. This is skipped if the executable is setuid/setgid for security reasons.
3. It looks in the DT_RUNPATH section of the executable unless the setuid/setgid bits are set (for security reasons).
4. It looks in the cache file /etc/ld/so/cache (disabled with the ‘ -z nodeflib’ linker option).
5. It looks in the default directories /lib then /usr/lib (disabled with the ‘ -z nodeflib’ linker option).
Wednesday, October 11, 2017
What if you linked external hard drive and can not access it?
usb - Detect and mount devices - Ask Ubuntu:
How to check disks tree structure and locate target disk:
lsblk
How do I find out my motherboard model?
How to mount
'via Blog this'
How to check disks tree structure and locate target disk:
lsblk
How do I find out my motherboard model?
lspci
How to mount
Manually Mount a USB Drive
A USB storage device plugged into the system usually mounts automatically, but if for some reasons it doesn't automount, it's possible to manually mount it with these steps.
- Press Ctrl+Alt+T to run Terminal.
- Enter
sudo mkdir /media/usb
to create a mount point called usb. - Enter
sudo fdisk -l
to look for the USB drive already plugged in, let's say the drive you want to mount is/dev/sdb1
. - To mount a USB drive formatted with FAT16 or FAT32 system, enter:
sudo mount -t vfat /dev/sdb1 /media/usb -o uid=1000,gid=100,utf8,dmask=027,fmask=137
OR, To mount a USB drive formatted with NTFS system, enter:sudo mount -t ntfs-3g /dev/sdb1 /media/usb
'via Blog this'
Subscribe to:
Posts (Atom)