text:
Why do you prefer blonds or brunettes?
and in specific, what is your FAVORITE hair color on a guy/girl?
- BlondeVote A
- Light BrownVote B
- Dark Brown/BrunetteVote C
- BlackVote D
- Red/Strawberry BlondeVote E
Most Helpful Guy
I like the darker colors because I myself have light blond hair and I think it would look weird to see two people with blond hair dating or would it?22|00|0


text:
Mental health and fitness: Improve your mind and body
It's crazy all the systems we've conditioned our bodies to over-ride our mind-body connection. Too numerous people these days don't listen to something their body is telling them and act accordingly. Sadly, we've been told that we require to "push thru the pain," or "go for the burn" to get advantages from exercise. When we're bored, we reach for a high-caffeinated drink or sugar-filled snack to boost our energy rather of catching a quick cat-nap or thinking to get to bed earlier for a healthy night's rest. It's not normal that this is something we require to function! And food… our portion sizes are out of control also the fast-food, pre-packaged, treated foods being consumed are excessively high calorie and low nutrient to give us the fuel we require for a healthy body. We're craving for nutrients and eating more or more "empty calories," and the population as a whole is getting fatter, sicker, and go at a much younger age. Below some remarkable tips for mental health and fitness: Improve your mind and body, also these ways will help you to more active and successful.
For better or for critical, our minds and bodies are interconnected. If you need to know more about mental health, then visit here now- Wikipedia.org. It is up to us to become conscious of our mind-body connections and to promote a loving and harmonious relationship between the two. Your mind and fitness can keep you healthy or not, and although it is not total, we do have manage over how we think or react to the things around us. Find out some marvelous facts about the mind-body connection:
1. We All Have The Mind-Body Connection
Whether consciously aware of it or not, all of us experiences the mind-body connection every day of our lives. Instead of thinking of the connection as being far out of reach, or something only attainable through hours of yoga and meditation, learn it is always here. Mouth-watering over a delicious-looking dessert, or nervous "butterflies" in the stomach before doing a presentation, or running a race, are all ideal examples of natural mind-body connections, which most of us have experienced at an amazing point. Sometimes, the mind-body connection can create negative outcomes, like failing to meet energetic, academic, or professional goals due to nervousness set up by the mind.
2. Our Bodies Respond To How We Think
"All that we are arises with our thoughts. With our thoughts, we make the world."
In other words, if we are continually thinking negative, self-destructive thoughts, our bodies will support suit. Emotional and mental imbalance can start as anything like stress-induced headaches, tight shoulders, and a painful upper back, and point to unhealthy weight gain or loss, insomnia, also high blood pressure. On the other hand, we can make a mindful effort to think more positively and to develop healthy coping mechanisms for life's stress or trials. Over time, the state of our emotional or mental health can hurt or improve the body's immune system.
3. We Can Get Ourselves Sick, or We Can Make Ourselves Well
Studies prove our coping mechanisms and process we handle stress directly relate to how we deal with critical illnesses, including cancer. Chronic stress influences the body in a negative behavior, and across long periods of time, long-term stress can make us more susceptive to diabetes, hypertension, heart diseases, and unusual infections. However, by using our natural mind-body connection in a positive way, by saving our minds and bodies in shape with exercise or nutrition, we can keep stress levels lower. In another word, the better we can cope by staying calm and decrease psychological stress, we will, in turn, decrease or physical stress, along with the chance of produce a disease.
4. We Also Have A BODY-Mind Connection
If we give attention, it is easy to see the influence the body has on our state of mind as well. For example, while women's bodies are preparing for menstruation, it is the hormones in the body causing all of the dreaded symptoms. Another example of body-mind effects is the flu. More than likely, a person starts to feel out of sorts mentally the day or a few days before the body exposes a sore throat, nasal congestion, and other common physical symptoms.
On the flip side, the body-mind connection is incredibly positive things, whether it is endorphins provide after exercise or stress relief during a massage. In the physical poses of yoga, it is assumed that certain poses perform certain mental states. Backbends, for example, are thought to incite the mind, while inversions may bring on a quieter state. Exercise can be a cheap method to boost our focus, feeling, and overall health.
5. Food Affects Both Our Bodies & Minds
It moves back to that old saying, "We are what we eat." Every single morsel or liquid passing through our lips has some effect on our brains. Our nutritional eating, every day, can have huge impacts –- both negative also positive — on how we feel, thankfulness mostly to the chemical serotonin. In a nutshell, while serotonin levels are high, we're well, and when they're low, we become depressed. Eating extremely carbs and sugar can reduce sensitivity to serotonin, which leads to sad moods, and ultimately obesity. To stabilize serotonin levels, eating protein can be the resolution, particularly before carb-intake. Instead of eating a sugary pick-me-up midday, go for a snack crucial in protein to keep the mood positive or energy up, evade a crash later.
Physically fitness doesn't surely mean you're emotionally healthy–
Although physical fitness is connected to emotional happiness, the narrative doesn't always give straight answers. We all are living in times where a host of fitness or lifestyle magazines thrive on glorifying and peddling the thought of an 'ideal' male or
female body. This coupled with the 'gotta have it now' mindset is setting us up for deeper, psychological difficulty, where we're not only looking for faster results but frequently questioning ourselves for not fitting in with society's idea of a 'fit body.'
Benefits of mental fitness–
While you go to bed after a long day, your body start to relax. But the mind doesn't eternally follow.
Visualization can support. You can usually achieve a sense of peacefulness through imagery, the method of picturing a tranquil scene or location. This practice can decrease tension in both your body or your mind by challenging neurons in the less-dominant area of your brain. The less dominant side of your brain is the area that controls feelings of self-confidence also optimism. When you think about anything other than your daily worries, you build activity in the neural structures of that section of your brain.
Ultimately, visualization can promote your emotional well-being and soothe you down mentally. Above of those tips can help you to boost your health and keep your mind fresh and healthy. If you need to know more about mind, body, stress, anxiety, yoga or meditation, then visit this site you can know more about these topics- love good vibes

subset: commoncrawl


text:
This month UK copyright law with regard to furniture and lighting finally comes into alignment with that of mainland Europe. This will greatly extend the protection given to designers and the licensed manufacturers of their works, which here in the UK have been especially vulnerable to the trade in inferior quality, lookalike products.
In addition to restoring the integrity of widely known and copied design classics such as those from Mies van der Rohe and Charles and Ray Eames, it is hoped the new protections will help incentivise ongoing investment into new design in the UK.
Barcelona chair by Ludwig Mies van der Rohe for Knoll
Eames Lounge chair by Charles and Ray Eames for Vitra
Introduced last July with a transition period ending 28 January, the repeal of section 52 of the Copyright, Designs and Patents Act 1988 means that copyright on industrially produced works of 'artistic craftsmanship' is now extended from 25 years after introduction to the market, to the lifetime of the designer plus 70 years.
The repeal follows long campaigning from manufacturers, designers, design writers and retailers. Issues raised included protection of creators' royalties, European manufacturing jobs, consumers being misleadingly sold goods of wildly variable quality and of revenue that allows manufacturers to nurture new design and invest in innovative production.
Arco floor lamp by Achille Castiglioni for Flos
Wagenfeld 24 table lamp by Wilhelm Wagenfeld for Tecnolumen
"For far too long the UK law allowed some furniture retailers to actively mislead their customers into buying unauthorised, unlicensed, poor quality 'replicas' or 'copies' of the authorised designs. Essentially they were selling fakes. The change in the law is good news for consumers who can be confident that they are now buying a high quality and long lasting asset. And it should lead to the growth and development of the UK furniture industry as more UK designers and manufacturers see the long term benefits of investing in high quality furniture design". – Daniel Aram, Managing Director, Aram Designs Ltd
Bibendum armchair by Eileen Gray for Aram Designs
E1027 side table by Eileen Gray for Aram Designs
The extent of change brought about by the repeal remains to be seen, but the complete disappearance of 'inspired-by' furniture seems unlikely. Designers or licensees will be required to prove case-by-case that the work in dispute represents 'artistic craftsmanship' – a term without a statutory definition. Things to be judged will likely include the level of skill involved in the design and making of the original, as well as less easily measurable factors such as the artistic intention of the designer and the supposed public perception of a work.
Panton chair by Verner Panton for Vitra
However things unfold, Aram views the repeal as a welcome affirmation of the importance of intellectual property – a valuable piece of consumer protection and ultimately a healthy development for all sectors of the furniture industry.


text:
Quote: something very bad is going to happen as a result
Quote:Lightningfractal said:Organized religion is crap, agreed. But still there might be a boogeyman coming because this pope cat kicks the bucket. Just so you realize...
Quote:Fucknuckle said:The anti christ is aleady here and in a seat of powerIt is BUSH LOL
Quote:i think the catholic church is the WORST thing ever to happen to the christian religion...i don't mean to insult your beliefs, but come on...how can any "organized" religion support and hide the molestation of young children. I cant for the life of me figure how "one" selected man has any more power in this world to communicate with "God"...well Bush says he does...but thats another subject! yes the Pope will die, who really cares when......they will just pick another dude to fill the chair and collect the money.Did you really think the Godfather III was a joke? The church is about controlling minds and collecting money.
Generated in 0.042 seconds spending 0.009 seconds on 21 queries.


text:
your bag
Your bag is empty.
Sorry, this product has sold out!
If you would like ARCHFASHION to try to and find it for you complete the form below.
Soft cotton, sweet hearts… This pattern from rails has been a popular style. If you're looking for a relaxed boyfriend style that's feminine too, then hearts on fire just might be for you.
The on trend Rosci Shirt - Hearts On Fire from Rails has sold out. We did have it inXs, S, M & L.
Start a "Find It For Me" to notify hundreds of Australian Boutiques that you're looking for it and then be notified if it comes back in stock.


text:
Tag Archives: Art Fest
Happy Easter Post
It's been a busy Lenten season and tomorrow is Easter………time for serious reflection and contemplation. With tomorrow's sunrise service this artist's schedule begins morphing back to something resembling "normal" (whatever that is). The Lenten presentation and the associated art work … Continue reading


text:
Privacy guaranteed - Your email is not shared with anyone.
Separate names with a comma.
Our best catch from November 2010 on Little Bay De Noc. Five best fish would have weighed in the 46lb range.
The two largest walleyes are in...
Little Bay de Noc Perch
Windy day walleye!!!
We made it back to the Little Bay De Noc from November 12-15 and here are some of the great 'eyes that we caught at night.
A close up of the 30" - 10-1/2lb walleye that was released back into the waters of Little Bay De Noc.
Unfortunately this big 'eye didn't make it back in. It had only one eye and was close to 30-1/2", 10-1/2 lbs.
One nights catch of some nice eaters from the cold waters of Little Bay De Noc. Couldn't fit all of them on the bragging stick. What a great...
This one went home to get mounted. This was my buddies largest 'eye so far 30" - 10-1/2 lbs.
A nice 30" - 10-1/2 lb walleye that was released back into the waters of Little Bay De Noc.


text:
Transmit Multiple Google Protocol Buffers Messages Between Java and C++
I am working on a project that needs to transmit data between an Android application written in Java and a Windows application written in C++, and naturally I chose to use Google Protocol Buffers over UDP as the solution. I did a prototype, it worked fine until I wanted to put multiple messages into a single UDP packet.
There are several good reasons I want to put multiple messages into a single UDP packet, like performance and simplicity. The first message is fixed, program will read it first, then will know what are the messages after it based on the information from first message. For example, first message is always "fruit", it has data like type, color, weight, etc. Based on type, program will know there is an apple or orange after it.
After several hours of Google search and testing, finally I made it working to transmit multiple messages between Java and C++ using a single buffer, using Android emulator.
Send Messages From Java
Google Protocol Buffers Java API builds a function writeDelimitedToin each message, it can be used to write message into raw buffer with the size of the message will be written first:
ByteArrayOutputStream output = new ByteArrayOutputStream(1024); msg1.writeDelimitedTo(output); msg2.writeDelimitedTo(output); ... // write more messages if they can fit into the output buffer byte buffer[] = output.toByteArray(); DatagramPacket packet = new DatagramPacket(buffer, output.size()); ... // send packet out
Receive Messages In C++
On the C++ side, the size of the message needs to be read out first, then read the message itself, repeat it for each message in the packet:
unsigned char buffer[1024]; sockaddr_in addr_other = {0}; int naddrsize = sizeof(addr_other); int size = recvfrom(s, (char*)buffer, sizeof(buffer), 0, (sockaddr*)&addr_other, &naddrsize); google::protobuf::io::ArrayInputStream arr(buffer, size); google::protobuf::io::CodedInputStream input(&arr); UINT32 message1_size = 0; input.ReadVarint32(&message1_size); google::protobuf::io::CodedInputStream::Limit limit = input.PushLimit(message1_size); msg1.ParseFromCodedStream(&input); input.PopLimit(limit); UINT32 message2_size = 0; input.ReadVarint32(&message2_size); limit = input.PushLimit(message2_size); msg2.ParseFromCodedStream(&input); input.PopLimit(limit); // repeat if there are more messages
Send Messages From C++
Sending messages from C++ requires writing the message size before actually writing the message itself:
unsigned char buffer[1024]; google::protobuf::io::ArrayOutputStream arr(buffer, sizeof(buffer)); google::protobuf::io::CodedOutputStream output(&arr); output.WriteVarint32(msg1.ByteSize()); msg1.SerializeToCodedStream(&output); output.WriteVarint32(msg2.ByteSize()); msg2.SerializeToCodedStream(&output); // repeat if more messages can fit into the buffer int nSent = sendto(s, (char*)buffer, output.ByteCount(), 0, (sockaddr*)&addr_other, sizeof(addr_other));
Receive Messages in Java
Again it is simpler in Java:
byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); ... // receive packet ByteArrayInputStream input = new ByteArrayInputStream(buffer); Msg1 msg1 = Msg1.parseDelimitedFrom(input); Msg2 msg2 = Msg2.parseDelimitedFrom(input); // repeat if there are other messages
You can test the Java application in Android emulator, but don't forget to add the port redirection in the emulator.
Use OpenSSL with Asynchronous Sockets, I/O Completion Ports and Ceritificate Signing
[Update 2016/12/28] A client and server sample program with source code has been added and can be downloaded from here.
Using OpenSSL with blocking sockets on Windows is simple and straightforward, you can add OpenSSL to existing project without much effort, http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s03.html is one of the most detailed and complete guides. It became a complete different story when you need to apply OpenSSL with asynchronous sockets on Windows, and it is hard to find a complete guide on the web about how to do so. This article intends to demonstrate how to use OpenSSL to implement a SSL client or server with I/O completion ports, it will also talk about few frequently asked questions about digital certificate at the end.
I/O completion ports
I/O completion ports are the best choice on Windows to implement high performance network applications. They use overlapped I/O and allow applications to handle results efficiently with minimized thread context switch. The code below gives a simple but effective implementation of using I/O completion ports.
void session_on_completed_packets(DWORD dwNumberOfBytesTransferred, ULONG_PTR lpCompletionKey, LPOVERLAPPED pOverlapped); struct iocp_info { HANDLE h_iocp; size_t threads_count; HANDLE *h_threads; }iocp; void iocp_on_completed_packets(DWORD dwNumberOfBytesTransferred, ULONG_PTR lpCompletionKey, LPOVERLAPPED pOverlapped) { session_on_completed_packets(dwNumberOfBytesTransferred, lpCompletionKey, pOverlapped); } unsigned __stdcall iocp_proc(void *p) { iocp_info *iocp = (iocp_info*)p; while(true) { DWORD dwNumberOfBytesTransferred = 0; ULONG_PTR lpCompletionKey = 0; LPOVERLAPPED pOverlapped = NULL; GetQueuedCompletionStatus(iocp->h_iocp, &dwNumberOfBytesTransferred, &lpCompletionKey, &pOverlapped, INFINITE); if(NULL == lpCompletionKey && NULL == pOverlapped) { PostQueuedCompletionStatus(iocp->h_iocp, 0, 0, 0); break; } iocp_on_completed_packets(dwNumberOfBytesTransferred, lpCompletionKey, pOverlapped); } return 0; } void iocp_start(iocp_info *iocp) { iocp->h_iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); SYSTEM_INFO info = {0}; GetNativeSystemInfo(&info); iocp->threads_count = info.dwNumberOfProcessors * 2; iocp->h_threads = (HANDLE*)malloc(sizeof(HANDLE) * iocp->threads_count); for(size_t n = 0; n < iocp->threads_count; ++n) iocp->h_threads[n] = (HANDLE)_beginthreadex(0, 0, iocp_proc, iocp, 0, 0); } void iocp_stop(iocp_info *iocp) { PostQueuedCompletionStatus(iocp->h_iocp, 0, 0, 0); WaitForMultipleObjects(iocp->threads_count, iocp->h_threads, TRUE, INFINITE); for(size_t n = 0; n < iocp->threads_count; ++n) CloseHandle(iocp->h_threads[n]); CloseHandle(iocp->h_iocp); } void iocp_associate_handle(HANDLE h) { CreateIoCompletionPort(h, iocp.h_iocp, 0, 0); }
OpenSSL initialization
You need to call few functions to initialize OpenSSL library, some crypto functions also requires OS-specific locking mechanism be to make them to be multiple-thread safe.
#include "openssl/ssl.h" #include "openssl/err.h" #include "openssl/x509v3.h" #pragma comment (lib, "libeay32.lib") #pragma comment (lib, "ssleay32.lib") typedef CRITICAL_SECTION ssl_lock; struct CRYPTO_dynlock_value { ssl_lock lock; }; int number_of_locks = 0; ssl_lock *ssl_locks = nullptr; SSL_CTX *ssl_ctx = nullptr; ssl_lock lock_connect_ex; LPFN_CONNECTEX pfn_ConnectEx = nullptr; void ssl_lock_callback(int mode, int n, const char *file, int line) { if(mode & CRYPTO_LOCK) EnterCriticalSection(&ssl_locks[n]); else LeaveCriticalSection(&ssl_locks[n]); } CRYPTO_dynlock_value* ssl_lock_dyn_create_callback(const char *file, int line) { CRYPTO_dynlock_value *l = (CRYPTO_dynlock_value*)malloc(sizeof(CRYPTO_dynlock_value)); InitializeCriticalSection(&l->lock); return l; } void ssl_lock_dyn_callback(int mode, CRYPTO_dynlock_value* l, const char *file, int line) { if(mode & CRYPTO_LOCK) EnterCriticalSection(&l->lock); else LeaveCriticalSection(&l->lock); } void ssl_lock_dyn_destroy_callback(CRYPTO_dynlock_value* l, const char *file, int line) { DeleteCriticalSection(&l->lock); free(l); } void ssl_init() { WSADATA wsaData = {0}; WSAStartup(MAKEWORD(2, 2), &wsaData); iocp_start(&iocp); number_of_locks = CRYPTO_num_locks(); if(number_of_locks > 0) { ssl_locks = (ssl_lock*)malloc(number_of_locks * sizeof(ssl_lock)); for(int n = 0; n < number_of_locks; ++n) InitializeCriticalSection(&ssl_locks[n]); } #ifdef _DEBUG CRYPTO_malloc_debug_init(); CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); #endif CRYPTO_set_locking_callback(&ssl_lock_callback); CRYPTO_set_dynlock_create_callback(&ssl_lock_dyn_create_callback); CRYPTO_set_dynlock_lock_callback(&ssl_lock_dyn_callback); CRYPTO_set_dynlock_destroy_callback(&ssl_lock_dyn_destroy_callback); SSL_load_error_strings(); SSL_library_init(); const SSL_METHOD* meth = SSLv23_method(); ssl_ctx = SSL_CTX_new(meth); SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, nullptr); InitializeCriticalSection(&lock_connect_ex); } void ssl_set_ctx_cert_and_key(X509 *cert, EVP_PKEY *pkey) { SSL_CTX_use_certificate(ssl_ctx, cert); SSL_CTX_use_PrivateKey(ssl_ctx, pkey); } void ssl_deinit() { SSL_CTX_free(ssl_ctx); ssl_ctx = nullptr; CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); EVP_cleanup(); CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0); ERR_free_strings(); if(nullptr != ssl_locks) { for(int n = 0; n < number_of_locks; ++n) DeleteCriticalSection(&ssl_locks[n]); free(ssl_locks); ssl_locks = nullptr; number_of_locks = 0; } iocp_stop(&iocp); DeleteCriticalSection(&lock_connect_ex); WSACleanup(); }
Some OpenSSL APIs (especially SSL_read and SSL_write) might set internal error code to WANT_READ or WANT_WRITE. These are not fatal errors but rather than flags telling us that they need to read or write more data in order to continue. The helper function ssl_is_fatal_error is used for distinguish these scenarios with real errors, another function ssl_get_error shows how to get pending errors from a SSL structure. These two functions will be used in sample code showed later.
static bool ssl_is_fatal_error(int ssl_error) { switch(ssl_error) { case SSL_ERROR_NONE: case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_CONNECT: case SSL_ERROR_WANT_ACCEPT: return false; } return true; } static int ssl_get_error(SSL *ssl, int result) { int error = SSL_get_error(ssl, result); if(SSL_ERROR_NONE != error) { char message[512] = {0}; int error_log = error; while(SSL_ERROR_NONE != error_log) { ERR_error_string_n(error_log, message, _countof(message)); if(ssl_is_fatal_error(error_log)) { // print error message to console or logs } error_log = ERR_get_error(); } } return error; }
Data Structure
We need to define a data structure to hold all the related information together, which include the handle to socket, socket buffer, overlapped structure, WASBUF structure, OpenSSL structures, socket buffers and SSL buffers etc. Each data member is commented with its purpose.
enum OVERLAPPED_TYPE{ RECV = 0, SEND, CONNECT }; enum ADDRESS_TYPE{ LOCAL = 0, REMOTE }; enum SOCKET_STATUS{ NONE = 0x0, ACCEPTING = 0x1, CONNECTING = 0x2, HANDSHAKING = 0x4, CONNECTED = 0x8, RECEIVING = 0x10, SENDING = 0x20, CLOSING = 0x40, CLOSED = 0x80, OPERATING = ACCEPTING | CONNECTING | HANDSHAKING | RECEIVING | SENDING }; #define ADDR_SZ_SIZE 46 #define BUFFER_SIZE 1024 struct session; struct session_overlapped { OVERLAPPED overlapped; DWORD result; session *psession; }; struct session { SOCKET s; // handle to socket SOCKET s_listening; // handle to external listening socket sockaddr_storage addresses[2]; // local and remote address char addresses_sz[2][ADDR_SZ_SIZE]; // addresses in string format char socket_buffer[2][BUFFER_SIZE]; // memory used for read/write from/to socket char ssl_buffer[2][BUFFER_SIZE]; // memory used for read/write from/to ssl memory bio DWORD ssl_buffer_size[2]; // indicates the bytes of valid data in ssl_buffer unsigned int status; // stores current socket status, bit-masked value of one or more of SOCKET_STATUS session_overlapped overlapped[3]; // structure for overlapped operations WSABUF wsabuf[2]; // structure used for pass buffer to overlapped operations DWORD bytes_transferred[2]; // store the bytes of buffer that received/sent from/to the socket DWORD wsa_flags[2]; // store the flags send/receive from overlapped operations, not used SSL *ssl; // SSL structure used by OpenSSL BIO *bio[2]; // memory BIO used by OpenSSL ssl_lock lock; // synchronization object for multiple-thread data access void *pdata; // user supplied contextual data, not used by openssl processing };
session_init is used to initialize the data structure, session_close is used to close the socket and free resources, it is normally called when peer socket closed its connection or serious error occurred. One thing to note here is that since we are doing asynchronous I/O, it might take multiple calls of session_close to same object to really close the session, when the status member has value of CLOSED, the pointer to session can now be deleted.
session* session_init(session *psession, void *pdata) { memset(psession, 0, sizeof(session)); psession->pdata = pdata; InitializeCriticalSection(&psession->lock); psession->overlapped[CONNECT].psession = psession->overlapped[RECV].psession = psession->overlapped[SEND].psession = psession; psession->wsabuf[RECV].buf = psession->socket_buffer[RECV]; psession->wsabuf[RECV].len = BUFFER_SIZE; psession->wsabuf[SEND].buf = psession->socket_buffer[SEND]; psession->wsabuf[SEND].len = 0; psession->ssl = SSL_new(ssl_ctx); psession->bio[SEND] = BIO_new(BIO_s_mem()); psession->bio[RECV] = BIO_new(BIO_s_mem()); SSL_set_bio(psession->ssl, psession->bio[RECV], psession->bio[SEND]); return psession; } session* session_new(void *pdata) { session *psession = (session*)malloc(sizeof(session)); return session_init(psession, pdata); } void session_delete(session *psession) { DeleteCriticalSection(&psession->lock); free(psession); } void session_lock(session *psession) { EnterCriticalSection(&psession->lock); } void session_unlock(session *psession) { LeaveCriticalSection(&psession->lock); } bool session_is_data_pending(session *psession) { if(psession->bytes_transferred[RECV] > 0) return true; if(SENDING == (psession->status & SENDING)) return true; if(nullptr != psession->ssl) { if(BIO_pending(psession->bio[SEND]) > 0 || BIO_pending(psession->bio[RECV]) > 0) return true; } return false; } void session_close(session *psession) { psession->status |= CLOSING; if( INVALID_SOCKET != psession->s && !session_is_data_pending(psession)) { shutdown(psession->s, SD_BOTH); closesocket(psession->s); psession->s = INVALID_SOCKET; } if(INVALID_SOCKET == psession->s && 0 == (psession->status & OPERATING)) { if(nullptr != psession->ssl) { SSL_shutdown(psession->ssl); SSL_free(psession->ssl); psession->ssl = nullptr; psession->bio[SEND] = psession->bio[RECV] = nullptr; } psession->status = CLOSED; } }
connect, accept, send and receive
These functions shows basic overlapped socket operations. They call ConnectEx, AcceptEx, WSASend and WSARecv respectively with pointer to appropriate overlapped structure. After the operation finished, result will be delivered to iocp and picked up by an arbitrary thread we created. The iocp completion routine will call session_on_completed_packets where we will check the result and process the data received.
void session_connect(session *psession, const sockaddr_storage *remote_addr) { memcpy_s(&psession->addresses[REMOTE], sizeof(sockaddr_storage), remote_addr, sizeof(sockaddr_storage)); sockaddr_to_string(&psession->addresses[REMOTE], psession->addresses_sz[REMOTE]); psession->s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); setsockopt(psession->s, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0); iocp_associate_handle((HANDLE)psession->s); addrinfo hints = {0}; hints.ai_family = remote_addr->ss_family; hints.ai_protocol = IPPROTO_TCP; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; addrinfo* paddrinfo = nullptr; getaddrinfo(0, "", &hints, &paddrinfo); if(NULL != paddrinfo) { bind(psession->s, paddrinfo->ai_addr, paddrinfo->ai_addrlen); freeaddrinfo(paddrinfo); paddrinfo = nullptr; } EnterCriticalSection(&lock_connect_ex); if(nullptr == pfn_ConnectEx) { DWORD dwRetBytes = 0; GUID guid = WSAID_CONNECTEX; WSAIoctl(psession->s, SIO_GET_EXTENSION_FUNCTION_POINTER, (void*)&guid, sizeof(guid), (void*)&pfn_ConnectEx, sizeof(pfn_ConnectEx), &dwRetBytes, NULL, NULL); } LeaveCriticalSection(&lock_connect_ex); psession->status |= CONNECTING; (*pfn_ConnectEx)(psession->s, (sockaddr*)remote_addr, sizeof(sockaddr_storage), 0, 0, 0, &psession->overlapped[CONNECT].overlapped); psession->overlapped[CONNECT].result = WSAGetLastError(); if(0 != psession->overlapped[CONNECT].result && WSA_IO_PENDING != psession->overlapped[CONNECT].result) { psession->status &= ~CONNECTING; session_close(psession); } } void session_accept(session *psession) { psession->s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); iocp_associate_handle((HANDLE)psession->s); psession->status |= ACCEPTING; BOOL accepted = AcceptEx(psession->s_listening, psession->s, psession->addresses, 0, sizeof(sockaddr_storage), sizeof(sockaddr_storage), 0, &psession->overlapped[CONNECT].overlapped); psession->overlapped[CONNECT].result = WSAGetLastError(); if(WSA_IO_PENDING != psession->overlapped[CONNECT].result) { psession->status = NONE; session_close(psession); } } void session_send(session *psession) { if((SENDING != (psession->status & SENDING)) && (psession->wsabuf[SEND].len > 0)) { psession->status |= SENDING; psession->bytes_transferred[SEND] = 0; WSASend(psession->s, &psession->wsabuf[SEND], 1, &psession->bytes_transferred[SEND], 0, &psession->overlapped[SEND].overlapped, 0); psession->overlapped[SEND].result = WSAGetLastError(); if(0 != psession->overlapped[SEND].result && WSA_IO_PENDING != psession->overlapped[SEND].result) { psession->status &= ~SENDING; session_close(psession); } } } void session_recv(session *psession) { if((CLOSING != (psession->status & CLOSING)) && (RECEIVING != (psession->status & RECEIVING)) && (psession->bytes_transferred[RECV] == 0)) { psession->status |= RECEIVING; DWORD size = 0; WSARecv(psession->s, &psession->wsabuf[RECV], 1, &size, &psession->wsa_flags[RECV], &psession->overlapped[RECV].overlapped, 0); psession->overlapped[RECV].result = WSAGetLastError(); if(0 != psession->overlapped[RECV].result && WSA_IO_PENDING != psession->overlapped[RECV].result) { psession->status &= ~RECEIVING; session_close(psession); } } }
OpenSSL data handling
When use OpenSSL with asynchronous sockets, we need to use memory BIOs instead of socket BIOs and we are responsible for data transmission between sockets and memory BIOs. For data received from sockets, we need to call BIO_write to write them to input BIO, then call SSL_read with input BIO to retrieve decrypted plain text; for data to be sent out, first call SSL_write to write them into output BIO, then call BIO_read on output BIO to retrieve data that needs to be sent to peer over socket. Since we are using memory BIOs, there are some very important points worth mentioning:
- Any data received from socket should be written to input BIO with BIO_write.
- Call SSL_read even if you didn't write any data into input BIO, it is especially critical to call SSL_read after the socket connection was established and SSL_set_connect_state or SSL_set_accept_state was called. We need SSL_read to start hand-shaking with peer here.
- After calling SSL_read, make sure call BIO_read on output BIO to check whether output BIO has pending data to be sent to peer over socket. This might happen because SSL_read will write data to output BIO when it handles hand-shaking or re-negotiation internally. We need to send data from BIO_read to peer over socket, and before making next call to SSL_read, check whether you have data received from socket, and if yes, use BIO_write to write them into input BIO.
- SSL/TLS works by records with size can be up to 16KB, it might take several reads from network and writes to input BIO to fill up a SSL/TLS record before SSL_read can decode the record and spit something out. SSL_read still can be called, but it will return error WANT_READ, and we use ssl_is_fatal_error to ignore it.
- If return value from SSL_read, SSL_write, BIO_read and BIO_write are greater than 0, it means the operation is successful, buffer passed to SSL_read now contains decrypted plain text and buffer passed to BIO_read on output BIO now contains data needs to be sent to peer over socket. If the return value is 0 or less than 0, you need to call ssl_is_fatal_error to check the internal SSL error and determine whether to bail out based on it. One exception here is BIO_write, if it returns 0 or less, you can call BIO_should_retry to determine whether it is fatal error. If BIO_should_retry returned true, you need to call BIO_write again with original parameters. Of course a call to SSL_read needs to be made in-between as it will consume data held in input BIO buffer.
Following function demonstrates how to move data between socket buffer, memory BIOs and SSL buffer.
bool session_process(session *psession) { bool fatal_error_occurred = false; if(nullptr != psession->ssl) { if(psession->bytes_transferred[RECV] > 0) { int bytes = BIO_write(psession->bio[RECV], psession->socket_buffer[RECV], psession->bytes_transferred[RECV]); int ssl_error = ssl_get_error(psession->ssl, bytes); if(bytes == psession->bytes_transferred[RECV]) { psession->bytes_transferred[RECV] = 0; } else if(!BIO_should_retry(psession->bio[RECV])) { fatal_error_occurred = true; } } if(psession->ssl_buffer_size[RECV] == 0) { int bytes = 0; do { bytes = SSL_read(psession->ssl, psession->ssl_buffer[RECV], BUFFER_SIZE); int ssl_error = ssl_get_error(psession->ssl, bytes); if ((HANDSHAKING == (psession->status & HANDSHAKING)) && SSL_is_init_finished(psession->ssl)) { psession->status &= ~HANDSHAKING; psession->status |= CONNECTED; app_on_session_connect(psession); } if (bytes > 0) { psession->ssl_buffer_size[RECV] = bytes; app_on_session_recv(psession); psession->ssl_buffer_size[RECV] = 0; } else if (ssl_is_fatal_error(ssl_error)) { fatal_error_occurred = true; } } while (bytes > 0); } if(psession->ssl_buffer_size[SEND] > 0) { int bytes = SSL_write(psession->ssl, psession->ssl_buffer[SEND], psession->ssl_buffer_size[SEND]); int ssl_error = ssl_get_error(psession->ssl, bytes); if(bytes == psession->ssl_buffer_size[SEND]) { psession->ssl_buffer_size[SEND] = 0; } else if(ssl_is_fatal_error(ssl_error)) { fatal_error_occurred = true; } } if(psession->wsabuf[SEND].len == 0 && (0 != psession->s_listening || BIO_pending(psession->bio[SEND]))) { int bytes = BIO_read(psession->bio[SEND], psession->socket_buffer[SEND], BUFFER_SIZE); int ssl_error = ssl_get_error(psession->ssl, bytes); if(bytes > 0) { psession->wsabuf[SEND].len = bytes; } else if(ssl_is_fatal_error(ssl_error)) { fatal_error_occurred = true; } } if(fatal_error_occurred) session_close(psession); } session_send(psession); session_recv(psession); return !fatal_error_occurred; }
I/O completion routine and result handling
session_on_completed_packets is our I/O completion handling routine, here we can cast OVERLAPPED pointer safely to a session_overlapped pointer, from which not only we know which session the pointer belongs to, by comparing the pointer with each element in overlapped array, we also know the type of the finished operation. After that we call one of the three handling functions to process the result. If peer socket has been closed (received 0 bytes), or something went wrong, these functions will call session_close one or multiple times. If the session status is CLOSED, it means there is no more active operations and we can free resources used by this session and finally delete this session.
void session_on_connect(session *psession) { psession->status &= ~CONNECTING; if(0 == psession->overlapped[CONNECT].result) { int size = sizeof(psession->addresses[LOCAL]); getsockname(psession->s, (sockaddr*)&psession->addresses[LOCAL], &size); sockaddr_to_string(&psession->addresses[LOCAL], psession->addresses_sz[LOCAL]); psession->status |= HANDSHAKING; SSL_set_connect_state(psession->ssl); session_process(psession); } else { app_on_session_connect(psession); session_close(psession); } } void session_on_accept(session *psession) { if(0 == psession->overlapped[CONNECT].result) { session *psession_new = session_new(psession->pdata); psession_new->s_listening = psession->s_listening; session_accept(psession_new); psession->status &= ~ACCEPTING; psession->status |= HANDSHAKING; int naddrslen[2] = {0, 0}; sockaddr *paddrs[2] = {0, 0}; GetAcceptExSockaddrs(psession->addresses, 0, sizeof(sockaddr_storage), sizeof(sockaddr_storage), &paddrs[LOCAL], &naddrslen[LOCAL], &paddrs[REMOTE], &naddrslen[REMOTE]); memcpy_s(&psession->addresses[LOCAL], sizeof(sockaddr_storage), paddrs[LOCAL], naddrslen[LOCAL]); memcpy_s(&psession->addresses[REMOTE], sizeof(sockaddr_storage), paddrs[REMOTE], naddrslen[REMOTE]); setsockopt(psession->s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&psession->s_listening, sizeof(SOCKET)); sockaddr_to_string(&psession->addresses[LOCAL], psession->addresses_sz[LOCAL]); sockaddr_to_string(&psession->addresses[REMOTE], psession->addresses_sz[REMOTE]); SSL_set_accept_state(psession->ssl); session_process(psession); } } void session_on_recv(session *psession) { psession->status &= ~RECEIVING; if((psession->bytes_transferred[RECV] > 0)) { session_process(psession); } else { session_close(psession); } } void session_on_send(session *psession) { psession->status &= ~SENDING; psession->wsabuf[SEND].len = 0; app_on_session_send(psession); if(0 == psession->overlapped[SEND].result) { session_process(psession); } else { session_close(psession); } } void session_on_completed_packets(DWORD dwNumberOfBytesTransferred, ULONG_PTR lpCompletionKey, LPOVERLAPPED pOverlapped) { session_overlapped *p = (session_overlapped*)pOverlapped; session_lock(p->psession); DWORD dwOverlappeddNumberOfBytesTransferred = 0, dwOverlappedFlags = 0; BOOL succeeded = WSAGetOverlappedResult(p->psession->s, pOverlapped, &dwOverlappeddNumberOfBytesTransferred, TRUE, &dwOverlappedFlags); p->result = WSAGetLastError(); if(pOverlapped == &p->psession->overlapped[CONNECT].overlapped) { if(0 == p->psession->s_listening) session_on_connect(p->psession); else session_on_accept(p->psession); } else if(pOverlapped == &p->psession->overlapped[RECV].overlapped) { p->psession->bytes_transferred[RECV] = dwNumberOfBytesTransferred; session_on_recv(p->psession); } else if(pOverlapped == &p->psession->overlapped[SEND].overlapped) { p->psession->bytes_transferred[SEND] = dwNumberOfBytesTransferred; session_on_send(p->psession); } bool close_session = (CLOSED == p->psession->status); session_unlock(p->psession); if(close_session) app_on_session_close(p->psession); }
Use OpenSSL in a server application
To use OpenSSL in a server application, there are some additional steps required. First is to load the server certificate and private key. Here is sample code of loading certificate and private key in PEM format from memory and apply them to a SSL_CTX:
void set_cert() { int length = strlen(server_cert_key_pem); BIO *bio_cert = BIO_new_mem_buf((void*)server_cert_key_pem, length); X509 *cert = PEM_read_bio_X509(bio_cert, nullptr, nullptr, nullptr); printf("Certificate used for server:\n"); ssl_print_cert_info(cert); EVP_PKEY *pkey = PEM_read_bio_PrivateKey(bio_cert, 0, 0, 0); ssl_set_ctx_cert_and_key(cert, pkey); X509_free(cert); EVP_PKEY_free(pkey); BIO_free(bio_cert); }
SSL_CTX holds global configurations. If you need to apply certificate and private key to each individual SSL connection, use SSL_use_certificate and SSL_use_PrivateKey instead.
The next step is to create a socket and set it in listening state:
SOCKET create_listen_socket(int port) { sockaddr_storage addr = {0}; sockaddr_in *paddrin = (sockaddr_in*)&addr; addr.ss_family = AF_INET; paddrin->sin_port = htons(port); paddrin->sin_addr.s_addr = htonl(INADDR_ANY); SOCKET s = WSASocket(addr.ss_family, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); iocp_associate_handle((HANDLE)s); bind(s, (sockaddr*)&addr, sizeof(addr)); listen(s, SOMAXCONN); return s; }
To accept connections, create an instance of session object and call session_accept. If a connection was accepted, a new instance of session object will be created automatically and passed to a call to session_accept(). The server will handle connection request from multiple clients automatically.
session *psession = session_new(0); psession->s_listening = s; session_accept(psession);
How to integrate it with your application
It is easy to integrate the framework with your application. The first step is to implement following callback functions:
// callback functions which are called under the protection of the psession->lock. extern void app_on_session_connect(session *psession); extern void app_on_session_send(session *psession); extern void app_on_session_recv(session *psession); // callback function which is called when psession is no longer in use and be safely // deleted by calling session_delete(). extern void app_on_session_close(session *psession);
They will be called from iocp worker threads and except app_on_session_close, they will be called under the protection of session's lock, which means it is thread-safe to access members of session object. app_on_session_close is used to notify application that framework will no longer touch psession and application can delete the session object now.
To send data out, call function session_send_data, it returns bytes sent, and be careful that it might be less than the size you passed it. Application needs to adjust the buffer pointer with bytes returned and call this function again, the best place might be from the callback function app_on_session_send, which is called when framework sent some data to peer over socket and there might be space freed in internal buffer.
When framework received and decrypted some data, it will call callback function app_on_session_recv, data is in psession->ssl_buffer[RECV] and its size is in psession->ssl_buffer_size[RECV].
When peer closes session first or something went wrong, framework will close session automatically, and after all pending operations have finished or been cancelled, it will call app_on_session_close. Application can also close session explicitly:
session_lock(psession); session_close(psession); session_unlock(psession);
app_on_session_close will be called when it is done, and again, it will be called from iocp worker thread.
SSL man-in-the-middle agent
You might realize that you can implement a SSL man-in-the-middle agent by pairing a client session and server session if you can manage redirecting peer traffic to your server, and one potential issue is certificate. After SSL MITM agent received connection from client, before it can perform hand-shake with client, the agent needs to connect to real server and finish hand-shaking with it, extract server certificate, create a new RSA key pair, set issuer to a self-signed CA's subject, re-sign the certificate with CA's private key, call SSL_use_certificate and SSL_use_PrivateKey on client SSL and start hand-shaking with client. Following code shows how to make a copy of certificate received from real server and re-sign the certificate with a self-signed CA certificate and its private key:
X509* ssl_copy_cert(X509 *cert) { int length = i2d_X509(cert, nullptr); unsigned char *buffer = (unsigned char *)OPENSSL_malloc(length); unsigned char *pointer_that_will_be_increased_after_encode = buffer; i2d_X509(cert, &pointer_that_will_be_increased_after_encode); const unsigned char *pointer_that_will_be_increased_after_decode = (const unsigned char *)buffer; X509 *cert_copy = d2i_X509(nullptr, &pointer_that_will_be_increased_after_decode, length); OPENSSL_free(buffer); return cert_copy; } EVP_PKEY* ssl_sign_cert(X509 *cert, X509 *ca_cert, EVP_PKEY *ca_pkey_private) { srand((int)time(0) + rand()); EVP_PKEY *pkey = EVP_PKEY_new(); RSA *rsa = RSA_generate_key(2048, RSA_F4, 0, 0); EVP_PKEY_assign_RSA(pkey, rsa); rsa = nullptr; ASN1_INTEGER_set(X509_get_serialNumber(cert), (int)time(0) + rand()); X509_set_issuer_name(cert, X509_get_subject_name(ca_cert)); ::X509_set_pubkey(cert, pkey); X509_sign(cert, ca_pkey_private, EVP_sha1()); return pkey; }
Note that CA certificate and private key can be loaded using same way as server certificate.
Following function shows how to read important information from X509 certificate:
void ssl_print_cert_info(X509 *cert) { printf("=======================\n"); X509_NAME *name_subject = X509_get_subject_name(cert); if(name_subject > 0) { BIO *bio = BIO_new(BIO_s_mem()); X509_NAME_print_ex(bio, name_subject, 0, XN_FLAG_RFC2253); char *subject = nullptr; long length = BIO_get_mem_data(bio, &subject); if(nullptr != subject && length > 0) { std::string str; str.resize(length); std::copy(subject, subject + length, str.begin()); printf("CERT subject: %s\n", str.c_str()); } BIO_free(bio); } X509_NAME *name_issuer = X509_get_issuer_name(cert); if(name_issuer > 0) { printf("CERT cn: %s\n", ssl_get_cert_issuer_info_by_id(name_issuer, NID_commonName).c_str()); printf("CERT c: %s\n", ssl_get_cert_issuer_info_by_id(name_issuer, NID_countryName).c_str()); printf("CERT o: %s\n", ssl_get_cert_issuer_info_by_id(name_issuer, NID_organizationName).c_str()); } int criticality = -1, ext_index = -1; ASN1_BIT_STRING *key_usage = (ASN1_BIT_STRING *)X509_get_ext_d2i(cert, NID_key_usage, &criticality, &ext_index); if(key_usage > 0) { const char *usages[] = {"digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"}; printf("CERT key_usage:"); for (int index = 0; index < 8; index++) { if(ASN1_BIT_STRING_get_bit(key_usage, index)) printf(" %s;", usages[index]); } printf("\n"); } const char *kuValue = NULL; STACK_OF(ASN1_OBJECT) *ext_key_usage = (STACK_OF(ASN1_OBJECT) *)X509_get_ext_d2i(cert, NID_ext_key_usage, NULL, NULL); if(ext_key_usage > 0) { printf("CERT ext_key_usage:"); while(sk_ASN1_OBJECT_num(ext_key_usage) > 0) { int usage_id = OBJ_obj2nid(sk_ASN1_OBJECT_pop(ext_key_usage)); const char *usage_value = OBJ_nid2sn(usage_id); printf(" %d:%s;", usage_id, usage_value); } printf("\n"); } STACK_OF(GENERAL_NAME) *alt_name = (STACK_OF(GENERAL_NAME)*) X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); while(sk_GENERAL_NAME_num(alt_name) > 0) { GENERAL_NAME *name = sk_GENERAL_NAME_pop(alt_name); switch(name->type) { case GEN_DNS: printf("CERT GEN_DNS: %s\n", ASN1_STRING_data(name->d.dNSName)); break; case GEN_URI: printf("CERT GEN_URI: %s\n", ASN1_STRING_data(name->d.uniformResourceIdentifier)); break; case GEN_EMAIL: printf("CERT GEN_EMAIL: %s\n", (char*)ASN1_STRING_data(name->d.rfc822Name)); break; } } printf("=======================\n"); }
I created a sample client and server program which demonstrate how to use the code showed above. The sample can be downloaded from here. You can download and build them using VS2010. The client program can be used with server program, or you can run it with a real web server, for example, here is output of running client.exe to connect Amazon on port 443 and sent "get /" to server:
C:\Users\user\Desktop\Cert>client amazon.com Connected to 184.108.40.206:443 ======================= CERT subject: CN=www.amazon.com,O=Amazon.com Inc.,L=Seattle,ST=Washington,C=US CERT cn: VeriSign Class 3 Secure Server CA - G2 CERT c: US CERT o: VeriSign, Inc. CERT key_usage: digitalSignature; keyEncipherment; CERT ext_key_usage: 130:clientAuth; 129:serverAuth; CERT GEN_DNS: www.amazon.com CERT GEN_DNS: amazon.com CERT GEN_DNS: uedata.amazon.com ======================= Type message to be sent to server and press ENTER, empty message to exit get / Received 166 bytes from 220.127.116.11:443:<html> <head><title>400 Bad Request</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <hr><center>nginx</center> </body> </html> Session 192.168.241.133:49563 - 22.214.171.124:443 is closed
Create VPN connection programmatically on Windows
Remote Access API can be used to create VPN connections, however the documentation isn't very clear. The following function shows how to use RAS API to create VPN connections of various types:
#include <Ras.h> #pragma comment(lib, "rasapi32.lib") enum vpn_type { pptp, l2tp_psk, l2tp_cert, ikev2_eap, ikev2_cert, }; void createvpn(const wchar_t* name, const wchar_t* server, const wchar_t* username, const wchar_t* password, const wchar_t* psk, int type) { DWORD size = 0; RasGetEntryProperties(NULL, L"", NULL, &size, NULL, NULL); LPRASENTRY pras = (LPRASENTRY)malloc(size); memset(pras, 0, size); pras->dwSize = size; pras->dwType = RASET_Vpn; pras->dwRedialCount = 1; pras->dwRedialPause = 60; pras->dwfNetProtocols = RASNP_Ip; pras->dwEncryptionType = ET_Optional; wcscpy_s(pras->szLocalPhoneNumber, server); wcscpy_s(pras->szDeviceType, RASDT_Vpn); pras->dwfOptions = RASEO_RemoteDefaultGateway; if(pptp == type) { pras->dwfOptions |= RASEO_RequireEncryptedPw; pras->dwVpnStrategy = VS_PptpOnly; } else if(l2tp_psk == type) { pras->dwVpnStrategy = VS_L2tpOnly; pras->dwfOptions |= RASEO_RequireEncryptedPw; pras->dwfOptions2 |= RASEO2_UsePreSharedKey; } else if(l2tp_cert == type) { pras->dwVpnStrategy = (VS_L2tpOnly); pras->dwfOptions2 |= RASEO2_DisableIKENameEkuCheck; } else if(ikev2_eap == type) { pras->dwfOptions |= (RASEO_RequireDataEncryption | RASEO_RequireEAP | RASEO_RequireMsCHAP2); pras->dwVpnStrategy = VS_Ikev2Only; } else if(ikev2_cert == type) { pras->dwfOptions |= RASEO_RequireDataEncryption; pras->dwfOptions2 |= RASEO2_RequireMachineCertificates; pras->dwVpnStrategy = VS_Ikev2Only; } RasSetEntryProperties(NULL, name, pras, pras->dwSize, NULL, 0); RASCREDENTIALS ras_cre = {0}; ras_cre.dwSize = sizeof(ras_cre); ras_cre.dwMask = RASCM_UserName | RASCM_Password; wcscpy_s(ras_cre.szUserName, username); wcscpy_s(ras_cre.szPassword, password); if(l2tp_psk == type) { RASCREDENTIALS ras_cre_psk = {0}; ras_cre_psk.dwSize = sizeof(ras_cre_psk); ras_cre_psk.dwMask = RASCM_PreSharedKey; wcscpy_s(ras_cre_psk.szPassword, psk); RasSetCredentials(NULL, name, &ras_cre_psk, FALSE); } free(pras); }
Once the connection was created, use RasDial to initiate the connection. You can pass NULL to first and second parameter, the third one is a pointer to structure of RASDIALPARAMS, of which you need to copy connection name into szEntryName, and optionally fill in server, username and password here. Pass 0 to 4th parameter if you want RasDial returns only if it finished work, or provide a callback function to receive progress notifications. One thing important here is even if RasDial failed, you still need to call RasHungUp, otherwise you will not be able to delete the connection.
If you are done with the connection and want to disconnect, call RasHungUp first, then call RasGetConnectionStatus in a loop until it returns INVALID_HANDLE.
To delete the connection, call RasDeleteEntry.
Setup VPN Server with Ubuntu
It's pretty easy to setup a VPN server on Ubuntu with openswan or strongswan, and there are several very good guides on the web which document step by step instructions about how to do it. I just installed one recently and this is just to document what I did.
1. Install all required packages: apt-get install openswan xl2tpd ppp
2. Create CA certificate: cd into /etc/ipsec.d, run openssl req -x509 -days 3650 -newkey rsa:2048 -keyout private/vpnpk.pem -out cacerts/vpnca.pem to create CA certificate and its private key, run openssl rsa -in private/vpnpk.pem -outform dem -out vpnpk.dem to get a copy of private key in dem format. [SIDE NOTE] openswan requires private key to be in dem format.
3. Modify openssl config file: gedit /usr/lib/ssl/openssl.cnf, change the CA_default section to make the dir and filenames sync with previous step:
[CA_default] dir = /etc/ipsec.d certificate = $dir/cacerts/cacerts/vpnca.pem private_key = $dir/private/vpnpk.pem
4. Create an empty file named index.txt and another file named serial with string "00", these two are required by openssl in next step.
5. Create client certificate: first create a request openssl req -newkey rsa:2048 -keyout private/clientpk.pem -out reqs/clientreq.pem, sign it with CA certificate openssl ca -in reqs/clientreq.pem -days 730 -out certs/clientcert.pem –notext, and optionally export the client certificate and its private key openssl pkcs12 -export -inkey private/clientpk.pem -in certs/clientcert.pem -certfile cacerts/vpnca.pem -out client.p12, this p12 file can be used to import client certificate into Windows.
6. Modify /etc/ipsec.conf, connection examples can be copied from /etc/ipsec.d/examples/l2tp-cert.conf, make sure leftcert is pointing to the CA certificate.
7. Modify /etc/ipsec.secrets (and/or files included by it), put password to the CA private key there: : RSA vpnpk.dem "password"
8. Modify /etc/xl2tpd/xl2tpd.conf, change the ip address and/or change authentication settings.
9. Check /etc/ppp/options.xl2tpd, change noauth to auth if necessary.
10. Modify /etc/ppp/chap-secrets, put username and password there, they are the ones be entered on client.
11. Modify firewall rules: ufw allow proto udp from any to any port 500 and ufw allow proto udp from any to any port 4500.
12. Restart services: /etc/init.d/ipsec restart and /etc/init.d/xl2tpd restart.
13. Install certificate on client and test. When importing p12 files on Windows, don't import them from Windows Explorer. Instead, launch mmc.exe, add "certificate" snap-in into "computer account", after which right click on personal certificates and use import wizard from there. This is to make sure the certificate is imported into computer account rather than user account.
IPsec/L2TP VPN server with Ubuntu 12.04
Build OpenSSL with Visual Studio (without Perl)
The following zip file contains Visual Studio 2010 solution and project files that can be used to build OpenSSL 1.0.1e on Windows platform without installing Perl.
Simply download vsbuild.zip and follow instructions in README.txt.
2013.02.19: updated the solution and project files based on OpenSSL 1.0.1.e.
Build OpenSSL with VisualStudio 2010 (without Perl)
The latest version is available at https://famellee.wordpress.com/2013/01/30/build-openssl-with-visual-studio-without-perl/.
Visual Studio 2010 crashes after install WDK 7.1
Today my Visual Studio 2010 started behaving oddly. After I launched it and opened a project, it would display an error message when I tried to edit something:
Visual Studio has encountered an exception. This may be caused by an extension.
The error message dialog also suggests launching VS2010 with "/Log" option and check ActivilityLog.xml in user's roaming profile folder. I didn't bother trying that and started Google search immediately. The answer is in the first page of result: http://connect.microsoft.com/VisualStudio/feedback/details/546369/
It looks like WDK 7.1 was to be blamed. I did install WDK 7.1 yesterday and the first attempt did fail and it rolled back, I though it was due to I had document helper opened at the time, I tried install it the second time and it succeeded. Apparently WDK 7.1 installer emptied default value of following registry location:
On 32-Bit Windows: [HKEY_CLASSES_ROOT\CLSID\{73B7DC00-F498-4ABD-AB79-D07AFD52F395}\InProcServer32]
On 64-Bit Windows: [HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{73B7DC00-F498-4ABD-AB79-D07AFD52F395}\InProcServer32]
The fix was to put its correct value back in:
On 32-Bit Windows: "C:\Program Files\Common Files\Microsoft Shared\MSEnv\TextMgrP.dll"
On 64-Bit Windows: "C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\TextMgrP.dll"
Or re-register TextMgrP.dll using regsrv32.exe.
Converting videos from mkv to mp4
There are several ways of converting videos from mkv format to mp4 format, and some of them allow you do so without re-encoding the video or audio.
It might be the best choice if you don't mind its dazzling command line parameters. An example of its usage:
ffmpeg -ss 00:01:15.000 -i input.mkv -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:2 -map 0:5 -t 01:00.00 output.mp4
The command above asks ffmpeg to do followings:
- convert input.mkv to output.mp4
- trim the video to keep the portion starts from 00:01:15.000 and lasts one hour (by -t 01:00.00)
- only process stream 0:0, 0:2 and 0:5, ignore the other streams (e.g. unwanted audios and subtitles)
- copy selected streams directly into output without re-encoding them
Of course it can also be used for video, audio and subtitle transcoding with mux and demux. Check out its Wiki and command line document.
MKVToolNix and MKVExtractGUI-2
These two are useful for handling mkv files. MKVExtractGUI-2 provides user interface for extracting streams from mkv files using MKVToolNix, the later has built-in mmg.exe for merging streams.
MP4Box and MkvToMp4
MP4Box is a command line utility of creating MP4 files and it is part of GPAC. There are several tools were built around it like YAMB and my MP4box GUI. MkvToMp4 makes a step further by putting mkv extract tool from MKVToolNix and MP4Box together to make mkv to mp4 converting an one step task.
This is for everything else into mkv or mp4.
Install Google Play Store on Android Emulator
I tried to install Google Play Store in ICS emulator and came to this article. After few hit and miss, finally made it success with following steps:
- Get latest Google Apps from CyanogenMod Wiki.
- Create an Android virtual device with proper API level.
- Start the AVD from command line: emulator-arm.exe -avd JB -partition-size 512 -no-audio -no-boot-anim -scale 0.51. The crucial parameter is partition-size, otherwise you will receive error like "Out of memory" when pushing .apk files later.
- Remount system partition: adb shell mount -o remount,rw /system
- Push apk: adb push GoogleLoginService.apk /system/app/.
- Push apk: adb push GoogleServicesFramework.apk /system/app/.
- Push apk: adb push Vending.apk /system/app/.
- Now you should have Play Store there:
How do you know it is a good movie
It was Sunday afternoon, I was sitting on the couch and reading The Girl with the Dragon Tattoo on my Kobo. The most-significant other turned on PS3, opened Netflix and hit Play button on Soul Kitchen. I was only planning to watch the beginning of the movie, but never expected to watched it till the end, and yet it is in German with English subtitle. That's how I know it is a good movie. Kobo was sitting on my knees, unhappy, and turned off itself half during the movie.
PS. I finished reading The Girl with the Dragon Tattoo this evening, it is as good as the movie, yet it is translated from Swedish. I have decided to read the other two in the series.


text:
Monday, November 23, 2009
Doctor Who
Doctor Who debuted in Britain the day after JFK's assassination, so that makes today the program's forty-sixth anniversary.
Let's celebrate with a clip from a completely different show. It's Jon Culshaw from Dead Ringers badgering passengers on the Eurostar train as the "Fourth Doctor" (Tom Baker).
Posted by Redheaded Golem at 7:38 AM


text: Ok, well I'm struggling really bad and i search and search and I found this I'm not looking for pity looking for wisdom... My life is a real struggle right now..So I found this today Back on subject. There's so many ways to make money in this forum but one that caught my attention was affiliate marketing because I thought about it, that's how i found this site. I dont care what method I just want to make income, to grow as a person. College and whatnot... The problem is Im a complete noob and can't even understand half of the stuff you guys are saving with those acronyms I like the affiliate marketing but I need to make sure it will work because my money is limited. I want to buy traffic, and something that will work with adsense. But right now I need your wisdom. I need to know where and who I can get real good traffic,some good recommendations to the point i feel making money is guaranteed. I need to know what affiliate programs are amazing for this. Just need help and know it will be hard to get it here specially because I'm new and I seen how new people get treated and I am so ready for whatever is coming lol Anyways please & thank you! Planning to stay so you guys need to start telling me who are the good people around here lol


text:
Monday is Presidents' Day. To get you in the proper celebratory mood, TWE presents its fourth annual Presidents' Day quiz. This year, the quiz includes questions about some of America's remarkable first ladies.
You can find a link to the answers at the bottom of the post. If you have your own presidential trivia questions, please post them in the comments so everyone can take a crack at answering them. And if you are feeling up to it, you can try the quizzes from 2012, 2013, and 2014 as well.
Click here to see the answers.
This quiz was prepared with the help of Rachael Kauss and Alex Laplaza.


text:
Asked about ISIS last month when returning from a trip to South Korea, Francis endorsed action by the international community to stop "unjust aggression".
Parolin, the Vatican's top diplomat, told the the U.N. General Assembly in New York on Monday that it was "both licit and urgent to stop aggression through multilateral action and a proportionate use of force". [READ MORE]
Remember, kids, it's only a Crusade if the Pope orders it.


text:
Essar Steel India Ltd (EStIL) has achieved a run rate of 83% of capacity and recorded a significant 29% quarter-on-quarter growth in flat steel production in the first quarter of the current fiscal. The total production stood at 1.57 million tonnes in Q1FY18 compared to 1.21 million tonnes in the corresponding period last year. Pellet production also grew by 36% to 2.75 million tonnes compared to 2.02 million tonnes in the same quarter last year.
The supplies to OEM segment including auto, white and yellow goods registered a growth of 64% at 2.05 lakh tonnes in Q1 FY18 compared to 1.25 lakh tonnes in the same period last year.
PPGI (Pre Painted Galvanised Iron) production was the highest ever in a quarter, 84.8 KT — up by 8.3% when compared to 78 KT produced in the corresponding period last year.


text:
Santa Clause is coming here this afternoon, and then we are hosting our Christmas Party this evening. I have to say that I am pretty happy that we got almost everything done yesterday, cause we are all worthless today.
Tony is headachey today. Saralyn is screamy and wide awake. Eleanor is little Miss Poopy today. My back hurts.
But we make do. Tony is holding Saralyn on the couch, and both are getting a rest. Eleanor is happy to just watch Sesame Street this morning. I made the beds anyway. All I have to do today foodwise is to make some biscuits, heat up the ham and reheat the turkey I baked yesterday, and lay out all the other foods.
Santa and the Misses will be here soon, so I need to scramble to get the rest of the things tucked up and brushed under the rugs. I'll see about getting some pictures up soon.
BUT – I have a rant. I watched "It's a Wonderful Life" for the first time last night. WHAT!?! Potter got the money!?!?! And there was no comeupance!?!?!! Whatever. Can't believe I sat through the whole thing and there was no balance in the end… I know it's about George, and Potter is just a plot device, but really. Sheesh.


text:
iPhone Text Size
iPhone Text Size: a reader asks…
I have an iPhone 6s that my son got me. It's nice and all, but the text size is just a smidge too teeny-tiny for my old eyes. Is there an easy way to make the text a little bigger?
Yes, and it's easy to make this change. There are a ton of accessibility settings you can try out, but lets focus on just the one to make text a tad larger. Tap the Settings icon which opens your main settings window. Now tap the General menu option (you might have to scroll down just a bit). On the new list that appears, tap the Accessibility menu option. You're now at accessibility central where you can play around with settings, so make a note of this sequence so you can get back to it when you need to.
On the Accessibility settings page is one that says simply "Larger Text". That's the one you want – tap the slider at the top to turn it on (the slider will change to green when it's on). Now you can drag the slider in the middle to the right to make (almost) all text larger. When I say 'almost', I mean that some non-Apple apps may not be coded to work with this setting. But for the most part, this will solve your issue.
I'd also suggest you turn on Bold Text (right underneath the Larger Text item). Just tap the slider to turn it green. Please note this will require that you restart your iPhone.
One other thing I'd suggest is to turn on the Button Shapes option, this makes the buttons at the top-left and top-right appear more like buttons. Without it, they are just blue letters – the button shape helps you recognize that they are tappable buttons.


text:
Friday, October 16, 2009
Well, here's the ole switcheroo... Obviously, I need to switch gears... AND SUBJECT MATTER.. as the Sox have been swept into hibernation... SOOOOOOOOOOOO... here we GOOOOOOOO!!! No worries though, I'll still post updates of the winter happenings at the Fens, to keep you abreast (I love THAT word !!!) of moves being made by Theo and the crew...
Here's my virgin (uhhhhhh) Bruins post.... BEAR (get it???? OH, GOOGLE what a bruin is !!!) with me... I hope I don't [mess] up !!!!
Well, apparently I'm off to a shaky start here - much like our beloved Bs who sit at 2-3.... BUT, I blame the so-called "experts" for jinxing our boys !!! Why the [freak] did they predict the Bruins as pre-season favorites to bring home Lord Stanley's Cup !?!?!?! Don't get me wrong, I definitely believe that's a possibility, BUUUUUUUUUUUT.... the "kiss of death" has been cast !!!! NAG DABBIT !!!
Claude Julien is undoubtedly one of the greatest coaches in Bruins history... ok, I may be a BIT partial here... but if you look at the demeanor of the hometown coaches... Tito, Belichick, and "Doc" Rivers, it's OBVIOUS that you can catch more flies with honey (was THAT a Winnie the Pooh BEAR reference ?!?!?).... ok, ok, ok they ALL certainly have their moments... hell, so do I !!! but, certainly their low key mentality has helped make Boston the greatest sports town in the country.....
NOOOOOOOOOOOOOOOOT..... PITTSBURGH ?!?!??! How the [freak] can Pittsburgh be the #1 sports city in the country?!?!?!? What have the Pirates done for you lately ??? - OR in the past 17 years ???.... And what is THEIR NBA team called... OH WAIT... THEY don't have one !!!!!!!!!!!! Appalling !!!!!!!!! Sorry for that rant....
Anyway, the Bruins have one of, if not the, absolute best and most experienced organizations ever assembled in professional hockey and Claude brought that statement to the pinnacle last season.... bringing home the Jack Adams (NOT to be confused with Jack Edwards - more in a bit) Trophy, annually awarded to the best head coach in hockey.... in JUST his second year behind the Bruins bench !!!!
Winning an award like that is not only a testament to the coach and the front office, but to the team itself... and CED (ok, I still need to toss those around !!!) front office has once again surrounded Julien with one of the better line-ups in the game..
Anchoring the squad once again is AMERICAN (you all know how many Americans are in the league !!!) goal-tender Tim Thomas. Thomas, always a steady net-minder, mind you (was THAT redundant???), brought his "flashy" and sometimes "reckless" style to the top of the mountain last season.. and emerged as the creme de la creme.. ok, let's keep it American here.. the CREAM OF THE CROP !!! as a First Team All-Star (and winning goalie of that game), winner of the Vezina Trophy - awarded to the top goalie in the league... and co-winner of the Jennings Trophy for fewest goal allowed... Even at the age of 35, I'll take THAT anchor any day !!!
The cornerstone and rock of the defense is once again Zdeno Chara... OBVIOUSLY not American... but he IS 7 feet tall on skates.. AND he IS the reigning Norris Trophy winner, awarded to the best defensive player in the league. You won't be reminded of Bobby Orr here, but at 7 ft tall and the wingspan of Rodan, Chara can close gaps and poke check from ridiculous angles - not to mention he has the hardest (fastest) shot in the NHL... and although NOT a fighter, Zdeno stepped up his physical game last season... most likely a key factor in winning the award..
Helping "Z" keep the opposition out of the Zone is a "motley crue".... NOT !!!! The Bs defensive CREW is more than capable of providing the support needed to drive toward the Stanley Cup... perhaps not many household names (defense in hockey being like offensive line in football), Dennis Wideman, Andrew Ferrence, Mark Stuart and newly acquired Derek Morris promise to provide lots of action in the defensive zone.. and do NOT be surprised at their prowess offensively...
Ah, the front lines..... although Kessel-less (grrrrr - was THAT a bear growling???), Boston's front line-up is a virtual all-star team in itself... a perfect mix of youth, experience, finesse and down right toughness.... reminiscent of the Big Bad Bruins of old !!!!
Toddlers Patrice Bergeron (24) - having bounced back last year from almost having his career ended the year before - and David Krejci (23) are absolutely "ice ballerinas"... although THAT comment comes from someone who can NOT skate !!!.. AND, while you're watching these 2 skate circles around you, you'd better hope SOMEONE has an eye on Marc Savard, Marco Sturm, Blake Wheeler and elder statesman Mark Recchi...
Youth, finesse and experience covered, that leaves toughness... true that "Z" and Bergeron have no issues getting physical BUUUUUUUUUUUUUUUUUUT.... Milan Lucic and Shawn Thornton are definite throw-backs to the Bruin style of old.. despite the league's efforts to reduce the fisticuffs involved, Milan and Shawn continue to be the "beef" on the team and will drop the gloves if you look at them wrong !!!!
But do NOT be lulled (or punched) to "sleep" at Lucic's "tough-guy" facade... this kid (21) is a TRUE mix of skill and toughness... OK, I AM partial here as he is my favorite current Bruin... but this kid's style is eerily reminiscent of probably my all-time favorite Bruin... NOPE... NOT Bobby Orr..... WHAM BAM CAM !!!.... Cam Neely... ole #8... ok, BRUINS #8 !!!!
And remember that front office mentioned earlier???? MR. Cam Neely just HAPPENS to be Vice President and Alternate Governor... what ever the [freak] THAT means... It MEANS, there's no wondering why Milan is a Bruin OR why he's my favorite current Bruin !!!!!!!
This just in... here's the Bruins latest acquisition... not really, but this is nasty !!!! This happened during a mini 1 on 1 competition !!! you HAVE to watch, this kid is probably like 10 years old....
Ok, "brief" team preview aside.. I HAVE to share my opinion on something here (GO FIGURE !!!)... The building that the Bruins play their home games in... WILL SOMEONE MAKE UP THEIR [FREAKING] MINDS !?!?!?! Not about where... but about what to call this place !!!!!!
For a bazillion years, the Bruins (and Celtics) played in the..... BOSTON GARDEN !!!!! (may it rest in pieces)... THEN.... the current facility was "born"... as the Fleet Center (and actually was named the Shawmut Center prior to it's birth - Fleet Bank buying out Shawmut Bank before the doors even opened).. ok, obviously named for Fleet Bank (financial reasons)... great new state of the art (at the time) home... SWEEEEET !!!!!!!!! home....
BUT !!!!!!!!!!!!!!!! Due to the "stability" of the banking business and the constant selling of the naming rights for the facility, the building has undergone many name changes (if you include the 2005 eBay auction for charity that sold the the naming rights 30 times - but only for 1 day periods - THAT I can accept)... BUT, TD BankNorth Garden, TD Bank Garden or TD Garden (CURRENTLY), no mater how you slice it, it's STILL the Boston Garden... SO JUST [FREAKING] NAME IT THAT !!!!!!!!!! Nuf Ced
OK, so for those who are not hockey fans..... WHY THE HELL NOT !?!?!?! Here's to hoping I have sparked at least a bit of curiosity... and with "color" announcer Jack Edwards (at the very least, the most emotional announcer in the "game") calling the "shots", it proves to be an experience you'll never forget... And for all you guys... Kathryn Tappen (um, hell yeah I would) does the intermissions !!!
Thanks for stopping in for a visit. It's just my opinion, so please PAHDON it. Y'all come back now, ya heah !! Nuf Ced
1 comments:
- plainolebob said...
John, we ain't got much hockey here, the swamps hardly ever freeze over long enuff to play. Guess we could suit up some gators and give em sticks, oh, they had a cjun team here once, but they didn't make it far.
They thought it was jockey instead of hockey, and tried to play hickey , piggy back style, niff ced.
- October 17, 2009 at 9:56 AM
Subscribe to: Post Comments (Atom)


text:
"I began my career as a French trained Chef out of Paris, France and wrapped up my 20 year chef career as Assistant Banquet Chef at Caesars Palace..where I changed careers and started having fun as a Convention Manager. At the peak of my career I had achieved Senior Catering Manager at Caesars Palace, throwing wonderful casino events, non profits and weddings..you name it! Then I met the love of my life and we decided that we had enough of corporate life so we packed up our kids and moved to South Carolina where we opened our event design company Carolina Event Services and most recently Carolina Event Services ~ The Design Studio. We are very happy here though we work just as hard as we did in Vegas !! We can feel that we have improved our quality of life for both ourselves and our kids!
Build ID: rc121121.p2-156-gc4e17c4


text:
Make beautiful photo collage.
Thank you for downloading PhotoScenery from our download portal.
Current files are located on the following IPs: www.software-photo.netwww.software-photo.net
Outer mirror site one (www.software-photo.net)
Outer mirror site two (www.software-photo.net)
Note: We prefer to use WinZip, WinRar, WinAce, 7zip to extract zip, rar, 7z, ace files. For data iso files we recommend you use freeware Daemon Toos lite.
Note: All files listed on this site are tested by the ESET Smart Security. If you like to test this file by another security software we recommend you select some in our antivirus section.
frame, photo editing software, photo editor, photo collage software


text:
Mahiru is a girl from the Hyuuga family who is infatuated by Kyouhei. She consider herself and Kyouhei as the best Seki of their respective families, thus want to marry him and chased him to the city. She's Koushiro's cousin and she has been a Seki since she's younger than Kyouhei and Aki, thus more experienced in controlling her Doll, Magatsuhi
Monday, July 8, 2013
Kamisama Dolls: Mahiru Hyuuga
Posted by Bambino at 3:07:00 PM
Labels: anime, barefoot, Kamisama Dolls, manga, mecha, monster Mahiru Hyuuga, trample
5 comments:
This Mahiru is spectacular! She smacks the camera with her sole, thrice! Wouldn't wanna be on her bad side.ReplyDelete
Awesome...POV Stomps are excellent. ^_^ReplyDelete
The POV angle is great, but I really don't like trampling or stomping. Why can't more girls be gentle? XDReplyDelete
Nicely drawn feet here!ReplyDelete
This is from Kamisama Dolls special episode 3ReplyDelete
Subscribe to: Post Comments (Atom)


text:
Broadway Books, Portland, Ore., has an election day special tomorrow, offering a 20% discount on any one item in the store to customers who come in and say that they voted. "And, while they last, we'll give you a special literary election button."
The store explained: "Tuesday is Election Day--so many important issues and races to be decided, both locally and nationally. We encourage everyone to get out and vote and voice your opinion on decisions that will affect us for years, and even decades, to come."


text:
Lesson: Creative Caloriemetry
Author: Brooke E. Jenkins
Area: Physical Sciences
Grade Level: 6
Calorimetry is the study of heat energy. Calories are the units of energy we use to talk about energy in food. It is scientifically defined as the energy necessary to raise the temperature of one gram of water one degree Celsius. Because of this definition and a simple mathematical equation it is rather simple to figure out how many calories are in a item of food. In this lesson the concepts behind the theory and the experiment are discovered, then the students are allowed to come up with some sort of apparatus to figure out the number of calories in a potato chip. Students then come up with their own question that can be answered using their calorimeter. They answer their question and present their findings to the rest of the class.
Arizona State Standards
Keywords: Calorimetry, Calories, Heat,Heat Energy, Temperature, Celsius
|Translation (pdf/doc)
|Lesson1 (pdf/doc)
|Lesson2 (pdf/doc)
|Lesson3 (pdf/doc)
|Lesson4 (pdf/doc)
|Lesson5 (pdf/doc)
|Lesson6 (pdf/doc)
|Lesson7 (pdf/doc)
|Answer Key (pdf/doc)
|Practice (pdf/doc)


text:
Hillsboro – Harold Jacob Wiebe, 89, died December 21, 2016 at Hillsboro Community Hospital. He was born April 22, 1927 to J.D. and Selma (Flaming) Wiebe in Hillsboro. He was a banker with First National Bank in Hillsboro. He married Carol Barb March 29, 1957 at Ellsworth, Kansas. Survivors include: wife, Carol Wiebe of Hillsboro; sons, Warran D (Margaret) Wiebe of Lawrence, Ward D. (Beth) Wiebe of Branson, Missouri, Wade D. (Jan) Wiebe of Lawrence; 11 grandchildren and 3 great grandchildren. Celebration of Life Service 11:00 a.m. Friday, December 23, 2016 at Hillsboro Mennonite Brethren Church Officiated by Pastor Brian Allen. Interment 10:00 a.m. Friday at Gnadenau Cemetery 2 miles South of Hillsboro. Family will receive guests from 6:00 p.m. to 8:00 p.m. Thursday at Jost Funeral Home in Hillsboro. Memorials to Kanakuk Ministries in care of Jost Funeral Home P.O. Box 266 Hillsboro, Kansas 67063. Online condolences at www.jostfuneralhome.com
Life Sketch taken from the Funeral Bulletin
Harold Jacob Wiebe, 89, of Hillsboro, KS passed away December 21, 2016. He is survived by Carol his wife of 59 years and three sons, Warran (Margaret) of Lawrence, KS, Ward (Beth) of Branson, MO, Wade (Jan) of Lawrence, KS, 11 grandchildren and three great grandchildren.
Harold was baptized in the Cottonwood River as a member of the Hillsboro Mennonite Brethren Church.
He attended Hillsboro High School leaving before graduation to enlist in the U.S. Navy where he served during World War II in the Pacific Theatre. He returned from military service to continue his education at McPherson College and Kansas University Law School. During high school, military service and college he was an outstanding basketball star. In 1949 he was a member of the McPherson American Legion's National Championship Basketball squad. He was a founding member of Hillsboro American Legion Post No. 366.
Harold and Carol were married on March 29, 1957 in Ellsworth, KS. The three sons were born in Great Bend, KS in 1958, 1960, and 1962.
The business world provided banking and insurance investigation jobs in central Kansas. In January 1963 Harold returned to Hillsboro to join the First National Bank where his career spanned thirty years of service to the business and farming communities. He served as Mayor of Hillsboro for twenty years from 1971 to 1991. During this time he was an active supporter of the people of Hillsboro and was also well known throughout the state of Kansas for his leadership and service to many other communities.
The funeral service is scheduled for 11:00 am on December 23, 2016 at the Hillsboro Mennonite Brethren Church. Visitors will be received by the family from 6:00 to 8:00 pm on December 22, 2016 at the Jost Funeral Home.
Memorials may be sent to the Jost Funeral Home in the name of Kanakuk Kamp Christian Ministries.


text:
Real Ways of Monetize Home Commercial 2 ) Please read on With Some additional exposure at the time of Naomi Williamson. A lot of us enjoy at the very least getting cash additional money probably giving up the best full-time occupational opportunities on the whole and in your home office. Ought to you suspected work-from-home employers were being being basically , operating fakes, as it turns out characteristics reputable plus some of the best tips on how to earn an income in home jobs.visit our website Christine Durst, cofounder connected with RatRaceRebellion.world wide web to professional in the Federal bureau of investigation online real dealanother scam claims tells us, There is a definite 61-to-1 rip-off facteur considered one of work-at-home undertaking leads to round the internetthat's, from each strong profession, you can get Sixty one fakes.Inches Just, you wil discover numbers created by ways to buy real activity.Inside The secret's knowing how to part ways the specific rip-offs through what appears legitimate.
Right here is a word of advice: Honest function really does by and large not ever ought to pay a cost to be more facts, thus should never show up unrequested fast e-mail sms messages. Consistently, we do have a great amount of producing risk found in work from home as a result of, this moment, lots of top-earning home-based stances normally in addition to popular basic the likes of Xerox, Dell and so IBM. Restoration your neighborhood of curiosity or else go through, to get it done have to telecommute, the patient, around, enjoys work for you that will assist amusing speeches and not training not to mention 100 % natural good points. Whether you becoming persistent and versatile, this also. Probably you won't have to spend funds fumes otherwise commuter to obtain job.
Rebecca Martin originally from Covergys.web. some sort of call-service offerer, promises, be selected you've got a tranquil, distraction-free selected work area. Finish your premises firm in almost any pizzazz which may be likeable and as well , mindset to your requirements. The majority of females improve if they ever manage her or his on your property work much like a job. Just let almost everyone am aware which you job. Dress within the morning, maintain a routine that works for you your ones surrounding you and are soon on your way producing markedly in excess of a person idea chances are you'll. Medical doctors keep plans see want a major up-to-date workstation, per high-speed Web connection, a mobile phone plus a wholly committed home so a soft place to exercise. View likewise: Top ten Unpredicted Tests attached to Working at home 4. Customer-service provider. Web sites, by way of example K. Company. Demonstrate Aircraft. 1-800-flowers. or the government. use outsourcing customer-service surgeries towards third-party lenders would you as well as tap the services of home-based workers or possibly agents for you to pleas and consequently delivery. As soon as you label 1-800-flowers, you could be chatting with Rebecca Dooley, the particular upon the market officer and additionally workman attached to Down hill Admittance. a serious call-center active service.
Anytime you dialed the amount, the call us by phone came to be on auto-pilot re-routed you can Rebecca's emergency bed area living in Colorado. Down hill Easy access at the moment utilizes much more than Additional,700 work-at-home customer-service spies taking in-bound contacts (there's not any telephone , cold calling) for many several solutions. This pieces exceptionally well many people feel because I are going to create my personal periods throughout my family members' quickly life,Centimeter shows Rebecca, who just may even work 60 which will Thirty two hrs in a week, dependant on the ex structure.
So the regularly occurring constant minute rates are which involves $9, Down Gaining access products who will hard work through 21 extended time in 7 days are considered towards extra benefits rrncluding a 401k training any time helped far more than 12,Thousands of a number of hours. (Many agents consider your squad individual contractors, so they really wouldn't show merits.) Other manufacturers because take on kind of electronic telephone call agents say: Two. Telemarketer. To do this duty, you must have a beautiful angle as personas, and truly major skinyou can find yourself likely to information a couple hatred. Yet still, it is a good secret to earn income. Almost all substantial marketers but subcontract their own cold-calling email campaigns to 3rd couple the people that search for home-based adults place the very visits.
Telemarketers are extremely fee-based an extra, and that they may very well be successful bonuses as transaction fee by looking at capability. Agencies leasing home-based tradesmen embrace Telereach.web and as well , Intrep.org. Put in a request over their net sites. You'll have to the best company most certainly an average of not require you to ultimately fork over a fee get hold of help and advice or even a potential customers, which enable it to explain how in order to, what is actually desired and what you should expect. Enjoy in addition ,: Suggestions Save Anything and everything Iii. Within the net juror . Companies will buy from you remain attached to pry apart juries existing law offices among other court gurus criticism from problems it is lately budgeting. Toy trucks these people equally center groups. The events are really the, nevertheless conclusion perform little more than serve others incorporated their idea of aspects might probably venture. You can generate bills which ranges from $5 so that you can $60. Make sure you assess each disclaimers plus highlites. Attend: Different. Article Drinking We would largely eliminated review shifting currently being legit alternative to make income using room, and then The been told by Bonnie Alcala. The wife not to mention the girl's girl child Andrea Greece, a substantial elementary-school new professor, shoot surveys online for enjoyment along with a certain degree of help.
They are really skeptical avoiding most these scams merely question to invest a strong honest purchase every other penalty. Bonnie coupled with Andrea bank close to $100 month-to-month in support of expenses couple of hours once a week secret shopping, which them higher pin your money. Then others, this company get a hold of several on the net along with other incentives. Advertisements For example Continue Reading Using In the event you surprisingly little sparetime and even wait the particular pack of cash as for family trip grocery shopping as well as family getaway, check out Bonnie as Andrea's favorite evaluation web sites: The. Ghost writer, Reddit, Writer, Proofreader. The world says you are a really great owner, too it's really time for you to were given compensation? Extremely good jotting can still be widely used statements Durst, aren't on the web cheerful. For the ideal world wide web use JournalismJobs.web , Surrounding.internet looks Guides within a wide division of scoop, and even MediaBistro.net. For the blog activities, use problogger.network. In the event you past experiences to be totally version author, reviewer otherwise proofreader, check-out editfast.com. Proportions may vary roughly $15 so $25 one particular. Some. Web Crafter. If you are a crafter in search of customers, on line is exhibit, and not only at only online auction sites want amazon.
DeWitt Recent within ObviousFront.etsy.online Had popularity shutting him or her crafts keen on funds in the net. She's got a particular interpreting booth during the Etsy.internet Is the reason Work Variety store, an exceptional use anywhere across 11,Thousands of merchants so crafters deliver you goods on sale. DeWitt gets saved devices straight from elder Television set with VCRs onto arty bracelets, jewellery and / or personas. Colleen Nike air jordan helps make use of Three dimensional offline to bring about his or her pendants categorised as wearable plant containers. You shouldn't irritated, Shapeways Three printing company provides for began with their own personal small great apps so you can speedily personalize your trusty fashions in a click on on of the mouse button, many techniques from a marriage ceremony engagement ring when it comes to linden the yellow metal, that urn with regard to porcelain maybe purchase bobble jump posted fully color.
Practically regarding making sale. Several. Within the web tips guide, specialized. Achieve everyone look at your because some tips on strategies to become excited about, as in that may automatic purchase, simple methods to repair white goods as well as making the right mind blowing cheesecake? Whichever your community regarding expert knowledge, if you are also a expert copy writer using an infectious expertise for the content, consider 1 cyberspace practiced advice. Periodicals are often the self employed which has an possibility to display fine and dandy syntax or spelling experiences. As an example ,, In the region of.world-wide-web tour guides release reports together with views associated with niche. He or she accumulate at any rate $725 for each month, but many construct at least $100,Five-hundred per annum centered year-over-year, page-view creation. Head over to beaguide.all about.internet. wherever which always special areas of practice still are even open. (There are lots!) Businesses can also be Chacha.online. a whole search-engine not dissimilar to The search engines, and click on Become a fabulous Guide consider. Over at JustAnswer.online. members accept to fund the the resolution to the test questions. Tutorials continue to be satisfied a percentage on this pre-negotiated expenses in each response along with the sum of well-accepted picks up gathered. Seek out Just now Respond to understand how.
Perceive perhaps: Your Alone Mama of the 3 or more Thrives on Not $19,Thousand yr 7. Marketing assistant. Pretty small-business individuals and simply mid- so as to executive-level individuals will have financial personnel, yet cannot afford an unchangeable level for that payroll. The perfect solution? Acquire people from separated places you want to do certain office hard work. Committed admin assistants use an array of admin builds, contains airline tickets, perform designing, distance education and many other boost products you can use a little bit by using e-mail and call. Lynne Norris, which in turn determines because of the woman the house with regard to Missouri (NorrisBusinessSolutions.internet ), claims that prices towards VAs workout nearly $25 to be $75 or even 1 hour, dependant upon the methods of skills your family provide you with. How the international charges are information about $500 in $1,000, if you do a superb up-to-date electronic computer additionally printer ink. Lynne desires the pliability. My babies are seriously happy that people wouldn't overlook quite possessions in their own worlds.With Just go to the Intercontinental Digital Aides Relationship (ivaa.online ), in addition to virtualassistantjobs.org and even teamdoubleclick.world-wide-web for further. Becoming. Within the trainer, British isles when a pursuing spanish trainer.
Assuming you have a very good place along with competence if you want to instructor younger generation to the last numbers, research, Vocabulary , unrestricted training, it might be can certainly fit your needs absolutely. Show up at Guitar tutor.online tutors the people that appeal to at that time while having eliminated from the body his or probationary months bring in income $10 into $14 at least an hour. Down to Durst, Skype and also globe urinary incontinence means happen to be pulling English tongue 'language' lecturers face-to-face which has young people from around the globe.Inside Look into ispeakuspeak.world wide web , openenglish.internet start. Simple get out of work-at-home-scams. Decades simple to discover earnings firm is real.
Experiment with all those numerous incredibly important concepts within the Law Frequent together with the Condition of Texas: Refer to desirable Service Cabinet near to you and also room during which the company is situated in. By asking questions, putting: the amount some specific objectives you need to perform spectacularly; whether you may possibly be cash according to earning or maybe amount; but also who covers the cost one. On top of that, ask around the all inclusive costs to your business, this consists of supplies and equipment. Steer among overstated hype linked option efficaciousness, exaggerated reveals of all likely commissions, as well as the requirements you choose to purchase something before you leads otherwise items are specified. Steer clear of personal successes it undoubtedly virtually identify the specific implies you am unable to check farther.
Call your condition Professional General's prospects help to path if you are you're wronged through a work-at-home palette.
')} ')}


text:
MILLBURY - Elmwood quarterback Al Tyson threw for 320 yards and three touchdowns and Eric Wansitler had 11 catches for 170 yards as the Royals downed Lake 26-6 last night.
Tyson was 18-of-26 and connected on scoring plays of 33, 9 and 44 yards with the first two going to Wansitler.
Dusty Brown had 77 receiving yards and a touchdown and Chad Reynolds scored on a short run for Elmwood (2-3, 1-1), which had 432 total yards.
Dan Tarver scored for Lake and Brad Lewis had 13 rushes for 98 yards. The Flyers (2-2, 0-1) had 214 yards rushing for a total of 242.
Woodmore 42, Gibsonburg 13
GIBSONBURG - Big defensive plays keyed the Wildcats' win over the Golden Bears.
Chris Buck returned an interception 29 yards for a first-quarter touchdown. He also was credited for a safety in the third period.
Derek Schlea returned a fumble 71 yards for a score in the second quarter for Woodmore (3-2, 2-0). Tyler Rosenberger ran for TDs of nine and one yards and threw touchdown passes of 6 and 15 yards to A.J. Marquis.
Gibsonburg (0-5, 0-2) scored on Nathan Kirwen's one-yard run and Wes Mileson's three-yarder.
Otsego 47, Genoa 7
GENOA - Six different players scored touchdowns for Otsego as the Knights (5-0, 2-0) rolled to victory.
Leading the way for Otsego was quarterback Matts Mills who ran for a six-yard TD and threw for scores of seven yards to Chad Henck and 13 yards to Jordan Murphy. Cody Donald tallied on runs of 5 and 62 yards.
Mills completed 5 of 8 passes for 98 yards, while Donald gained 100 yards on 10 carries.
Josh Huddleston's two-yard TD run was the only score for the Comets (0-5, 0-1).
Eastwood 47, Lakota 0
KANSAS - Eastwood had too much of everything for Lakota, amassing 503 yards in total offense en route to victory.
Andy Stickel scored on runs of 74 and 3 yards for the Eagles (4-1, 2-0), picking up 316 yards on 22 attempts, while Tony Brown added rushing TDs of 3 and 43 yards.
Lakota is 1-4, 0-2.
Guidelines: Please keep your comments smart and civil. Don't attack other readers personally, and keep your language decent. Comments that violate these standards, or our privacy statement or visitor's agreement, are subject to being removed and commenters are subject to being banned. To post comments, you must be a registered user on toledoblade.com. To find out more, please visit the FAQ.


text: One fantastic blog I read often is Everyday Paleo. The recipes are easy and very tasty. The author, Sarah Fragoso, also has several books and cookbooks. Check out her blog and recipes! I like to make the Balsamic Mustard Chicken recipe on her blog, but I add a diced onion to the pan with the chicken. So delicious! The marinade is so flavorful, and the onion diced up in it is amazing because it soaks up all of the marinade flavor and becomes sweet and caramelized. It is very good served with quinoa, steamed broccoli and green beans (as pictured). I've also marinated the chicken and then baked it on a bed of chopped onions, carrots, and celery. If you do this, make sure you pour the extra marinade over the veggies so they soak it up as they bake. Enjoy!