Author - Web Developer - Educator
Found 11 results for tag "japan"
RSS Feed

How many drafts does it take?

As I browse through my online profiles, I realize that I haven't updated my blog. IN 5 MONTHS! Geez, my online life really has fallen behind. I'm not proud of that.

My many drafts
My many drafts for Omega Noir
So, what has been keeping me busy? I'm glad you asked:

Working on 3rd draft of Omega Noir 1 manuscript


During NanoWrimo 2015, I wrote the majority of "Omega Noir: Ascension", which was the first of my magical fantasy series. During 2016, I finished the manuscript and began editing it, and really liked where it was going. However, while writing "Omega Noir: Chaos Cast" (#2), and editing what I had of that, I realized two things:
  1. Vol 1(1) had lots of plot holes
  2. Vol 2(1) had a sucky villian


So I started a 2nd draft of Omega Noir (#1), and got about 70 pages in, but I realized I was doing the same thing: making sucky villians and building up plot holes. Additionally, the story didn't flow the same way, and lost even MY interest.

Hence, I began Draft #3. This one has a better hook, explains as it goes, and keeps on moving. I'm already 56 pages in, and so much has already happened, with a lot more to go!

Teaching Japanese Elementary and Middle School


My job in Japan has me teaching at 4 different schools: 2 elementary schools (1-6 grade) and 2 middle schools (7-9 grade). My job: Teaching (or assisting in teaching) the English Language.

Luckily, the programs have already been planned out, so all I have to do is show up, maybe bring an activity, and be active. It's not the hardest job in the world, but it is technically the first 8-5 job I've had.

Teaching AB Tech


While teaching English during the day, I'm also teaching HTML by night (well, late evening). I still have my job with AB Tech, and I'm so happy that AB Tech was willing to let me keep my job while across the world. I've had to do a lot of video recording (and editing) as my course is completely online, so I can't just show up and talk for two hours like I did before.

Managing Japanoblog


Japanoblog has become a big part of our lives. While in Japan, we have traveled around the area, including Tokyo and Kyoto, documenting different adventures, sights, foods, and more. Although we still have to work on the weekdays, it's nice to get out and share our adventures with our fans.

Managing the cats


Getting the cats to Japan (after the paperwork) was easy. However, shortly after we arrived, the cats got fleas. We're still not quite sure how, because they never had fleas in America, and we didn't bring them. But somehow, they got fleas, and we've been fighting them ever since. The two of them fight like siblings and we keep them fed and watered, and they like the treats that Japan has to offer.

During some nights, Maru will come into the bedroom and sleep on our heads (or lick our faces) while Chi traps us under the blankets. Other nights (or days), neither of them will enter the bedroom, and when we drag them in, they immediately dash out. No idea why.

Figuring out Japan lifestyle


Comapring Japan to America is like night and day (which, since we're 14 hours ahead, can be a literal definition). There are many things in Japan that are different from America, such as traveling, paying bills, bank accounts, phones, and more. We'll do an article/video on Japanoblog and talk about that in detail.

So until the next post, I'm still busy.


Tags:#tokyo #kyoto #japanoblog #cats #abtech #english #omeganoir

RSS Feed

The Move, the Jobs, and the Editing

Me in Japan!I'm on my bike, in Japan!
So, you may be wondering "Where has Kyle been?" I have a very good answer: busy. Okay, that's not a very good answer. How about this one: In the past month, I have done the following:

  • Packed up the Waynesville house for selling and moving
  • Had the cats examined and ready to move
  • Moved to Japan!
  • Attended training for my "new" job - teaching english
  • Maintaining the Japanese apartment
  • Planned out the new semester for a WEB 115 online course that I am teaching with AB Tech, all the way across the world
  • Recorded videos for WEB 115, edited, and published them (per section - I'm up to Chapter 3 out of 9)
  • Organized Moodle for WEB 115, which was a mess, since I merged my seated class with my "attempt" at my previous online WEB 115 class, so I had to sort that out)
  • Traveled to Tokyo multiple times to take care of some visa documentation
  • Attended more training for my English teaching job
  • Traveled to some of the schools that I will be teaching at
  • Prepped for a presentation at the Board of Education, who ultimately decides my fate with my new job
  • Edited the physical copy of Omega Noir (I'm editing the digital manuscript now)
  • Updating all profile information to either Raleigh or Japan
  • Communicating with in-laws about stuff we left in Waynesville, in Raleigh, and/or selling items
  • ....and I'm sure I left something off of this list

So I've been busy. Since I'm now (and hopefully) a full-time Assistant Language Teacher (ALT) with this company (instead of a substitute, which I was originally hired as), I will be working 40 hours a week between 2 elementary schools and 2 junior high schools; I'm also teaching/managing an online session of WEB 115 with AB Tech; and I'm editing/rewriting Omega Noir, so it can hopefully be released by the end of the year.

Why? I want "Omega Noir 2" to start in November, so I can participate in NaNoWriMo again.

Japanoblog!Japanoblog
Oh, did I mention that I'm also working on Keat and my side project, Japanoblog? Yeah, we're also doing that when we have some free time.
I know I've been slack on my personal site's postings - I've dedicated more time to Japanoblog while I've been at the apartment (shooting video, editing video, creating the blog post, managing social media presence, etc) along with making sure that my WEB 115 course is up-to-date (wash, rinse, repeat - minus the social media), and prepping for my new ALT job.

Overall, I have a lot on my plate - and that's how I like it. While working full time, having a part time online teaching job, writing/editing books, and managing/shooting/editing video and posts for a side job, I've got a lot to do. Am I making excuses? No, I just don't have a lot of free time. Does that mean I will stop writing? Of course not, but I won't have as much dedicated time to get my books done as fast as I originally hoped (which also means my parody book, The Story: Epic Conquest of Tag may have to wait until probably 2019 or so


Tags:#japan, #omega #noir, #the #story, #web #115, #ab #tech, #alt

RSS Feed

FIRE SALE!

What we have left!
If you haven't heard the news yet, Keat and I are moving to Japan. Therefore, we need to downsize our belongings. Some of these belongings include extra copies of our books, so we've decided to host a Fire Sale of our remaining inventory!

In order to move what we have left, all books are $5 flat! That's right, we'll cover the cost of shipping to anywhere in the US, because we need to move these things.

Spread the word, tell your friends, and help us get rid of our inventory, because we can't take it with us when we leave the country!

You can only get this deal on our Square store - not Amazon, not at a local book store, not anywhere else!

And once our inventory runs out, that's it (for this sale). Click on the titles below to purchase:


The Night Blade series is actually going to go through a minor revision, and will be re-released with new covers, and that should happen early 2017.


Tags:#nightblade #thekingsrose #lunarproductions #firesale #japan

RSS Feed

Update Youtube Video Privacy with API and OAuth

OAuthI posted this on my Facebook and Github, but I thought I'd post it here for a more public audience.

Recently, while working on Japanoblog, I realized that there was a problem: when we created videos, we would post them for our Patreon supporters 3 days early so they could get early access to them. However, I had a few options:
  1. I could post a separate video to Youtube/Vimeo/etc and share the link, but then wait 3 days and upload the real video and take down the temp one (which would mean 2x the work, and misleading stats)
  2. I could make the video "Unlisted" and share the link with our Patreon supporters, then wait 3 days and change the video to "Public" for all, or
  3. Do the 2nd option, but then have the server automatically change the status to "Public" when the video was ready to go public (as per the blog post publishing date

Well, being the pragmatic programmer that I am, I figured out how to make the server do it for me. But it was not an easy task (apparently, nobody had done this before - at least, on a public searchable point). After scouring the internet to dissect the Youtube API, Google OAuth (along with token creation), researching and pulling parts from about 7 different public user projects, and some patient testing, I finally have it...I hope.

This script is based on Dom Sammut's code and the Youtube Sample Code (PHP #1).

(Don't want to copy/paste? Here's the Github repository)

So, without further ado, here is what I have come up with:

First: get your tokens


You need to generate your tokens to get the process started.
<?php
 

 
#Primary code from https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide/
 
#Create Client ID and Client Secret by creating OAuth credentials 
 
# at https://console.developers.google.com/apis/credentials
 
# MAKE SURE YOU UPDATE YOUR REDIRECT URL TO MATCH!!!!!!!!!
 
$CLIENT_ID = "XXXXXXXXXXXXXX.apps.googleusercontent.com";
 
$CLIENT_SECRET = "XXXXXXXXXXX";
 
$application_name="APPLICATION_NAME";
 
 
 
// Call set_include_path() as needed to point to your client library.
 
#set_include_path($_SERVER['DOCUMENT_ROOT'] . '/directory/to/google/api/');
 
#Download the PHP Client Library from Google at https://developers.google.com/api-client-library/php/
 

 
#This has been installed using Composer - update if you download the files directly
 
set_include_path(get_include_path() . PATH_SEPARATOR . '/PATH/TO/vendor/google/apiclient/src/');
 
require_once 'Google/Client.php';
 
require_once 'Google/Service/YouTube.php';
 
session_start();
 
 
 
/*
 
 * You can acquire an OAuth 2.0 client ID and client secret from the
 
 * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>
 
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 
 * <https://developers.google.com/youtube/v3/guides/authentication>
 
 * Please ensure that you have enabled the YouTube Data API for your project.
 
 */
 
$OAUTH2_CLIENT_ID = $CLIENT_ID;
 
$OAUTH2_CLIENT_SECRET = $CLIENT_SECRET;
 
#$REDIRECT = 'http://localhost/oauth2callback.php';
 
$REDIRECT = 'http://YOUR_URL.com/oauth2callback.php';
 
$APPNAME = $application_name;
 
 
 
 
 
$client = new Google_Client();
 
$client->setClientId($OAUTH2_CLIENT_ID);
 
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
 
$client->setScopes('https://www.googleapis.com/auth/youtube');
 
$client->setRedirectUri($REDIRECT);
 
$client->setApplicationName($APPNAME);
 
$client->setAccessType('offline');
 
 
 
 
 
// Define an object that will be used to make all API requests.
 
$youtube = new Google_Service_YouTube($client);
 
 
 
if (isset($_GET['code'])) {
 
    if (strval($_SESSION['state']) !== strval($_GET['state'])) {
 
        die('The session state did not match.');
 
    }
 
 
 
    $client->authenticate($_GET['code']);
 
    $_SESSION['token'] = $client->getAccessToken();
 
 
 
}
 
 
 
if (isset($_SESSION['token'])) {
 
    $client->setAccessToken($_SESSION['token']);
 
    echo '<code>' . $_SESSION['token'] . '</code>';
 
}
 
 
 
// Check to ensure that the access token was successfully acquired.
 
if ($client->getAccessToken()) {
 
    try {
 
        // Call the channels.list method to retrieve information about the
 
        // currently authenticated user's channel.
 
        $channelsResponse = $youtube->channels->listChannels('contentDetails', array(
 
            'mine' => 'true',
 
        ));
 
 
 
        $htmlBody = '';
 
        foreach ($channelsResponse['items'] as $channel) {
 
            // Extract the unique playlist ID that identifies the list of videos
 
            // uploaded to the channel, and then call the playlistItems.list method
 
            // to retrieve that list.
 
            $uploadsListId = $channel['contentDetails']['relatedPlaylists']['uploads'];
 
 
 
            $playlistItemsResponse = $youtube->playlistItems->listPlaylistItems('snippet', array(
 
                'playlistId' => $uploadsListId,
 
                'maxResults' => 50
 
            ));
 
 
 
            $htmlBody .= "<h3>Videos in list $uploadsListId</h3><ul>";
 
            foreach ($playlistItemsResponse['items'] as $playlistItem) {
 
                $htmlBody .= sprintf('<li>%s (%s)</li>', $playlistItem['snippet']['title'],
 
                    $playlistItem['snippet']['resourceId']['videoId']);
 
            }
 
            $htmlBody .= '</ul>';
 
        }
 
    } catch (Google_ServiceException $e) {
 
        $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
 
            htmlspecialchars($e->getMessage()));
 
    } catch (Google_Exception $e) {
 
        $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
 
            htmlspecialchars($e->getMessage()));
 
    }
 
 
 
    $_SESSION['token'] = $client->getAccessToken();
 
} else {
 
    $state = mt_rand();
 
    $client->setState($state);
 
    $_SESSION['state'] = $state;
 
 
 
    $authUrl = $client->createAuthUrl();
 
    $htmlBody = <<<END
 
  <h3>Authorization Required</h3>
 
  <p>You need to <a href="$authUrl">authorise access</a> before proceeding.<p>
 
END;
 
}
 
?>
 
 
 
<!doctype html>
 
<html>
 
<head>
 
    <title>My Uploads</title>
 
</head>
 
<body>
 
<?php echo $htmlBody?>
 
</body>
 
</html>


Now that that's all set, save the response to a file (I recommend "the_key.txt"), and modify and run the following:
<?php
 
/**
 
 * This code is to be run automatically to update a Youtube video's privacy status
 
 *
 
 * First, generate your key using "get-token.php" - read the notes below for generation
 
 * Next, update this file with the appropriate information (path to key file, Client ID, 
 
 *    Client Secret (OAuth Required), Application Name, Database Login, Database Query, and
 
 *    location of PHP Client Library - all download information is below)
 
 * 
 
 * @author Kyle Perkins
 
 * @site https://github.com/kode29/google-youtube-api-privacystatus
 
 * 
 
 * NOTICE: Rest of copyright should be in tact for other scripts (Dom Sammut (domsammut.com) and Ibrahim Ulukaya (Google)
 
 * Last Update: 20160108
 
**/
 

 
#Primary code from https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide/
 
# Mixed with sample code from https://developers.google.com/youtube/v3/docs/videos/update (PHP #1)
 

 

 
#Generate the "the_key" with get-token.php and store it into "the_key.txt" or wherever you want to store it BEFORE running this script.
 
# Also, make sure "the_key" has a REFRESH TOKEN!
 
$key_file = "/path/to/the_key.txt";
 

 
#Create Client ID and Client Secret by creating OAuth credentials 
 
# at https://console.developers.google.com/apis/credentials
 
# MAKE SURE YOU UPDATE YOUR REDIRECT URL TO MATCH!!!!!!!!!
 
$CLIENT_ID = "XXXXXXXXXXXXXX.apps.googleusercontent.com";
 
$CLIENT_SECRET = "XXXXXXXXXXX";
 
$application_name="APPLICATION-NAME";
 

 
#CHeck the DB for updated videos
 
$video_list=array();
 
    $dbh = new PDO('mysql:host=localhost;dbname=DATABASE_NAME', "DATABASE_USER", "DATABASE_PW");
 

 
	$sql="select `video` from `TABLE` where `stamp` like '".date("Y-m-d H:i:")."%'";
 
				$query = $dbh -> prepare($sql);
 
				$query->execute();
 
				if ($query->rowCount() > 0){ #rowCount() won't work on some databases
 
					$values = $query->fetch(PDO::FETCH_ASSOC);
 
					while (list($key, $value) = each($values)){
 
						$video_list[]=$value;
 
					}
 
				}
 
$key = file_get_contents($key_file);
 
if (count($video_list)>0){
 
foreach($video_list as $VIDEO_ID){
 
	$VIDEO_ID = str_replace("https://youtube.com/watch?v=", "", $VIDEO_ID);
 
	$VIDEO_ID = str_replace("https://youtu.be/", "", $VIDEO_ID);
 

 
#Sample $VIDEO_ID can be "gYY3fVz6PjY";
 
/**
 
 * This sample adds new tags to a YouTube video by:
 
 *
 
 * 1. Retrieving the video resource by calling the "youtube.videos.list" method
 
 *    and setting the "id" parameter
 
 * 2. Appending new tags to the video resource's snippet.tags[] list
 
 * 3. Updating the video resource by calling the youtube.videos.update method.
 
 *
 
 * @author Ibrahim Ulukaya
 
*/
 

 
// Call set_include_path() as needed to point to your client library.
 
#Download the PHP Client Library from Google at https://developers.google.com/api-client-library/php/
 

 
#This has been installed using Composer - update if you download the files directly
 
set_include_path(get_include_path() . PATH_SEPARATOR . '/PATH/TO/vendor/google/apiclient/src/');
 
    
 
require_once 'Google/Client.php';
 
require_once 'Google/Service/YouTube.php';
 
session_start();
 

 
/*
 
 * You can acquire an OAuth 2.0 client ID and client secret from the
 
 * Google Developers Console <https://console.developers.google.com/>
 
 * For more information about using OAuth 2.0 to access Google APIs, please see:
 
 * <https://developers.google.com/youtube/v3/guides/authentication>
 
 * Please ensure that you have enabled the YouTube Data API for your project.
 
 */
 
$OAUTH2_CLIENT_ID = $CLIENT_ID;
 
$OAUTH2_CLIENT_SECRET = $CLIENT_SECRET;
 

 
$client = new Google_Client();
 
$client->setClientId($OAUTH2_CLIENT_ID);
 
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
 
$client->setScopes('https://www.googleapis.com/auth/youtube');
 

 
#$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
 
# If running via Cron, HTTP_HOST may be blank
 
$redirect = filter_var('http://YOUR_URL/' . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
 
$client->setRedirectUri($redirect);
 

 
$scope=array("https://www.googleapis.com/auth/youtube", "https://www.googleapis.com/auth/youtubepartner", "https://www.googleapis.com/auth/youtube.forcessl");
 

 
// Define an object that will be used to make all API requests.
 

 

 
#if (isset($_GET['code'])) {
 
#  if (strval($_SESSION['state']) !== strval($_GET['state'])) {
 
#    die('The session state did not match.');
 
#  }
 
#
 
#  $client->authenticate($_GET['code']);
 
#  $_SESSION['token'] = $client->getAccessToken();
 
#  header('Location: ' . $redirect);
 
#}
 
#
 
#if (isset($_SESSION['token'])) {
 
#  $client->setAccessToken($_SESSION['token']);
 
#}
 
$client_id = $CLIENT_ID;
 
$client_secret = $CLIENT_SECRET;
 
#var_dump($key);
 

 
  $client = new Google_Client();
 
    $client->setApplicationName($application_name);
 
    $client->setClientId($client_id);
 
    $client->setAccessType('offline');
 
    $client->setAccessToken($key);
 
    $client->setScopes($scope);
 
    $client->setClientSecret($client_secret);
 

 
// Check to ensure that the access token was successfully acquired.
 
if ($client->getAccessToken()) {
 
/**
 
         * Check to see if our access token has expired. If so, get a new one and save it to file for future use.
 
         */
 
        if($client->isAccessTokenExpired()) {
 
            $newToken = json_decode($client->getAccessToken());
 
            $client->refreshToken($newToken->refresh_token);
 
		#This is for debugging if your token is not regenerated
 
	    #var_dump($client->getAccessToken());
 
            file_put_contents($key_file, $client->getAccessToken());
 
        }
 

 
$youtube = new Google_Service_YouTube($client);
 

 
  try{
 

 
    // REPLACE this value with the video ID of the video being updated.
 
    $videoId = $VIDEO_ID;
 

 
    // Call the API's videos.list method to retrieve the video resource.
 
    $listResponse = $youtube->videos->listVideos("status", array('id'=>$videoId));
 

 
#	array( 'id' => $VIDEO_ID, 'status' => array('privacyStatus' => 'public')));
 

 
    // If $listResponse is empty, the specified video was not found.
 
    if (empty($listResponse)) {
 
      $htmlBody .= sprintf('<h3>Can't find a video with video id: %s</h3>', $videoId);
 
    } else {
 
      // Since the request specified a video ID, the response only
 
      // contains one video resource.
 
      $video = $listResponse[0];
 
	$videoStatus = $video['status'];
 
	$videoStatus->privacyStatus = 'public'; #privacyStatus options are public, private, and unlisted
 
	$video->setStatus($videoStatus);
 
	$updateResponse = $youtube->videos->update('status', $video);
 

 

 
#    $htmlBody .= "<h3>Video Updated</h3><ul>";
 
#    $htmlBody .= sprintf('<li>Tags "%s" and "%s" added for video %s (%s) </li>',
 
#        array_pop($responseTags), array_pop($responseTags),
 
#        $videoId, $video['snippet']['title']);
 
#    $htmlBody .= '</ul>';
 
$htmlBody = "We're Good!"; #Just a debug phrase to know that the script completed successfully. Not required to output
 

 
  }
 
    } catch (Google_Service_Exception $e) {
 
      $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
 
          htmlspecialchars($e->getMessage()));
 
    } catch (Google_Exception $e) {
 
      $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
 
          htmlspecialchars($e->getMessage()));
 
    }
 

 
    $_SESSION['token'] = $client->getAccessToken();
 
    } else {
 
      // If the user hasn't authorized the app, initiate the OAuth flow
 
      $state = mt_rand();
 
      $client->setState($state);
 
      $_SESSION['state'] = $state;
 

 
      $authUrl = $client->createAuthUrl();
 
      $htmlBody = <<<END
 
  <h3>Authorization Required</h3>
 
  <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p>
 
END;
 
    }
 
#      echo "<body>$htmlBody</body>";
 
}}
 
	?>
 

Again, Here's the Github repository)


Tags:#php #mysql #japanoblog #video #youtube #api #oauth

RSS Feed

Our New Project: Japanoblog

Keat and I have been dwelling on this over the past few months (aka: years), and one thing has been certain: we want to go to Japan.

We waited until after the holidays wrapped up to really start this, but one step that we have taken to assure that we are really going to Japan is to start a travel blog; in this case, Japanoblog!


Keat is currently applying for jobs over there, and hopefully will leave within the next few months. Me? Well, I'm kind of anchored down until May 10th, because I have 3 classes to teach until then. I can't just abandon them now.


Basically, Japanoblog is going to have multiple sections that we want to cover.

Japan-o-food

Japan-o-food is going to cover different Japanese recipes that people can make in their home. We'll also go around to different restaurants and food stalls and review their food.

Japan-o-trains

As a train fan, I want to host a segment about Japanese trains; the different types, prices, routes, and maybe a bit of history.

Japan-o-tours

After going to Japan in 2008, I got to explore a few different places, and wanted to offer the same opportunity to the public (filming approved, of course)

Japan-o-tips

Japanese tips to help everyone live each day a little better, whether in Japan or America.

Japan-o-days

Lastly, since this is a thing on Youtube, we're going to film some of our day-to-day activities and let people see what we do.

Japan-o-comics

Keat is going to draw some comics about our adventures and post them online for everyone to view.

Lastly, Everything Else - this list includes videos that don't fall into one of the above categories.

Overall, the whole reason why we are doing this is because we want others to enjoy our Japanese experience, especially if they want to keep up with us (aka: our parents). We both think that it will be fairly fun to do this project, and make a bit of money on the side through Youtube and Patreon.

So take a moment to explore Japanoblog and let me know what you think.


Tags:#japanoblog #japan #living #moving #keat

RSS Feed

Japanese Experiment: Result

It's been 30 or so days since Keat and I started our "Living Japanese" Experiment, and we've received the power bill, which means it should give us a better understanding of how our different lifestyle has helped or hindered us.

So here's the result:
October Bill

For those of you that like table comparisions instead of images, here's the September bill (when we started) as compared to our October bill:

SeptemberOctoberΔ
Water$15.82$15.82No Change
Sewer$15.81$15.81No Change
Electricity$92.42$78.51-15.05%
GarbageCollection$9.00$9.00No Change
Renewable Energy Fee$0.56$0.56No Change
Tax$6.51$5.54-14.9%

The verdict: Not much.

Our Electricity usage went down a bit, which I'm not sure whether it is because we used less electricity because we didn't use the big energy drainers (like the stove and dishwasher) or because my primary hosting server quit and I took out the servers (although that was on 10/5, only 10 days short of the end of the experiment).

I was quite surprised to see that our water, sewer, and garbage stayed exactly the same (I knew the Renewable Energy fee would stay the same, and the Tax of course would differ). I thought that we would have used remarkably less or more water since we were washing all of our dishes by hand, but I guess our town just doesn't work that way.

Does this mean that Keat and I will continue this 'experiment'? Probably, since we are looking at moving to Japan in 5 years or less. It will depend on a number of circumstances, including jobs.


Tags:#japanese #japan #experiment #kitchen

RSS Feed

Introduction of the <ruby> tag

As much as I've wanted to write Japanese on the web, I never really knew how hiragana characters were written above kanji (see example).
NHK News Easy Website

I always thought that it was manually inserted with each set of characters a special <div> that showed the pronunciation, or there was a special engine or library that automatically did it.
Well, whether there is or there isn't, I have found a way: the <ruby> tag.

I always saw the <ruby> tag and thought it was for inserting Ruby on Rails code into HTML. I knew about merging Ruby and HTML codings, but never like this.
<ruby>愛
 
	<rt>あい</rt>
 
</ruby>
Produces this
あい


That is it. In order to insert special Japanese (or Chinese/Thai/Korean/etc) characters, you don't need to look up each special character code for each character if you already have access to it (like a Japanese IME or keyboard). Just copy and paste (or write) and the <rt> tags will put the special pronunciation over the selected character. Although, you may need to insert multiple <ruby> tags in order to write out a paragraph or something, but the concept is there.

I find it interesting that this is possible, and I may be late to the game, but it is nice to be able to do something like this.


Tags:#html #demos #tags #ruby #japanese

RSS Feed

Japanese Lifestyle Experiment: Day 1

So Keat and I decided to "live Japanese" for a while, just to see how we can do it and what it is like.

The Rules

With that being said, here are the rules that we are setting in place for at least the next 30 days:
  1. No Dishwasher: That's right. We will be hand-washing everything. Even though throughout all of the houses that we looked at 4 years ago, this house was the only house that had a dishwasher, we are going to try to not use it.
  2. No Stove: Since most Japanese houses/apartments don't have stoves, we will be using a 5th Eye only. We found out that ours kind of sucks, so we may need a better one.
  3. No Oven: Most Japanese apartments/houses don't have ovens, only toaster ovens. So we will be trying our best to reduce (if not eliminate) our oven-usage.
  4. Only using one side of our kitchen: Let me explain: our kitchen is fairly huge compared to most Japanese apartments, so we are reducing our usage to only one side: the sink side. It will drastically reduce our counterspace, but we think it may be a bit better (if we don't kill each other first for the space).
  5. No Dryer: We will be using our washer to wash clothes, but we will be drying them on our back porch. Mainly, so we can reduce our electricity usage because of the dryer, but also to get used to drying our clothes outside (although with Winter sneaking up, that may not be the best idea)

That's everything for right now.
Our kitchen setup
Our kitchen setup - everything off of the good counter
The GOOD side of the kitchen
The GOOD side of the Kitchen that we are going to use
Our first night hand-washing dishes
Our first night hand-washing dishes

The Interim Results

Since we technically started this experiment last night, here's what we've learned so far:
  • Cooking hasn't changed much. However, the counter space is very small, but that's okay for a 5th eye, a rice cooker, and some prep space.
    Cooking
    Gyudon!
  • Our 5th eye sucks! (See above) We have an electric 5th eye that we picked up a few years ago, but haven't really used it. We started boiling some water to make some home-made Mirin, and by the time we made the Mirin (which should have been a 5 minute ordeal), the rice was completely cooked (which takes 30 minutes). So we are doing some research to find a new one.
    5th eye sucks!
    We are just now starting to cook the meat, while the rice has been done for about 5 minutes
  • Cleaning all of the dishes is a bit hard, but the good news is that it all gets done in roughly 10-15 minutes!
    All the dishes!
  • We are reducing the amount of dishes we are using to cook and eat! Which means less to clean! (Well, mostly)
  • Our Town came by and recorded our power and water usage at the beginning of our experiment (which was lucky for us). According to our average power/water usage, our utility bill is $140. Hopefully, in 30 days, our power bill will be a fraction of that!
    Our Power Bill at the beginning

That's everything we've learned so far. More reports later, and (hopefully in 30 days) there is a comparison report!


Tags:#japanese #japan #eating #kitchen #experiment

RSS Feed

End of November Catchup


Where to begin, where to begin......

Ok, here's the rundown:

  • I've become a fan of Rules of Engagement. It's actually a pretty good show, and Patrick Warburton is doing well for a sitcom.

  • I participated in my Fraternity's Initiation Night on Friday, and since I can't tell too much, all I can say is that we finally used the FPAC for I-night and it was visually exciting! I wish that the planning was a little better so things went a little smoother than "Okay, it's been 2 hours! What are we supposed to do?" and turning into "We have 2 hours left! RUSH EVERYTHING!"

  • Keat and I were in charge of the Turkey for her parent's Thanksgiving. After all of the criticism, questioning, confronting, questioning, "process correction", questioning, and so on, we did the following:
    - Brined the Turkey for roughly 12 hours
    - stuffed it with an apple, onion, rosemary and other spices
    - baked at 500 for 30 minutes
    - put on a turkey triangle, baked at 350 for 1.5 hours
    - rest for about an hour
    - carved, eat, nap, repeat
    Overall, the Turkey was the best turkey we'd ever had! Now, my parents want us to do it for their Christmas, and Keat's parents have put us on permanent Turkey duty.

  • We are moving our office from the 200 sq ft space to (just under) 900 sq ft! Progress is really going well, and we should be done by Dec 20 (photos are here: flickr.com/photos/shadowdevelopment/sets/72157632013766916/ )

  • We landed a new client: Omega Safety, and a Contest Winner. PR will be released soon

  • Our facebook page reached 100 likes! Yes, through a combination of a Facebook Advertising Beta program (which gave us $100 worth of FB advertising) and some article sharing, we reached 100 likes today! Yay!

  • I created 2 items with jQuery that I thought were really cool: play sound with jQuery and Color blocks with jQuery - most jQuery "Masters" may think that they are super simple, but I thought they are great because I thought about them and created totally from scratch (although the blocks require the jQuery UI plugin)

  • My dad had a weird change-of-careers. Let's just say he doesn't have his job anymore, but has been hired back on with the same company with the same job responsibilities working his own hours at 3x the pay. Yeah, go figure. Apparently, his company got rid of his position, but hired him back on as a Consultant to do his same job. Yeah, that just happened.

  • Found a good solution for our online payment conundrum. WePay is an integrated payment system with an API for automatic charging. Otherwise: a solution to manually monitoring Paypal and manually typing into Square.

  • I started watching the classic Doctor Who episodes (at least, all of the ones available on Netflix Instant) from Hartnell through Baker (translation: First Doctor through Fourth)



I'll stop it there. November was busy, and I'm expecting December to be twice as busy (as always).

Until next update.....

Also, I found out that this blog is just over 2 years old. You can easily see what kind of updates I post on this thing.


Tags:#doctorwho #jquery #november #turkey #keat #dad #pilambdaphi #fpac #japan

RSS Feed

Monday Rollercoaster

Since I seem to droll on with my previous catch-up posts, I promise to keep this one short and sweet:

Today:
  • Came in today, worked with Janet to get her new menu ready
  • Recorded/processed payments/invoices for 3 clients
  • Added rewards to said clients
  • Signed up for Basecamp, explored it a bit
  • responded to emails, including Tom, Kat (+debugging), client (previous system), client (current checkout system), client (invoice followup), Amazon Spoofing
  • Checked my backlogged Reader
  • Ordered mini-squishies
  • Scanned for Health Insurance quotes - couldn't find anything usable under $90/mthCompany insurance survey
  • reconciled accounts (both)
  • split insurance declarations into one document
  • updated SD's G+ page
  • added G+ to Blog and site (for Author Verification program)
  • updated Janet's site with new roll
  • explored IdeaPaint some more
  • worked on the Team Operating Manual a bit

Previous to today:
  • Rewatching the reboot of Doctor Who, got Keat hooked
  • Signed SD up for Pintrest, flickr
  • made some major progress on the SD Portal
  • became Google Engage partner
  • talked with White Fox Studios
  • went to family gathering, had fun
  • started going to N-Scale meetings
  • PiLam volunteer meetings
  • Interviewed two people
  • Southern Atlantian Archery Day (SAAD):, rain, bow broke, stayed a night at Keat's parent's place, got refund for busted bow
  • JapanFest!
  • Sacred Stone Baronial Birthday: fun, shot some, went and stayed the night at friends house b/c it was so humid
  • met with SMDC, we are moving! (videos)
  • SD now insured
  • Got award from Powder Creek Traditional Archery


See? Told you it would be short and sweet.

And here's a short and sweet comic to sum up what Niko has been doing when I'm not in the chair:
Kitty in Chair


Tags:#doctorwho #janet #invoices #basecamp #squishies #insurance #googleplus #ideapaint #pilambdaphi #saad #japanfest #trains

RSS Feed

Happy Post-Valentines Day!

It's been a joyous Valentine's Day 2012. Especially since I've been sick over the past few years on this date. Really. Over the past few years on Feb 14, I have come down with an extremely bad virus that kept me in bed all day. And when I go down, I really go down for the count. The good news: I wasn't sick this year! Yay!

However, I did stay home and work since I had a lot of work to get done (and another reason, but I'll get to that later). Really, it's not a bad thing. I spent most of the day in front of my desktop at home, played Pandora in the background, and worked on some tasks that have been living on my ToDo list for a while.

The other good news is: Keat got me chocolate for today! Here's a snippet:
CHOCOLATE!


Now, you may be thinking: "What did you get for her this year?" Well, the short answer is: nothing. WAIT! Before you start flipping out on me, hear me out. We observe/celebrate "Valentine's Day and White Day". I'm sure the latter sounds like a racist celebration. I assure you it is not.

White Day is actually a holiday in Japan that the younger generation celebrates. Instead of me trying to rant on about what it is, here's a quick overview:

In Japan, Valentine's Day is observed by females who present chocolate gifts (either store-bought or handmade), usually to a male, as an expression of love, courtesy or social obligation. A handmade chocolate is usually preferred by the receiver, because it is a sign that the receiving male is the girl's "only one". On White Day, the converse happens: males who received a honmei-choco (本命チョコ, "chocolate of love") or giri-choco (義理チョコ, "courtesy chocolate") on Valentine's Day are expected to return the favor by giving gifts, usually more expensive. Traditionally, popular White Day gifts are cookies, jewellery, white chocolate, white lingerie and marshmallows. Sometimes the term sanbai gaeshi (三倍返し, literally, "triple the return") is used to describe the generally recited rule that the return gift should be two to three times the cost of the Valentine's gift. [source] [another source]


You may be thinking this is a quick cop-out for me forgetting Valentine's Day. I can guarantee that I didn't forget it, but just didn't have the necessary means to get something yet. However, she is going to get something 2-3x nicer next month (and I'll be 25!).

Anyway, here's the comic for today:
The System

I thought this comic would be relevant to this past week, since I do have a few projects going on that could fall anywhere on this chart.

However, on Sunday, I had a revelation. After thinking over the events from last week (revamping the contract, the preliminary fish bowl launch, Drinks with Geeks planning, getting the new computer up and running, finalizing the new prices, straightening out the accounting records, meeting with AdvantageWest about funding, fixing a co-worker's computer problems, getting a new contract signed, planning some new "ease of use" projects to help new sales people, and more), I realized that everything that we were doing seemed to be working in countless different directions, causing our workforce to become thin and not be able to take on much work. I realized that if things were going to improve, we have to mainstream: make the whole "first contact to project launch" process a whole lot faster, easier, and more flexible.

After thinking about the process we had in place for the past 6 years, it occurred to me that we are basically reinventing the wheel each and every time. Overall, this wasn't getting us anywhere. We need to have a tried-and-true process for going from Step 1 to Step 2 to Step 3 without any hassle. Right now, in order to get one task passed along the production line, a person either has to be trained in that area to take care of it, or it needs to be taken over by someone who can get it done quicker, and some communication between the lines gets lost.

We need a company-level Sales tracker, Project tracker, Site Manager (not just a CMS, but a Company-wide version), Customer notifier, integrated payment system, team calendar, and EVERYTHING else that we have been working on. Instead of working on so many different projects, the solution is simple: make this 1 massive project for the company. This way, Sales people can track leads, Designers/Developers can work on any site, Customers can keep track of their projects, Customer payments can be processed/managed, teams can collaborate on projects and tasks, and more. By integrating the Scrum methodology to this process, we can shrink 3 months down to 1 month or less! Just imagine the work load we can take on!

To be honest, I feel stupid for not seeing this earlier. The solution is so simple. I was trying to create 20 different things to do 20 different tasks. What I should have been doing is developing 1 project to do these 20 things and integrate it into the company so it would be easier to manage.

Why am I confessing all of this here? Two primary reasons: 1) So I have an official record of what I am thinking about so I can look back on it at a later date, and 2) So I can be held accountable for this. Looking back on a few projects that I've worked on, they were started anywhere from a week to 2 years ago, and they all seem to be in the same state: hiatus. To be honest: that sucks. How can I work 5 days a week from 10-5pm and 10-5am and get so little done? This will change.

On a related matter, one reason why it will change is because of the following:
TNG, DS9, and Voyager. Done


Yes, I have finished watching Star Trek: TNG, DS9, and Voyager in their completion. I will admit that I spent a few nights in the past months up till wee hours in the morning watching Star Trek, but now that I've gotten through TNG, DS9, and Voyager, I can dedicate more time to getting stuff done.

I find that I get a lot done with background music. Time seems to work with me when I'm in that "state of mind." However, when I find a series I want to watch (or I'm curious about) on Netflix, that seems to occupy my time instead of getting things done. For example: I didn't think I'd really get into Heroes. I thought "I'll watch the first episode and be done with it." Yeah right. Before I knew it, I watched all 4 seasons and lost valuable programming time during those 16 days it took me to watch it. I have lots of other items on my Netflix instant queue to watch, but I have a ToDo list that is breathing down my neck. I have to get that done.

Enough procrastinating on this blog. I have work to do.


Tags:#thesystem #chocolate #keat #valentinesday #whiteday #startrek #tng #ds9 #voyager #japan #netflix #heroes #accountable #streamline