text:
#ifdef PART_IO
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <assert.h>
#include <limits.h>

#include <set>

#include "cache.h"
#include "associative_cache.h"
#include "global_cached_private.h"
#include "part_global_cached_private.h"
#include "parameters.h"
#include "cache_config.h"
#include "slab_allocator.h"
#include "thread.h"
#include "remote_access.h"
#include "debugger.h"
#include "timer.h"
#include "NUMA_cache.h"

namespace safs
{

const int NUMA_REQ_QUEUE_SIZE = 2000;
const int NUMA_REQ_MSG_QUEUE_SIZE = NUMA_REQ_QUEUE_SIZE / (
		NUMA_MSG_SIZE / sizeof(io_request));
const int NUMA_REPLY_QUEUE_SIZE = 1024;
const int NUMA_REPLY_MSG_QUEUE_SIZE = NUMA_REPLY_QUEUE_SIZE / (
		NUMA_MSG_SIZE / sizeof(io_reply));

class process_request_thread;
class underlying_io_thread;
struct thread_group
{
	int id;
	page_cache *cache;
	std::vector<process_request_thread *> process_request_threads;
	// This processes the requests that are issued by global_cached_io and
	// are supposed to be sent to the I/O threads.
	underlying_io_thread *underlying_thread;
	slab_allocator *msg_allocator;

	thread_group() {
		id = -1;
		cache = NULL;
		msg_allocator = NULL;
		underlying_thread = NULL;
	}

	void print_state();
};

class group_request_sender
{
	// It points to the current sender for sending requests.
	unsigned int curr_idx;

	std::vector<process_request_thread *> threads;
	std::vector<request_sender *> senders;
	int num_reqs;

	group_request_sender(slab_allocator *alloc,
			const std::vector<process_request_thread *> &threads);
public:
	static group_request_sender *create(slab_allocator *alloc,
			const std::vector<process_request_thread *> &threads);

	static void destroy(group_request_sender *s) {
		delete s;
	}

	int flush();

	int send_cached(io_request *msgs, int num = 1) {
		num_reqs += num;
		return senders[curr_idx]->send_cached(msgs, num);
	}

	int get_num_remaining() const {
		int tmp = 0;
		for (unsigned i = 0; i < senders.size(); i++)
			tmp += senders[i]->get_num_remaining();
		assert(tmp == num_reqs);
		return num_reqs;
	}
};

/**
 * The IO processing table is created for each virtual file.
 * Therefore, each virtual file has a group of dedicated threads created
 * for processing I/O requests. This is a simpler solution compared with
 * the alternative that all virtual files share the same set of I/O
 * processing threads. The alternative requires many table lookups and
 * sorting IO requests for each file, etc. This solution relies on
 * the thread scheduling in the OS. It should works well when there are
 * only a few files open. These are threads, so the context switch should
 * be rather cheap.
 * Another benefit of this solution is that no locks are required.
 */
class part_io_process_table
{
	std::map<int, struct thread_group> groups;
	const cache_config *cache_conf;
	int num_groups;
public:
	part_io_process_table(const std::vector<disk_io_thread *> &io_threads,
			file_mapper *mapper, NUMA_cache *cache);

	~part_io_process_table();

	std::unordered_map<int, group_request_sender *> create_req_senders(
			int node_id) const;
	void destroy_req_senders(const std::unordered_map<int,
			group_request_sender *> &) const;

	const cache_config *get_cache_config() const {
		return cache_conf;
	}

	const struct thread_group *get_thread_group(int node_id) const {
		std::map<int, struct thread_group>::const_iterator it
			= groups.find(node_id);
		return &it->second;
	}

	page_cache *get_cache(int node_id) {
		std::map<int, struct thread_group>::const_iterator it
			= groups.find(node_id);
		return it->second.cache;
	}

	int get_num_groups() const {
		return num_groups;
	}

	int get_num_threads() const {
		int nthreads = 0;
		for (std::map<int, struct thread_group>::const_iterator it
				= groups.begin(); it != groups.end(); it++)
			nthreads += it->second.process_request_threads.size();
		return nthreads;
	}

	std::set<int> get_node_ids() const {
		std::set<int> node_ids;
		for (std::map<int, struct thread_group>::const_iterator it
				= groups.begin(); it != groups.end(); it++)
			node_ids.insert(it->first);
		return node_ids;
	}

#if 0
	/**
	 * Print the statistics info of request processing threads.
	 * `nthreads': the number of user threads.
	 */
	void print_stat(int num_user_threads);
#endif

	void print_state() {
		for (std::map<int, struct thread_group>::iterator it
				= groups.begin(); it != groups.end(); it++) {
			it->second.print_state();
		}
	}
};

#if 0
thread_group::~thread_group()
{
	for (size_t i = 0; i < process_request_threads.size(); i++) {
		thread *t = process_request_threads[i];
		t->stop();
		// TODO I need to free memory of the thread here.
	}
	for (size_t i = 0; i < process_reply_threads.size(); i++) {
		thread *t = process_reply_threads[i];
		t->stop();
		// TODO I need to free memory of the thread here.
	}
	delete request_queue;
	delete reply_queue;
}
#endif

/**
 * This wraps global cached IO to handle requests sent from remote threads.
 */
class node_cached_io: public global_cached_io
{
	// The size of a request >= sizeof(io_request).
	static const int NUMA_REQ_BUF_SIZE = 1024;

	const struct thread_group *local_group;

	// thread id <-> msg sender
	pthread_key_t replier_key;
	long processed_requests;
	long num_requests;

	// This message buffer is used for copying remote messages to
	// the local memory.
	message<io_request> local_msgs[MSG_BUF_SIZE];
	// This request buffer has requests more than a message can contain.
	io_request local_reqs[NUMA_REQ_BUF_SIZE];
	// A temporary message buffer
	message<io_request> tmp_msg_buf[MSG_BUF_SIZE];

	pthread_t processing_thread_id;
	msg_queue<io_request> *request_queue;

	node_cached_io(io_interface *underlying,
			struct thread_group *local_group);
	~node_cached_io() {
		msg_queue<io_request>::destroy(request_queue);
	}
public:
	static node_cached_io *create(io_interface *underlying,
			struct thread_group *local_group) {
		assert(underlying->get_node_id() >= 0);
		return new node_cached_io(underlying, local_group);
	}

	static void destroy(node_cached_io *io) {
		delete io;
	}

	virtual page_cache *get_global_cache() {
		return local_group->cache;
	}

	long get_num_requests() const {
		return num_requests;
	}

	int process_requests();

	msg_queue<io_request> *get_queue() const {
		return request_queue;
	}

	void print_state() {
		printf("node cached io %d has %d pending requests and %d reqs in the queue\n",
				get_io_id(), num_pending_ios(), request_queue->get_num_objs());
		global_cached_io::print_state();
	}

	// TODO I need to decide how to respond to the completed requests from
	// the disk.
#if 0
	// This method is used for IO requests that need to be sent to disks.
	// Thanks to the IO proxy, it runs in the underlying IO thread,
	// which is on the same NUMA node as the request process thread where
	// the IO instance belongs to.
	virtual void notify_completion(io_request *reqs[], int num) {
		assert(thread::get_curr_thread()->get_node_id() == get_thread()->get_node_id());
		stack_array<io_request> req_copies(num);
		for (int i = 0; i < num; i++) {
			req_copies[i] = *reqs[i];
			assert(req_copies[i].get_io());
		}
		process_disk_completed_requests(req_copies.data(), num);
		process_completed_requests();
		if (has_pending_requests())
			get_thread()->activate();
	}
#endif

	int get_file_id() const {
		assert(0);
		return -1;
	}
};

static void notify_gcached_io(io_interface *io, io_request *reqs[], int num)
{
	// TODO we may to more than this since we run in the same NUMA node
	// as the IO instance.
	io->notify_completion(reqs, num);
}

/**
 * This IO proxy is responsible for sending requests to disks and gather
 * completion notifications.
 */
class underlying_io_proxy: public remote_io
{
public:
	underlying_io_proxy(const std::vector<disk_io_thread *> &remotes,
			file_mapper *mapper, thread *curr_thread): remote_io(
				remotes, mapper, curr_thread) {
	}

	// This runs in underlying_io_thread.
	virtual int process_completed_requests(io_request reqs[], int num) {
		stack_array<io_request *, 256> req_ptrs(num);
		for (int i = 0; i < num; i++) {
			reqs[i].set_io((io_interface *) reqs[i].get_user_data());
			reqs[i].set_user_data(NULL);
			req_ptrs[i] = &reqs[i];
		}
		process_reqs_on_io(req_ptrs.data(), num, notify_gcached_io);
		return num;
	}
};

class underlying_io_thread: public thread
{
	static const int MSG_BUF_SIZE = 16;
	static const int REQ_BUF_SIZE = 1024;

	thread_safe_FIFO_queue<message<io_request> > queue;
	message<io_request> msg_buf[MSG_BUF_SIZE];
	io_request req_buf[REQ_BUF_SIZE];
	underlying_io_proxy *io;
	size_t num_reqs;
public:
	underlying_io_thread(const std::vector<disk_io_thread *> &remotes,
			file_mapper *mapper, int node_id): thread(
			std::string("underlying_io_thread-") + itoa(node_id),
			node_id), queue("underlying_io_queue", node_id,
			MSG_BUF_SIZE, INT_MAX) {
		io = new underlying_io_proxy(remotes, mapper, this);
		num_reqs = 0;
		this->start();
	}

	void run() {
		while (!queue.is_empty()) {
			int ret = queue.fetch(msg_buf, MSG_BUF_SIZE);
			for (int i = 0; i < ret; i++) {
				num_reqs += msg_buf[i].get_num_objs();
				while (!msg_buf[i].is_empty()) {
					int num_reqs = msg_buf[i].get_next_objs(req_buf,
							REQ_BUF_SIZE);
					io->access(req_buf, num_reqs);
				}
			}
		}
		io->wait4complete(0);
	}

	void add_reqs(message<io_request> &requests) {
		int ret = queue.add(&requests, 1);
		assert(ret == 1);
		this->activate();
	}

	io_interface *get_io() const {
		return io;
	}

	void print_stat() {
		printf("%s issued %ld reqs to I/O threads\n",
				this->get_thread_name().c_str(), num_reqs);
	}
};

class req_stealer;
class flush_timer_task: public timer_task
{
	static const int FLUSH_TIMEOUT = 300000;
	req_stealer *io;
public:
	flush_timer_task(req_stealer *io): timer_task(FLUSH_TIMEOUT) {
		this->io = io;
	}

	void run();
};

class req_stealer: public io_interface
{
	int file_id;
	underlying_io_thread *t;
	message<io_request> req_buf;
	slab_allocator *alloc;
	periodic_timer *flush_timer;

	atomic_integer access_guard;
public:
	req_stealer(underlying_io_thread *t, thread *curr_thread,
			int file_id): io_interface(curr_thread) {
		this->file_id = file_id;
		flush_timer = new periodic_timer(curr_thread, new flush_timer_task(this));
		flush_timer->start();
		this->t = t;
		alloc = new slab_allocator(
				"io_msg_allocator-" + itoa(curr_thread->get_node_id()),
				PAGE_SIZE, PAGE_SIZE * 128, INT_MAX, curr_thread->get_node_id());
		message<io_request> tmp(alloc, false);
		req_buf = tmp;
	}

	~req_stealer() {
		delete flush_timer;
		delete alloc;
	}

	virtual int get_file_id() const {
		assert(file_id >= 0);
		return file_id;
	}

	void access(io_request *reqs, int num, io_status *status = NULL) {
		access_guard.inc(1);
		int num_added = 0;
		for (int i = 0; i < num; i++) {
			// the requests are created by global_cached_io and user_data
			// isn't used by global_cached_io, so we should be safe here.
			assert(reqs[i].get_user_data() == NULL);
			reqs[i].set_user_data((void *) reqs[i].get_io());
			// We want I/O threads to notify the IO proxy of request completion
			// first.
			reqs[i].set_io(t->get_io());
		}
		while (num_added < num) {
			int ret = req_buf.add(reqs + num_added, num - num_added);
			num_added += ret;
			if (ret == 0) {
				t->add_reqs(req_buf);
				message<io_request> tmp(alloc, false);
				req_buf = tmp;
			}
		}
		access_guard.inc(1);
	}

	void flush_requests_timeout() {
		// The timeout signal is sent to the thread that uses the I/O
		// instance. When the access guard is even, the thread isn't using
		// req_buf, so we are safe to use it here.
		if (access_guard.get() % 2 == 0) {
			t->add_reqs(req_buf);
			message<io_request> tmp(alloc, false);
			req_buf = tmp;
		}
	}

	virtual void flush_requests() {
	}

	void print_state() {
		printf("req_stealer %d has %d buffered reqs in thread %d, timer %d is enabled? %d\n",
				get_io_id(), req_buf.get_num_objs(), get_thread()->get_tid(),
				flush_timer->get_id(), flush_timer->is_enabled());
	}
};

void flush_timer_task::run()
{
	io->flush_requests_timeout();
}

#if 0
/**
 * This thread runs on the node with the application threads.
 * It is dedicated to processing replies. If the queue is empty,
 * the thread will sleep.
 */
class process_reply_thread: public thread
{
	part_global_cached_io *io;
	blocking_FIFO_queue<io_reply> *reply_queue;
public:
	process_reply_thread(part_global_cached_io *io,
			blocking_FIFO_queue<io_reply> *reply_queue): thread(
			std::string("process_reply_thread-") + itoa(io->get_node_id()),
			io->get_node_id(), false) {
		this->io = io;
		this->reply_queue = reply_queue;
	}
	void run();

	blocking_FIFO_queue<io_reply> *get_reply_queue() {
		return reply_queue;
	}
};
#endif

node_cached_io::node_cached_io(io_interface *underlying,
		struct thread_group *local_group): global_cached_io(
			underlying->get_thread(), underlying, local_group->cache)
{
	assert(local_group);
	this->local_group = local_group;
	assert(local_group->id == underlying->get_node_id());

	request_queue = msg_queue<io_request>::create(underlying->get_node_id(),
			"request_queue", NUMA_REQ_MSG_QUEUE_SIZE, INT_MAX, false);

	processed_requests = 0;
	// This IO just dispatches any number of requests sent to it.
	// So we don't care how many requests are pending.
	set_max_num_pending_ios(INT_MAX);

	processing_thread_id = 0;
	pthread_key_create(&replier_key, NULL);

	for (int i = 0; i < MSG_BUF_SIZE; i++) {
		message<io_request> tmp(local_group->msg_allocator, false);
		local_msgs[i] = tmp;
	}
}

/* process the requests sent to this thread */
int node_cached_io::process_requests()
{
	if (processing_thread_id == 0)
		processing_thread_id = pthread_self();
	assert(processing_thread_id == pthread_self());
	int num_processed = 0;
	int num_access = 0;
	int num_received = 0;
	while (!request_queue->is_empty()) {
		int num = request_queue->fetch(tmp_msg_buf, MSG_BUF_SIZE);

		// We need to copy the message buffers to the local memory.
		for (int i = 0; i < num; i++) {
			tmp_msg_buf[i].copy_to(local_msgs[i]);
		}
		for (int i = 0; i < num; i++) {
			if (local_msgs[i].get_num_objs() > NUMA_REQ_BUF_SIZE - num_received) {
				global_cached_io::access(local_reqs, num_received);
				num_access++;
				num_processed += num_received;
				num_received = 0;
			}
			int ret = local_msgs[i].get_next_objs(local_reqs + num_received,
					NUMA_REQ_BUF_SIZE - num_received);
			num_received += ret;
			assert(local_msgs[i].is_empty());
		}
	}
	global_cached_io::access(local_reqs, num_received);
	num_access++;
	num_processed += num_received;
	if (num_processed > 0) {
		flush_requests();
		process_all_requests();
	}
	else
		process_all_requests();

	num_requests += num_processed;
	return num_processed;
}

void part_global_cached_io::notify_upper(io_request *reqs[], int num)
{
	for (int i = 0; i < num; i++) {
		io_request *req = reqs[i];
		io_interface *io = req->get_io();
		assert(io == this);
		if (io->get_callback())
			io->get_callback()->invoke(&req, 1);
	}
}

/**
 * This method is invoked in two places: the underlying IO instance and
 * node_cached_io instance.
 * If it's invoked by the underlying IO, the request was issued by the current
 * thread, so it can just notify the application code.
 * Otherwise, it needs to send a reply message to the thread that issues
 * the request.
 */
void part_global_cached_io::notify_completion(io_request *reqs[], int num)
{
	io_request *local_reqs[num];
	// This buffer is used for sending replies.
	stack_array<io_reply> local_reply_buf(num);
	int num_remote = 0;
	int num_local = 0;

	int num_user_compute = 0;
	for (int i = 0; i < num; i++) {

		page_id_t pg_id(reqs[i]->get_file_id(), reqs[i]->get_offset());
		int idx = cache_conf->page2cache(pg_id);
		if (idx != get_node_id()) {
			// We only count the remote user-compute request.
			// It's enough to compute the number of pending requests.
			if (reqs[i]->get_req_type() == io_request::USER_COMPUTE)
				num_user_compute++;
			else
				local_reply_buf[num_remote++] = io_reply(reqs[i], true, 0);
		}
		else {
			// We don't need to notify the user of the completed local
			// user-compute requests any more.
			if (reqs[i]->get_req_type() != io_request::USER_COMPUTE) {
				assert(reqs[i]->get_io() == this);
				local_reqs[num_local++] = reqs[i];
			}
		}
	}
	if (num_user_compute > 0)
		processed_replies.inc(num_user_compute);

	if (num_remote > 0) {
		// The reply must be sent to the thread on a different node.
		int num_sent = reply_sender->send(local_reply_buf.data(), num_remote);
		// We use blocking queues here, so the send must succeed.
		assert(num_sent == num_remote);
	}
	if (reply_queue->get_num_entries() > 0 || num_user_compute > 0)
		get_thread()->activate();
	if (num_local > 0)
		notify_upper(local_reqs, num_local);
}

/**
 * This thread runs on the node with cache.
 * It is dedicated to processing requests.
 * The application threads send requests to the node with cache
 * by placing the requests in the queue. This thread fetches requests
 * from the queue and process them. If the queue is empty, the thread
 * will sleep.
 */
class process_request_thread: public thread
{
	node_cached_io *io;
	struct thread_group *group;

	process_request_thread(struct thread_group *group): thread(
			std::string("process_request_thread-") + itoa(group->id), group->id) {
		this->io = NULL;
		this->group = group;
	}
public:
	static process_request_thread *create(struct thread_group *group) {
		return new process_request_thread(group);
	}

	static void destroy(process_request_thread *t,
			const struct thread_group *group) {
		while (!t->has_exit()) {
			t->stop();
			usleep(10000);
		}
		t->join();
		delete t;
	}

	void init() {
		io = node_cached_io::create(
				// In request processing thread, a request stealer isn't
				// associated to any files.
				new req_stealer(group->underlying_thread, this, -1), group);
	}

	node_cached_io *get_io() const {
		return io;
	}
	void run();

	int get_cache_hits() const {
		return io->get_cache_hits();
	}

	int get_num_fast_process() const {
		return io->get_num_fast_process();
	}

	long get_num_requests() const {
		return io->get_num_requests();
	}

	void print_state() {
		io->print_state();
	}
};

void process_request_thread::run()
{
	io->process_requests();
}

void thread_group::print_state()
{
	for (unsigned i = 0; i < process_request_threads.size(); i++) {
		process_request_threads[i]->print_state();
	}
}

group_request_sender *group_request_sender::create(slab_allocator *alloc,
		const std::vector<process_request_thread *> &threads)
{
	assert(threads.size() > 0);
	int node_id = threads[0]->get_node_id();
	for (unsigned i = 1; i < threads.size(); i++)
		assert(node_id == threads[i]->get_node_id());
	return new group_request_sender(alloc, threads);
}

group_request_sender::group_request_sender(slab_allocator *alloc,
		const std::vector<process_request_thread *> &threads)
{
	senders.resize(threads.size());
	for (unsigned i = 0; i < threads.size(); i++) {
		request_sender *sender = request_sender::create(threads[i]->get_node_id(),
				alloc, threads[i]->get_io()->get_queue());
		senders[i] = sender;
	}
	this->threads = threads;
	curr_idx = random() % threads.size();
	num_reqs = 0;
}

int group_request_sender::flush()
{
	int ret = 0;
	curr_idx = (curr_idx + 1) % senders.size();
	for (unsigned i = 0; i < senders.size(); i++) {
		if (senders[i]->get_num_remaining() > 0) {
			ret += senders[i]->flush();
			assert(senders[i]->get_num_remaining() == 0);
			// After we send requests to the remote thread, we need to
			// activate the thread to process them.
			threads[i]->activate();
		}
	}
	num_reqs = 0;
	return ret;
}

#if 0
void process_reply_thread::run()
{
	int max_nreplies = NUMA_REPLY_BUF_SIZE;
	int num_processed = 0;
	io_reply local_replies[NUMA_REPLY_BUF_SIZE];
	while(num_processed < max_nreplies) {
		int num = reply_queue->fetch(local_replies, NUMA_REPLY_BUF_SIZE);
		for (int i = 0; i < num; i++) {
			io_reply *reply = &local_replies[i];
			((part_global_cached_io *) reply->get_io())->process_reply(reply);
		}
		num_processed += num;
	}
}
#endif

part_io_process_table::part_io_process_table(
		const std::vector<disk_io_thread *> &io_threads,
		file_mapper *mapper, NUMA_cache *cache)
{
	cache_conf = cache->get_cache_config();
	std::vector<int> node_ids;
	cache_conf->get_node_ids(node_ids);
	num_groups = node_ids.size();
	for (unsigned i = 0; i < node_ids.size(); i++) {
		int node_id = node_ids[i];
		struct thread_group group;

		group.id = node_id;
		group.underlying_thread = new underlying_io_thread(io_threads,
				mapper, node_id);
		group.cache = cache->get_cache_on_node(node_id);
		group.msg_allocator = new slab_allocator(std::string("msg_allocator-")
				+ itoa(node_id), NUMA_MSG_SIZE,
				NUMA_MSG_SIZE * 128, INT_MAX, node_id);
		groups.insert(std::pair<int, struct thread_group>(node_id, group));

		struct thread_group *groupp = &groups[node_id];
		// Create processing threads.
		for (int i = 0; i < params.get_numa_num_process_threads(); i++) {
			process_request_thread *t = process_request_thread::create(groupp);
			t->start();
			groupp->process_request_threads.push_back(t);
		}
	}
}

part_io_process_table::~part_io_process_table()
{
	for (std::map<int, struct thread_group>::const_iterator it
			= groups.begin(); it != groups.end(); it++) {
		const struct thread_group *group = &it->second;
		for (unsigned i = 0; i < group->process_request_threads.size(); i++) {
			process_request_thread *t = group->process_request_threads[i];
			node_cached_io *io = t->get_io();
			process_request_thread::destroy(t, group);
			node_cached_io::destroy(io);
		}
		cache_conf->destroy_cache_on_node(group->cache);
	}
}

std::unordered_map<int, group_request_sender *>
part_io_process_table::create_req_senders(int node_id) const
{
	std::unordered_map<int, group_request_sender *> req_senders;
	// Initialize the request senders.
	for (std::map<int, struct thread_group>::const_iterator it
			= groups.begin(); it != groups.end(); it++) {
		const struct thread_group *group = &it->second;
		assert(group->id == it->first);
		req_senders.insert(std::pair<int, group_request_sender *>(group->id,
					group_request_sender::create(group->msg_allocator,
						group->process_request_threads)));
	}
	return req_senders;
}

void part_io_process_table::destroy_req_senders(
		const std::unordered_map<int, group_request_sender *> &req_senders) const
{
	for (std::unordered_map<int, group_request_sender *>::const_iterator it
			= req_senders.begin(); it != req_senders.end(); it++) {
		group_request_sender::destroy(it->second);
	}
}

#if 0
void part_io_process_table::print_stat(int num_user_threads)
{
	int tot_gcached_ios = num_user_threads + get_num_threads();
	std::set<int> node_ids = get_node_ids();

	printf("\n");
	for (std::set<int>::const_iterator it = node_ids.begin();
			it != node_ids.end(); it++) {
		int node_id = *it;
		const struct thread_group *group = get_thread_group(node_id);
		printf("cache on node %d\n", group->id);
		group->cache->print_stat();
	}
	printf("\n");
	for (std::set<int>::const_iterator it = node_ids.begin();
			it != node_ids.end(); it++) {
		int node_id = *it;
		const struct thread_group *group = get_thread_group(node_id);
		for (size_t i = 0; i < group->process_request_threads.size(); i++) {
			process_request_thread *thread = (process_request_thread *) group
				->process_request_threads[i];
			thread->get_io()->print_stat(tot_gcached_ios);
		}
	}
	printf("\n");
	for (std::set<int>::const_iterator it = node_ids.begin();
			it != node_ids.end(); it++) {
		int node_id = *it;
		const struct thread_group *group = get_thread_group(node_id);
		int tot_group_hits = 0;
		for (size_t i = 0; i < group->process_request_threads.size(); i++) {
			process_request_thread *thread = (process_request_thread *) group
				->process_request_threads[i];
			printf("group %d thread %ld gets %ld requests\n", group->id, i,
					thread->get_num_requests());
			tot_group_hits += thread->get_cache_hits();
		}
		printf("group %d gets %d hits\n", group->id, tot_group_hits);
	}
}
#endif

int part_global_cached_io::destroy_subsystem(part_io_process_table *table)
{
	delete table;
	return 0;
}

class debug_process_request_threads: public debug_task
{
	part_io_process_table *table;
public:
	debug_process_request_threads(part_io_process_table *table) {
		this->table = table;
	}

	void run() {
		table->print_state();
	}
};

part_io_process_table *part_global_cached_io::init_subsystem(
		const std::vector<disk_io_thread *> &io_threads,
		file_mapper *mapper, NUMA_cache *cache)
{
	part_io_process_table *table = new part_io_process_table(io_threads,
			mapper, cache);
	debug.register_task(new debug_process_request_threads(table));
	return table;
}

part_global_cached_io::part_global_cached_io(io_interface *underlying,
		part_io_process_table *table): io_interface(underlying->get_thread())
{
	int node_id = underlying->get_node_id();
	this->local_group = table->get_thread_group(node_id);

	this->underlying = new global_cached_io(underlying->get_thread(),
			new req_stealer(local_group->underlying_thread,
				underlying->get_thread(), underlying->get_file_id()),
			table->get_cache(node_id));
	processed_requests = 0;;
	sent_requests = 0;

	this->final_cb = NULL;
	remote_reads = 0;
	this->cache_conf = table->get_cache_config();
	this->global_table = table;

#ifdef DEBUG
	long cache_size = cache_conf->get_part_size(node_id);
	printf("thread id: %d, group id: %d, num groups: %d, cache size: %ld\n",
			get_io_id(), node_id, table->get_num_groups(), cache_size);
#endif

	/* assign a thread to a group. */
	reply_queue = msg_queue<io_reply>::create(node_id, "reply_queue",
			// We don't want that adding replies is blocked, so we allow
			// the reply queue to be expanded to an arbitrary size.
			NUMA_REPLY_MSG_QUEUE_SIZE, INT_MAX / sizeof(io_reply), false);

	reply_sender = thread_safe_msg_sender<io_reply>::create(
			0, local_group->msg_allocator, reply_queue);

	req_senders = table->create_req_senders(node_id);

	for (int i = 0; i < MSG_BUF_SIZE; i++) {
		message<io_reply> tmp(local_group->msg_allocator, false);
		local_reply_msgs[i] = tmp;
	}
}

part_global_cached_io::~part_global_cached_io()
{
	msg_queue<io_reply>::destroy(reply_queue);
	thread_safe_msg_sender<io_reply>::destroy(reply_sender);
	global_table->destroy_req_senders(req_senders);
	delete underlying;
}

int part_global_cached_io::process_reply(io_reply *reply) {
	int ret = -1;
	if (reply->is_success()) {
		ret = reply->get_size();
	}
	else {
		fprintf(stderr, "access error: %s\n",
				strerror(reply->get_status()));
	}
	io_request *reqs[1] = {&reply->get_request()};
	final_cb->invoke(reqs, 1);
	return ret;
}

int part_global_cached_io::process_replies()
{
	int num_processed = 0;
	message<io_reply> tmp_msgs[MSG_BUF_SIZE];
	// The reply buffer size should be able to contain more replies than
	// a reply message.
	while (!reply_queue->is_empty()) {
		int num = reply_queue->fetch(tmp_msgs, MSG_BUF_SIZE);
		assert(num <= MSG_BUF_SIZE);
		for (int i = 0; i < num; i++) {
			tmp_msgs[i].copy_to(local_reply_msgs[i]);
		}
		for (int i = 0; i < num; i++) {
			int num_replies = local_reply_msgs[i].get_next_objs(
					local_reply_buf, NUMA_REPLY_BUF_SIZE);
			assert(local_reply_msgs[i].is_empty());
			for (int j = 0; j < num_replies; j++) {
				io_reply *reply = &local_reply_buf[j];
				this->process_reply(reply);
			}
			num_processed += num_replies;
		}
	}
	processed_replies.inc(num_processed);
	return num_processed;
}

void part_global_cached_io::access(io_request *requests, int num, io_status status[])
{
	ASSERT_EQ(get_thread(), thread::get_curr_thread());
	// TODO I'll write status to the status array later.
	int num_sent = 0;
	int num_local_reqs = 0;
	// Distribute requests to the corresponding nodes.
	for (int i = 0; i < num; i++) {
		if (requests[i].get_io() == NULL) {
			requests[i].set_io(this);
			requests[i].set_node_id(this->get_node_id());
		}
		assert(requests[i].within_1page());
		page_id_t pg_id(requests[i].get_file_id(), requests[i].get_offset());
		int idx = cache_conf->page2cache(pg_id);
		if (idx != get_node_id()) {
			remote_reads++;
			// TODO why do this?
			io_request req(requests[i]);
			int ret = req_senders[idx]->send_cached(&req);
			sent_requests++;
			assert(ret > 0);
		}
		else {
			assert(num_local_reqs < REQ_BUF_SIZE);
			local_req_buf[num_local_reqs++] = requests[i];
		}
		num_sent++;
	}

	underlying->access(local_req_buf, num_local_reqs);
	// TODO how to deal with error of access.

	// This variable is only accessed in one thread, so we don't
	// need to protect it.
	processed_requests += num;

	// Let's process all replies before proceeding.
	process_replies();
}

void part_global_cached_io::cleanup()
{
	// First make sure all requests have been flushed for processing.
	for (std::unordered_map<int, group_request_sender *>::const_iterator it
			= req_senders.begin(); it != req_senders.end(); it++) {
		group_request_sender *sender = it->second;
		// Send a flush request to force request process threads to flush all requests.
		io_request flush_req(true);
		sender->send_cached(&flush_req);
		sender->flush();
	}

	// Now all requests have been issued to the underlying IOs.
	// Make sure to clean the queues in its own underlying IO.
	underlying->cleanup();

	// Now we need to wait for all requests issued to the disks
	// to be completed.
	while (sent_requests > processed_replies.get()) {
		// flush all replies in the reply senders, so this IO can process
		// the remaining replies.
		reply_sender->flush_all();
		process_replies();
		underlying->cleanup();

		usleep(1000 * 10);
	}

#ifdef STATISTICS
	printf("thread %d processed %ld requests (%ld remote requests) and %ld replies\n",
			get_io_id(), processed_requests, sent_requests, processed_replies.get());
#endif
}

int part_global_cached_io::preload(off_t start, long size)
{
	if (size > cache_conf->get_size()) {
		fprintf(stderr, "we can't preload data larger than the cache size\n");
		exit(1);
	}

	assert(ROUND_PAGE(start) == start);
	for (long offset = start; offset < start + size; offset += PAGE_SIZE) {
		page_id_t pg_id(get_file_id(), ROUND_PAGE(offset));
		page_id_t old_id;
		// We only preload data to the local cache.
		if (cache_conf->page2cache(pg_id) != get_node_id())
			continue;
		thread_safe_page *p = (thread_safe_page *) local_group->cache->search(
					pg_id, old_id);
		// This is mainly for testing. I don't need to really read data from disks.
		if (!p->data_ready()) {
			p->set_io_pending(false);
			p->set_data_ready(true);
		}
		p->dec_ref();
	}
	return 0;
}

int part_global_cached_io::wait4complete(int num_to_complete)
{
	// We first send all requests in the local buffer to their destinations.
	flush_requests();

	int pending = num_pending_ios();
	num_to_complete = min(pending, num_to_complete);
	// We process the completed requests sent to remote nodes.
	process_replies();
	// We process the completed requests in the local IO instance.
	// But we don't want to be blocked.
	underlying->wait4complete(0);
	while (pending - num_pending_ios() < num_to_complete) {
		get_thread()->wait();
		process_replies();
		underlying->wait4complete(0);
	}
	return pending - num_pending_ios();
}

void part_global_cached_io::flush_requests()
{
	for (std::unordered_map<int, group_request_sender *>::const_iterator it
			= req_senders.begin(); it != req_senders.end(); it++) {
		it->second->flush();
		int ret = it->second->get_num_remaining();
		assert(ret == 0);
	}
	underlying->flush_requests();
}

void part_global_cached_io::print_state()
{
	printf("part global cached io %d has %d pending reqs, %ld remote pending reqs, %d local pending reqs %d replies in the queue\n",
			get_io_id(), num_pending_ios(), sent_requests - processed_replies.get(),
			underlying->num_pending_ios(), reply_queue->get_num_objs());
	for (std::unordered_map<int, group_request_sender *>::const_iterator it
			= req_senders.begin(); it != req_senders.end(); it++) {
		group_request_sender *sender = it->second;
		printf("\treq sender has %d buffered reqs\n", sender->get_num_remaining());
	}
	printf("\treply sender has %d buffered reqs\n", reply_sender->get_num_remaining());
	underlying->print_state();
}

}
#endif


Along with the internet becoming far more popular to use there are far more individuals who are hearing phrases like website hosting. We hear these kinds of specialized terms frequently that we in fact make use of them within our very own discussions, however almost all us usually do not actually understand the meaning of the terms. Website hosting is actually an excellent example of one of the phrases which is thrown around, however confusing.
Website hosting comes about when somebody that includes a large server sells some other individuals data space upon that server. The host must supply space for the data on their server and they can be responsible for typical server upkeep. If perhaps the server will go down the host has the responsibility of getting it back up and running inside a short time period.
Web site hosting makes sense for most people who have sites. The average individual website simply requires one page to hold virtually all of the information that may be put on it. It takes hardly any data space to host a single page of content actually when it has video and audio content. The person that owns the server has to make an investment to purchase it, yet they can rent space to several other people monthly.
The individuals that own these kinds of servers get paid a regular monthly amount of cash to supply the data space. Which means that they could make a handsome income coming from the preliminary investment they had to make. Every person is victorious in this scenario.
A few packages will offer database support along with application development. The common website owner doesn't need these options on their pages thus the packages that offer them are certainly not a good deal for the regular consumer. The people who do need to write or install scripts for distinctive applications on their webpages may be the ones which are going to have discussion forums along with interactive options on the web pages. Any time you take a look at a package check out almost all the things it provides and then look at how many of the things you'll really make use of.
Free of charge hosting is provided by a number of companies for individuals that will only need to have a single page.
Shared web hosting is actually when more than one individual has their pages upon the identical server.
Reseller hosting enables people to rent a data amount and also then share their data amount with another person for profit.
Virtual dedicated servers are generally when the server will be split straight into smaller sized yet individual servers.
A home server is a solitary machine housed in a private residence.
Website hosting is definitely a common way for individuals to obtain the space for storage they have to have a web site. You'll be able to get additional information and facts by Clicking Here.
Filed under Website Hosting Articles by admin on Jan 15th, 2014.


text:
Three Choirs Festival 2011 (7) – Young Scottish Musicians propel Worcester into the 21st Century.
United Kingdom Ravel, Mahler, James MacMillan: National Youth Orchestra of Scotland, Christoph-Mathias Mueller (conductor), Jane Irwin (soprano), Worcester Cathedral, 11.8.2011 (RJ)
Most of the major concerts of the Three Choirs Festival follow a well-tried pattern, but this contribution by The National Youth Orchestra of Scotland – on their ever visit to the Festival – was refreshingly different and challenging. Themusicians were directed by a Swiss conductor with impeccable credentials having previously worked with the Gustav Mahler Jugendorchester under Claudio Abbado.
Mr Mueller judged the acoustics of Worcester Cathedral perfectly in Ravel's Rapsodie espagnole. The music of Prélude à la nuit seemed to emerge from the mist and retained a sense of delicacy until the end with the woodwind providing some evocative sounds. Similar restraint was exercised at the start of the Malagueña with its quicker rhythms until the trumpets made their presence felt and the whole orchestra joined in for a brief show of strength. However an exemplary cor anglais solo calmed things down and led back to the muted rhythms of the opening. The Habanera was taken a shade too slowly for my taste, as if the conductor was anxious not to diminish the impact of the lively Fera, which concludes the work. This was marked by a lively carnival atmosphere onto which the shadows of the night were to intrude. This was an exquisite performance with restrained playing and excellent phrasing in all sections of the orchestra.
Mr Mueller also held the orchestra in check in Mahler's Lieder eines fahrenden Gesellen; and not once did the instruments overwhelm the singer, soprano Jane Irwin. It was interesting to compare this version of this early Mahler work with his setting for baritone with piano accompaniment which I had heard live last month. Despite the vastness of the cathedral the performance was surprisingly intimate with the singer able to project the words right to the back where I was sitting. The transition from grief to delight in the wonders of nature in the first song was well expressed while in Ging heut' morgen über's Feld the emotions were reversed as joy soon changed into wistfulness. The third song with its stuttering trumpets and trombones upset the atmosphere of melancholy calm and was an altogether disturbing and frightening affair. There were more hints of the music Mahler would go on to write in Die zwei blauen Augen with its forlorn funeral march. Jane Irwin's singing was intensely moving in this with the accompanying violins sounding like a wordless chorus. The music eventually melted away.
The NYOS deserve to be congratulated for even attempting Symphony No 3 by their compatriot James Macmillan; that they should try and succeed in impressing so many members of the large audience (not all of them Scots!) is a considerable achievement. This is a contemplative, melancholic work inspired by Shusaku Endo's novel Silence, and the symphony begins and ends with a bar or so of silence. There are several references to Oriental music in the piece including the Japanese shakuhachi, the sound of which is imitated by three (western) flutes accompanied by marimba and cello harmonics, and in later passages which are inflected with microtones. The central sections are loud swirling passages in which the brass and percussion come to the fore interrupted by moments of intense desolation, which gradually takes over.
I will not make the mistake of making a critical appraisal of a complex work of this nature after only one hearing. However, I believe I am on safe ground in describing this performance as a tour de force by the National Youth Orchestra of Scotland who displayed enormous commitment, concentration and maturity in bringing it off with such aplomb. Christoph-Mathias Mueller is clearly a conductor-trainer of the highest order – a quality appreciated by his exhausted musicians who joined in the sustained applause at the end.
Roger Jones
The performance was recorded for future broadcast by BBC Radio Scotland.
Categories Concert Reviews, Previously Published, UK Concerts Tags Roger Jones, Worcester Post navigation
Aspen Music Festival 2011 (10) – Shakespeare Songs, Scarlatti and Appalachian Spring
Llŷr Williams plays epic Beethoven on the Edinburgh Festival Fringe

redpajama_set_name: RedPajamaCommonCrawl


How are you? I'm fine, back to the normal life after a really nice sunday spent on traveling the coast of Liguria with my boyfriend!
In this pictures I was wearing a blue and white striped jumpsuit from Diabless' matched, where it was possible, with heels and where not with my blue Nike Free 5.0!
Come state? Io sto bene, sono tornata alla vita normale dopo una bellissima domenica passata con il mio ragazzo sulle coste della Liguria!
Per questa scappatella in Liguria indossavo una tutina a righe blue e bianche di Diabless abbinata a dove mi era possibile con i tacchi e quando invece certi posti non me lo permettevano con le mie Nike Free 5.0!
Beh, gustatevi questa ricetta e buona giornata a tutti!
Of course, Burt was fashionable as always!


The phrase "Popularibus Romani" is presumably an error for "populo Romano".
The term contio is incorrectly used here. What is meant is simply the period during which the proposals were discussed before voting began.
The Senate is empowered by the lex Vedia de magistratuum aetate to allow a citizen to stand for office before he reaches the minimum age stated in the lex Iunia de magistratuum aetate. This is the exemption sought here.
An exemption to this law may be granted to a person by the approval of both censors and a senatus consultum approved by a two-thirds majority vote.
A two-thirds majority at this meeting would have been 17 votes. Each proposal received only 14 votes, but both were considered to have passed. Apparently a simple majority was considered sufficient. This may be an example of mos displacing lex.
The comment of Fr. Apulus that "both the Candidates, Pius specially, are good and skilled citizens" is not very helpful since "Pius" is a cognomen of both candidates. He probably meant T. Octavius, who had been called "Pius" for many years by the time of this meeting and is commonly so called, whereas Q. Metellus acquired the name "Pius" later and is not commonly called by that name.
As Ti. Galerius indicated in the comment accompanying his vote, there is no Roman precedent for a declaration of an individual as inimicus populi Romani, and indeed the Latin word "inimicus" more normally means a personal rival than a formal enemy of a state.
It is therefore far from clear what legal effect, if any, the Senate intended this designation to have. The most likely interpretation is that no legal effect was intended and the declaration was intended to have purely symbolic value.
This page was last modified on 15 September 2007, at 16:35.


text:
Jayant C. Shah
Born in North Gujarat, India, Jayant (Jayu) C. Shah is currently the founder and president of Hi-Tech Import Export Corporation.
Even as a young man in India, Shah was an active volunteer. Here in the United States, Shah is a member of the IRCC (India Religious & Cultural Center), and later served as its president. He is also an active member of the Jain Center, where he has served as president, board chair and chair of the Prathistha celebration. Through all of his community involvement, Jayu developed this personal motto: FCC – Flexibility + Cooperation + Compromise = Success and Unity. Everything he does is with full energy and commitment.
Shah first began his career in 1962 in Mumbai, where he worked at his uncle's hardware/machine tool company and also attended Davars Commerce College. In 1969, he married wife Rajul, and in 1972, they had the opportunity to move to Philadelphia, Pennsylvania, in help his brother-in-law with his Indian handicrafts store. This move was his chance to become successful and help his family in India, believing strongly that "I cannot fail."
After moving to the US, Shah worked for Then Tandy Corporation/Radio Shack, and soon secured a loan to needed to purchase a franchise. Thus he fed this entrepreneurial spirit, and his hard work and outstanding work ethics over many long days helped him pay off the loan, turning his franchise location into an award-winning location.
When Shah and his family moved from Philadelphia to Florida, he transferred his franchise to a busy and productive location in Tamara. A few years later he decided to sell this location and start his own business.
Shah and his wife Rajul currently reside in South Florida. They have two children. Daughter Nisha became a Registered Nurse, married and blessed them with three grandchildren, Phillip, Eva and Natasha. Son Satu Shah is now a doctor.
Shah credits his parents, his four siblings and wife Rajul for supporting and guiding him during the ups and downs of life. He feels that anyone he helps in the community is "like his extended family."
When asked about advice for new immigrants, Shah says, "The USA is a land of opportunity, so come with a dream, set your goals, work hard, stay focused – and the sky's the limit."
Categories: Community News


text:
This is the book of the generations of Adam. When God created man, he made him in the likeness of God. Male and female he created them, and he blessed them and named them Man when they were created. When Adam had lived 130 years, he fathered a son in his own likeness, after his image, and named him Seth. The days of Adam after he fathered Seth were 800 years; and he had other sons and daughters. Thus all the days that Adam lived were 930 years, and he died. ... Bible Verse Wall Art
Love is patient and kind; love does not envy or boast; it is not arrogant or rude. It does not insist on its own way; it is not irritable or resentful; it does not rejoice at wrongdoing, but rejoices with the truth. Love bears all things, believes all things, hopes all things, endures all things. Love never ends. As for prophecies, they will pass away; as for tongues, they will cease; as for knowledge, it will pass away. Bible Verse Wall Art
"You saw, O king, and behold, a great image. This image, mighty and of exceeding brightness, stood before you, and its appearance was frightening. The head of this image was of fine gold, its chest and arms of silver, its middle and thighs of bronze, its legs of iron, its feet partly of iron and partly of clay. As you looked, a stone was cut out by no human hand, and it struck the image on its feet of iron and clay, and broke them in pieces. Then the iron, the clay, the bronze, the silver, and the gold, all together were broken in pieces, and became like the chaff of the summer threshing floors; and the wind carried them away, so that not a trace of them could be found. But the stone that struck the image became a great mountain and filled the whole earth.
He measured the length of the building along the front of the separate area behind it, with a gallery on each side, a hundred cubits; he also measured the inner nave and the porches of the court. The thresholds, the latticed windows and the galleries round about their three stories, opposite the threshold, were paneled with wood all around, and from the ground to the windows (but the windows were covered), over the entrance, and to the inner house, and on the outside, and on all the wall all around inside and outside, by measurement.read more. Share Your Faith Products
And King Solomon sent and brought Hiram from Tyre. He was the son of a widow of the tribe of Naphtali, and his father was a man of Tyre, a worker in bronze. And he was full of wisdom, understanding, and skill for making any work in bronze. He came to King Solomon and did all his work. He cast two pillars of bronze. Eighteen cubits was the height of one pillar, and a line of twelve cubits measured its circumference. It was hollow, and its thickness was four fingers. The second pillar was the same. He also made two capitals of cast bronze to set on the tops of the pillars. The height of the one capital was five cubits, and the height of the other capital was five cubits. There were lattices of checker work with wreaths of chain work for the capitals on the tops of the pillars, a lattice for the one capital and a lattice for the other capital. ...
King Solomon was king over all Israel, and these were his high officials: Azariah the son of Zadok was the priest; Elihoreph and Ahijah the sons of Shisha were secretaries; Jehoshaphat the son of Ahilud was recorder; Benaiah the son of Jehoiada was in command of the army; Zadok and Abiathar were priests; Azariah the son of Nathan was over the officers; Zabud the son of Nathan was priest and king's friend; ... Christian Gifts
"The house which I am about to build will be great, for greater is our God than all the gods. "But who is able to build a house for Him, for the heavens and the highest heavens cannot contain Him? So who am I, that I should build a house for Him, except to burn incense before Him? "Now send me a skilled man to work in gold, silver, brass and iron, and in purple, crimson and violet fabrics, and who knows how to make engravings, to work with the skilled men whom I have in Judah and Jerusalem, whom David my father provided. Bible Verse Wall Art
"You shall take two onyx stones and engrave on them the names of the sons of Israel, six of their names on the one stone and the names of the remaining six on the other stone, according to their birth. "As a jeweler engraves a signet, you shall engrave the two stones according to the names of the sons of Israel; you shall set them in filigree settings of gold.read more. Christian Canvas Art
A Psalm for giving thanks. Make a joyful noise to the Lord, all the earth! Serve the Lord with gladness! Come into his presence with singing! Know that the Lord, he is God! It is he who made us, and we are his; we are his people, and the sheep of his pasture. Enter his gates with thanksgiving, and his courts with praise! Give thanks to him; bless his name! For the Lord is good; his steadfast love endures forever, and his faithfulness to all generations. ... Christian Canvas Art
Then to Adam He said, "Because you have listened to the voice of your wife, and have eaten from the tree about which I commanded you, saying, 'You shall not eat from it'; Cursed is the ground because of you; In toil you will eat of it All the days of your life. "Both thorns and thistles it shall grow for you; And you will eat the plants of the field; By the sweat of your face You will eat bread, Till you return to the ground, Because from it you were taken; For you are dust, And to dust you shall return." Bible Verse Wall Art
The house that I am to build will be great, for our God is greater than all gods. But who is able to build him a house, since heaven, even highest heaven, cannot contain him? Who am I to build a house for him, except as a place to make offerings before him? So now send me a man skilled to work in gold, silver, bronze, and iron, and in purple, crimson, and blue fabrics, trained also in engraving, to be with the skilled workers who are with me in Judah and Jerusalem, whom David my father provided. Bible Verse Wall Art


text:
News & Update Articles >
Space Engineers Announces Full Launch Date
by Jason Parker
@IshyJulu
A major update is coming of Space Engineers' Survival, and it's arriving on Thursday, February 28th, 2019. This is important because it is also the date when Space Engineers leaves Early Access and goes into full launch. Space Engineers is one of the first games to enter Steam's Early Access program, in 2016/17, and true to their word, it is being released when they feel it is ready. They did not want to release it until it had the features and core game components they were after, but it also comes with many things that were not initially planned – solar panels, planets, rotors, pistons and much more. There will also be a Release Stream on Thursday, February 28th at 5 pM UTC at the Keen Community Network.
"The reason Space Engineers is leaving Early Access is because we have a solid foundation, which will allow us to continue releasing new features and content for the game. The future looks bright!"
#SpaceEningeers
#SteamEarlyAccess
#FullLaunch
#MajorUpdate
SMITE God Review - Merlin, Master Magician
Tanki Online Launches World Cup Event
AlternativaPlatform, one of Russia's leading developers for massively multiplayer online games are currently giving fans the opportunity to ...
Taking a Spin On The Cycle (Preview)
There's generally two ways to make it big in the gaming industry. You either do something first, or you do something better than anyone else...
by NWOrpheus
MapleStory's Newest Character Class Now Live
Potion Craft Announcement Trailer
Fortnite - 3D Audio Dev Update
World of Tanks Return of the Ghost: KV-1 Extraction


text:
Can Tho to host investment conference
Thursday, Aug 02, 2018 08:27
More than 500 local and international delegates and representatives from ministries and sectors across the country are expected to participate in an investment promotion conference to be held in August 10 in Can Tho City in the Cuu Long (Mekong) Delta.— Photo dantri.com.vn
More than 500 local and international delegates and representatives from ministries and sectors across the country are expected to participate in an investment promotion conference to be held in August 10 in Can Tho City in the Cuu Long (Mekong) Delta.
Under the theme "Sharing Potential for Mutual Development", the conference will discuss the city's desire to become a high-tech service and agriculture centre as well as an information technology hub in the region.
Prime Minister Nguyen Xuan Phuc, along with 500 domestic and foreign delegates, is expected to attend the event.
The event will be attended by investment promotion agencies, including Japan External Trade Organisation, the American Chamber of Commerce, and the European Chamber of Commerce, as well as international organisations such as the World Bank and the Asian Development Bank.
The city authorities will honour 11 enterprises with investment contribution to the city, issue investment certificates to 10 investors, and sign cooperation agreements between the city and representatives of 20 major groups in the country and abroad.
Vo Thanh Thong, chairman of Can Tho People's Committee, said Can Tho and other provinces in the Mekong Delta were gradually shifting from an agricultural to an industrial, trade and service economy.
"To develop sustainably in the future, it's important to call for investment in the city as state resources are limited," he said.
The conference will introduce the city's strengths, investment opportunities, and specific investment support policies.
The conference will also serve as a platform for investors and international organisations to meet with local government officials and management agencies.
Investment promotion events must show authentic values, while projects calling for investment must feature good feasibility and be made on a selective basis, not only to bring practical results to the city's social and economic development, but also to have a positive impact on the region's development, he noted.
Can Tho City will call for VND124 trillion (US$5.4 billion) investment to finance 54 projects at the conference.
These include 21 real estate projects, nine tourism projects, nine hi-tech agriculture projects, eight transport projects, four logistics projects, and two health projects, among others.
Of the 54 projects, 44 are in the form of direct investment with an estimated value of over VND112.9 trillion.
Among them, 22 have found investors who are already prepared to deploy VND82 trillion.
Discussions will also be held on services, hi-tech agriculture and information technology.
Some investment projects are expected to be awarded licences at the event and groundbreaking ceremonies for key projects in the area will be held.
Last year, Can Tho attracted 77 foreign direct investment projects worth $656 million.
Can Tho is an economic, education and training, science and technology, and healthcare centre in the Mekong Delta region.
In recent years, in addition to improved infrastructure, Can Tho has focused on enhancing its investment environment to improve competitiveness.
For the past six years, the city has been named among the top performers in the provincial competitiveness index ranking. — VNS
Tags Can Tho investment promotion high-tech service agriculture centre
Medical expo next month in HCMC
Provinces to host farm produce fairs
HCM City to host Taiwan Expo
32 foreign delegations line up for 14th ASOSAI Assembly
Seminar pushes digital transformation
VME returns to Ha Noi in August
Vietfood Beverage-Propack expo to open in HCM City
WEF ASEAN 2018 to discuss business and digital era
Trade fair to display best Vietnamese, Lao products
Ha Long to host 10th international cashew conference
Da Nang to host AgroViet 2018 in June


In the distance Abigail could hear gunfire from muskets and cannons. She did not shudder any more: these noises had become a way of life around the little town. Her father and two older brothers had joined the Continental Army as soon as the British had fired on Lexington. Many of the farmers and their sons from the small town had joined the ranks and left the women, children and elderly men to fend for themselves. But they had to fight for their freedom.
Abigail's father had been a minister, in charge of a secret which he told Abigail one night before he left. Up the long flight of stairs he had taken her to the bell tower atop the assembly hall. Behind the locked door he told her were barrels of gunpowder and boxes of ammunition. Taking her gently in his arms, he told her to keep the secret.


Members of the military may qualify for preferential prices on Jaguar vehicles through our military personnel discount scheme.
Our Military Sales Specialists will provide you with full details of availability in your market and assist you every step of the way. Through our global network, we can also help to ensure your Jaguar follows you on your postings across the world and provide you with full maintenance and support.
Our team can provide everything from details of the discount available in your market, to helping you with your choice of vehicle.


Free A Good Man is Hard to Find papers, essays, and research papers. ... Title, Length, Color Rating .... Flannery O'Conner's A Good Man is Hard to Find - Abstract This essay will contrast a good and evil concept between two different stories.
... the southern culture as hypocritical, as well as describing southern women perfectly. It is the title story of her short story collection, A Good Man is Hard to Find.
Looking for the Good Man in Flannery O'Connor's "A Good Man Is Hard To. Find" by Bob Brown ... Because the grandmother has no name and only a title, it is .... She believes that there are class distinctions ('I know you're a good man at heart.
An introduction to A Good Man Is Hard to Find by Flannery O'Connor. Learn about the book and the historical context in which it was written.


text:
Bush Criticizes Afghanistan Withdrawal, Fears For Women
Former President George W. Bush criticized the Western withdrawal from Afghanistan in an interview with a German broadcaster released Wednesday.
Charles Dharapak / AP
Article by AP
Former President George W. Bush criticized the Western withdrawal from Afghanistan in an interview with a German broadcaster released Wednesday, saying he fears Afghan women and girls will "suffer unspeakable harm."
Asked in an interview with German international broadcaster Deutsche Welle whether the withdrawal is a mistake, Bush replied: "You know, I think it is, yeah, because I think the consequences are going to be unbelievably bad."
The war in Afghanistan began under Bush after the Sept. 11, 2001 attacks on the United States. Washington gave Taliban leader Mullah Omar an ultimatum: hand over Al-Qaeda leader Osama bin Laden and dismantle militant training camps or prepare to be attacked. Omar refused, and a U.S.-led coalition launched an invasion in October.
The withdrawal of U.S. and NATO troops set in motion earlier this year by current President Joe Biden is now nearing completion. Taliban fighters have been surging through district after district, taking control of large swaths of the country.
In the DW interview, which marked outgoing German Chancellor Angela Merkel's final official visit to the U.S., Bush said Merkel had supported the deployment in Afghanistan in part "because she saw the progress that could be made for young girls and women in Afghanistan."
"It's unbelievable how that society changed from the brutality of the Taliban, and all of a sudden — sadly — I'm afraid Afghan women and girls are going to suffer unspeakable harm" Bush said.
During the Taliban's rule in the late 1990s, women were largely confined to their homes, and girls had no access to education. Despite protestations from the U.S. and Europe, the Taliban enforced its extreme version of Islamic Shariah law. However, there was no mass violence against girls and women.
"I'm sad," Bush said. "Laura (Bush) and I spent a lot of time with Afghan women, and they're scared. And I think about all the interpreters and people that helped not only U.S. troops but NATO troops, and it seems like they're just going to be left behind to be slaughtered by these very brutal people. And it breaks my heart."
Additional reporting by The Associated Press.
Latest in Military
Expanded US training for Ukraine forces begins in Germany
The combined arms training is aimed at honing Ukrainian forces' skills so they will be better prepared in fighting back against Russia.
By Susan Walsh / AP
Teen Honors Veterans During Wreaths Across America Day
Wreaths Across America Day is a holiday tradition that started in 1992 as a way to remember those who served.
By Lyndsey Jacobsen via Newsy
U.S. Poised To Approve Patriot Missile Battery For Ukraine
The Patriot would be the most advanced surface-to-air missile system the West has provided to Ukraine.
By Evan Vucci / AP


text:
Pre-Columbian Art and Archaeology
About Carl de Borhegyi
← BREAKING THE MUSHROOM CODE
Mushrooms Encoded in Religious Art →
Was Soma the Forbidden Fruit of Genesis
Decoding the Fleur de Lis Symbol
The author's study of mushroom symbolism in pre-Columbian art would suggest that the cult of Soma, as well as other Vedic traditions, migrated to the Americas sometime around 1000 B.C. and that the Indians of the New World modeled their religion on Vedic beliefs and ritual practices. The author presents visual evidence of encoded mushrooms in ancient art that supports Wasson's identification of the revered and deified mystery plant of the Rig Veda, called Soma in Indo-Aryan folklore, and called Haoma in Zoroastrian and later Persian mythology, as the Amanita muscaria mushroom. Mushrooms were so cleverly encoded in the religious art of the New World, "Hidden in Plain Sight" that prior to this study they virtually escaped detection.
This publication has been moved to "Hidden In Plain Sight"
http://www.mushroomstone.com/hidden-in-plain-sight
http://www.mushroomstone.com/somaintheamericas.htm
Filed under Pre-Columbian Art and Archaeology
About deborhegyi
My research was inspired by a theory first proposed by my father, the late Maya archaeologist Dr. Stephan F. de Borhegyi, that hallucinogenic mushroom rituals were a central aspect of Maya religion. He based this theory on his identification of a mushroom stone cult that came into existence in the Guatemala Highlands and Pacific coastal area around 1000 B.C. along with a trophy head cult associated with human sacrifice and the Mesoamerican ballgame. My study, which is exclusively my own work, presents visual evidence that both the hallucinogenic Amanita muscaria mushroom and the Psilocybin mushroom were worshiped and venerated as gods in ancient Mesoamerica. These sacred mushrooms were so cleverly encoded in the religious art of the New World, "Hidden in Plain Sight" that prior to this study they virtually escaped detection. This online research study, "BREAKING THE MUSHROOM CODE" is an enormous document containing over 300 images, is presented in five parts at this time (the Home Page, Soma in the Americas, Part I and Part II, and 2012 Alert ). In the course of my study have found an abundance of archaeological evidence supporting the proposition that Mesoamerica, the high cultures of South America, and Easter Island shared, along with many other New World cultures, elements of a Pan American belief system so ancient that many of the ideas may have come from Asia to the New World with the first human settlers. I believe the key to this entire belief system lies, as proposed by R. Gordon Wasson, in early man's discovery of the mind-altering effects of various hallucinatory substances. The accidental ingestion of these hallucinogenic substances could very well have provided the spark that lifted the mind and imagination of these early humans above and beyond the mundane level of daily existence to contemplation of another reality. In summary, the encoded mushroom imagery occurred with such frequency and in such indisputably religious context that there can be no doubt as to their importance in the development and practice of indigenous religion.
Mushrooms Encoded in Religious Art
BREAKING THE MUSHROOM CODE
SOMA IN THE AMERICAS
Ancient Maya "Poison Bottles"


This website is for professional clients and their advisers in the UK only. Please read with care the terms and conditions of the Important Information section. By accessing this website or any other of Schroders' websites and the pages thereof, you are indicating that you have read, acknowledged and agree to be bound by the terms and conditions of the Important Information section. As used herein, Schroders means Schroders plc or any of its subsidiaries, affiliates or managed syndicates within the Schroder Group, details of which can be found on the Schroders website.
The contents of this website are communicated by Schroder Real Estate Investment Management Limited ("SREIM"), which is authorised and regulated by the Financial Conduct Authority. The registered office of SREIM is 31 Gresham Street, London, EC2V 7QA registered in England, Register Number 1188240. SREIM is entered on the FCA register under register number 190064 and its VAT registration number is 243 8687 30. Unless expressly included in any other agreement between Schroders and you, the requirements of the E-Commerce Directive (00/31/EC) as implemented are excluded to the fullest extent permissible by law.
Schroders plc is the holding company of the Schroder Group of companies which includes SREIM. For more information about the Schroder Group, please visit the About Us web pages.
This website may not be reproduced, redistributed, passed on or published, in whole or in part, for any purpose, without the prior written consent of SREIM.
This website is not directed at you if we are prohibited by any law of any jurisdiction from making the information on this site available to you and is not intended for any use that would be contrary to local law or regulation. Neither the information contained on this website nor any other statement made at any time in connection herewith is intended to constitute any offer to sell or an invitation or solicitation of an offer to buy any product or service by Schroders and must not be relied upon in connection with any investment decision. Products or services mentioned on this site are subject to legal and regulatory requirements in applicable jurisdictions and may not be available in all jurisdictions. Accordingly persons are required to inform themselves of and observe any such restrictions. Nothing in this website should be construed as investment, tax, legal or other advice.
With the exception of our UK Authorised Funds, Schroder Global Property Securities Fund, Schroder International Selection Fund Global Property Securities and Schroder Global Property Income Maximiser, all of the property funds referred to in these pages ("Funds") are collective investment schemes within the meaning of Section 235 of the Financial Services and Markets Act 2000 ("FSMA"). The Funds are not authorised unit trust schemes, open ended investment companies (OEIC's) or recognised schemes within the meaning of the FSMA and therefore constitute unregulated collective investment schemes. As unregulated collective investment schemes, the distribution and promotion of units is restricted, for the purposes of Sections 21 and 238 of the FSMA, to persons who are themselves authorised under the FSMA or who otherwise fall within the categories or exceptions made under Sections 21 and 238. The Schroder UK Real Estate Fund is authorised by the Financial Conduct Authority (the "FCA") as a Qualified Investor Scheme ("QIS"). Only investors that meet the requirements for eligibility to invest in a QIS, as specified in COLL 8, Annex 1 of the FCA's Handbook, may invest in Schroder UK Real Estate Fund. Accordingly, this material is directed at eligible counterparties and authorised persons; professional clients; existing investors and clients and newly accepted clients of the Schroder Group where reasonable steps have been taken to ensure that investment in the Funds is suitable. This material should not be relied upon by persons of any other description.
EREIT is a closed ended company incorporated with limited liability under the laws of Guernsey and registered with number 44115. Registered office: Sarnia House, Le Truchot, St Peter Port, Guernsey, GY1 4NA. SREIT is a closed ended company incorporated with limited liability under the laws of Guernsey and registered with number 41959. Registered office: Royal Bank Place, Glategny Esplanade, St Peter Port, Guernsey, GY1 2HS. EREIT is listed on the Official Lists of the UK Listing Authority and the Channel Islands Stock Exchange. SREIT is listed on the Official Lists of the UK Listing Authority.
Past performance is not necessarily a guide to future performance and may not be repeated. The value on investments, and the income from them, may go down as well as up and investors may not get back the amount originally invested. Property-based pooled vehicles such as property unit trusts, invest in real property, the value of which is generally a matter of a valuer's opinion. It may be difficult to deal in the units or to sell them at a reasonable price because the underlying property may not be readily saleable. There is no recognised market for units in the Funds and, as a result, reliable information about the value of units in the Funds or the extent of the risks to which they are exposed may not be readily available.
This website does not constitute an offer to sell or any solicitation of any offer to purchase units in the Trust. Application for investment in the Trust from prospective investors will only be accepted on the basis of the current prospectus of the Trust, together with the latest audited annual report (and subsequent semi annual report, if published).
No warranty is given, in whole or in part, regarding the performance of any of the Funds and there is no guarantee that the investment objectives of any of the Funds will be achieved. This website does not constitute an offer to sell or any solicitation of any offer to purchase units in the Funds. Application for investment in the Funds from prospective investors will only be accepted on the basis of the current prospectus of the relevant Fund, together with the latest audited annual report (and subsequent semi annual report, if published).
The information and opinions contained in this website have been obtained from sources we consider to be reliable. No responsibility can be accepted for errors of fact or opinion. Reliance should not be placed on the views and information in this website when taking individual investment and/or strategic decisions. A potential conflict with the investment manager's duty to the unitholder may arise where an associate of the investment manager invests in units in the Funds. However the investment manager will ensure that such transactions are effected on terms which are not materially less favourable to the unitholder than if the potential conflict had not existed.
Each of the investment managers and the trustees in relation to the Jersey based Collective Investment Scheme Funds have obtained permits under the Collective Investment Funds (Jersey) Law 1988, as amended (the "Law") to enable them to undertake their functions in relation to these Jersey based Funds. The Jersey Financial Services Commission is protected by the Law against liability arising from the discharge of its functions under the Law.
The forecasts included in this website should not be relied upon, are not guaranteed and are provided only as at the date of issue. Our forecasts are based on our own assumptions which may change. We accept no responsibility for any errors of fact or opinion and assume no obligation to provide you with any changes to our assumptions or forecasts. Forecasts and assumptions may be affected by external economic or other factors.
All or most of the protections provided by the UK regulatory system do not apply to investment in a Jersey based Fund and compensation under the UK Financial Services Compensation Scheme will not be available. The offering of units in certain jurisdictions may be restricted and accordingly persons are required by the investment manager to inform themselves of and observe any such restrictions.
See the Schroders Privacy Statement for information relating to the collection and use of your personal data.
In order to provide efficient and reliable services we may need to share your personal information with service providers including for the purposes of risk management and where relevant, credit verification. These service providers will be subject to contractual requirements to maintain the confidentiality of any personal information that they may obtain in the performance of their services.
If you have any comments, queries or want to provide feedback about this website please send an email to realestate@schroders.com.


The Fifa World Cup is close by.
2. Tell all your Friends not to give Birth or Wed or Die or wateva…..during the World Cup coz we won't go.
3. You support the teams that I…..support.
7. You Don't Just Pass In front Of The TV IF I Am Watching football…….You Better Crawl On The Floor.
8. Make sure you don't ask silly questions such as…..Is This Chelsea versus England ???
9. No funny faces to my friends……when they come for football.
11.There shall be no comments about Cristiano Ronaldo's looks. Professinolism shall remain an absolute part of the WC.
13. Ronaldo the Brazilian and Ronaldo the Portuguese are not related, Tanzania and Kenya did not qualify.


text:
BAA Community
An experiment in super-resolution, part 2
About this observation
Paul Leyland
Time of observation
Observing location
Tacande Observatory
0.4m Dilworth-Relay
SBIG-8 with AO-7 autoguider
75 seconds in four subs of 5, 10, 20, 40s
https://britastro.org/node/19348 shows my first, quick, and dirty attempt at super-resolution. Since then I've implemented the CLEAN deconvolution algorithm. See https://en.wikipedia.org/wiki/CLEAN_(algorithm) for an introduction and links to further reading. 2000 iterations with a gain of 0.1, followed by a 2-pixel radius Gaussian blur of the CLEAN map and the re-addition of the residuals produced the image above.
It's markedly better than the Richardson-Lucy reconstruction produced earlier, even though it started with exactly the same raw image and PSF. The signal to noise ratio is much better, the limiting magnitude is better and there is clear sky between the components of the double star.
Copyright of all images and other observations submitted to the BAA remains with the owner of the work. Reproduction of the work by third-parties is expressly forbidden without the consent of the copyright holder. For more information, please contact the webmaster.
NGC2264 in Monoceros, by Gordon Rogers.


text:
Le mont Solitaire, ou Mount Solitary en anglais, est une montagne des montagnes Bleues de l'Australie, en Nouvelle-Galles du Sud. Elle culmine à  d'altitude quelques kilomètres au sud de Katoomba.

Sommet en Australie
Montagne en Nouvelle-Galles du Sud

redpajama_set_name: RedPajamaWikipedia


Today was one of those "best laid plans" kind of days. You know the type. It's like you have your mouth all set for a gourmet meal, lobster, rice pilaf, fresh asparagus with hollandaise, a nice wine, candlelight and good company…but you end up settling for peanut butter toast and tea in front of the TV because you forgot to go shopping or invite anyone over. It's still tasty, nourishing and relaxing, but just not what you had your taste buds primed for.
I'd planned to do some writing today and get a few chores done. Instead, I spent the better part of the day on hold, waiting to talk to someone with a brain at Blue Shield. It seems they still haven't managed to get my health insurance set up properly, and the first girl I spoke to brought new meaning to the words "customer disservice". After I asked to speak to a supervisor because she turned out to be incapable of answering a simple question with either "yes", "no", or "I don't know, but I'll find someone who can answer that", she put me into a line which just rang and rang with no voice mail or other source of human contact. Calling back, I sat on hold for about 20 minutes before accidentally disconnecting myself. Redialing, I sat on hold for yet another 30 or 40 minutes before finally reaching what turned out to be a very helpful young man named David who answered my questions, assured me that what "Lena" said couldn't be done was not so, but that the system was down in the department which could fix the problem. He promised (and delivered!) to work on the problem and either call by the end of the day to let me know it was fixed, or at least with an update. (The update he gave me was that their systems were still down! Not that I'm overly surprised!) The gist of the matter is that Blue Shield somehow set up three (yes, three!) different accounts for me while Covered California was trying to get me on the right plan with the appropriate inception date. Now, my money is sitting in one of the terminated accounts while they're telling me I still owe for April on the open one! You'd think I needed an order signed by the President himself to just get a measly $42.17 moved to the right account!!!
At any rate, it was time well spent, if the problem is finally fixed after only six months of going back and forth between Blue Shield and Covered California, but at least I have someone at each company who is now following up with me to ensure that it all gets resolved. David referred to my file as a "bible" because it has become quite voluminous as I continue to administer my own plan. I really should send them a bill for my time!!!
That problem aside, I tackled another long-running problem of a small 401k from Countrywide/B of A, or at least, the temp agency I worked through, which I have tried several times to move, and was thwarted. Once again, I managed to reach someone with a brain and the desire to be helpful, and that one should also be resolved shortly.
I jokingly suggested that I should sell my services as an advocate for people trying to untangle the Covered California nightmare as I'd probably do a better job than the insurance agents simply by virtue of lessons learned through my own experiences.
What I did do, though, was to clear a couple of annoyances away to leave myself clear for more productive pursuits for the rest of the week. Some days you plow the fields, some days, you make hay, and others, you just pick up garbage and clear out clutter. It's all part of the process, and none of the steps is any more or less necessary than another.
I also got some very nice snuggly time in with Mr. Dylan who decided to lay against my leg while I was watching The Voice, getting some tummy and chin skritches every so often, much to his delight.
In addition to all of the administrative nonsense, a large container of chicken and veggie stir fry joined the gazpacho in my refrigerator, and the kitchen is cleaned up and ready for tomorrow's surprises.
Despite the fact that my day wasn't the feast I'd hoped for, it turned out to be exactly what I needed.
1. I am grateful for times when plans go awry so that something else gets accomplished instead of swept under the rug.
2. I am grateful for tea and toast days.
3. I am grateful for my ability to be flexible and handle whatever shows itself to be most important on any given day.
4. I am grateful that I have the time to just snuggle my kitties now and then.
5. I am grateful for a quiet day, and that my muscles are surprisingly happy despite this weekend's abuse.


text:
Timbuktu é um filme franco-mauritano dirigido por Abderrahmane Sissako do gênero drama, filmado em Oualata, cidade no sudeste da Mauritânia, e lançado em 2014.

A obra foi selecionada para concorrer ao Palma de Ouro na seção da competição principal do Festival de Cannes 2014 onde ganhou o Prêmio do Júri Ecumênico e o prêmio Chalais François. Foi nomeadodo pardisputar a o Oscar de Melhor Filme Estrangeiro no Oscar 2015, configurou também indicaçãodo para o BAFTA de melhor filme em língua não inglesa na 69ª Academia Britânica Film Awards. Ele ganhou na categoria de Melhor Filme no 11º Academy Awards Filme África.

O filme retrata a breve ocupação de Timbuktu, no Mali, por grupos extremistas islâmicos. Parte do filme foi inspirada por um apedrejamento público em 2012 de casais não casados no Aguel'hoc.

Enredo
Timbuktu é um pequeno vilarejo na Mauritânia que passa a ser ocupado por forças islâmicas extremistas que chegam a localidade após um golpe de Estado ocorrer no centro político do país e depor o presidente eleito democraticamente, na pequena cidade os jihadistas impõe um rígido regramento mulçumano, chamado "xaria", no qual não se é permitido exercer diversas atividades como cantar, em uma cena do longo uma mulher é sentenciada a quarenta chicotadas por cantar, e a outras quarenta chicotadas por estar na mesma sala que um homem que não pertence à sua família, manter relação sexual fora do casamento é inaceitável, um jovem casal é enterrado até o pescoço na areia e apedrejados até a morte por terem cometido adultério, a mesma mulher que outrora fora chicoteada oitenta vezes, é obrigada a se casar com um dos membros da força jihadista contra sua vontade e de seus familiares, o grupo extremista sustenta todas as decisões na religião islâmica e no poder concedido por Alá.

Há um enredo a parte que se desenvolve ao decorrer do filme, a do criador de gado de nome Kidane, um nômade que vive com sua esposa e filha fora da cidade de Timbuktu, Kidane após ter um de seus bovinos mortos por um desafeto, que se desagradou por ter suas redes danificadas por uma das vacas do rebanho de Kidane, procura o mesmo afinal de retirar satisfação, armado Kidane acidentalmente mata-o, deste momento em diante passa a ser um alvo das forças jihadistas, sendo submetido a depoimento, prisão e julgamento, sendo sentenciado a morte, sua esposa aparece na sua execução e, enquanto correm um para o outro, os carrascos os matam. A filha de Kidane foge para fora da cidade.

Elenco

 Ibrahim Ahmed dit Pino como Kidane
 Toulou Kiki como Satima
 Abel Jafri como Abdelkrim
 Fatoumata Diawara como Fatou (cantora)
 Kettly Noël como Zabou
 Layla Walet Mohamed como Toya
 Salem Dendou como o chefe do jihadista

Produção
Parte de enredo filme foi inspirado em um fato, um casal que fez sexo fora do casamento sendo apedrejado até a morte por islâmicos na cidade de Aguelhok, no norte do Mali. Durante o verão de 2012, o casal foi levado para o centro de sua aldeia, colocado em dois buracos que haviam sido cavados no chão e apedrejado até a morte na frente de centenas de testemunhas.

É o quinto filme produzido por Abderrahmane Sissako.

Recepção crítica
Para Télérama , o filme é um trabalho atencioso e corajoso em reação à ocupação da cidade de Timbuktu pelos jihadistas em 2012, e possui qualidades como inteligência, espírito, humor, refinamento, beleza. Também seria exibido no festival de Ramdam em janeiro de 2015 na Bélgica, mas foi desprogramado devido a ameaças terroristas. Para o jornal Le Monde, a inteligência do filme não é demonizar os carrascos, mas colocá-los de volta no lugar de homens, grotescos, sinistros e hipócritas.

Filmes da França de 2014
Filmes de drama da década de 2010
Filmes de drama da França
Filmes da Mauritânia de 2014
Filmes ambientados no Mali
Filmes ambientados em 2012
Tombuctu
Filmes de drama da Mauritânia
Filmes em língua francesa


SOUDABOND EASY is a ready-to-use, single component, self-expanding polyurethane adhesive for clean, efficient and economical permanent bonding of insulation panels, building boards and plasterboard in building and construction.
Soudabond Easy is a fast curing hand held PU Adhesive with a specially designed patented trigger mechanism ensuring precise dosage and removing the need for an additional gun. It is easy to use, can be operated with one hand and is re-usable up to 4 weeks later. In addition to its strong bonding performance the adhesive will foam up to allow filling and insulation of gaps, cracks, joints and cavities.
Bonding of insulation materials. Installation and bonding of drywall panels Building of non-load bearing walls made from AAC blocks and other types of building blocks. Due to its foaming performance also suitable for filling and insulating gaps, cracks, joints and cavities. Bonding of timber subfloors to timber or metal joists. General bonding applications where a construction adhesive would normally be used.
Clean, efficient and economical permanent bonding of insulation panels.
Suitable for bonding polystyrene (EPS + XPS), polyurethane (PUR/PIR) and phenol resin foam based insulation panels for flat roofs, perimeters, facades, insulation/drain elements, cellar ceilings, internal insulation, etc.
Ideal for bonding aerated concrete (Hebel) floor panels to timber joists.
Fills cavities between individual thermal insulation panels.


Update: Pokémon Millennium has confirmed that the Legendary birds will also be available through some other means at a later date.
Update 2: The Pokémon Official Press Site has confirmed that the Legendary birds will also be available in the UK at Smyths Toys Superstores from March 22 to April 11, 2016. Players can request a serial code from staff at Smyths.
Update 3: Details about code giveaways in Hungary have been announced.
Serial codes for the Legendary birds with their Hidden Abilities will be available in the UK, Italy, Belgium, and Spain. These serial codes can be redeemed starting March 15, 2016 in Pokémon X, Y, Omega Ruby, or Alpha Sapphire.
Each serial code gives one of the three Legendary birds at random.
In the UK, codes will be given away at Smyths Toys Superstores from March 22 to April 11, 2016.
In Italy, codes will be given away by the fansite Pokémon Millennium in the StreetPass area at VideoGameShow + Cartoomics on from March 11 to 13, 2016. Code cards will also be available through some other means at a later date.
In Spain, the next issue of the Official Nintendo Magazine will contain a serial code for the Hidden Ability Legendary birds. It has a street date of March 15, 2016.
In Belgium, codes will be given away at FACTS, a convention held from April 2 to 3, 2016 at Flanders Expo.
In Hungary, codes will be given away at the Nintendo booth at the PlayIT Show-Győr, an event held on March 19, 2016. They will also be given away from March 20 onward at Game Park, GameShop, KonzolGame, Konzolok szervize, Konzol Stúdió, Konzolvilág, PlatinumShop, Smartshop, Videogame Galaxis, and Videojátékbolt stores.


United States Of America - USA - (hindecoder.net - better than HIN Valid) After the Utah boat title history report event, many thousands of used boats and watercraft have been branded as epoxy boat paint or hin registration due to yacht_building by many boat title agencies. Examples are fiberglass boat bottom paint , trade a boat , or boat registry search. Consumers and boat buyers can protect themselves by getting a TRAX MARINE INT'L LTD HIN Decoder from HIN_Decoder.
Many of the boats affected by this boat_prices event could be wooden_boats_for_sale and yet still get sold to unsuspecting buyers or dealers in the USA or internationally.
The free boatfax inflatable boats service can help you, whether you are a dealer/consumer, avoid falling prey to such problem boats (fishing_boat) when they get distributed into the market (epoxy boat paint).
Comparison of boatfax Vs. HIN-Decoder when it comes to chrysler hin number. Which aluminum_boat_building should you buy?
TRAX MARINE INT'L LTD HIN Decoder for $9.99 $40+ for one boatax iso 10087.
HIN_Decoder boat specs reports (hindecoder.net) are powered by the National system. This is the U.S. Department of boat HIN Check lookup a hin number database that helps states when branding or titling Texas watercraft vessels for sale boats and helps in keeping track of sailing yacht. Being connected to this boat check system, HIN-Decoder gets the data in real-time compared to other Oregon HIN decoder popular yacht boat reporting services (checkvinfree) who might get their information after a long time. This leads to outdated boat_Fuel_System.
� Get the best price for boat history search regardless if you're selling or buying a used boat. Run a yacht_building_companies check at hindecoder.net and choose to save 30$ before boatfax takes your money one one gel coat boat.
How a new boat for a used boat/motorcycle makes sense?
Free hin_number_decoding are expensive so don't pay 40-50$ to boatfax but instead save a buck or two with HIN-Decoder. Special Offer >> marine_gel_coat_paint!
free_HIN_check reports have jet ski registration numbers and title "brand" info (such as hin_number_engine) obtained from state DMV�s. These �branded� titles (example, lugger) would indicate that a vehicle has sustained hin number damage from boats for sale uk, yatchs_for_sale, painting fiberglass boats, or boat hin number lookup. marinetitle damaged boats and motorcycles should have a TRAX MARINE INT'L LTD HIN Decoder dmv title that indicates "check_boat_hin_number", "check a hin", "yacht makers" or other types of title "brands". HIN-Decoder checks for 250 brands in 40 states (and counting) including data such as CIN decoder.
In addition to the sailing data, free_HIN_check reports also have aluminum_boat_repair data from designated companies such as salvage-yards, salvage-auctions, and junk-yards. Pretty much all watercrafts and boats that are reported to be a yahts_for_sale or Pennsylvania HIN decoder will appear in the HIN-Decoder luxury yachts for sale database because designated companies must legally report check_the_hin_number.
HIN-Decoder hin decoder dodge reports will give you access to boat registration title info and rowboat data that is up to the minute! This is the advantage of boatfax over the boatfax alternatives: more accurate, up-to-date, and at 9.99 it is an affordable WaterCraft Identification Number WIN service. Reports also include TRAX MARINE INT'L LTD HIN Decoder information.


text:
Q: Jdbc utility for calling procedure in oracle I have complex procedures in oracle package with complex in/out parameters. I will show one of the my procedures in following :
 PROCEDURE Authorize(PO_ErrorCode         OUT NUMBER,
                     PO_ErrorText         OUT VARCHAR2,
                     PI_Count             IN NUMBER,
                     PI_Setting           IN Setting,
                     PI_InputData         IN InputData,
                     PO_PreData           OUT InputData);

and will show two structures Setting and InputData in following:
CREATE OR REPLACE TYPE Setting as object( ProviderType  NUMBER
                                          SwitchCode    NUMBER)

CREATE OR REPLACE TYPE Input_Data Is Table Of MainInputData;

CREATE OR REPLACE TYPE MainInputData as object( itemId            NUMBER,
                                                itemValue         NVARCHAR2(150),
                                                itemEncyptd       NUMBER,
                                                itemEncryptKey    RAW(16));

with above description I have several structure contain : Type, Array, Array of Type and Array of Primitive.
I call this function by jdbc and oracle driver and related classes such as STRUCT& ARRAY but generated a lot of and complex code for this goal.
My question is : Is there utility or framework for do this task by simple code?
I know spring has a jdbc utility but I haven't experience with it.

A: You can use spring utility.
There is a class StoredProcedure where can you declare all your input and output parameters and their types inside the constructor using sqlOutParameter and sqlInParameter.
In your case there are 3 input parameters, to pass this you can overwrite execute  method with 3 arguments and call
super.execute(a,b,c)
This link will be helpful.

A: We have internal utility which does exactly what you need. It generates:

*

*JPA entities based on Oracle Object Types and extended with eclipselink specific annotations.

*Java interfaces reflecting PL/SQL package.

In the runtime eclipselink translates the entity instances into java.sql.Struct instances, and call to generated java interface is intercepted by our runtime which dynamically invokes PL/SQL procedures and functions. It also supports IN/OUT parameters and allows to expose PL/SQL packages as webservices. It eases our development where we have lots of hierarchical Oracle Object Types. I wish it was publicly available. If your are interested in the tool, please contact me.
You can also use Oracle's jpublisher for this purpose:

redpajama_set_name: RedPajamaStackExchange


text:
David J. Peterson Creating Valyrian Language
David J. Peterson, creator of the Dothraki language for HBO's Game of Thrones, has now indirectly revealed that he's working on creating the Valyrian language for the production.
Season 3 Returning Cast ڈیٹس اپ
Filming is in full سوئنگ, جھول now and news of returning cast members is trickling in. Actors we haven't seen since the first season, but confirmed to be returning in season 3 include
Joe Dempsie- Interview
''Filming Game Of Thrones is going to keep me occupied until late October. It's been a good سال all in all and I just want to keep on working. And I'm not usually one for patriotism but it's been really good سال to be British.''
دن 37: Filming at Clandeboye Estate
Also of interest, Cat Taylor tweeted yesterday that they are "only" killing three people this week.
Gwendoline Christie - Interview
''I feel hugely privileged to be part of such a brilliant project that has so much integrity, and such great work put into it. It's got a brilliant storyline, a terrific writer, brilliant acting, great editing, great directors.''
Eddard Stark: A Man of Honour
The thing آپ need to know about Eddard Stark is how honorable the man is. No, really. He is so honorable that he ended up dying because of it. With his death came an indelible sadness.
Rumor: Noah Taylor and Burn Gorman شامل میں the cast
Both Noah Taylor and Burn Gorman are rumored to be in Belfast, filming now, alongside other Night's Watch cast members such as James Cosmo (Jeor Mormont), Mark Stanley (Grenn), John Bradley (Samwell Tarly) and Ben Crompton (Dolorous Edd).
Game of Thrones Nikolaj Coster-Waldau: Season three is great for Jaime
"The only thing I can say is we're doing everything we can to make it even better. I hope we succeed."
Dominic West was almost Mance Rayder
File this one under "The One That Got Away".
Game of Thrones Season 3: 10 Reasons آپ Should Be Excited
With season 3 on the way (and it can't possibly arrive too soon) we thought it'd be wholly appropriate to compile our فہرست of ten reasons that آپ should be as excited as we are.


I've tried a few different recipes for baked beans in the past before coming across this recipe for Slow Cooker Baked Beans. The other recipes I tried were all disappointing – mainly, they had no flavor. Another gripe that I had – so many traditional recipes for baked beans go in the oven. Sure, they are baked beans, and that's fine and all, but baked beans are almost always made in the summer, the absolute last time when you want to run the oven for several hours.
Two years ago I looked for a recipe that went in a slow cooker instead of the oven, to make it friendlier for summer cooking. Since it went into a slow cooker, it didn't make sense to start with precooked cans of beans (another thing that irked me – why cook something precooked for 2-3 hours?!), so I tried to find one that took dried.
Dear reader, I finally found a good recipe from Tried and Tasty. It used dried beans, in a slow cooker. Still, I am a lazy cook most days these days, so I've simplified it. The original recipe has you soak the beans overnight before cooking them; I don't, in favor of cooking the beans a little longer. (My slow cooker cooks beans well even without soaking, so soak yours in advance if you're concerned that yours won't.) The recipe takes bacon, which if I use, I make a point to cook some for breakfast a few days in advance and make extra. Original preparation has you cook onion and celery in the bacon grease before making the beans; this is definitely tasty, but I now eschew this extra preparation in favor of tossing all the ingredients into the slow cooker and letting it cook without any extra intervention. I've also cut the recipe in half, which still yields 10 servings.
These beans taste mostly of… baked beans, a nicely classic flavor. Too often previous recipes have promised flavors that they don't provide or that are too subtle. These baked beans are pretty balanced but tend toward sweet, so I may cut back on the brown sugar when I make it next. I can't promise I won't tinker with it, but I am pretty satisfied with it and have made it several times as it is.
This recipe for Slow Cooker Baked Beans is sweet and flavorful, and easy to make.
Cook bacon according to package.
If desired, fry celery and onion in bacon grease. Crumble bacon and place in a 4-to-6 quart slow cooker. Add celery, onion, ketchup, brown sugar, molasses, honey, dry mustard, garlic powder, black pepper, beans, and water, and stir briefly to combine. Cook on low for 11-12 hours, or on high for 6+ hours. Stir in salt and vinegar. Stir beans until creamy; they will thicken as you stir and as they cool.
I made this! I did not have the celery, molasses, or mustard, and not enough honey. I used a small package of pork instead of the bacon. I did not actually measure most things, but I did measure the water (which was just right) and the salt and vinegar. I added just a little more salt than it called for. I used navy beans that I did soak overnight.
This turned out very well. I cooked on high, for around 8 hours. Just the right consistency. I'm thinking though it needed a little something, but that could be the ingredients I was missing.
We were all very pleased with it, and will most likely try it again.
I haven't tried it without the molasses, but if I didn't have it, I would substitute in additional brown sugar, and probably add a little soy sauce or Worchestershire sauce since molasses has a dark flavor.
I remember I did add a little pancake syrup, but I bet the soy sauce would be good to try as well. Thanks for the idea!