This series of writing summing up of what I did in Google Summer of Code (GSoC) 2017. GSoC 2017 be held in three period of time. In this part I will tell you about the first period.
Community Approaching
After looking for organizations to work on, I decide to choose GNU Wget2 (part of GNU Project). Why I choose this organization? Some reason I can say:
- The codebase is small (but not the scope, for me), it give me advantage that it’s easy to deploy on my local machine.
- It use C as its primary programming language. At this time, I would like to learn about C (Linux was influenced me) on real world application. I was starting to learn C but just on the theory. So, working on Wget2 could help me to learn C with practice.
- The GNU Project reputation is well recognized in Open Source community so working on their project make me proud.
I immediately take a look on their repository. I try to clone their repository
and build on my machine. GNU Wget2 use mailing list as their primary
communication channel, so I sent greeting to them about what project I
interesting at.
The contributor of the project is so friendly. They give me some clues about
what should I do. I should do some microproject work to show effort from me to
understand their workflow and also their codebase. That means, I have to send a
patch (there was Github pull request at this time) to the project. I choose to
work on adding new unit test to function wget_robots_parse()
[0]. Just like
most of open source contribution, it took some process of revision of patch so
it can be merged to upstream. I respect the reviewing process, it help me learn
a lot. Also from now I learn a lot to use GDB (GNU Debugger) to debug
application.
At first I choose to use subject “Design and Implementation of a Framework for
Plugins”. But I rethink again because what I do in microproject is about
Testing. Finally I change my subject so I take “Design and Implementation of
Test Suite Using Libmicrohttpd” as my project. I send my proposal to project’s
mailing list [1]. After some reviewing and revision process, I officially sent
my proposal to GSoC homepage and my proposal was accepted.
The project aim to use Libmicrohttpd as test suite for Wget2. I planned to
complete this by change on function wget_test_start_server()
also
wget_test_stop_server()
from src/libtest.c of Wget2. With this
approach, I don’t need to change existing test suite which call the internal
server code through functions mentioned above.
I’ve count there are 36 test file which use
wget_test_start_server()
. I must ensure all the test passed. And
for installation prerequisite, I must ensure that Libmicrohttpd are included
when building Wget2 binary. Then I need to modify configure.ac. I will give
proper warning about this requirement. There is a section in README.md where I
must explain to user to provide Libmicrohttpd to make all test running
correctly. With Libmicrohttpd I can add new test using feature that not yet
implemented in old server code, but ready on Libmicrohttpd, such as HTTP
authentication and concurrent request checking.
Community Bonding Period
During this period, I spend my time to learn codebase about Wget2 and Libmicrohttpd. I was busy to learning them, that I forget to stay active in community. To prevent mentors give me minus points, I try to work on an issue. I try an easy one, adding enhancement for capabilities of file extended attributes. In short words, Wget2 could save target file’s extended attributes if filesystem support it. It is like the feature on Wget 1.x. To solve this issue, I have to dive a little bit on Wget2 codebase. That’s give me a view about how Wget2 works.
1st Week
There comes the first week of my official coding period. I was work on some
basic tasks for this projects, such as modify the build tools. I have modifed
configure.ac to include Libmicrohttpd into Wget2. I just include the package,
and not adding, modifying or removing anything else yet.
With Libmicrohttpd becomes mandatory package to install before building Wget2
binary, there must be proper warning about this requirement, otherwise the
building process will fail. I have add oneliner information into README.md.
Actually, I was misunderstood about this. Christian Grothoff then give me
suggestion to correct it. Dependency to Libmicrohttpd should not become
mandatory. The solution it to make conditionally-compile and run the tests only
if Libmicrohttpd is present while build Wget2. Libmicrohttpd does the same for
Libcurl. Making the dependency optional also avoids the obvious possibility of
circular dependencies if we ever were to add Libwget2-based tests to
Libmicrohttpd.
Tim Ruhsen also reminds that I should to skip the appropriate tests if
Libmicrohttpd is not installed/ available. I should definitely avoid to use
Wget2 legacy server code in Libwget and focus on client functionality instead.
Because after we successfully integrating Libmicrohttpd, we should remove the
legacy server code. I finally understood what they mean and will fix this the
next week.
On the CI/CD section, I have ensured that all make check passed on several
testing machine including: Debian/GCC, Fedora/Clang, MingW64 and OSX.
Fortunately, most of those OS have provided Libmicrohttpd package on their
respective repository, except MingW64 (the representation of Windows build).
Especially for MingW64 build, because I haven’t found the correct package for
Libmicrohttpd, I include Libmicrohttpd by download the source and compile
manually. What I’ve done is add the following lines on .gitlab-ci.yml:
before_script:
- dnf -y install wget
- wget http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.55.tar.gz
- tar zxf libmicrohttpd-0.9.55.tar.gz && cd libmicrohttpd-0.9.55/
- mingw64-configure --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/
- mingw64-make -j$(nproc)
- mingw64-make -j$(nproc) LOG_COMPILER=wine install
- cd -
I asking if my step was right. Tim give me advice on that MingW64 issue, that I
should provide a script (e.g. in contrib/ folder) that will
downloads/builds/installs Libmicrohttpd. That script then added to the CI runner
YAML file(s) so we can test on MinGW64 as well. This will keep us to stay run as
many tests as possible. He suggest that I should move my MinGW64 build script to
contrib in the end of GSOC as a cleanup.
On the other hand, Evgeny Grin tell me there is a package for Libmicrohttpd on
MinGW64, it provided on Msys2 project and has HTTPS support. Another solution,
is to use W32 binary build provided on GNU mirrors, but it has not HTTPS
support. I keep this information for later decision. For now, I should focus on
the test code first.
2nd Week
Things get more interesting. Because in this period, I will starting to work on
Wget2 main testing function. I started on wget_test_start_server()
.
I must change that function in order to call Libmicrohttpd as service for
wget_test()
. Workflow to resolve this:
- Disable initial process for HTTP server socket.
- Disable
_http_server_thread
, instead call new function which call Libmicrohttpd. - Create
_http_server()
function, wrapper for Libmicrohttpd. There is also functionahc_eco()
which use to create proper HTTP response.
Some issues I found in this period:
- Decide what the best threading model for Libmicrohttpd. I currently using
MHD_USE_INTERNALLY_POLLING_THREAD
which use external select. I still check the comparison with legacy code that use Wget2 APIwget_thread_start
. Darshit Shah give me a clue, that I should choose any mechanism that usesselect()
. Then we can change the threading model at a later stage if it turns out to be a bottleneck.epoll
is Linux-only and evenpoll
isn’t always available, so as long as I choose aselect
based implementation, it should be fine. Evgeny said that I can useMHD_is_feature_supported()
withMHD_FEATURE_POLL
andMHD_FEATURE_EPOLL
to check for supported polling functions. Alternatively, with latest versions of Libmicrohttpd I can useMHD_USE_AUTO
and Libmicrohttpd will chooseselect()
,poll()
or epoll-based polling automatically. -
I make the
http_server_port
still hardcoded. Darshit tell me that this becomes important note. The port should be a random number. Usually, passing 0 in the port number makes the kernel choose an open one for it. Having a randomised port is important to ensure that multiple runs don’t step on each other.
I think still don’t know how to accomplish this. Maybe, it just my understanding that when I pass 0 in MHD port number, the result is still 0. Another approach, when I look into the old code, it generate port number by callingwget_tcp_get_local_port()
. But, I need to callwget_tcp_init()
andwget_tcp_listen()
respectively in order to get proper result. Conclusion, do I need to use existingwget_tcp_get_local_port()
to get the port, or maybe there is a function in Libmicrohttpd to do that.
Tim added that all I need is the socket descriptor. How to callgetsockname()
+getnameinfo()
to retrieve the port number I see inlibwget/net.c
/wget_tcp_get_local_port()
. If Libmicrohttpd doesn’t have such a function, either try to get the socket descriptor or extend Libmicrohttpd with a small function (similar code as inwget_tcp_get_local_port
).
Evgeny give more detailed explanations. There are several ways to resolve it:- Initialise socket externally and start
listen()
on it. I can use any bind and port detection function. Pass socketFD
toMHD_start_daemon()
byMHD_OPTION_LISTEN_SOCKET
. - Use
MHD_start_daemon()
with “0” as port number then useMHD_get_daemon_info()
withMHD_DAEMON_INFO_LISTEN_FD
to get listen socket FD. Use any port detection. - Use
MHD_start_daemon()
with “0” as port number then useMHD_get_daemon_info()
withMHD_DAEMON_INFO_BIND_PORT
to get port number. Works withMHD_VERSION >= 0x00095501
and on platforms that supportgetsockname()
.
I can combine second and third methods.
- Initialise socket externally and start
int port_num;
if(0) {}
#if MHD_VERSION >= 0x00095501
else if (MHD_NO !=
MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
{
const union MHD_DaemonInfo *dinfo;
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
if (NULL == dinfo || 0 == dinfo->port)
{
/* Insert code to handle error. */
return -1;
}
port_num = (int)dinfo->port;
}
#endif /* MHD_VERSION >= 0x00095501 */
else
{
const union MHD_DaemonInfo *dinfo;
MHD_socket sock_fd;
dinfo = MHD_get_daemon_info (d, MHD_OPTION_LISTEN_FD);
if (NULL == dinfo)
{
/* Insert code to handle error. */
return -1;
}
sock_fd = dinfo->listen_fd;
/* Insert code to use port detection on provided socket. */
}
He add note that socket type used by MHD functions is MHD_socket
.
MHD_socket
is int
on POSIX platforms (Linux, *BSD, Unix, Darwin) and
SOCKET
on Windows platform (excluding Cygwin, where MHD_socket
is int
).
- In
ahc_eco()
of Libmicrohttpd, urls data still using static checking for matching with requested urls. In other word, it’s hardcoded. It needs to be changed to dynamic method to accomodate variadic data. - I still not touched HTTPS yet.
- I ask about what to do with FTP and FTPS functions. Since Libmicrohttpd just provide service for HTTP. I was asking, do we need keep the function for FTP{s}, or removing it. Darshit told me that we keep the FTP code intact for now. Then we should look into different libraries that provide a FTP server in C and try to integrate that into your test suite as well. But for this period, it is out of scope.
- The test was failed when I try to resolve URL with question mark. For example:
/subdir1/subpage1.html?query¶m
, when I debug, it return just/subdir1/subpage1.html
so the result is 404 not found. I also check using logging example source code provided in Libmicrohttpd tutorial. When I access using http client such as Wget2 and Firefox, the result is still the same. The URL result omit the query part. I confirm to Libmicrohttpd side about this, whether it is intended behaviour or not. Christian said it that’s intended, for URL parameters/arguments I need to useMHD_get_connection_values()
withkind=MHD_GET_ARGUMENT_KIND
to inspect them.
3rd Week
Based on feedback from mentors on the previous week, I made some fixes.
- Remove initial process for HTTP server socket.
- Create
_http_server_start()
function, wrapper for Libmicrohttpd. There is also functionanswer_to_connection()
which use to create proper HTTP response. - Use select method
(MHD_USE_SELECT_INTERNALLY)
for threading model in Libmicrohttpd to get better compatibility. http_server_port
seized automatically using Libmicrohttpd function by passingMHD_DAEMON_INFO_BIND_PORT
orMHD_DAEMON_INFO_LISTEN_FD
parameter toMHD_get_daemon_info()
.- Using iteration to parse urls data in
answer_to_connection()
. This guarantee we can pass any variadic data to Libmicrohttpd and prevent segmentation fault. - Fix
answer_to_connection()
function to create proper HTTP response (to deal with parameters and arguments on url, to add proper HTTP headers).
4th Week
Finally it comes to the end of the first period. I report to mentors what I’ve done in this week.
- I have finished modify configure.ac to include Libmicrohttpd into Wget2.
- I have ensured that all make check passed on several testing machine including: Debian/GCC, Fedora/Clang, MingW64 and OSX.
-
Started working on
wget_test_start_server()
. Workflow to resolve this:- Remove initial process for HTTP server socket.
- Create
_http_server_start()
function, wrapper for Libmicrohttpd. There is also functionanswer_to_connection()
which use to create proper HTTP response. - Use select method (
MHD_USE_SELECT_INTERNALLY
) for threading model in Libmicrohttpd to get better compatibility. - http_server_port seized automatically using Libmicrohttpd function by
passing
MHD_DAEMON_INFO_BIND_PORT
orMHD_DAEMON_INFO_LISTEN_FD
parameter toMHD_get_daemon_info()
. - Using iteration to parse urls data in
answer_to_connection()
. This guarantee we can pass any variadic data to Libmicrohttpd and prevent segmentation fault. - Fix
answer_to_connection()
function to create proper HTTP response (to deal with parameters and arguments on url, to add proper HTTP headers).
- I must ensure that all test suite running correctly. To give better
visualization, I’ve created spreadsheet about summary of test file which use
wget_test_start_server()
. Currently, as far as I know, it reaches 87.5% (28 of 32). I need to complete all test suite reach 100%.
After I send it to the mailing list, I have got many feedback from my mentors for this report.
When Darshit trying to check my code, he has noticed that I was working only
on a single branch and have only one commit until the date. This much work is
not enough for the mid semester evaluation. He asks me to split my work into
smaller commits which are discrete units of work. I follow up this with breaking
down my previous one big commit into smaller ones so it could represent my work
in period of time.
About the commit style, he gave me a clear clue. My commit messages are pretty
hard to read. Also, he asks to maintain the standard style of commit messages.
At Wget, the commit messages are converted into a ChangeLog, hence my message
should be written in that format.
git commit
Commit Message title (60 chars)
[Blank Line]
* file_changed(function_name): Description of change
* file_changed(function_name): Description of change
Any other details I want to write
The commit messages I have written are actually fine, but when it exceeds 60 chars in
the first line, I should convert my message to the longer format he just
described.
Another thing, he asks to not force push to my (master) branches. There are
other people that pull from these branches to check in on the code. If I force
push, it messes the repository up for all. Force pushing should only be reserved
as a last resort. However, in this case, when I rewrite the commit messages, I
should force push to my own current branch. That will allow me to maintain that
branch later.
The CI system states failures. He asks whether this is an expected failures. I
said that it not intended to be failure. On my machine which use Ubuntu/GCC, I
can run make check
, and some test could pass. Same like on Gitlab CI that use
Debian/GCC. Based on CI artifacts, most of them failed on make check-valgrind
that I miss to check before. I still find out how to deal with this memory leak
error. Actually, I still stuck in this. Then I ask, how to debug using Valgrind.
I read the error logs and it still it pointed me out of nowhere. He said that I
really should discuss these issues with them more. That is exactly why they are
here to mentor me. Valgrind’s memcheck tool which is what is being used in the
make check-valgrind
is a memory leak checker. He will look a little into it
once he can get the basic tests running on his machine. I asked to be focus on
that first. He said we will look into the memory leaks in a while. Most probably
the leaks happen because either I lost the pointer to some allocated memory or
are using the libmicrohttpd API wrong and forgot to free()
some data structure
returned by it.
He also sees that ./configure always tries to link Libmicrohttpd. But Wget2
should not depend on that. It should try to add the linker flags only when
trying to compile the test suite. The Wget2 binary should not use that flag. I
realize that was there are flaws in my code. I will figure out after some work
against other test files.
On his local system, not a single test passes. make check -j$(nproc)
causes a
segmentation fault and a simple make check
gets stuck on test-wget-1 and never
progresses ahead. He asks me to fix the branch and/or provide them with
information on how to make the tests work. I look at CI system with Fedora/Clang
and indeed the result is all segmentation faults. I still have no clue about
that. With this case, I cannot claim that I have almost 85% tests passing
already. From his perspective, it is still 0%.
In fact, all the tests that my spread sheet marks are passes, end up causing a
segfault on his system. This seems to stem from the fact that the
http_server_tid
is stored as “0” and I try to call pthread_cancel
on that
value. I asks for more detail information about this. I have use some advice
from Evgeny Grin how to deal with dynamic port. Even when I use hard coded port,
the result is still the same. He explains that he don’t think this is connected
to the port number at all. If it is, then my variable naming scheme requires a
serious change. This issue is happening because I have never stored the tid of
the server in the variable, but I still try to cancel that thread id. After I
take a look on my code again, I realize something wrong. Darshit was right. That
segmentation fault error happened because I forgot to remove
wget_thread_cancel
(http_server_tid
) which is used by the old code at server
termination time. After I remove that line, the CI runner of Fedora/Clang
passes some tests, not all test were resulted segmentation fault (14 of 32
pass, while 4 skipped). The other fail because likely Valgrind check error.
Darshit asks me to make sure that my code works as I have mentioned at least one day
before the deadline for the evaluations. On my Week 3 report I planned to get
100% of passing all of the test suite. But, until Week 4, my job still not yet
all done (even excluding other error generated outside make check
on
Debian/GCC system). I realized I have missed my (personal) target. Hence, he
asks me where do I think I missed out which caused me to fall behind. In
hindsight, he asks what according to me could have been done better. So, I and
they should be look into this together to see where it can be improved. He asks
what topics were I most stuck on, and why did it take me so much time. Also, if
I stuck on any single point for more than a day, he asks to send they a message.
There is a very good chance that they might be able to help me out and fix it
much faster.
Darshit sends a message to both Libmicrohttpd maintainers, Christian and Evgeny:
that the issues in Valgrind seem to come from within Libmicrohttpd. One of the
blocks reported by Valgrind is:
=26290== 72 bytes in 3 blocks are still reachable in loss record 6 of 6
==26290== at 0x4C2BEEF: malloc (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26290== by 0x7E06608: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x7E077FB: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x7EBEFB1: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x7EBF02F: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x7E0655F: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x7E06764: ??? (in /usr/lib/libgcrypt.so.20.1.7)
==26290== by 0x6634CF8: ??? (in /usr/lib/libmicrohttpd.so.12.43.0)
==26290== by 0x400F339: call_init.part.0 (in /usr/lib/[1]ld-2.25.so)
==26290== by 0x400F445: _dl_init (in /usr/lib/[2]ld-2.25.so)
==26290== by 0x4000D39: ??? (in /usr/lib/[3]ld-2.25.so)
==26290== by 0x9: ???
So, he guess is that this is some memory that is being allocated by Libmicrohttpd.
The test code does indeed seem to call MHD_stop_daemon()
which should
ideally ensure a clean exit. He asks, where did the implementation go wrong.
Christian said this is a bit hard to evaluate without the debug symbols. Most
likely it would be a false-positive from a globally allocated buffer of
Libgcrypt’s initialization sequence. He asks to download and install debug
symbols for Libgcrypt and ideally Libmicrohttpd. It is unlikely to be
Libmicrohttpd fault, as except for responses there are no Libmicrohttpd buffers
my code would have to free.
Evgeny gives a review about my works, direct pointed to the code.
static char *_scan_directory(const char* data)
{
char *path = strchr(data, '/');
if (path != 0) {
return path;
}
else
return NULL;
}
He asks why do I use underscore as prefix for functions. Usually it is used by libraries to avoid name conflict. First, I think that I need to remove the underscore, then Tim also give comment that this is also useful in projects where there is more than one C file. They use it to make clear that a function/variable is static (not consequently everywhere, though). So, I still keep the underscore.
static char *_parse_hostname(const char* data)
{
if (!wget_strncasecmp_ascii(data, "http://", 7)) {
char *path = strchr(data += 7, '/');
return path;
} else
return NULL;
}
static char *_replace_space_with_plus(char *data)
{
if (strchr(data, ' ') != 0) {
char *result = data;
char *wk, *s;
wk = s = strdup(data);
while (*s != 0) {
if (*s == ' '){
*data++ = '+';
++s;
} else
*data++ = *s++;
}
*data = '\0';
free(wk);
return result;
} else
return data;
}
He asks me about the reason for using strdup()
/free()
. I checked string
twice (by strchr()
and by my custom iterations). It just waste of CPU time.
He gives simpler implementation:
{
while(0 != *data)
{
if (' ' == *data)
*data = '+';
data++;
}
return data;
}
I applied the changes to my code.
Evgeny also give note that according to current HTTP specification ‘+’ must NOT be
used as replacement for ‘ ’ in URLs. When I learn about this problem, it
leads me to here [2]. Then if it need to be applied, I need to modify test
file: test-base.c to not use ‘+’, and use %2B instead.
Tim added that the ‘+’ was always just for the query part. He asks to Evgeny
what document are you exactly referring to to. Not that he is against dropping
the ‘+’ rule, but what consortium is not accepted as normative by everyone,
while IETF is. He is unsure about what ‘spec’ to follow. So, I keep my changes
of ‘+’.
static int print_out_key(void *cls, enum MHD_ValueKind kind, const char *key,
const char *value)
{
if (key && url_it == 0 && url_it2 == 0) {
wget_buffer_strcpy(url_arg, "?");
_replace_space_with_plus((char *) key);
Evgeny said that we are not allowed to modify any content pointed by pointer to const. By dropping ‘const’ qualifiers are violating API. In other words: I was modifying internal structures that are not expected to be modified and the result is unpredictable. I fixed them then.
wget_buffer_strcat(url_arg, key);
if (value) {
wget_buffer_strcat(url_arg, "=");
_replace_space_with_plus((char *) value);
wget_buffer_strcat(url_arg, value);
}
}
if (key && url_it != 0 && url_it2 == 0) {
wget_buffer_strcat(url_arg, "&");
_replace_space_with_plus((char *) key);
wget_buffer_strcat(url_arg, key);
if (value) {
wget_buffer_strcat(url_arg, "=");
_replace_space_with_plus((char *) value);
wget_buffer_strcat(url_arg, value);
}
}
url_it++;
return MHD_YES;
}
He also gives me some questions:
- Is
url_arg
a global variable? - Do I use single thread only?
- Why not to pass pointer to
url_arg
ascls
? - What about
url_it
andurl_it2
? It is hard to guess meaning from name.
If I need to pass all of them, I was advised to define some structure with three pointers and pass pointer to structure.
static int answer_to_connection (void *cls,
struct MHD_Connection *connection,
const char *url,
const char *method,
const char *version,
const char *upload_data, size_t *upload_data_size, void **con_cls)
{
struct MHD_Response *response;
int ret;
url_arg = wget_buffer_alloc(1024);
MHD_get_connection_values (connection, MHD_GET_ARGUMENT_KIND, print_out_key, NULL);
url_it2 = url_it;
wget_buffer_t *url_full = wget_buffer_alloc(1024);
wget_buffer_strcpy(url_full, url);
if (url_arg)
wget_buffer_strcat(url_full, url_arg->data);
if (!strcmp(url_full->data, "/"))
wget_buffer_strcat(url_full, "index.html");
url_it = url_it2 = 0;
unsigned int itt, found = 0;
for (itt = 0; itt < nurls; itt++) {
char *dir = _scan_directory(url_full->data + 1);
if (dir != 0 && !strcmp(dir, "/"))
wget_buffer_strcat(url_full, "index.html");
char *host = _parse_hostname(url_full->data);
if (host != 0 && !strcmp(host, "/"))
wget_buffer_strcat(url_full, "index.html");
wget_buffer_t *iri_url = wget_buffer_alloc(1024);
wget_buffer_strcpy(iri_url, urls[itt].name);
MHD_http_unescape(iri_url->data);
if (urls[itt].code != NULL &&
!strcmp(urls[itt].code, "302 Redirect") &&
!strcmp(url_full->data, iri_url->data))
{
response = MHD_create_response_from_buffer(strlen("302 Redirect"),
(void *) "302 Redirect", MHD_RESPMEM_PERSISTENT);
for (int itt2 = 0; urls[itt].headers[itt2] != NULL; itt2++) {
const char *header = urls[itt].headers[itt2];
if (header) {
char *header_value = strchr(header, ':');
char *header_key = wget_strmemdup(header, header_value - header);
MHD_add_response_header(response, header_key, header_value + 2);
ret = MHD_queue_response(connection, MHD_HTTP_FOUND, response);
wget_xfree(header_key);
itt = nurls;
found = 1;
} else
itt = nurls;
}
} else if (!strcmp(url_full->data, iri_url->data)) {
response = MHD_create_response_from_buffer(strlen(urls[itt].body),
(void *) urls[itt].body, MHD_RESPMEM_PERSISTENT);
He asks me again to ensure that content of urls[itt].body
will be valid until
end of this connection. Otherwise you must use MHD_RESPMEM_MUST_COPY
as last
parameter. I followed his advice and fix my code.
Two generic advises he gave to me:
- Avoid using global variables.
- Use better names for variables. It it hard to understand what mean
iri_url
,itt
anditt2
.
First Period Evaluations
After finish my 4th period report, I also must complete first evaluation report
via GSoC web app. I passed the evaluations, but with warning. Mentors give me an
important messages about what happened and what should I improve.
The project is indeed behind schedule. The mentors still give me a chance by passing
me in the hopes that I and they will be able to improve the communication and
get the project back on track. One major suggestion is that I increase the
frequency of my project reports from weekly to daily. Just a single line at the
end of each day stating what I have done and what are my plans for the next
day.
Conclusion
That was though days with my first time period of GSoC. There was many jobs left to be finished in the next period. Mistakes happen, but I was learn a lot from them.
Reference(s):
[0] https://github.com/rockdaboot/wget2/pull/155
[1] https://lists.gnu.org/archive/html/bug-wget/2017-03/msg00156.html
[2] https://stackoverflow.com/questions/1005676/urls-and-plus-signs


This email was sent to you by elegchic.com. To ensure that our updates get to you(not bulk or junk folders), please add our e-mail address to your address book or safe list.
If you have any questions regarding your orders or products, please contact us at
service@elegchic.com.


I tried something new today with my students – I asked them to rate their confidence in their answers on a 1 (total guess) to 4 (definitely know I know it) scale. I collected the aggregate information for each class and started flagging issues.
First, this only took me about 5 minutes to do. So, after we finished the questions, they started working on their review for our test this week. I pulled in the numbers, ran a formula or two, and had the percent correct for each item as well as the average confidence. Then, we started talking about what they noticed.
Some noticed right away that a few questions were more missed than others. Someone also noticed that questions with a high percent correct tended to have a high confidence rating. The same was true for lower-scoring questions. I then pointed out what I was really interested in:
Discrepancy.
I saw nods and furrowed brows as I pointed out low-scoring questions with high confidence ratings. It doesn’t compute. If so many people got it wrong, why were we so sure it was right?
This highlights areas I need to go back and review again, which is really nice. It also helps students reach a metacognitive place on their own work – it was only 6 questions, so they know what they got right and wrong.
Different classes, different priorities.
And then here’s the aggregate data for all classes:
For now, I’m adding the red flags myself based on an arbitrary percentage and confidence level discrepancy. I’m doing that because I don’t know of any other way to make that comparison. So, here’s the question:
Are there statistical analyses that can be done on two-variable data (correct vs. confidence) which can then highlight areas significantly lower than expected?
I even went so far as to perform a correlation test on the data, which shows a definite positive correlation between the score and student confidence:
But again, I don’t know how to set up that discrepancy benchmark statistically. I may be thinking too hard about this, but I’d really like to have more to go on than, “This one is low compared to confidence.” It’s also a very small sample, and I know most correlation tests (t-Test, ANOVA, etc) require 10 samples, usually, so I’m not putting a ton of weight on the stats.
If you have any experience in this kind of analysis, I’d appreciate some pointers in the comments.
Written on April 27th, 2015 by Brian Bennett Categorized in: All Teaching
Leave a comment


This inspection checks for problems in invocations of named XSLT templates, such as missing arguments, passing arguments that are not declared by the template or passing an argument for a certain parameter more than once.
The inspection assumes that parameters declared with a default-value are optional and will not complain if an invocation does not specify an argument for such parameters.


Toggle navigation
CMU-SUMMIT
AGENDA
SPEAKERS
Opening Remarks
Keynote Speakers
Panel Speakers
PANELS
IE
Start-up
Sustainability
High Tech
Finance
COMPETITION
COLLABRATORS
CAREER
Recruiters
Jobfair
RESOURCES
ABOUT US
Agenda
April 9, 2016
Registration
09:00am-09:45am
Opening Remarks
09:45am-10:15am
Keynote One
10:15am-10:45am
Coffee Break
10:45am-11:00am
Keynote Two
11:00am-11:30am
Keynote Three
11:30am-12:00pm
12:00pm-01:00pm
Lunch Event
01:00pm-01:30pm
Keynote Four
01:30pm-03:00pm
Finance Panel
03:00pm-03:15pm
Coffee Break
03:15pm-04:45pm
High Tech Panel
04:45pm-06:15pm
Energy & Sustainability Panel
07:00pm-08:00pm
Private Dinner (Invite Only)
April 10, 2016
Registration | Free Breakfast
08:30am-09:00am
Innovation and Entrepreneurship Panel
09:00am-10:40am
Break (Refreshments Provided)
10:40am-10:50am
Start-up Panel
10:50am-12:20pm
12:20pm-02:30pm
Job Fair (Including Lunch)
02:45pm-03:15pm
Keynote Five
03:20pm-06:20pm
New Venture Competition
06:30pm-06:50pm
Closing Remarks
Welcome!


Type library Revision Current Public Version 1.1 Keywords together Sample code github samples See also http://playstogether.com Availability Starter, Basic, Pro
The Together class is the root class in the Together api. It contains essential configuration settings, an object representing the logged in User, and various Managers for creating, deleting, and retrieving various Together objects.
It is best to assign the GetInstance call to a global either you have created or to the declared global in the library, "g_Together". After signing up you can connect/login by passing your generated keys to the initialization call of the created instance.
local together = require("plugin.together");
g_Together = together:GetInstance();
g_Together:Initialize(yourPublicKey, yourPrivateKey, yourGameKey, yourPlatform);
All network methods that require a callback function will invoke your callback with the same object. Details about this "Event" object can be found here.
When you build using the Corona Simulator, the server automatically takes care of integrating the plugin into your project.
All you need to do is add an entry into a plugins
table of your build.settings
. The following is an example of a minimal build.settings
file:
settings =
{
plugins =
{
-- key is the name passed to Lua's 'require()'
["plugin.together"] =
{
-- required
publisherId = "com.playstogether",
},
},
}
You can access sample projects from the Git repository here.
Follow this tutorial for getting started quickly and making your own memory game.
A TogetherCache class instance used to Load and Save the together cache on the Device.
A TogetherSocial class instance containing various social apis.
A GameInstanceManager class instance useful for storing GameInstances the logged in User is a member of.
A LeaderboardManager class instance useful for storing Leaderboards.
A UserMessageManager class instance for sending and receiving in game messages or emails
A UserNotificationManager class instance useful for storing UserNotifications.
A AchievementManager class instance useful for storing Achievements.
A ItemManager class instance useful for storing Items.
A ChatRoomManager class instance useful for storing ChatRooms.
A FriendManager class instance useful for storing together Friends.
A UserPurchaseManager class instance useful for storing UserPurchases.
How often the ping message is sent to the server.
The last time a ping message was sent to the server.
The DeviceToken for Apple push notifications.
A boolean indicates whether the push enabled Device has been registered with the server.
The cached UserGuid of the last logged in User.
The IP address of the together server.
The PublicKey of the Together Client the Game belongs to.
The PrivateKey of the Together Client that Game belongs to.
The Key of the Together Game.
The name of the platform the Game is running on. (IOS, Android, Mac OS, Unity, HTML5/JS)
The ApplicationID of the Facebook application.
The Facebook privileges to ask for when logging into Facebook.
A TogetherUser class instance representing the logged in User.
A TogetherUserSession class instance representing the logged in UserSession.
Gets or creates the instance of global 'g_Together'
Shorthand for fetching the TogetherUser.UserID property.
Shorthand for fetching the TogetherUser.Username property.
Shorthand for fetching the TogetherUser.Name property.
Shorthand for calling the TogetherUser:GetViewName method.
Checks to see if the User is registered via Facebook.
Checks to see if the User is registered via Custom.
Finds the TogetherFriend with the specified UserID.
Together:FindTogetherFriendByUserID( userID )
Finds the TogetherFriend with the specified SocialID (FacebookID). Finds the FacebookFriend with the specified SocialID (FacebookID).
Together:FindTogetherFriendBySocialID( userID, userID )
Gets the session token returned when the User logged in.
Initializes the Together class so it's ready to make API requests.
Together:Initialize( clientPublicKey, clientPrivateKey, gameKey, platformName )
string clientPublicKey
The PublicKey assigned to your account. This is accessible from the playstogether developer portal.
string clientPrivateKey
The PrivateKey assigned to your account. This is accessible from the playstogether developer portal.
string gameKey
The GameKey of the game you are connecting to. This is accessible from the playstogether developer portal.
string platformName
The Name of the Platform the game is running on. Supported Platforms are:
("IOS", "Android", "Mac OS", "Unity", "HTML5/JS")
Sets the ApnsDeviceToken that will be used when registering the device for push notifications.
Together:SetApnsDeviceToken( apnsDeviceToken )
Sets the ServerAddress all network messages will be sent to when talking to the together servers. This defaults to the primary Together servers and does not need to be called unless you are working with a form of private/local server instance. If you are interested in private hosting and want more information, contact .
Together:SetServerAddress( serverAddress )
Gets the ServerAddress all requests are being sent to.
Sets the Facebook ApplicationID all Facebook related calls will use.
Together:SetFacebookAppID( facebookAppID, facebookPrivileges )
string facebookAppID
The ApplicationID of the Facebook application.
table facebookPrivileges
A table full of Facebook privileges to ask for when logging into Facebook.
Loads the Together Cache from the Device. The only thing stored in the TogetherCache currently is the UserGuid of the last logged in user for the application.
Saves the Together Cache to the Device. The only thing stored in the TogetherCache currently is the UserGuid of the last logged in user for the application.
Erases the Together Cache from the Device. The only thing stored in the TogetherCache currently is the UserGuid of the last logged in user for the application.
Logs in the User. This should always be the first Together network message called. If no User GUID is provided, a new user account will be created anonymously and assigned a GUID which can be used to log the user in again later or register them with Facebook or via Custom form.
Note Currently anonymous users will NOT be deleted. However it is possible that a user cleansing system will be implemented in the future that removes unregistered accounts after 3 to 6 months of inactivity.
Together:LoginUser( callbackFunc )
Gets the Server Timestamp(UTC+0). The timestamp will be returned in the data member of the callback as a long.
Together:GetServerTimeUTC( callbackFunc )
Fetches your developer global profile of data set through the portal or by atomic operations. The callback object will contain the profile in the data member as a PropertyCollection type.
Together:GetGlobalProfile( callbackFunc )
Fetches the game's profile of data set through the portal or by atomic operations. The callback object will contain the profile in the data member as a PropertyCollection type.
Together:GetGameProfile( callbackFunc )
Fetches the current, logged in user's profile for the game. The callback object will contain the profile in the data member as a PropertyCollection type. This is also retrieved when the User object for the local player is fetched and can be modified with the User.Modify() call.
Together:GetUserProfile( callbackFunc )
Adds an atomic field to either the game profile or the global profile. The callback object will contain a Property type in the data field.
Together:AddAtomic( global, parentName, propertyName, propertyValue, callbackFunc )
boolean global
Pass TRUE to add the atomic entry to the global profile, FALSE to add it to the game profile
string parentName
The name of an existing parent collection in which to add the atomic entry to
string propertyName
The name of the atomic field to add
string propertyValue
The value of the atomic entry to apply
function callbackFunc
The function to call upon completion.
Increments an existing atomic property in either the game profile or global profile without an upper limit. The callback object will contain a Property type in the data field.
Together:IncrementAtomic( global, parentName, propertyName, callbackFunc )
boolean global
Pass TRUE to increment an entry in the global profile, FALSE to increment an entry in the game profile
string parentName
The name of an existing parent collection containing the property
string propertyName
The name of the property to increment
function callbackFunc
The function to call upon completion.
Increments an existing atomic property in either the game profile or global profile with a passed upper limit. The callback object will contain a Property type in the data field.
Together:IncrementAtomicWithLimit( global, parentName, propertyName, limit, callbackFunc )
boolean global
Pass TRUE to increment an entry in the global profile, FALSE to increment an entry in the game profile
string parentName
The name of an existing parent collection containing the property
string propertyName
The name of the property to increment
number limit
The upper limit of the atomic operation as an integer
function callbackFunc
The function to call upon completion.
Increments an existing atomic property in either the game profile or global profile with a reference to a limit elsewhere in the profile. The callback object will contain a Property type in the data field.
Together:IncrementAtomicWithLimitRef( global, parentName, propertyName, refParent, refProperty, callbackFunc )
boolean global
Pass TRUE to increment an entry in the global profile, FALSE to increment an entry in the game profile
string parentName
The name of an existing parent collection containing the property
string propertyName
The name of the property to increment
string refParent
The name of the parent collection containing the property to be used as the limit
string refProperty
The name of the property in the referenced parent to be used as the limit
function callbackFunc
The function to call upon completion.
Registers the User with Facebook. TogetherSocialFacebook:Login() calls this method upon successfully logging into facebook.
Together:RegisterFacebook( facebookID, name, firstName, lastName, link, username, gender, locale, callbackFunc )
string facebookID
The FacebookID of the facebook user.
string name
The name of the facebook user.
string firstName
The first name of the facebook user.
string lastName
The last name of the facebook user.
string link
The link to the facebook user.
string username
The username of the facebook user.
string gender
The gender of the facebook user.
string locale
The locale of the facebook user.
function callbackFunc
The function to call upon completion.
Registers the User with the custom registration system.
Together:RegisterCustom( email, password, name, callbackFunc )
string email
The email of the Custom user.
string password
The password of the Custom user.
string name
The name of the Custom user.
function callbackFunc
The function to call upon completion.
Logs out the User. If the user did not registered, this will mark the account inactive but is reactivated at the next login with the same user GUID.
Note Currently anonymous users will NOT be deleted. However it is possible that a user cleansing system will be implemented in the future that removes unregistered accounts after 3 to 6 months of inactivity.
Together:Logout( callbackFunc )
Registers a push enabled Device. Use by setting ApnsDeviceToken and/or GcmDeviceToken and/or WnsDeviceToken first then calling.
Together:RegisterPushEnabledDevice( callbackFunc )
Sends a push notification message.
Note This counts towards Push Notifications on your developer account and does not count as a System Request.
Together:SendPushNotification( destUserID, notificationMessage, platform, data, callbackFunc )
number destUserID
The ID of the User to send the push notification to.
string notificationMessage
The message to send.
string platform
the platform that the message is being sent to: ios or android
TogetherNotification data
the TogetherNotification to be sent to the server
function callbackFunc
The function to call upon completion.
Adds an Analytic event for the User with simple options.
Together:AddAnalytic( eventName, propName, propValue, callbackFunc )
string eventName
The name of the event to assign to the analytic record.
string propName
The name of the property to assign to the analytic record.
string propValue
The value of the property to assign to the analytic record.
function callbackFunc
The function to call upon completion.
Adds an Analytic event for the User with extended options.
Together:AddAnalyticEx( eventName, propertyCollection, callbackFunc )
string eventName
The name of the event to assign to the analytic record.
PropertyCollection propertyCollection
Collection of data to add to the event record
function callbackFunc
The function to call upon completion.


Garbage occurs if objects refer too each other in a circular fashion. Such reference cycles cannot be freed automatically and must be collected by the garbage collector. While it is sometimes hard to avoid creating reference cycles, preventing such cycles saves garbage collection time and limits the lifetime of objects. Moreover, some objects cannot be collected by the garbage collector.
Reference cycles can be visualized with the help of graphviz.
The GarbageGraph is a ReferenceGraph that illustrates the objects building reference cycles.  The collected objects are then illustrated in a directed graph.
Large graphs can be reduced to the actual cycles by passing reduce=True to the constructor.
 If collectable is true, every reference cycle is recorded. Otherwise only uncollectable objects are reported.
Render the graph to filename using graphviz. The graphviz invocation command may be overriden by specifying cmd. The format may be any specifier recognized by the graph renderer (‘-Txxx’ command). The graph can be preprocessed by the unflatten tool if the unflatten parameter is True. If there are no objects to illustrate, the method does not invoke graphviz and returns False. If the renderer returns successfully (return code 0), True is returned.
An OSError is raised if the graphviz tool cannot be found.
Split the graph into sub-graphs. Only connected objects belong to the same graph. split yields copies of the Graph object. Shallow copies are used that only replicate the meta-information, but share the same object list self.objects.
>>> from pympler.refgraph import ReferenceGraph
>>> a = 42
>>> b = 'spam'
>>> c = {a: b}
>>> t = (1,2,3)
>>> rg = ReferenceGraph([a,b,c,t])
>>> for subgraph in rg.split():
... print (subgraph.index)
0
1
Write raw graph data which can be post-processed using graphviz.
Log annotated garbage objects to console or file.
| Parameters: | stream – open file, uses sys.stdout if not given |
|---|


Item:
Black bean purses
Southwestern Napoleons
Coconut-Corn Chowder
Jerk Rotisserie Chicken
Thai Shrimp Kebabs
Pasta Puttanesca
Quantity:
Name:
Collection Date:
Submit
Reset


System requirements
Building the Zoltan library
Testing the Zoltan library
Reporting bugs in Zoltan
Incorporating Zoltan into Applications
Building applications that use Zoltan
Data types for global and local IDs
C++ interface
F90 interface
cd zoltan/BUILD_DIROptions to the configure command allow paths to third-party libraries such as ParMETIS, PT-Scotch and PaToH to be specified. Building with MPI compilers (e.g., mpicc) is the default for Autotools builds of Zoltan; many options allow specification of particular MPI paths and compilers.
../configure {options described below}
make everything
make install
Users desiring a Fortran90 interface to Zoltan must specify the "--enable-f90interface" option.
All options can be seen with the following command issued in the zoltan/BUILD_DIR directory:
../configure --help
The following script is an example of configuration and build commands using Autotools. It specifies that Zoltan should be built with both the ParMETIS and PT-Scotch interfaces. Paths to both ParMETIS and PT-Scotch are given. The prefix option states where Zoltan should be installed; in this example, Zoltan's include files will be installed in /homes/username/zoltan/BUILD_DIR/include, and the libraries will be installed in /homes/username/zoltan/BUILD_DIR/lib. This examples assumes the script is run from /homes/username/zoltan/BUILD_DIR.
#
../configure \
--prefix=/homes/username/zoltan/BUILD_DIR \
--with-gnumake \
--with-scotch \
--with-scotch-incdir="/Net/local/proj/zoltan/arch/all/src/Scotch5" \
--with-scotch-libdir="/Net/local/proj/zoltan/arch/linux64/lib/openmpi/Scotch5" \
--with-parmetis \
--with-parmetis-incdir="/Net/local/proj/zoltan/arch/all/src/ParMETIS3" \
--with-parmetis-libdir="/Net/local/proj/zoltan/arch/linux64/lib/openmpi/ParMETIS3"
make everything
make install
The configure script also allows you to specify the data type for a global identifier. The choices are unsigned int, unsigned long, and unsigned long long. The default data type is unsigned int. If your space of global identifiers requires more than 32 bits, you can specify a 64-bit data type.
--with-id-type=uint
--with-id-type=ulong
--with-id-type=ullong
Support of 64-bit identifiers is new as of Zoltan version 3.5. At this point in time all methods except for refinement tree partitioning have been modified to work with 64-bit identifiers. Zoltan's Fortran90 interface does not yet support 64-bit identifiers.
More examples are in the directory zoltan/SampleConfigurationScripts.
After the configuration is done in the build directory, object files and executables can be removed with make clean; the same configuration will be used for subsequent builds. Configuration information is removed with make distclean.
cd Trilinos/BUILD_DIR
cmake \
-D Trilinos_ENABLE_ALL_PACKAGES:BOOL=OFF \
-D Trilinos_ENABLE_Zoltan:BOOL=ON \
{options described below} \
..
make
make install
CMake also allows you to specify the data type for a global identifier. The choices are unsigned int, unsigned long, and unsigned long long. The default data type for a global identifier is unsigned int. The options to set the global identifier data type are shown below.
-D Zoltan_ENABLE_UINT_IDS:Bool=ON
-D Zoltan_ENABLE_ULONG_IDS:Bool=ON
-D Zoltan_ENABLE_ULLONG_IDS:Bool=ON
Support of 64-bit identifiers is new as of Zoltan version 3.5. At this point in time all methods except for refinement tree partitioning have been modified to work with 64-bit identifiers. Zoltan's Fortran90 interface does not yet support 64-bit identifiers.
Serial builds are the default in Trilinos; for serial builds, Zoltan builds and links with the siMPI library provided by Pat Miller in the Zoltan distribution. More commonly, Zoltan users desire parallel builds with MPI libraries such as OpenMPI or MPICH. For such builds, users must specify CMake option
-D TPL_ENABLE_MPI:BOOL=ONTrilinos also defaults to using a Fortran compiler, but Fortran is not required to build Zoltan; the option to disable this check is
Other options to the cmake command allow paths to third-party libraries such as ParMETIS, PT-Scotch and PaToH to be specified.
Users desiring a Fortran90 interface
to Zoltan must
specify the option
-D Zoltan_ENABLE_F90INTERFACE:BOOL=ON
All options can be seen with the following command issued in the Trilinos/BUILD_DIR directory:
rm CMakeCache.txt
cmake -LAH -D Trilinos_ENABLE_Zoltan:BOOL=ON ..
The following script is an example of configuration and build commands using CMake. It specifies that Zoltan should be built with both the ParMETIS and PT-Scotch interfaces. Paths to both ParMETIS and PT-Scotch are given. The prefix option states where Zoltan should be installed; in this example, Zoltan's include files will be installed in /homes/username/Trilinos/BUILD_DIR/include, and the libraries will be installed in /homes/username/Trilinos/BUILD_DIR/lib.
More details of CMake use in Trilinos are
in
Trilinos/cmake/TrilinosCMakeQuickstart.txt.
The "right" answer for these tests depends on the number of processes with which you run the tests. In general, if they compile successfully, run quickly (in seconds), and produce reasonable looking output, then Zoltan is built successfully.
The C++ interface to Zoltan is implemented in header files which define classes that wrap the Zoltan C library. The file include/zoltan_cpp.h defines the Zoltan class which encapsulates a load balancing data structure and the Zoltan load balancing functions which operate upon it. Include this header file instead in your C++ application. Note that C++ applications should call the C function Zoltan_Initialize before creating a Zoltan object.
Fortran applications must USE module zoltan and specify the Zoltan installation's include directory as a directory to be searched for module information files.
The C, C++ or Fortran application should then be linked with the Zoltan library (built with Fortran support in the Fortran case) by including
-lzoltanin the linking command for the application. Communication within Zoltan is performed through MPI, so appropriate MPI libraries must be linked with the application. Third-party libraries, such as ParMETIS, PT-Scotch and PaToH, must be also be linked with the application if they were included in compilation of the Zoltan library.
The installed files include/Makefile.export.zoltan* contain macros that can specify Zoltan paths and libraries in an application's Makefiles. Using these files, applications can be assured they are using the same build options that were used when Zoltan was built.
Definitions of ZOLTAN_ID_TYPE and ZOLTAN_ID_MPI_TYPE are in include/zoltan_types.h; they can be used by an application for memory allocation, MPI communication, and as arguments to load-balancing interface functions and application-registered query functions. In the Fortran interface, IDs are passed as arrays of integers since unsigned integers are not supported in Fortran. See the description of the Fortran interface for more details.
The local IDs passed to Zoltan are not used by the library; they are provided for the convenience of the application and can contain any information desired by the application. For instance, local array indices for objects may be passed as local IDs, enabling direct access to object data in the query function routines. See the application-registered query functions for more details. The source code distribution contains an example application zdrive in which global IDs are integers and local IDs are local array indices. One may choose not to use local ids at all, in which case NUM_LID_ENTRIES may be set to zero.
Some Zoltan routines (e.g., Zoltan_LB_Partition and Zoltan_Invert_Lists) allocate arrays of type ZOLTAN_ID_PTR and return them to the application. Others (e.g., Zoltan_Order and Zoltan_DD_Find) require the application to allocate memory for IDs. Memory for IDs can be allocated as follows:
ZOLTAN_ID_PTR gids;The system call malloc may be used instead of ZOLTAN_MALLOC.
int num_gids, int num_gid_entries;
gids = (ZOLTAN_ID_PTR) ZOLTAN_MALLOC(num_gids * num_gid_entries * sizeof(ZOLTAN_ID_TYPE);


| Created: | 1/27/2021 3:41:58 PM |
| Modified: | 1/27/2021 3:41:58 PM |
| Project: | |
| Advanced: |
| Attribute |
|
Public bigint user_id |
|
Details:
|
|
Public varchar(255) user_sub |
|
Details:
|
|
Public varchar(255) user_first_name |
|
Details:
|
|
Public varchar(255) user_last_name |
|
Details:
|
|
Public varchar(255) user_email |
|
Details:
|
|
Public timestamp with time zone(0) created_at |
|
Details:
|
|
Public timestamp with time zone(0) updated_at |
|
Details:
|
|
Public bigint created_by_user_id |
|
Details:
|
|
Public varchar(255) created_by_user_sub |
|
Details:
|
|
Public varchar(255) created_by_user_first_name |
|
Details:
|
|
Public varchar(255) created_by_user_last_name |
|
Details:
|
|
Public varchar(255) created_by_user_email |
|
Details:
|
|
Public bigint updated_by_user_id |
|
Details:
|
|
Public varchar(255) updated_by_user_sub |
|
Details:
|
|
Public varchar(255) updated_by_user_first_name |
|
Details:
|
|
Public varchar(255) updated_by_user_last_name |
|
Details:
|
|
Public varchar(255) updated_by_user_email |
|
Details:
|
|
Public bigserial ods_id |
|
Details:
|
|
Public jsonb ods_meta |
|
Details:
|
|
Public varchar(255) ods_created_by |
|
Details:
|
|
Public timestamp with time zone(0) ods_created_at |
|
Details:
|
|
Public varchar(255) user_oid |
|
Details:
|
|
Public varchar(255) created_by_user_oid |
|
Details:
|
|
Public varchar(255) updated_by_user_oid |
|
Details:
|
| Operation | ||
|
Public users_pkey( ods_id: bigserial, |
||
|
Details:
<<PK>>
|
| Tag | Value |
| Owner | public |
|
Details:
|
| Property | Value |
| isFinalSpecialization: | 0 |


|
|
|
DOCKET NUMBER |
PLAINTIFF TRIBE |
PAGE NUMBER |
|
67 consolidated with 124, 314, 337 • Intervenors: 15-D, 29-B, 89, 311, 315 |
The Miami Tribe of Oklahoma, also known as the Miami Tribe • Harley T. Palmer, Frank C. Pooler and David Leonard, as representatives of the Miami Tribe and all of the members thereof
Amended and Additional Findings of Fact
Opinion of the Commission
Opinion
Conclusions of Law and Final Award
|
1
3
19
24-a
|
|
93 |
The Snoqualmie Tribe of Indians on its own behalf, and on relation of the Skykomish Tribe of Indians
Findings of Fact
Opinion of the Commission
Interlocutory Order
|
25
41
48-a
|
|
180-A |
Charles E. Williams, Joseph Redthunder and Harry Owhi, as representatives of the Nez Perce Tribe
Final Judgment
|
48-c
|
|
314-Amended |
The Peoria Tribe of Indians of Oklahoma, et al.
On Petitioners' Motion for Partial Summary Judgment
Order Granting in Part and Denying in Part Petitioners' Motion for Partial Summary Judgment
|
49
60-a
|
|
17 |
The Snake or Piute Indians of the Former Malheur Reservation, in Oregon
Opinion of the Commission
Order Allowing Reimbursable Expenses Incurred
|
67
73-a
|
|
44, 45 |
The Uintah Ute Indians of Utah
Order Allowing Fees to Attorney for the Uintah Ute Indians of Utah in Dockets No. 44 and 45
|
74
|
|
68 |
The Ottawa Tribe Indians
Order of Dismissal
|
80
|
|
10 |
Pawnee Indian Tribe of Oklahoma, consisting of the four confederated bands of Pawnee Indians, namely: Chaui or Grand Pawnee, Kitkehahki or Republican Pawnee, Pitahauerat or Tappage Pawnee, and Skidi, Loup or Wolf Pawnee
Additional Findings of Fact
Opinion of the Commission
Interlocutory Order Amending Findings of Fact and the Third Interlocutory Order of June 14, 1960
Supplemental Opinion
Order Amending Interlocutory Order of January 31, 1961
Amended Conclusions of Law and Final Award
|
82
85
93-a
94-a
97-a
97-c
|
|
303 |
The Ottawa Tribe and Guy Jennison, Bronson Edwards and Gene Jennison, as representatives of the Ottawa Tribe
On Defendant's Motion for Rehearing
Order Admitting Additional Evidence and Overruling Motion of Defendant for Rehearing
|
98
107-a
|
|
67 |
The Miami Tribe of Oklahoma, also known as the Miami Tribe and Harley T. Palmer, Frank C. Pooler and David Leonard, as representatives of the Miami of Tribe and all of the members thereof
Additional Opinion
Order Overruling Defendant's Motion for Rehearing
|
108
161-a
|
|
173 |
The Cherokee Nation or Tribe of Indians
Findings of Fact
Opinion of the Commission
Interlocutory Order
|
162
197
235-a
|
|
331 |
The Spokane Tribe of Indians, sueing on its own behalf and on behalf of the Upper, Middle Spokane, or Lower Spokane Band of Indians, or any one or two of them alternatively
Findings of Fact
Opinion of the Commission
Interlocutory Order
|
236
254
273-a
|
|
314-Amended |
The Peoria Tribe of Indians of Oklahoma and Amos Robinson Skye on behalf of the Wea Nation
Findings of Fact
Opinion
Interlocutory Order
|
274
289
300-a
|
|
135-A |
The Sac and Fox Tribe of Indians of Oklahoma, the Sac and Fox Tribe of the Missouri, Sac and Fox Tribe of the Mississippi in Iowa, and Edward Mack, Pauline Lewis, William Newashe, Amos Black, Kenneth Youngbear, Charles Davenport, Albert Davenport, Percy Bear, and Columbus Keahna, appearing as the representatives and on the relation of the Sac and Fox of the Mississippi, and as representatives and on behalf of all the members thereof, and together with Charles W. Robidoux, John Connell, Dorothy Gilfillian, Thomas Green and Thomas Herrick, appearing as the representatives of and on the relation of the Confederated or United Tribes of Sac and Fox Indians and as representatives and on behalf of all the members thereof
Findings of Fact
Opinion of the Commission
|
301
308
|
|
18-A • 113 • 191 |
Red Lake, Pembina and White Earth Bands, et al. • Turtle Mountain Band of Chippewa Indians • The Little Shell Band of Chippewa Indians, et al.
Additional Findings of Fact
Opinion of the Commission
Order
|
315
336-a
345-a
|
|
337 |
Absentee Delaware Tribe of Oklahoma, Delaware Nation, ex rel., W.E. Exendine and Myrtle Holder
Findings of Fact
Opinion of the Commission
Interlocutory Order
|
346
353
358-a
|
|
296 |
The Skokomish Tribe of Indians
Additional Findings of Fact
Opinion of the Commission
Second Interlocutory Order
|
359
390
416-a
|
|
87 |
The Northern Pauite Nation and the Bands thereof, ex rel. Walter Voorhees, Avery Winnemucca, Mark Jones, Frank John, Andrew Dick, Dewey Sampson, Hastings Pancho, Willie Steve, William Hardin, Sullivan Thom, Earl Frank, Wesley Keno, Frank Kaiser, Albert Aleck, Harry Sampson, Ann Downington, Ross Hardin, Ocho Winnemucca; The Walker River Tribe of the Walker River Reservation; The Pyramid Lake Tribe of the Pyramid Lake Reservation; The Yerington Paiute Tribe of the Yerington Reservation; The Reno-Sparks Indian Colony; The Paiute Shoshone Tribes of the Fallon Reservation; The Fort McDermitt Paiute Shoshone Tribe
Additional Findings of Fact
Statement and Opinion of the Commission
Final Judgment
|
417
429
434-a
|
|
180-A |
Charles E. Williams, Joseph Redthunder and Harry Owhi, as representatives of the Nez Perce Tribe
Order Allowing Attorneys' Fees
|
434-c
|
|
173 |
The Cherokee Nation or Tribe of Indians
Additional Findings of Fact
Opinion of the Commission
Final Judgment
|
435
454
456-a
|
|
18-A • 113 • 191 |
Red Lake Pembina and White Earth Bands, et al. • Turtle Mountain Band of Chippewa Indians • The Little Shell Band of Chippewa Indians, et al.
Additional Findings of Fact
Opinion of the Commission
Final Award
|
457
511
537-a
|
|
78 |
The Sioux Tribe of Indians of the Lower Brule Reservation, South Dakota
Additional Findings of Fact
Opinion of the Commission
Final Order
|
538
544
571-a
|
|
226 |
The Caddo Tribe of Oklahoma, et al.
Additional Findings of Fact
Opinion of the Commission
Interlocutory Order
|
557
566
571-a
|
|
54 |
The Crow Tribe of Indians
Opinion of the Commission
Order Allowing Attorneys' Fees
|
572
579-a
|
|
76 |
The Miami Tribe of Oklahoma, also known as the Miami Tribe, et al.
Findings of Fact
Opinion of the Commission
Order of Dismissal
|
580
585
591-a
|


{{ $team := .Site.Data.team }} {{ $team.title }} {{ $team.description }} {{ range $team.members }} {{ end }}
{{ $team.description }}


This was my first time using 2C-T-7.
We acquired the 2c-t-7 at a party, only being told that it was a type of 'synthetic acid'. I only found out exactly what it was after I took it.
About a week later, me and my friend R, who was extremely drunk at the time, went to a very small gathering at one of his friends house, I was familiar with the people there, but certainly didnt know them. I didn't feel entirely comfortable with my surroundings.
Me and R had previously considered taking the powder earlier on, but giving the time was then 2am, we didnt want to begin tripping at 4am in the morning (we had assumed the drug should be taken orally).
We arrived at this gathering about 2.30am. By 3am there were 7 people left, including R and myself. After the drug being brought up in some discussion, R looked at me nervously and produced the capsule. Out of boredom we decided to split it 4 ways and snort it. The owner of the house seemed to know alot about the drug, however we were only informed of its effects after snorting. I was horrified to learn that it induced vomiting, burning of the sinuses and a very nauseating feeling. I had originally expected the drug to be no more potent than the mushrooms I had done. I was wrong. I decided to smoke some grass, to calm myself down. It didnt help.
As I learned more and more of the negative effects, a wave of fear crept over me, and I began asking more and more questions as the drug set on. I was conscious of this fear and felt that it would surely lead to a bad trip, which again created more waves of panic. All this happened within the come-up - about the first 10 minutes after snorting. Soon, I could no longer even concentrate on my fear, as my mind was ripped apart. The drug seemed to take effect in waves, often with periods of relative lucidity, followed by intense sensory distortion. Time slowed right down. Unfortunately, someone had walked huge amounts of catshit all through the house, and after hearing about the side-effects of the drug, I couldnt stop myself thinking that I had shat myself right there, as the smell was overwhelming.
My mind was soon pulled away by this, as I hallucinated more than I have in my life. The carpet formed all sorts of crazy patterns, which again morphed into pictures and images which I will never remember. Being in the house of a regular user of psychedelics, the walls were covered in scribble and drawings, which melted before my eyes. The lines of the drawings seemed to come apart like snakes, and morph into completely different pictures. I was impressed. Soon however, the nausea I had been dreading approached, and I became desperate to find out whether I had actually shat my pants or not. It was about this time Our 'sitter' left us to our own devices. The only people not on the drug, was a girl who was completely stoned off the weed I had given her, and a guy who lay curled up, seemingly passed out from alcohol consumption.
I made my way to the bathroom. What horror. I had major trouble undressing myself, and must have pulled my pants up and down about 7 times. I could hear laughter from the other room, and assumed it was because of me. It took me a great deal of time to work out that I hadn't shat my pants, and was fine. I felt very sick, but could not vomit.
After about 10 minutes, (what seemed like 2 hrs), I came out to find everyone had completely looped out. My friend R, seemed to be trying to use ESP to communicate with a green couch, and the others were rambling uncontrollably.
'Jesus' I thought, at least I'm relatively aware. Then a wave hit me, and I sat down to enjoy the patterns, which were insane. I felt I was lost in some kind of soup, thats all I can describe it as.
Someone said something about a CD in R's car, and suddenly the thought of the outside world dawned on us. It seemed so far away. R, looked extremely distressed, but tried to act calmly as he agreed to go outside to collect the CD, the girl tripping with us accompanied him, I assumed she wanted to get with him, so I left them alone. Me and the guy who lives there (I forget his name), simply stood in the kitchen and stared at one another, I was engrossed in the tiles, when I saw the masses of catshit everywhere. I was somewhat relieved in that I had not shat myself (although the fear was dispelled earlier, it had still lingered in my mind.) This was confirmation.
Me and the guy started talking, rather awkwardly, seeing as though we didnt know each other. We mainly talked about what effects we were experiencing etc. During this time, I had a mild cramp in my stomach, and generally felt a little sick, although I was still tripping hard, which distracted me.
After a while (time was lost a long time ago), we decided to check on R, and the girl. To our horror R's car was gone. I was especially horrified, considering I had left my car at a bar, which was totally out of walking-distance.
The guy who lived there seemed much more sober than me, and offered to drive me to the bar. I accepted, and as I sat in the passenger seat, I remember seeing all kinds of things on the road, I repeatedly told him to stop the car, as I thought the road was swarming with people.
We got to the carpark at the bar where my car was parked. It was about 530am, no one was around. He was extremely worried about me driving (rightly so), but I assured him, I would sleep in the car until the trip wore off.
After about 20mins in the car, I felt so uncomfortable that I had to drive, there were delivery vans driving through the car park, which caused me intense waves of paranoia.
[Erowid Note: Driving while intoxicated or tripping is dangerous and irresponsible because it endangers other people. Don't do it!]
I started the car and drove out, thinking I was sober enough. This must have triggered another wave, because almost instantly I had lost my mind, as well as the ability to follow any road rules. My sense of direction was gone as well. I resorted to following other cars, not knowing where they were going, but simply in a desperate attempt to stay on the road.
My mind was in and out of consciousness, often trailing off into bizarre thoughts which seemed to form endless loops of further thought.  I quickly turned, went through an intersection, then panicked, turned in the middle of an intersection, through a red light. I looked back and saw a car speeding off away from me, I assumed I had almost died. I came to a large shopping centre car park, and decided to wait it out in the car until I was capable of preserving my own life on the roads.
The carpark was pure horror. I felt myself completely losing it, my legs were shaking uncontrollably, and my shoes were covered in cat shit, which permeated the whole car. The windows were fogged up, and hoping I had gotten over the trip, I gazed out the window, only to realise the patches of fog were taunting me with bizarre patterns, it looked as if transparent leeches were crawling all over the windows. To add to the horror, workers began arriving at the complex, and being in a van, I was completely visible. I tried to pretend I was asleep, thinking they would call the police.
After 40 minutes or so of trying to formulate some excuse for myself being there, I decided it was ridiculous. I needed to get home, which was about 30mins drive. I started to drive off, realising that during my time there, someone had chained off all the entrances, escape was impossible. The question then dawned on me: how had I gotten in there? Surely they didnt lock all the gates to the place a few hours before opening? 'My god' I thought, 'what have I done'.  Out of the very few people awake at that time of morning, as I drove off the curb and onto the road, there was a guy walking down the street opposite to me, he turned to see a van speeding towards him through the garden, with some raging drug-fucked psychotic - me - behind the wheel. I simply nodded to him, and skidded off down the road, I could think I no other response.
I found I could just barely drive, although very dangerously. I was blessed to see a sign leading to the freeway, which led to my house. I had previously assumed I was completely lost. During the ride home, I worried intensely for my friend, who had driven off earlier. To add to this worry, my extremely bad driving filled me with paranoia that I would either crash, or be pulled over. I couldnt work out which I wanted more. With many close calls, I managed to get home. I was there before my parents awoke, and quickly went to bed. It was 7am.
This was the scary part. I felt so sick, I felt as if I could not breathe automatically. My hands looked blue, and I found myself losing my breath constantly. I would start to fall asleep, then realised that I had stopped breathing, and force myself awake. I would cough and pant, as I struggled to regain breath. I thought if I fell asleep, I would not wake up. I spent the next three hours leaning against my wall, struggling with my breath, which grew shorter and shorter. I looked at myself in the mirror and was horrified. I looked like a corpse. I was so pale, and my lips were slightly blue.
I felt like I had rocks in my stomach, and my heart occasionally ached. I decided to induced vomiting, thinking that undigested food was clogging my airways, or that my stomach was pushing up against my lungs (I had lost all awareness of my anatomy), it made sense at the time. I realised my parents were now awake, so I snuck into the bathroom, turned on the shower and induced vomiting. After that I took a shower and felt worlds better, although still slightly short of breath.
I awoke at 12am the next morning, a total of 15 hrs sleep. I felt troubled, and could not think straight. I went to bed at 4am, and woke up today at 7pm. I feel unable to concentrate, but I know this is just the comedown. As for the waves I described, this may be associated with the simultaneous smoking of marijuana, it would be interesting if anyone can confirm this.
I still have not heard from my friend R, or anyone else with us.
A piece of advice when taking this drug:
DO NOT DRIVE. I swear I had so many near-death experiences that night, I almost swore never to do drugs again.
SET IT UP. Dont take this stuff at the spur of the moment.  Unfortunately for me, things like this always happen at the spur of the moment, but this I will never do again with out planning.
RESEARCH: Do not wait to find out about the drug after you've taken it. Know what you're in for and the risks involved. Its no fun finding out you're in for a nightmare at the onset of a trip.
As for whether I will take 2C-T-7 again, I do not know. I will find out what happened to the others, and do some more research. Although snorting was a rush, to avoid the burning, vomiting etc, I will definitely take the next batch orally, if at all.
Stay safe.
J.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


{% extends 'base/base.html' %} {% load staticfiles %} {% load cookielaw_tags %} {% block content %} {% cookielaw_banner %}
Dashboards optimised for humanitarians
Quick Mapping
Linked to the common operational datasets to automatically generate maps. Just include PCodes.
Intelligent Suggestions
HXLDash uses HXL to give intelligent suggestions which allows dashboards to be built in 2 minutes.
Print Friendly
50% of data products are printed hard copies in the field. HXLDash provides easy print formats for all dashboards.
Low Bandwidth
HXLDash aims to make dashboards 10% the filesize as other popular providers so they work in low bandwidth areas
Free and Open Source
HXLDash is free to use with no sign up required and the code is open source for everybody to access.
Integrates with the HXL ecosystem
HXLDash integrates seamlessly with the HXL ecosystem such as the HXL Proxy to create fast automated workflows
Create an online sharable dashboard in less than 2 minutes. Watch the example video below to see how easy it is.
Please refer to our help section to get started.
For the Alpha test of this product the team has decided to host no data on the HXLDash server. To find out more about this approach, it's limitations and plans for the future read more here.
Please complete this Google form with your question or reach out to Simon Johnson on Twitter. Your query will be answered as soon as possible.
HXL Dash is project developed and hosted by the British Red Cross. Initial development was sponsered by the Centre for Humanitarian Data. The principle developer is Simon Johnson.


MNT
NJWD
MONITOR
Toggle navigation
Alexander Pierce
Alexander Pierce - Web Developer
Member since Nov. 2012
Followers
Sales
Friends
Profile
Sign out


{% extends 'base.html' %} {% load static %} {% block content %} Check your Email! We've sent you email verfication link! Check your email to complete your progress.. {% endblock %}
We've sent you email verfication link! Check your email to complete your progress..


public class FuncTestSuite
extends java.lang.Object
| Modifier and Type | Field and Description |
|---|---|
static int |
TD_BRIEF |
static int |
TD_DETAILED |
static int |
TD_SUCCESS_FAILURE |
static int |
TM_BASE |
static int |
TM_CC_DN01 |
static int |
TM_CC_SET_DN01 |
static int |
TM_CC_SET_UP01 |
static int |
TM_CC_TENOR_DN01 |
static int |
TM_CC_TENOR_UP01 |
static int |
TM_CC_UP01 |
static int |
TM_IR_DN01 |
static int |
TM_IR_SET_DN01 |
static int |
TM_IR_SET_UP01 |
static int |
TM_IR_TENOR_DN01 |
static int |
TM_IR_TENOR_UP01 |
static int |
TM_IR_UP01 |
static int |
TM_RR_DN01 |
static int |
TM_RR_SET_DN01 |
static int |
TM_RR_SET_UP01 |
static int |
TM_RR_UP01 |
static int |
TM_TSY_DN01 |
static int |
TM_TSY_SET_DN01 |
static int |
TM_TSY_SET_UP01 |
static int |
TM_TSY_TENOR_DN01 |
static int |
TM_TSY_TENOR_UP01 |
static int |
TM_TSY_UP01 |
static int |
TP_BASKET_BOND |
static int |
TP_CASH |
static int |
TP_CDS |
static int |
TP_CDX |
static int |
TP_EDF |
static int |
TP_FIXED_BOND |
static int |
TP_IRS |
static int |
TP_NONE |
| Constructor and Description |
|---|
FuncTestSuite() |
| Modifier and Type | Method and Description |
|---|---|
static void |
main(java.lang.String[] astrArgs) |
static void |
testCC(MarketParamsContainer mpc,
JulianDate dt,
int iTestMode,
int iTestDetail) |
public static final int TM_BASE
public static final int TM_IR_UP01
public static final int TM_IR_DN01
public static final int TM_IR_SET_UP01
public static final int TM_IR_SET_DN01
public static final int TM_IR_TENOR_UP01
public static final int TM_IR_TENOR_DN01
public static final int TM_CC_UP01
public static final int TM_CC_DN01
public static final int TM_CC_SET_UP01
public static final int TM_CC_SET_DN01
public static final int TM_CC_TENOR_UP01
public static final int TM_CC_TENOR_DN01
public static final int TM_RR_UP01
public static final int TM_RR_DN01
public static final int TM_RR_SET_UP01
public static final int TM_RR_SET_DN01
public static final int TM_TSY_UP01
public static final int TM_TSY_DN01
public static final int TM_TSY_SET_UP01
public static final int TM_TSY_SET_DN01
public static final int TM_TSY_TENOR_UP01
public static final int TM_TSY_TENOR_DN01
public static final int TD_SUCCESS_FAILURE
public static final int TD_BRIEF
public static final int TD_DETAILED
public static final int TP_NONE
public static final int TP_CASH
public static final int TP_EDF
public static final int TP_IRS
public static final int TP_CDS
public static final int TP_FIXED_BOND
public static final int TP_CDX
public static final int TP_BASKET_BOND
public static void testCC(MarketParamsContainer mpc, JulianDate dt, int iTestMode, int iTestDetail) throws java.lang.Exception
java.lang.Exception
public static void main(java.lang.String[] astrArgs) throws java.lang.Exception
java.lang.Exception


Methods for parsing Asciidoc input files and rendering documentsusing eRuby templates.
Asciidoc documents comprise a header followed by zero or more sections.Sections are composed of blocks of content. For example:
Doc Title ========= SECTION 1 --------- This is a paragraph block in the first section. SECTION 2 This section has a paragraph block and an olist block. 1. Item 1 2. Item 2
Examples:
Use built-in templates:
lines = File.readlines("your_file.asc") doc = Asciidoctor::Document.new(lines) html = doc.render File.open("your_file.html", "w+") do |file| file.puts html end
Use custom (Tilt-supported) templates:
lines = File.readlines("your_file.asc") doc = Asciidoctor::Document.new(lines, :template_dir => 'templates') html = doc.render File.open("your_file.html", "w+") do |file| file.puts html end
Pointers to the preferred version for a given backend.
NOTE allows for empty space in line as it could be left by the template engine
Flags to control compliance with the behavior of AsciiDoc
The backend determines the format of the rendered output, default to html5
The default document typeCan influence markup generated by render templates
Default extensions for the respective base backends
Default page widths for calculating absolute widths
Flag to indicate whether encoding of external strings needs to be forced to UTF-8_All_ input data must be force encoded to UTF-8 if Encoding.default_external is not UTF-8Address failures performing string operations that are reported as “invalid byte sequence in US-ASCII” Ruby 1.8 doesn’t seem to experience this problem (perhaps because it isn’t validating the encodings)
unconstrained quotes:: can appear anywhereconstrained quotes:: must be bordered by non-word charactersNOTE these substituions are processed in the order they appear here andthe order in which they are replaced is important
The following pattern, which appears frequently, captures the contents between square brackets,ignoring escaped closing brackets (closing brackets prefixed with a backslash ‘' character)
Pattern:(?:|[^]])*?)])Matches:[enclosed text here] or [enclosed [text] here]
NOTE in Ruby 1.8.7, [^\] does not match start of line,so we need to match it explicitlyorder is significant
The root path of the Asciidoctor gem
Parse the AsciiDoc source input into an Asciidoctor::Document
Accepts input as an IO (or StringIO), String or String Array object. If theinput is a File, information about the file is stored in attributes on theDocument object.
the AsciiDoc source as a IO, String or Array.
a String, Array or Hash of options to control processing (default: {})String and Array values are converted into a Hash.See Asciidoctor::Document#initialize for details about options.
a callback block for handling include::[] directives
returns the Asciidoctor::Document
# File lib/asciidoctor.rb, line 674 def self.load(input, options = {}, &block) if (monitor = options.fetch(:monitor, false)) start = Time.now end attrs = (options[:attributes] ||= {}) if attrs.is_a? Hash # all good; placed here as optimization elsif attrs.is_a? Array attrs = options[:attributes] = attrs.inject({}) do |accum, entry| k, v = entry.split '=', 2 accum[k] = v || '' accum end elsif attrs.is_a? String # convert non-escaped spaces into null character, so we split on the # correct spaces chars, and restore escaped spaces attrs = attrs.gsub(REGEXP[:space_delim], "\\1\00"").gsub(REGEXP[:escaped_space], '\1') attrs = options[:attributes] = attrs.split("\00"").inject({}) do |accum, entry| k, v = entry.split '=', 2 accum[k] = v || '' accum end else raise ArgumentError, 'illegal type for attributes option' end lines = nil if input.is_a? File lines = input.readlines input_mtime = input.mtime input_path = File.expand_path(input.path) # hold off on setting infile and indir until we get a better sense of their purpose attrs['docfile'] = input_path attrs['docdir'] = File.dirname(input_path) attrs['docname'] = File.basename(input_path, File.extname(input_path)) attrs['docdate'] = input_mtime.strftime('%Y-%m-%d') attrs['doctime'] = input_mtime.strftime('%H:%M:%S %Z') attrs['docdatetime'] = [attrs['docdate'], attrs['doctime']] * ' ' elsif input.respond_to?(:readlines) input.rewind rescue nil lines = input.readlines elsif input.is_a?(String) lines = input.lines.entries elsif input.is_a?(Array) lines = input.dup else raise "Unsupported input type: #{input.class}" end if monitor read_time = Time.now - start start = Time.now end doc = Document.new(lines, options, &block) if monitor parse_time = Time.now - start monitor[:read] = read_time monitor[:parse] = parse_time monitor[:load] = read_time + parse_time end doc end
Parse the contents of the AsciiDoc source file into an Asciidoctor::Document
Accepts input as an IO, String or String Array object. If theinput is a File, information about the file is stored inattributes on the Document.
the String AsciiDoc source filename
a String, Array or Hash of options to control processing (default: {})String and Array values are converted into a Hash.See Asciidoctor::Document#initialize for details about options.
a callback block for handling include::[] directives
returns the Asciidoctor::Document
# File lib/asciidoctor.rb, line 753 def self.load_file(filename, options = {}, &block) Asciidoctor.load(File.new(filename), options, &block) end
Parse the AsciiDoc source input into an Asciidoctor::Document and render itto the specified backend format
Accepts input as an IO, String or String Array object. If theinput is a File, information about the file is stored inattributes on the Document.
If the :in_place option is true, and the input is a File, the output iswritten to a file adjacent to the input file, having an extension thatcorresponds to the backend format. Otherwise, if the :to_file option isspecified, the file is written to that file. If :to_file is not an absolutepath, it is resolved relative to :to_dir, if given, otherwise theDocument#base_dir. If the target directory does not exist, it will not becreated unless the :mkdirs option is set to true. If the file cannot bewritten because the target directory does not exist, or because it fallsoutside of the Asciidoctor::Document#base_dir in safe mode, an IOError is raised.
If the output is going to be written to a file, the header and footer arerendered unless specified otherwise (writing to a file implies creating astandalone document). Otherwise, the header and footer are not rendered bydefault and the rendered output is returned.
the String AsciiDoc source filename
a String, Array or Hash of options to control processing (default: {})String and Array values are converted into a Hash.See Asciidoctor::Document#initialize for details about options.
a callback block for handling include::[] directives
returns the Document object if the rendered result String is written to afile, otherwise the rendered result String
# File lib/asciidoctor.rb, line 787 def self.render(input, options = {}, &block) in_place = options.delete(:in_place) || false to_file = options.delete(:to_file) to_dir = options.delete(:to_dir) mkdirs = options.delete(:mkdirs) || false monitor = options.fetch(:monitor, false) write_in_place = in_place && input.is_a?(File) write_to_target = to_file || to_dir stream_output = !to_file.nil? && to_file.respond_to?(:write) if write_in_place && write_to_target raise ArgumentError, 'the option :in_place cannot be used with either the :to_dir or :to_file option' end if !options.has_key?(:header_footer) && (write_in_place || write_to_target) options[:header_footer] = true end doc = Asciidoctor.load(input, options, &block) if to_file == '/dev/null' return doc elsif write_in_place to_file = File.join(File.dirname(input.path), "#{doc.attributes['docname']}#{doc.attributes['outfilesuffix']}") elsif !stream_output && write_to_target working_dir = options.has_key?(:base_dir) ? File.expand_path(options[:base_dir]) : File.expand_path(Dir.pwd) # QUESTION should the jail be the working_dir or doc.base_dir??? jail = doc.safe >= SafeMode::SAFE ? working_dir : nil if to_dir to_dir = doc.normalize_system_path(to_dir, working_dir, jail, :target_name => 'to_dir', :recover => false) if to_file to_file = doc.normalize_system_path(to_file, to_dir, nil, :target_name => 'to_dir', :recover => false) # reestablish to_dir as the final target directory (in the case to_file had directory segments) to_dir = File.dirname(to_file) else to_file = File.join(to_dir, "#{doc.attributes['docname']}#{doc.attributes['outfilesuffix']}") end elsif to_file to_file = doc.normalize_system_path(to_file, working_dir, jail, :target_name => 'to_dir', :recover => false) # establish to_dir as the final target directory (in the case to_file had directory segments) to_dir = File.dirname(to_file) end if !File.directory? to_dir if mkdirs Helpers.require_library 'fileutils' FileUtils.mkdir_p to_dir else raise IOError, "target directory does not exist: #{to_dir}" end end end start = Time.now if monitor output = doc.render if monitor render_time = Time.now - start monitor[:render] = render_time monitor[:load_render] = monitor[:load] + render_time end if to_file start = Time.now if monitor if stream_output to_file.write output.rstrip # ensure there's a trailing endline to_file.write "\n" else File.open(to_file, 'w') {|file| file.write output } # these assignments primarily for testing, diagnostics or reporting doc.attributes['outfile'] = outfile = File.expand_path(to_file) doc.attributes['outdir'] = File.dirname(outfile) end if monitor write_time = Time.now - start monitor[:write] = write_time monitor[:total] = monitor[:load_render] + write_time end # NOTE document cannot control this behavior if safe >= SafeMode::SERVER if !stream_output && doc.attr?('basebackend-html') && doc.attr?('copycss') && doc.attr?('linkcss') && DEFAULT_STYLESHEET_KEYS.include?(doc.attr('stylesheet')) Helpers.require_library 'fileutils' outdir = doc.attr('outdir') stylesdir = doc.normalize_system_path(doc.attr('stylesdir'), outdir, doc.safe >= SafeMode::SAFE ? outdir : nil) Helpers.mkdir_p stylesdir File.open(File.join(stylesdir, DEFAULT_STYLESHEET_NAME), 'w') {|f| f.write Asciidoctor::HTML5.default_asciidoctor_stylesheet } end doc else output end end
Parse the contents of the AsciiDoc source file into an Asciidoctor::Documentand render it to the specified backend format
the String AsciiDoc source filename
a String, Array or Hash of options to control processing (default: {})String and Array values are converted into a Hash.See Asciidoctor::Document#initialize for details about options.
a callback block for handling include::[] directives
returns the Document object if the rendered result String is written to afile, otherwise the rendered result String
# File lib/asciidoctor.rb, line 897 def self.render_file(filename, options = {}, &block) Asciidoctor.render(File.new(filename), options, &block) end


The sample illustrates how to add custom CSS styles to Custom element Grid cells under specific conditions.


Alphaman
Home
Home
Features
Overview
Graphs ▾
Broker
Trades
Analytics
{% block content %} {% endblock %}


include a basic choropleth of the places I've lived in the States, or include a choropleth of NYC for something basic
'Of course,' the Mock Turtle said: 'advance twice, set to partners—' '—change lobsters, and retire in same order,' continued the Gryphon. 'Then, you know,' the Mock Turtle went on, 'you throw the—' 'The lobsters!' shouted the Gryphon, with a bound into the air. '—as far out to sea as you can—' 'Swim after them!' screamed the Gryphon. 'Turn a somersault in the sea!' cried the Mock Turtle, capering wildly about. 'Change lobsters again!' yelled the Gryphon at the top of its voice. 'Back to land again, and that's all the first figure,' said the Mock Turtle, suddenly dropping