Friday, December 30, 2016

Random Gift Exchange Java Program

This is something fun that I wrote that I wanted to share. My wife and I celebrated Christmas at her parents' house. Since the family is all moved out and is continually growing, we each buy one gift for another person.

I thought it would be cool to create a quick program that makes random assignations. I wrote it in Java, and made it runnable via Eclipse or the Command Line. If I wanted to elaborate on it more, I would have gotten user input for the names instead hard-coding it in. I would have made it a web app with a nice interface. I also would make it not assign immediate family members. (ie child won't have to get present for adult parent or fellow child sibling)

 Here's my source code, enjoy!

Monday, December 26, 2016

Website Revamp!



I've finished school, and just got a new job, so it was time to revamp my website! I spent a lot on my old design, but it was lacking in some areas, and had too much irrelevant information in others. The central message of my old design was, "I'm almost done with college, I coded a lot of cool projects in school, I have lots of internship experience, hire me!" I tried to minimalize personal details about my life to focus on relevant info that might get me hired.


I love my new job, and I anticipate on staying there for a while (there's so much to learn). So I wanted to make my new design say, "I am a professional, I'm involved in some cool projects, I do fun things outside of work, and you should hire me to be your freelancer/consultant."

Initially I wanted it to be very minimalist, but give it a more personal flair. Maybe a picture of myself, a quick blurb, and a couple of links. But, after rummaging through dozens of designs, there were too many features lacking in all the examples that I saw, many were focused towards web designers. While I enjoy web design, and I have pretty good experience, I'm not an expert, and I don't have any glitzy projects in my repertoire. In the end I decided to just keep the same layout, but modify the content, and move around some things.

I updated which projects that I wanted to promote in my portfolio. I included a Fantom and SkySpark project for the first time in my portfolio. I've become quite good in the past 3+ years in ETC Group in SkySpark related technologies, and I want to continue to specialize in that area.

I also included a comprehensive of my personal sites in my personal section.

Give it a look and let me know what you think!

http://darylbennett.net/

Friday, December 23, 2016

Attempting to barter web design services for guitar repair services

I had a guitar that needed a minor repair, and I wanted to take it to a local Guitar Shop, House of Guitars. They do awesome work and I trust them a lot. They have one of the best ratings in the Salt Lake for repairs. They also have one of the worst websites I've ever seen.

                                                           http://www.guitarzip.com/

The background isn't aligned, there's a "Click here to add text" line on the top right, and it looks something straight out of the 90's.

So I took an hour, and I created a simple mock-up to present to the store owner to see if we could barter my website design for the guitar repair.

                                       http://www.eighthdayslc.com/houseOfGuitarsDemo/

I tried to make it responsive, I added a Google maps widget, which displayed their awesome 4.9 review rating.

I was so nervous asking the store owner, because this was so out of the ordinary, to try to barter web design services for guitar repair. He was very cordial, and respectful. I presented the website on my laptop, and explained why a better website would help his business.

I thought that I good job on the design on my mock-up, and my presentation wasn't bad, but in the end the store owner didn't see the value in modernizing his website, because his business was so successful. He said that he'd invest in his website if business was down, but they were getting an increasing amount of business, and they were having a hard time to meet all the orders.

In the end, it was a good experience.


Wednesday, March 23, 2016

VR Cannon Beta Release



My Senior Project Group, git-mo, has been developing several Augmented Reality and Virtual Reality apps for our Senior Project. I'm pleased to announce that the first app Beta, VR Cannon, is finished and is deployed on the Google Play store. This app was developed to test out Google Cardboard and Virtual Reality. It immerses you into a virtual world, and lets you shoot a cannon. To find out how to play or more information, check out our website.

 To become a Beta Tester and download the app, go to this link: https://play.google.com/apps/testing/com.Gitmo.CannonVR

Blowing up a castle in Cannon Free Range
Main Menu
Forest Target Shoot




Tuesday, March 15, 2016

Outside Interests Can Help Your Computer Science Career

Outside Interests Can Help Your Computer Science Career

This is something that I learned in one of my introduction Computer Science classes, and something that I've especially seen throughout my schooling career. Many classes such as my Senior Project and Android development class allow students to create ideas and implement them. Here's some examples:

1. ARora (Augmented Reality Optical Assistant): This is part of my Senior Project. One of our team members, Taylor, loves reading old classic books. The challenge is that they're written in Old English, and he constantly has to look up words in the dictionary. So we're developing an application that allows you to view the book through your phone's camera, and tap on the word on your phone's screen to bring up the dictionary definition.

Example of ARora

2. ARiT (Augmented Reality Image Translator): Also part of my Senior Project. Matt, loves learning languages. In fact he got a BA degree in Arabic Studies. He remembered how hard it was when learning the language to carry a dictionary everywhere he went, and how hard it was to learn everything that was around him. This app allows a user to point their phone at an object, tap on the phone screen, and the app will tell the user what the object is in their chosen language.

3. Hiking App: One of the ideas for my Senior Project was to create a hiking app that showed trails, and would allow you to navigate without cell reception. We have some avid hikers and lovers of the outdoors in my group.

4. Restaurant Manager: A classmate of mine worked at a restaurant part-time, trying to pay their way through college. They came up with a cool software idea that would help staff know what tables were filled and how close to capacity the restaurant was.

5. Music: I love music. It seems that I'm drawn to project that incorporate music. I've created a Music-Based Authentication System, a Midi Musical Search Engine, and I've written various songs for games I've written for class.

Here's the latest song that I've written for JengaAR:

Monday, March 14, 2016

New Senior Project Direction! AR SUITE


My Senior Project Team has decided to branch out and explore other areas of Augmented Reality and Virtual Reality development. We are going to be releasing our ARSuite beta very soon! This has been exciting but challenging at the same time. While other groups are adding finishing touches to their projects, we are coding as fast as we can to implement our new ideas. I have created a website with the most up-to-date details about our project. (Or projects, depending how you look at it.)

AR SUITE WEBSITE

Friday, March 11, 2016

Don't take advantage of family and friends when doing a gig for them

If you're blessed to be gifted with technical skills, such as web design, photography, music production, then you probably have had friends and family who have asked to use your skills for free, or a highly discounted price. Sometimes the motive is to maintain/strengthen your relationship, gain experience, or to further your repertoire. Often time, there's not as much incentive to do a good job in a timely manner since you're doing it as a favor. Many times for performers in this situation don't take the gig as seriously and will flake out at the last minute. I want to STRONGLY condemn this attitude in this post, and encourage doing your best, or not doing it at all.

Encouraging Story

 My family tradition is to play Starcraft II with my family every year around the holidays. The gaming was delayed a couple days because my dad was asked by a close family friend as to make a wedding video their son's wedding. I was a little bit sad that I had to wait, but ultimately filled with deep respect and admiration for my dad who wanted to do a good job in a timely manner without any monetary reward.

1. When to accept or not to accept a project

Let's be honest. It takes a lot of time to do technical projects. As a software developer, I've been approached a few times to create a website or an app for family and friends. One of my neighbors runs a business, and was excited to hear that I was programmer. She told me about her idea for a really intricate  and complicated app that she was sure would take me a few hours (a big understatement). There were benefits of doing it. I would have gained a lot of practical technical knowledge, and would have had my name on a product of a growing company. I was very busy at the time with school and work and I knew that I wouldn't be able to dedicate the time needed to a good job for her app. So I politely declined.

2. Pass the baton!

Family and friends are like traditional customers; they want a quality end product. Family and friends are more patient and understanding to your situation. They understand that you may be working on their project around your busy schedule. Yet, they deserve that you do it in a timely manner. Nothing is more disrespectful when you put off their project for too long.

Music Mixer flees to Mexico

The bassist in my band knew a guy who gave us good a deal to record a 4 track CD for only $200. He's recorded pretty good stuff in the past. We laid down all the tracks, and while he was in the middle of mixing the tracks, some weird stuff happened to him. We lost contact with him for two weeks. When we got a hold of him, he said that he was in trouble with some debtors, and that he lost his house and he fled to Mexico. This was super random but, he emailed me all of the tracks and projects so that we could continue to work with somebody else. While we weren't completely satisfied with this outcome, we are much more satisfied than had he just up and left us hanging.

YSA Website

This also happened to me when my young single adult church group asked me to create a regional website for them. It was summer, and I had plenty of time to work on it. I put a lot of time into it, but I wasn't able to finish 100% before getting married and leaving the single's church group. I didn't make the interface easily customize able to those with no coding knowledge. I did my best to create robust documentation, videos, and even trained another coder within the church group to continue the work. I didn't want to have wasted all my time on "almost functional" website. It would have been useless to the church group, and I wouldn't be able to use it as part of my repertoire.

3. Do Your Best

Even though you may not be a professional, and the person you're helping might not be paying you, you still should do your best. My wife and I were lucky. Most of the people who participated in our wedding did an outstanding job and really came through for us. I could go on and on about how awesome everybody was, but I'll pick one notable exception: The cake maker. She is a high-quality professional who is in high demand. We approached her with little notice, asking her to make our cake. Even though there was little notice, she gave us the best tasting cake I've ever tasted, and I'm really grateful for that too.


En Fin

Do a good job always. Especially for your friends and family.


EDIT: removed the negative story.

Saturday, February 6, 2016

Using Unity3D's UNET to Make a Multi-Playered Model that Allows Users to Take Turns

Intro
So this is a base model that can be expanded to fit a number of multi-playered games that require the users to take turns, such as board games, Jenga, Battleship, etc... In this tutorial we're going to be making a "game" that allows for an infinite number of players to connect and change the color of a central block when it is their turn. https://youtu.be/c5dOCmh2RMQ

1)     Create a flat plain, color it if you wish.
2)     Create an Empty GameObject and name it NetworkManager
a)     Add the component Network->(Network Manager HUD)
3)     Create an empty GameObject, name it Player. Make it a prefab, delete from the Object hierarchy. Even though the player won’t have a physical body that they will be controlling, this step is necessary for the NetworkManager to manage the players.
a)     Give it a Network->NetworkIdentity Component.
b)     Create and attach the PlayerControllerScript to the Player Object.
using UnityEngine;

using System.Collections;
using UnityEngine.Networking;
using UnityEngine.UI;

public class PlayerController : NetworkBehaviour
{
    [SyncVar]
    public Color cubeColor;
    [SyncVar]
    private GameObject objectID;
    //determines which player's turn it is
    [SyncVar]
    public int turn;
    //determines which player the current player is
    public uint player;
    private NetworkIdentity objNetId;

    Text playerText;
    Text identityText;

    void OnDestroy()
    {
        GameStateManager.removePlayer((int)player);
    }

    void Start()
    {
        //The network manager assigns network identities dynamically,
        //so just use this value as the current player's id
        player =  this.GetComponent<NetworkIdentity>().netId.Value;

        //add player id to network
        GameStateManager.addPlayer((int)player);

        //get the current turn
        turn = GameStateManager.getPlayerTurn();

        //initialize player text, tells who's turn it is
        playerText = GameObject.FindGameObjectWithTag("PlayerTurnText").GetComponent<Text>();
        playerText.text = "It's working";
        //tells you which player you are
        identityText = GameObject.FindGameObjectWithTag("IdentityText").GetComponent<Text>();
        identityText.text = "Player " + turn;
        identityText.color = new Color(Random.value, Random.value, Random.value, Random.value);
    }

    // Update is called once per frame
    void Update()
    {
        if (isLocalPlayer)
        {
            //checks to see if the player clicked
            CheckIfClicked();
            //makes sure that the player turn text is synced
            CmdGetTurn();
            changeTurnText();
        }
    }

    void CheckIfClicked()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //update the variable
            CmdGetTurn();
            //check if it's my turn, if not, exit out
            if (turn != player) return;
            CmdChangeTurn();

            //change the color
            objectID = GameObject.FindGameObjectsWithTag("Tower")[0];
            cubeColor = new Color(Random.value, Random.value, Random.value, Random.value);
            CmdChangeColor(objectID, cubeColor);
        }
    }
 
    //updates state on the server
    [Command]
    void CmdChangeTurn()
    {
        if (turn == player) GameStateManager.nextTurn();
        turn = GameStateManager.getPlayerTurn();
        //syncs this all clients connected on server
        RpcUpdateTurn(turn);
    }

    /*
    * Changes the turn text of the player
    */
    void changeTurnText()
    {
        if (turn == player)
            playerText.text = "Your turn. ";
        else if (turn != player)
            playerText.text = "Opponent's turn. ";
    }

    [ClientRpc]
    void RpcUpdateTurn(int i)
    {
        turn = i;
        changeTurnText();
    }
       

    [Command]
    void CmdGetTurn()
    {
        turn = GameStateManager.getPlayerTurn();   
    }

    [Command]
    void CmdChangeColor(GameObject go, Color c)
    {
        objNetId = go.GetComponent<NetworkIdentity>();
        objNetId.AssignClientAuthority(connectionToClient);
        RpcUpdateTower(go, c);
        objNetId.RemoveClientAuthority(connectionToClient);
    }

    /*
     * Being sent from server to
     */
    [ClientRpc]
    void RpcUpdateTower(GameObject go, Color c)
    {
        go.GetComponent<Renderer>().material.color = c;
    
    }  
}
4)     Create a Cube Object, and name it Tower. Make it a prefab and delete from the hierarchy.
a)     Give it a Network->NetworkTransform. Ensure that the Transform Sync Mod is “Sync Transform”
5)     Create an empty object named TowerSpawnLoc, make it a prefab, delete from hierarchy.
6)     Create an empty object named GameManager
a)     Create and attach TowerSpawnLoc script to it
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System;
using UnityEngine.UI;

public class TowerSpawnLoc : NetworkBehaviour
{
    [SerializeField]
    GameObject towerPrefab;
    [SerializeField]
    GameObject towerSpawn;

    public override void OnStartServer()
    {
        SpawnTower();
    }

    void SpawnTower()
    {
        GameObject go = GameObject.Instantiate(towerPrefab, towerSpawn.transform.position, Quaternion.identity) as GameObject;
        NetworkServer.Spawn(go);
    }
}
i) Add the parameters, Tower Prefab->Tower, Tower Spawn->TowerSpawnLoc
b)     Create and attach the GameStateManager
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Collections.Generic;

public class GameStateManager : NetworkBehaviour
{
    //an enum, Player 1 = 1, Player 2 = 2.
    public static int playerTurn = -1;
    public static ArrayList connectedPlayers = new ArrayList();

    //call this every time a player connects
    public static void addPlayer(int networkId)
    {
        connectedPlayers.Add(networkId);
    }

    //call this every time a player disconnects
    public static void removePlayer(int networkId)
    {
        connectedPlayers.Remove(networkId);
    }

    public static int getPlayerTurn()
    {
        if (playerTurn == -1) playerTurn = (int)connectedPlayers[0];
        return playerTurn;
    }

    /*
     * Increment the player's turn
     */
    public static void nextTurn()
    {
        int currentIndex = connectedPlayers.IndexOf(playerTurn);
        if (currentIndex == connectedPlayers.Count - 1) playerTurn = (int)connectedPlayers[0];
        else playerTurn = (int)connectedPlayers[currentIndex + 1];
    }
}


Wednesday, January 13, 2016

Final Semester!

This week I've begun the final semester at the University of Utah! Part of me is excited to be finished with school, but part of me is sad. I've had some great classes, and I've had interesting electives, but there's other electives I'd like to take that I won't have a chance to, such as Natural Language Processing, Compilers, Advanced Algorithms, Machine Learning, Artificial Intelligence, etc... I've contemplated pursuing my Master's Degree and taking these courses. I know that I'll probably get exposure to these topics in my professional career, and I don't have to be enrolled in the University to learn any particular subject!
While I am infected with the infamous "senior-itis", I chose a particularly difficult final semester. Thus far in my schooling career, I've taken electives that focus on application building. I enjoy developing software. When I started this major, I wanted to know how to make websites, desktop applications, and mobile apps. For the first year and a half, I felt like I didn't know how build anything that would be useful in the real world. I was unsatisfied. Then I started taking electives that bridged the abstract programming skills I learned into creating real world applications. In my Databases class, I created a robust website to manage a bookstore. In my Web Software Architecture course, we learned how to create complex websites from scratch. I designed and implemented my own multi-user Android App, that utilized a REST API that I created myself. It was a great feeling, knowing that I could create applications that could be useful and help people!
Our Undergraduate Adviser discouraged people from taking courses that I just described. He said that all you learned from those courses was how to program, and you can learn how to program at any job. Ironically he's the instructor for the Web Software Architecture course. He emphasized the need to take classes that were more low-level, and more involved with math. He said that that was the difference between a mere programmer, and a computer scientist. I don't agree 100% but, now that I feel comfortable in the different facets of software development, the more inclined I find myself towards wanting to learn more about the low-level layers, and math based stuff.
I've chosen to take Data-Mining and Computer Vision to finish up my schooling career. They're both heavily involved with Linear Algebra, Discrete Math, Probability, Statistics and 3D Calculus. It's going to be a challenge, but I want to step outside my comfort zone and learn more about these topics. I feel like data-mining is essential in the world of big data. I don't see the amount of generated data decreasing any time soon. Also image recognition is going to be very important as the world immerses itself deeper and deeper into a digital era.

Go Utes!