How to Include or Escape a Question Mark in an HTTP GET Request Query Parameter

Trying to figure out how to include a question mark in your HTTP GET request query strings? Simply swap out the ‘?’ for ‘%3F’. For example, if you wanted to search DuckDuckGo for the following question:

“who won the superbowl?”

You could use use a URL that looks something like:

https://duckduckgo.com/?q=who+won+the+superbowl%3F

Notice, the spaces become ‘+’ symbols and the question mark becomes ‘%3F’. Hope you found this blog post helpful, and happy hacking my friend!

 

Happening Now… Privacy Policy

Privacy Policy

Your privacy is important to me. It is  my (Christopher Pedersen) policy to respect your privacy regarding any information I may collect from you on my app, “Happening Now…”.

I only ask for personal information when we truly need it to provide a service to you. I collect it by fair and lawful means, with your knowledge and consent. I also let you know why I am collecting it and how it will be used.

I only retain collected information for as long as necessary to provide you with your requested service. What data I store, I will protect within commercially acceptable means to prevent loss and theft, as well as unauthorized access, disclosure, copying, use or modification.
I don’t share any personally identifying information publicly or with third-parties, except when required to by law.

My app may link to external sites that I do not operate. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies.

You are free to refuse our request for your personal information, with the understanding that I may be unable to provide you with some of your desired services.

Your continued use of my website will be regarded as acceptance of our practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me (chris@topherpedersen.com).

This policy is effective as of 01 February 2020.

 

LaunchScreen.xib images not showing? TLDR; Reboot Your Device

Having trouble getting your images to show up in the launch screen of your iPhone app? The answer to this problem is pretty ridiculous: reboot your device! I was riding the struggle bus for awhile trying to uncover the answer to this doozy before stumbling upon Flexicoder’s answer on Stack Overflow.

The first thing I tried doing was to run the app on the simulator instead of on my physical iPhone, and sure enough my launch screen image showed up right away. Then after rebooting my iPhone, I was able to get the launch screen image to start displaying on my physical device as well. So cheers to Flexicoder and his solution which have been upvoted 270 times:

 

How to Restore a GitHub Repository Back to a Particular Commit

Confession: I hate Git. Heresy, I know. But true nonetheless. And I suppose that’s what brings you here. You made a mistake. You pushed several commits to the MASTER branch of your GitHub repository, but have now have had a change of heart. You’ve decided that you’d like to go back to the good ol days, a few commits ago actually. That’s what you want, but Git doesn’t care.

Awful isn’t it!?!? All you want to do is something fairly straight forward, reset your project back to a previous point in time, and Git does not want to allow you to do this. Checkout a previous commit? No problem! Push this commit to MASTER? Absolutely not!

Well luckily, I found an excellent tutorial on YouTube tonight on how to do this. It isn’t super simple. It probably isn’t the way the professionals do it. It probably doesn’t follow “best practices.” However, it works:

// From "merge -s ours" on YouTube by Colten Jackson
// https://www.youtube.com/watch?v=HkTlVCMo6_k
$ git checkout 1234321
$ git merge -s ours master
#### that merge will leave you in detached head, use "git log" to get latest commit hash, shown here as 9876789 #####
$ git checkout master
$ git merge 9876789
$ git push origin master
 

Working with APIs and Parsing JSON Data in Golang: A Quickstart Reference Powered by RapidAPI and Hacker News

Welcome back internet friend,

At the moment I’m currently doing a little hacking in Golang, and just wanted to post this quick little example of how to work with an api and parse json data in Go. Unlike some of the other languages I’ve worked with, in Golang you will need to create a struct to represent the JSON data you are receiving from the API endpoint you are hitting. That’s the trickiest part in my opinion. Also, the JSON data you will be working with is going to be an array of bytes, not a string. Last, you’ll use json.Unmarshal to parse your JSON and extract the information you are looking for.

Unfortunately, I don’t have time to write up a detailed post about how all of this works. However, I think the code snippet below is pretty cool and should provide a good reference if you happen to be playing around with APIs and JSON using Go. Note, the code below is using RapidAPI’s Hacker News endpoint to provide the JSON data. So if you’d like to try running this code yourself, make sure to visit rapidapi.com, register for an account, and replace the API key below with your own. Enjoy!

// REFERENCE (Parsing JSON in Golang): https://www.sohamkamani.com/blog/2017/10/18/parsing-json-in-golang/
// REFERENCE (Cast Int as String in Golang): https://yourbasic.org/golang/convert-int-to-string/
package main
import (
"fmt"
"net/http"
"io/ioutil"
"encoding/json"
"strconv"
)
type TopStories struct {
Story []int
}
type Story struct {
By string
Descendants int
Id int
Kids []int
Score int
Title string
Type string
URL string
}
func main() {
// ---------------------------------------------------------------------
// Hit the top stories endpoint for the Hacker News API
// via RapidAPI to get the story ids for the top stories
// today trending on Hacker News
// ---------------------------------------------------------------------
url := "https://community-hacker-news-v1.p.rapidapi.com/topstories.json?print=pretty"
// Create Request
request, _ := http.NewRequest("GET", url, nil)
request.Header.Add("x-rapidapi-host", "community-hacker-news-v1.p.rapidapi.com")
request.Header.Add("x-rapidapi-key", "YouR-SuPER-SWeeT-RaPiDaPi-KeY-GoeS-HeRe")
// Get Result, Result Body, and Result Body String
result, _ := http.DefaultClient.Do(request)
defer result.Body.Close()
resultBody, _ := ioutil.ReadAll(result.Body)
resultBodyStr := string(resultBody)
// Create an array to store our topStories,
// then append the story ids to our array
// using json.Unmarshall
var topStories []int
json.Unmarshal([]byte(resultBodyStr), &topStories)
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Next, Let's fetch some information about the top trending story on
// Hacker News. TODO: Fetch data for ALL the trending stories on HN
// ---------------------------------------------------------------------
var topStoryID string = strconv.Itoa(topStories[0])
url = "https://community-hacker-news-v1.p.rapidapi.com/item/" + topStoryID + ".json?print=pretty"
request, _ = http.NewRequest("GET", url, nil)
request.Header.Add("x-rapidapi-host", "community-hacker-news-v1.p.rapidapi.com")
request.Header.Add("x-rapidapi-key", "YouR-SuPER-SWeeT-RaPiDaPi-KeY-GoeS-HeRe")
result, _ = http.DefaultClient.Do(request)
defer result.Body.Close()
resultBody, _ = ioutil.ReadAll(result.Body)
resultBodyStr = string(resultBody)
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Now, let's parse the top story...
// ---------------------------------------------------------------------
var topStory Story
json.Unmarshal([]byte(resultBodyStr), &topStory)
fmt.Println("Top Story...")
fmt.Printf("Title: %s\n", topStory.Title)
fmt.Printf("URL: %s\n", topStory.URL)
// ---------------------------------------------------------------------
}
view raw hackernews.go hosted with ❤ by GitHub

UPDATE (1/27/2020): Remember to use a JSON to Golang Struct Conversion Tool such as JSON-to-Go to easily map Golang Structs to the JSON objects you want to decode. The code snippet below provides a good example of a struct created with JSON-to-Go:

package main
import (
"fmt"
"net/http"
"io/ioutil"
"encoding/json"
)
// Convert JSON to Go Struct
// https://mholt.github.io/json-to-go/
type SoccerMatch struct {
Title string `json:"title"`
Embed string `json:"embed"`
URL string `json:"url"`
Thumbnail string `json:"thumbnail"`
Date string `json:"date"`
Side1 struct {
Name string `json:"name"`
URL string `json:"url"`
} `json:"side1"`
Side2 struct {
Name string `json:"name"`
URL string `json:"url"`
} `json:"side2"`
Competition struct {
Name string `json:"name"`
ID int `json:"id"`
URL string `json:"url"`
} `json:"competition"`
Videos []struct {
Title string `json:"title"`
Embed string `json:"embed"`
} `json:"videos"`
}
func main() {
url := "https://free-football-soccer-videos1.p.rapidapi.com/v1/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-rapidapi-host", "free-football-soccer-videos1.p.rapidapi.com")
req.Header.Add("x-rapidapi-key", "YouR-SuPeR-SWeeT-aPi-KeY-GoeS-HeRe")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
bodyStr := string(body)
var matches []SoccerMatch
json.Unmarshal([]byte(bodyStr), &matches)
for i := 0; i < len(matches); i++ {
fmt.Println(matches[i].Title)
}
}
view raw ApiExample.go hosted with ❤ by GitHub
 

Working with WebSockets in React Native // TLDR: Avoid Socket.IO

Welcome back dear internet friend!

Having trouble getting started with WebSockets in React Native? I’ve got the answer you’re looking for! After many hours of messing around with WebSockets in React Native for the first time today I’ve made some discoveries that hopefully will be of use to someone else out there on the internet.

First, avoid Socket.IO. When attempting to tackle this problem I naturally started with Socket.IO as I’ve used it before in the past, it’s sort of the #1 name in WebSocket programming, so it would make sense as a good starting point. However, I had a little trouble getting it to work. Now in all fairness to Socket.IO, their WebSocket library may not have been the problem in my setup. But along my winding path today I discovered that Socket.IO doesn’t work “out of the box” in React Native, and while it does work, it actually falls back upon HTTP Long Polling if you simply install it in your project with modification. Furthermore, the official React Native documentation specifically mentions the built-in WebSocket API that comes with JavaScript, so I would recommend using that.

The next stumbling block you might run into is setting up your own WebSocket server. For me, this ended up being a lot trickier than simply setting up a WebSocket server for a web app. I have setup WebSocket servers for both NodeJS and Flask web apps fairly easily, but doing the same with React Native gave me a lot of problems. So what I found extremely helpful was to use a test endpoint from a 3rd party that simply echos back any WebSocket messages sent from my app.

After a days work fumbling around, riding the struggle bus, I present a super simple quick start template for getting up and running with WebSockets in React Native. The endpoint URL in the code points to the 3rd party WebSocket test endpoint described above, so the solution below should work as is with no modification necessary. Just create a new React Native app, delete the contents of your App.js file, and copy & paste the code below, and you should be well on your way! (and this way, you will know your React Native app is working properly and playing nice with WebSockets before you start messing around with your server side code. Also, remember to avoid Socket.IO if you want to use the built-in WebSocket API like in my example:

EDIT: According to notable developer Miguel Grinberg, Socket.IO will not fall back upon HTTP Long Polling in React Native if you specify that you want to use [websockets] as your transport method. But never let the truth get in the way of a good story, so I’m leaving this post unedited 😉

// REFERENCE (ws.send)
// https://dev.to/finallynero/using-websockets-in-react-4fkp
// REFERENCE (official react-native docs)
// https://facebook.github.io/react-native/docs/network#websocket-support
import React from 'react';
import {
SafeAreaView,
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
Button,
} from 'react-native';
var ws = new WebSocket('ws://echo.websocket.org/');
ws.onopen = () => {
alert("ws.onopen called!");
ws.send('something');
}
ws.onmessage = (e) => {
alert("ws.onmessage called!");
}
ws.onerror = (e) => {
alert("ws.onerror called!");
}
ws.onclose = (e) => {
alert("ws.onclose called!");
}
class App extends React.Component {
constructor(props) {
super(props);
}
handlePingWebSocketServer() {
ws.send("hello, world");
}
render() {
return(
<View>
<Text>hello, world</Text>
<Button
title="Ping WebSocket Server"
onPress={ () => this.handlePingWebSocketServer() } />
</View>
);
}
}
export default App;
view raw App.js hosted with ❤ by GitHub
 

Command Line User Input in Golang

Cheatsheet reference for handling command line user input in Golang:

// Command Line User Input in Golang
// REFERENCE: https://stackoverflow.com/questions/20895552/how-to-read-from-standard-input-in-the-console
package main
import (
"fmt"
"bufio"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print(">>> ")
userInput, _ := reader.ReadString('\n')
fmt.Println(userInput)
fmt.Print(">>> ")
userInput2, _ := reader.ReadString('\n')
fmt.Println(userInput2)
fmt.Print(">>> ")
userInput3, _ := reader.ReadString('\n')
fmt.Println(userInput3)
}
view raw userinput.go hosted with ❤ by GitHub
 

How to do a FULL JOIN in MySQL, TLDR: Fake It!

Over the past two days I’ve been pretty stumped working on this new database for my latest app, Moolabeast. I’ve been experimenting with different table designs etc., and discovered what I really need is a FULL JOIN. Great! But just one problem… MySQL doesn’t support FULL JOINS. Yikes!

On StackOverflow I found a bunch of different posts from developers describing how to “fake” a FULL JOIN using various SQL statements that were a little beyond my comprehension. However, I finally found an excellent blog post from TablePlus explaining how this works.

Therefore, if you find yourself struggling to do a FULL JOIN in MySQL, I suggest checking out TablePlus’s explanation. I don’t think I could do it justice! It took me a while to find a really good post on the subject, thus that’s why I wanted to write this post to point more people in the right direction.

Essentially you need to do a LEFT JOIN, and a RIGHT JOIN, and then a UNION which will merge the results of the two joins. Now it isn’t perfect, but it’s probably close enough:

SELECT * FROM a
LEFT JOIN b ON a.id = b.id
UNION
SELECT * FROM a
RIGHT JOIN b ON a.id = b.id

Nifty ven diagrams from TablePlus demonstrating the UNION of the LEFT JOIN and RIGHT JOIN results to create a FULL JOIN:

 

The React Native Equivalent of Tap Gesture Recognizer and resignFirstResponder

This blog post is brought to you by the developer of Moolabeast: Automated Expense Tracking for Android and iOS. Avoid overspending when you start tracking your expenses with Moolabeast.

Having trouble dismissing the keyboard in your React Native app on iOS? Would you like the keyboard to simply go away after a user taps somewhere else on the screen after entering some text into a TextInput? Here’s what you’re looking for: <TouchableWithoutFeedback> and Keyboard.dismiss() are the React Native equivalents of Tap Gesture Recognizer and resignFirstResponder. Simply wrap your view in a <TouchableWithoutFeedback> component and call the Keyboard.dismiss() method onPress and the keyboard will automatically dismiss itself when a user taps an area of the screen outside of the currently selected <TextInput>:

import React, { Component } from 'react';
import {
Alert,
Button,
StyleSheet,
Text,
TextInput,
Keyboard,
TouchableWithoutFeedback,
View
} from 'react-native';
class DismissKeyboardExample extends Component {
constructor(props) {
super(props);
this.state = {
emailTextInput: "",
passwordTextInput: ""
};
}
handleEmailTextInput(text) {
let previousState = this.state;
let newState = previousState;
newState.emailTextInput = text;
this.setState(newState);
}
handlePasswordTextInput(text) {
let previousState = this.state;
let newState = previousState;
newState.passwordTextInput = text;
this.setState(newState);
}
handleTestSignupForm() {
let email = this.state.emailTextInput;
let password = this.state.passwordTextInput;
let info = "email entered: " + email + "\n";
info += "password entered: " + password;
alert(info);
let previousState = this.state;
let newState = previousState;
newState.emailTextInput = "";
newState.passwordTextInput = "";
this.setState(newState);
}
render() {
return (
<TouchableWithoutFeedback
accessible={false}
onPress={ () => Keyboard.dismiss() }>
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Dismiss Keyboard Example</Text>
<TextInput
placeholder="Email"
onChangeText={ (text) => this.handleEmailTextInput(text) }
value={this.state.emailTextInput} />
<TextInput
placeholder="Password"
onChangeText={ (text) => this.handlePasswordTextInput(text) }
value={this.state.passwordTextInput} />
<Button
title="Sign Up"
onPress={ () => this.handleTestSignupForm() } />
</View>
</TouchableWithoutFeedback>
);
}
}
export default DismissKeyboardExample;