Cocoa: Making Properties KVO Compliant

In Cocoa KVO or Key-Value-Observing compliant means that the value of a certain object sends notifications out when its value has been changed to an observer. An example would be values stored in a NSMutableDictionary or NSMutableArray. Since they are KVO compliant, you can bind something to a value in one of these objects, and will be updated automatically, no glue code required. Although not all objects have their values KVO compliant and this can cause problems for example when trying to bind to them in Interface Builder. A good example can be seen with NSDocument’s documentName. Notice you can bind an object’s value to documentName, but if the documentName changes, this value does not update. The way to fix this, is to subclass NSDocument and send out notifications whenever documentName is changed. A class-dump of NSDocument reveals the -(BOOL)_setDocumentName:(NSString*)name method. All you have to do is add this method to your NSDocument subclass

-(void)_setDisplayName:(NSString*)name
{
	//Hack Display Name to make KVO Compliant
	[self willChangeValueForKey:@"displayName"];
	[(YourClassNameHere*)super _setDisplayName:name];
	[self didChangeValueForKey:@"displayName"];
}

And that should be it. Note: I changed the method’s return type to void because otherwise it will create an error in the console about KVO compliant methods not being able to return anything other then void.

Also note that this is for read-only binding, to do a binding where you can change the value you have to implement and expose a new binding programmatically.

Apple’s Documentation on KVO

Fixing Old Printer Drivers to Work in Snow Leopard

The upgrade to snow leopard may be leaving some of you with not working printers. When I upgraded I could no longer print to my Xerox Workcentre Pro 238. The thing it seems is that snow leopard deletes all of your old PPDs and printer drivers. I had to download and install the driver again. Then alas, after doing so, the printer failed to function, it gave me the error message “The printer software was installed incorrectly. Please reinstall the printer’s software or contact the manufacturer for assistance.”

After researching the error, I came to the conclusion that it has to do with snow leopard upgrading CUPS. The newest version of CUPS, I read, requires that all the drivers’ files be owned by root. After investigating I found that Xerox’s PPD’s and plugins were NOT owned by root and thus causing the problem. To remedy this problem just type this command into the terminal:

sudo chown -R root:admin /Library/Printers

(The command might take a while to run.) This owns the /Library/Printers folder and everything in it to root, this could potentially fix many different printer software to work with snow leopard since it can effect pretty much any printer driver. So if you’re having problems try giving this a shot. Good luck.

Snow Leopard and Close to Instant Gmail Contact Sync

I’m sure many of you are aware that Apple has just released their newest OS X update called Snow Leopard, I was lucky enough to get my hands on a copy already. One very interesting feature of this update is the support for syncing your contacts in Address Book.app with Gmail’s contacts. Through Gmail, you can already sync your contacts to your iPhone thanks to Google Sync’s MS Exchange servers. With the these two services combined you can have your contacts on your phone synced to your computer and vice-versa fairly instantly without MobileMe. The problem I was having was that this service didn’t do quite instant enough for my taste, here’s how you enable the sync, and how you can tweak it to make it even closer to instant.

First enable Gmail Contacts sync in Address Book by clicking Address Book > Preferences… > Accounts. Then click “On My Mac”, and then check the box next to synchronize with Google. Enabling Google Sync in Address Book in Snow Leopard After enabling it you will be prompted for your Gmail username and password. Then you should see a sync icon in your status bar. This lets you manually force a sync with google by clicking “sync now.” When it syncs you will probably have to resolve some ’sync issues’ (basically deciding which contact is correct, the Gmail or Address Book version.)
Snow Leopard Sync Menu
If this icon annoys you, just hold down the apple key and drag it out of the bar to remove it, to put it back you can enable it in iSync.app’s preferences.

Now to tweak it. Your computer syncs your contacts in a job in that runs through a process called launchd (For those of you that don’t know, in Tiger and newer, launchd takes the job of cron on normal unix systems.) By default this process runs only once every hour, we are going to try and tweak this. To easily edit your loaded jobs, download Lingon from here http://sourceforge.net/projects/lingon/files/. Open up Lingon, on the left under ‘My Agents’ you should see ‘com.google.GoogleContactSyncAgent.’ Click this, and you here you are able to change it from running every hour to as little time as every second (although I don’t recommend this AT ALL.) Just adjust this setting to a shorter time period to speed it up. The real trick here though is that you can set something called a watch file/directory. This lets the process run when that file/directory has been modified. To make the sync run whenever you change one of your contacts you should just fill in under “Run when this file is modified” this file /Users/remi/Library/Application Support/AddressBook/AddressBook-v22.abcddb This file is your address book database, so hence it runs when you update the database. Lingon Editing Snow Leopard Google Sync Agent Remember that this makes your contacts instantly updated from your computer to google, but no the other way around. The frequency that the contacts come into your computer from google is determined by the “run it every” setting. I do not know why apple did not have the file set to watch the address book database to begin with, so I’m not sure if there are any adverse effects, but there has been none that I have experienced so far. Once you are finished editing the job, hit save, then log out and back in or restart for it to take effect. To try it out just edit one of your contacts in Address Book.app and see the update automatically appear on Gmail, and if you iPhone is synced to Gmail, then right to your iPhone.

Please post a comment if you have problems with this method, good luck everyone!

XHTML Compliancy

Just recently, I’ve gotten into making pages XHTML 1.0 Transitional compliant. What this means is that the coding of the webpage is fit to a more strict standard then just plain HTML. Practically speaking this means that the webpage fits into the web standards and will close guarantee that your webpage will display correctly on current and future web-standard compliant browsers. There are three types of XHTML, Transitional, Strict, and Frameset. Transitional is most widely used form of XHTML, and Strict is a version that is even more, well, strict. Making pages XHTML 1.0 Strict compliant can be difficult, but making it Transitional compliant isn’t hard at all. It is mainly a matter of cleaning up your existing HTML. I will cover how to make your webpage XHTML 1.0 Transitional compliant, as I have done with my site. But, don’t take my word, try clicking the button on the right that says “W3C XHTML 1.0″ and it will go to W3C’s (the organization that makes the web standard) xhtml/html validator. This is an extremely helpful tool, because it highlights the errors in your webpage that make it not xhtml compliant.

The first thing you must do is specify a doctype, here it is for transitional

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Next comes the hmtl tag, but what you have to do in it is define the XML name space and the language as english

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en:gb">

Now add the head tag, specify the page encoding, and add a title which is required in valid XHTML

<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello World!</title>

For the most part all of your XHTML Transitional pages should start that way. The next thing to do is just to take care of some pretty simple formatting rules. First off, all of your tags must be in lowercase, and this goes for your tag’s properties too, for example onClick is bad, it has to be onclick, and <P> has to be <p>. Next all your tags have to be closed, if you’re use to using single <p>  tags, you’ll have to do them in the self-closing style: <p />.  Script and style tags must contain a type, so like the following,

<script type="text/javascript"></script>, <style type="text/css"></style>

Also JavaScript not in an external file has to be escaped properly from the XHTML interpreter like follows:

<script type="javascript">
//<![CDATA[
alert("Hello");
//]]>
</script>

Image tags also, have to be closed but also they have to include the alt attribute, even if its just blank.

<img src="http://kunugiken.com/DRF/refresh.png" alt="" />

Another interesting thing to note is that when you declare your page as XHTML, is can break some of your CSS if it is not done correctly, one example would be the left property, for example the following will work in most browsers, but will not work on XHTML pages

position: absolute;
left: 40;

In actuality the left, top, right or bottom properties take a numerical value with a unit of measurement, so it has to be the following

position: absolute;
left: 40px;

Remember that this is also true if you’re setting the CSS from inside JavaScript.

I hope that you found this helpful, these are just some of the things that caught me up while converting my site to XHTML. Although it wasn’t so hard to make my blog part of the site proper XHTML because wordpress does a nice job of making XHTML compliant code anyway. (Although I had to mess with some of the plugins to get them to do it right). Check out W3School’s page on XHTML, and try taking their quiz! I hope you found XHTML at least interesting, and will consider converting your pages. Good Luck Everyone.

Sending Growl Notifications from Ubuntu

If you’re like me then you love being up to date on things happening on your network.  So when things were happening on my Ubuntu server I wanted to be alerted in some way.  I tried to use email but that was just impractical.  Then I came up with the idea to use growl.  If you don’t know, Growl is a messaging system for OS X that many applications use to notify the user with pleasant on screen notifications.  I remembered that growl would accept on notifications received over the network so I went out to the internet to find a way to send these notifications from Ubuntu.  I found a wonderful utility for doing it using python, which is a scripting language that comes pre-installed on Ubuntu. The name is pygNotify.  This would have been all fine and well and I would have had handy growl alerts form my server, but as it turned out there was very little documentation out there as to how to get this setup, and the included instructions are overly-simplified.  Therefore, I am writing this.

On the Ubuntu computer open the terminal, found in Applications > Accessories > Terminal.  First we’re going to create a folder to keep this growl stuff in.

mkdir ~/growl
cd ~/growl

of course you don’t have to keep it in your home directory
Next, lets download pygNotify

wget http://pygnotify.googlecode.com/files/pygNotify-0.1.tgz
tar xvfz pygNotify-0.1.tgz
mv pygNotify-0.1/pygNotify.py .
rm -r pygNotify-0.1

The next thing you need is get the python libraries from the growl SDK, that you can download from their website here http://growl.info/source.php Unfortunately the SDK is in a dmg so you’ll have to use a mac to extract it then copy it to the Ubuntu machine. You’ll need the folder Bindings/Python and also the script Bindings/Network/netgrowl.py. I will write the rest assuming you copied them into a folder called dmg in your home directory. Now we need to install the libraries. Cd into the directory you copied over from the dmg.

cd ~/dmg/Python
sudo python setup.py install

Now you need to move the netgrowl.py also from the dmg to the growl folder we created earlier

mv ~/dmg/netgrowl.py ~/growl

Then we should be done with the stuff from the dmg so we can clean up

rm -r ~/dmg

It should be all installed at this point. Now we need to enable receiving network notifications on the mac computers you want to receive the notifications from your ubuntu machine.

If you haven’t already, download and install growl from its website http://growl.info/ Once installed, go to System Preferences in the apple menu and click on Growl. Then click the network tab, then check “Listen for incoming notifications” and also check “Allow remote application registration” and set a password. Even if you don’t want a password, as far as I can tell you have to set one for it to work. Next you’ll need your computer’s ip address. Open Terminal.app found in /Applications/Utilities and type

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2

The output should be your ip, write it down because we’ll use it in this next step.  Repeat for each mac.  Now back on your ubuntu machine we need to register your server as an application that can send notifications on your mac.

cd ~/growl
python pygNotify.py -n "Ubuntu Server" -p "password" -H your.macs.ip.address -r -m "register"

Please note that the second command is one line.  Replace password with the password you set earlier, and replace the part after -H with your mac ip address.  You’ll have to do this for every mac you setup to receive network notifications.

Note that the option after -n is the title of the application as it will appear to growl, and you can register multiple times with your mac if you use different names. By using different names for different sets of notifications it becomes possible to set customized settings for both on your mac. ie you could register “System Monitor” and maybe “Email Server” and have them have different message styles on the mac

Once the command runs, it should be registered on the mac and show up in the application list. A keychain confirmation may come up on the mac asking you if you want growlHelper to access the keychain. You should hit always allow, so this notification doesn’t come up every time.

Note: If when you run the command you get a “IndentationError: expected an indented block” when you try to run the script, my best guess is that its due to the formatting being messed up when you copied it to the server. If you find yourself unable to fix this just copy and paste the file from here: http://the.taoofmac.com/space/Projects/netgrowl and finally that worked for me.

Now to send a message

python pygNotify.py -n "Ubuntu Server" -t "test message" -p "password" -H your.macs.ip.address -m "hello world"

Again note that the command is one line.  The part after the -t option is the title of the alert, and the part after -m is the message. Also note if you want the alert to be sticky, meaning it stays on the screen, you can use the -s option.

And that’s, it hopefully. If you have problems with it registering or sending messages, be sure to check your firewall settings, to make sure growlHelper.app can access the internet, or that udp port 9887 is open I believe. Also you can try deleting the password set by growl in the keychain, and resetting it in the System Preferences Growl pane again. This can reset growl’s privileges to access the keychain, which may or may not be set to deny it access. The whole setup can be a finicky system at times, so good luck!

Ever Heard of Pizzicato Five?

Ever heard of this Japanese group?  I stumbled upon this video of theirs, and found it to be awesome.  To me the video looks like its sporting some 60’s theme, at least some time before 1996, when it was made.  Overall, the video surprised me because it was simple but yet different.  The Pizzicato Five have been in surprising amount of things, all the way from Austin Powers to a Microsoft presentation at E3!.  Be sure to check out their wikipedia page. Here’s the video, enjoy!

YouTube Preview Image

Yodobashi Kamera

Hello everyone, sorry that there haven’t been any posts lately.  I have to just say what everybody says, I was busy. Well, I have a quick one with another youtube video!  I just love this song.  Apparently it is a song from a classic Japanese commercial for the Yodobashi Kamera, (Yodobashi Camera) store.  Somebody I knew was telling about the song, and I was able to dig it up on youtube, so here it is. Enjoy.

YouTube Preview Image

My Top 5 Most Awesome Free Apps for OS X!

As you might have guessed I quite love macintoshes, and thus I feel compelled to tell the world about some of my favorite free software for OS X!

# 5  Cyberduck

A truly great ftp client, with excellent features like bonjour, growl, and quick look support.  As far as I’m concerned, this is the only FTP client you will ever need for OS X.  It has mostly all the good features of programs like transmit.  With great reliability and nice interface, it is a download you can’t miss.  The only complaint I have is that webDAV support isn’t great.  Visit Site

#4 The Unarchiver

This is an amazing program that brings support to OS X for extracting an amazing amount of archives, even archives made on machines from other countries.  The icing on the cake is that it has almost no presence and blends with the OS X gui perfectly, practically replacing the default unarchiving program in OS X.  This program is a must download and is definitely worthy of the “the” at the beginning of its name.  Forget Stuffit, this is the only unarchiving program you’ll need. Visit Site

VLC#3 VLC

A must for any operating system.  VLC can play virtually any video or  music file right out of the box! (or disk image rather).  But the amazing video bliss doesn’t stop there, it can even re-encode the video and save it back to disk.  It can even capture video from your camera or your screen.  This is an amazing application that follows the mac ideals of “just working.” Visit Site

#2 Adium

This instant messenger is a great choice for any multi-protocol user on OS X.  It supports an amazing amount of protocols including MSN, AIM, Google Talk, Bonjour, and the new Facebook chat protocol.  If that wasn’t enough, it has growl support, custom themes, scripting support, and tons of plugins and extras.  The only downside is that it does not have video or audio support, but it is supposedly going to take advantage of leopard’s new video features for the 2.0 release. Visit Site

#1 Smultron

I use this application all the time.  It is close to an equivalent to textmate, but with not quite the same features.  In my opinion, smultron gives a better range of features and has a great reliability, and impressive usability.  I use this for writing HTML, Javascript, PHP, and any other scripting languages.  It can open any file as plain text, which is something you may take for granite if you are new to OS X.  This gets my number one spot basically because of the essentialness of this program to my OS X experience, and because it never fails to surprise me with helpful features. Visit Site

Allegro game programming library: how to install on Ubuntu, OS X and Windows

When it comes to simple 2D game programming Allegro is great. It may be a little tricky to get allegro to install on some systems, but I will cover how to do it on three: Ubuntu, OS X and Windows.

We’ll be starting with the easiest, Ubuntu
Open up the terminal (Applications > Accessories > Terminal) and type if you have not already
sudo apt-get install build-essential
Then we’ll install Allegro:
sudo apt-get install liballegro4.2-dev
Thats it, allegro is installed and gcc is ready to compile allegro source.
To compile and run file by name inputfile.c in gcc type:
gcc inputfile.c -o output `allegro-config --libs`
./output

On OS X it is a little tricker, and I highly recommend installing X-Code to compile the code with, there is a way to install gcc without X-Code, but I don’t recommend it, and I won’t cover it here.
download X-Code here (You have to become an ADC member to download, it’s free). You can also install X-Code (developer tools) from your OS X installation disk.

download the allegro source for Unix on their website here
its a tar.gz so, double click it and it should be expanded into a folder.
Now open the terminal (/Applications/Utilities/Terminal) and type “cd ” then drag the allegro folder to the window and hit enter, now type the following:

chmod +x fix.sh
./fix.sh macosx
make
sudo make install
sudo make install-man
sudo make install-framework
sudo make install-framework EMBED=1
sudo make install-template

If you are using X-Code 3.0 or higher then type the following to make the template work:

mv /Library/Application\ Support/Apple/Developer\ Tools/Project\ Templates/Application/Allegro\ Application /Developer/Library/Xcode/Project\ Templates/Application

There, you’re done, now all you need to do is open X-Code and then click File > New Project then under application choose allegro application.

For windows, you can install Allegro to work with Visual C++ or other Microsoft IDE’s if you use them for development, but if you don’t have any of those don’t fret, just download and install Bloodshed’s Dev-Cpp here
Then to install allegro, download the allegro devpak here and then just double click it.
Once it installs you should be set, now just open Dev-Cpp and make a new allegro project.

Here is some code you can try and compile, it’s a version of pong I wrote for allegro, it’s still buggy so beware!

/*
 *  Pong
 *
 *  Created by Remi Bernotavicius on 12/4/08.
 *  Copyright (c) 2008 __MyCompanyName__. All rights reserved.
 */
 
#include <allegro.h>
#include <math.h>
 
#define paddle_width 10
#define paddle_height 50
#define screen_width 640
#define screen_height 400
#define ball_speed 70
#define ball_size 6
#define paddle_speed 15
#define dashed_frequency 20.00
 
#define UP 0
#define CENTER 1
#define DOWN 2
 
//left side
int yl = ((screen_height / 2) - (paddle_height/2))*paddle_speed;
int points_l = 0;
int direction_l = CENTER;
 
//right side
int yr = ((screen_height / 2) - (paddle_height/2))*paddle_speed;
int points_r = 0;
int direction_r = CENTER;
 
//ball
int bx = (screen_width / 2)*ball_speed;
int by = (screen_height / 2)*ball_speed;
int angle = 30;
int i_speed = 5;
 
int rest_counter = 0;
 
void gatherInput()
{
  if(key[KEY_DOWN] && yr < (screen_height - paddle_height)*paddle_speed)
  {
    yr++;
    direction_r = DOWN;
  }
  else if(key[KEY_UP] && yr > 0)
  {
    yr--;
    direction_r = UP;
  }
  else
  {
    direction_r = CENTER;
  }
 
  if(key[KEY_Z] && yl < (screen_height - paddle_height)*paddle_speed)
  {
    yl++;
    direction_l = DOWN;
  }
  else if(key[KEY_A] && yl > 0)
  {
    yl--;
    direction_l = UP;
  }
  else
  {
    direction_l = CENTER;
  }
}
 
 
int main(int argc, const char *argv[])
{
  allegro_init();
  install_keyboard();
 
  if (set_gfx_mode(GFX_AUTODETECT, screen_width, screen_height, 0, 0)) {
    allegro_message("Error setting 320x200x8 gfx mode:\n%s\n", allegro_error);
    return -1;
  }
 
  //Title Screen
  textprintf_centre_ex(screen, font, screen_width/2, 100, makecol(255, 255, 255), -1, 
    "Pong!");
  textprintf_centre_ex(screen, font, screen_width/2, 120, makecol(255, 255, 255), -1, 
    "By Remi Bernotavicius");
  textprintf_centre_ex(screen, font, screen_width/2, 140, makecol(255, 255, 255), -1, 
    "Press Space Bar to Start");
 
 
  while(!key[KEY_SPACE])
  {
    if(key[KEY_ESC])
      return 0;
  }
 
  BITMAP* buffer = create_bitmap(screen_width, screen_height);
 
  while(!key[KEY_ESC])
  {
    gatherInput();
    clear_to_color(buffer, 0);
 
    //score
    textprintf_centre_ex(buffer, font, screen_width/4, 10, makecol(255, 255, 255), -1, "%d",
      points_l);
    textprintf_centre_ex(buffer, font, screen_width*(3.00/4.00), 10, makecol(255, 255, 255), -1,
      "%d", points_r);
 
    //dashed line
    float f;
    for(f = 1.00;f < dashed_frequency;f +=2.00)
      line(buffer, screen_width/2, -10 + screen_height - (screen_height*(f/dashed_frequency)) +
        (screen_height*(1.00/dashed_frequency)), screen_width/2, -10 + screen_height -
        (screen_height*(f/dashed_frequency)), makecol(255, 255, 255));
 
    //left paddle
    rectfill(buffer, 10, yl/paddle_speed, 10+paddle_width, (yl/paddle_speed)+paddle_height,
      makecol(255, 255, 255));
    //right paddle
    rectfill(buffer, screen_width - 10 - paddle_width, yr/paddle_speed, screen_width - 10,
      (yr/paddle_speed)+paddle_height, makecol(255, 255, 255));
 
    while(angle > 360)
      angle -= 360;
    while(angle < -360)
      angle += 360;
 
 
    if(rest_counter == 0)
    {
    bx+=cos(angle*M_PI/180)*i_speed;
    by+=sin(angle*M_PI/180)*i_speed;
    }
    else
    {
      rest_counter--;
    }
 
    circlefill(buffer, bx/ball_speed, by/ball_speed, ball_size, 
      makecol(250, 250, 250));
 
    //collision detection
    if((by/ball_speed) > screen_height - ball_size)
    {
      angle *= -1;
      by = (screen_height - ball_size)*ball_speed;
    }
    else if((by/ball_speed) < ball_size)
    {
      angle *= -1;
      by = ball_size * ball_speed;
    }
 
    if((bx/ball_speed) > (screen_width - 10 - paddle_width - ball_size))
    {
      if((by / ball_speed) > ((yr/paddle_speed) - ball_size) && (by / ball_speed) <
        (((yr/paddle_speed) + paddle_height) + ball_size))
      {
        //If the ball hit the right paddle
 
        angle *= -1;
        angle += 180;
        if(direction_r == UP)
        {
          angle += 30*sin(angle*M_PI/180);
          i_speed -= 2*sin(angle*M_PI/180);
        }
        else if(direction_r == DOWN)
        {
          angle -= 30*sin(angle*M_PI/180);
          i_speed += 2*sin(angle*M_PI/180);
        }
        bx = (screen_width - 10 - paddle_width - ball_size)*ball_speed;
      }
      else
      {
        //If the ball went off the screen on the right
 
        points_l++;
        bx = (screen_width/2)*ball_speed;
        by = (screen_height/2)*ball_speed;
        angle = 30;
        i_speed = 5;
        rest_counter = 3000;
      }
    }
    else if((bx/ball_speed) < 10 + paddle_width + ball_size)
    {
      if((by / ball_speed) > ((yl/paddle_speed) - ball_size) && (by / ball_speed) <
        (((yl/paddle_speed) + paddle_height) + ball_size))
      {
        //If the ball hit the left paddle
 
        angle *= -1;
        angle += 180;
 
        if(direction_l == UP)
        {
          angle -= 30*sin(angle*M_PI/180);
          i_speed -= 2*sin(angle*M_PI/180);
        }
        else if(direction_l == DOWN)
        {
          angle += 30*sin(angle*M_PI/180);
          i_speed += 2*sin(angle*M_PI/180);
        }
 
        bx = (10 + paddle_width + ball_size)*ball_speed;
      }
      else
      {
        //If the ball went off the screen on the left
 
        points_r++;
        bx = (screen_width/2)*ball_speed;
        by = (screen_height/2)*ball_speed;
        angle = 150;
        i_speed = 5;
        rest_counter = 3000;
      }
    }
 
    blit(buffer, screen, 0, 0, 0, 0, screen_width, screen_height);
 
  }
 
 
  return 0;
}
END_OF_MAIN();

Download

Pink Lady and Sugar Babe

Just recently I got Tsuji Ayano’s newest album “Cover Girl 2.” With this album, as with “Cover Girl” (its predecessor), Tsuji re-does hit Japanese songs bringing her own spin to each of them. On this album she re-does a song called “Nagisa no Sinbad” which is a song by a 1970’s group called “Pink Lady.” The song is great, and the video is really fun. The song sold over a million copies, and stayed at number one for eight weeks. Tsuji did another song from the 70’s, it’s called DOWNTOWN done by a group called “Sugar Babe.” Another great song. I really was missing out on some great music from the 1970’s in Japan. So catchy. Enjoy!

note: Tuji Ayano’s first name is Ayano, in Japanese the first name comes last.

Nagisa no Sinbad by Pink Lady
YouTube Preview Image

DOWNTOWN by Sugar Babe
YouTube Preview Image