text:
Home » News » No Longer the Richest: Elon Musk Drops down Forbes List After Tesla Stock Slide
No Longer the Richest: Elon Musk Drops down Forbes List After Tesla Stock Slide
Elon Musk, the tech visionary and founder of Tesla, is no longer the richest person in the world according to Forbes magazine. After Tesla's stock slid by almost 8% this week, his net worth dropped below that of Amazon founder Jeff Bezos. This marks a major shift in the rankings of the world's wealthiest individuals and highlights the fragile nature of stock market investments. Read on to learn more about how the Tesla stock slide has impacted Musk's wealth and why he is no longer the world's wealthiest person.
Tesla stock prices have been volatile
The roller coaster ride that is Tesla stock has been a source of anxiety for many investors this year. On January 7th, Elon Musk surpassed Jeff Bezos as the world's richest person with an estimated net worth of $188 billion. However, since then, Tesla stock prices have taken a sharp dive, and on March 17th, Elon's wealth was estimated at $151 billion. This placed him in second position on the Forbes Billionaires list, behind Bezos.
Investors remain cautiously optimistic about the future prospects for Tesla stock. Despite the current volatility, analysts are still forecasting strong growth for the company. As the electric vehicle industry continues to grow and mature, it is likely that Tesla will remain a leader in the space. With increasing demand and improved profitability, it wouldn't be surprising to see Tesla stock prices rebound. It remains to be seen if Elon will reclaim his spot as the world's richest person.
This has caused Elon Musk to drop down on the Forbes list
The drop in Tesla stock caused the net worth of Musk to fall below Amazon CEO Jeff Bezos. Despite the significant losses, Musk is still ranked second on Forbes' list of wealthiest people.
The recent tumble in Tesla's stock can be attributed to multiple factors. This includes the sell-off due to reports of reduced demand for Tesla's electric vehicles, as well as investor concerns about rising costs associated with expanding production facilities. Additionally, some analysts have speculated that Musk's eccentric behavior might have also played a role in the drop in Tesla's stock.
Musk is now ranked third with a net worth of $115 billion
Musk is now ranked third with a net worth of $115 billion, falling behind Bernard Arnault and Jeff Bezos. This comes after Tesla's stock fell by more than 20%, which reduced Musk's fortune by an estimated $16 billion.
It was only a month ago that Musk had surpassed Bezos to become the world's richest person, and his fortune peaked at $188 billion. Since then, the shares of Tesla have dropped significantly, making it difficult for Musk to remain at the top of the list.
Jeff Bezos and Bernard Arnault are now ranked first and second respectively
The top spot was taken over by Jeff Bezos, with Bernard Arnault in the second place. This comes as a surprise to many, as only two weeks prior Musk had overtaken Bezos and was declared the world's richest person. His wealth came from his stake in Tesla, which has seen a sharp decline in the past week.
The biggest loser in this shuffle appears to be Musk, whose net worth is now estimated to be just over $185 billion compared to his peak of over $210 billion last month. Meanwhile, Bezos' net worth increased from roughly $184 billion to an impressive $196 billion over the same period.
It's likely that Bezos and Arnault will remain at the top for some time, though other tech giants like Bill Gates, Mark Zuckerberg, and Larry Ellison could potentially challenge their positions if their stocks perform well. For now, however, it looks like Jeff Bezos and Bernard Arnault will continue to reign supreme in the world of billionaires.
Musk has lost $15.2 billion since January 7th
On January 7th, Elon Musk was the wealthiest person in the world according to Forbes Magazine. Unfortunately, since then, Musk has lost a total of $15.2 billion of his personal wealth. This significant drop was largely due to the decline of Tesla stock. While the company has seen an overall increase in their stock price throughout 2020, it has experienced a sharp decline in the last few months, leading to the loss of Musk's fortune.
It is estimated that Musk's total net worth is now around $157 billion, putting him in second place on Forbes' Billionaires List behind Amazon CEO Jeff Bezos. Despite the recent setback, Musk still remains one of the wealthiest people in the world and continues to be a major innovator in the tech industry.
How to Send Voice Messages on WhatsApp
The Best Black Bed Frame That Is Perfect For Your Home In 2022
How The IPhone Clean Energy Charging Can Make A Little Bit Difference
How the Apple Adds Devices to (PRODUCT) RED to Raise Money for World AIDS Day
Why iPhone's Satellite Rescue Feature Is a Game Changer
Google is Going to Shutting its Website Experience and Optimization Tool
Intel plans to slash hundreds of jobs in the coming months
Welcome to BAP, your go-to source for honest and unbiased product reviews. Our team of experts thoroughly tests and evaluates a wide range of products to bring you the most accurate and informative reviews. Whether you're in the market for a new tech gadget, home appliance, or beauty product, BAP has you covered.
We independently research, test, review and recommend the best products – learn more about our process. If you buy through our link , we may earn a commission.
©2022 Best Affordable Products. All Rights Reserved.


The campaign follows a public outcry over a hoodie advertising campaign.
CAPE TOWN - Global retailer H&M says it will embark on anti-racism programmes both locally and around the world.
EFF supporters last weekend protested at various H&M outlets in Gauteng and the Western Cape against an online advertisement showcasing a black child modelling a hoodie with the slogan "Coolest Monkey in the Jungle".
Some stores were also trashed in Gauteng.
H&M says it's usually high standards of checks and balances have failed the company.
The retailer adds it's taken steps to ensure such offensive garments are never manufactured under its name again.
Headquarter management will now receive training from a specialist organisation on issues relating to diversity.
Socially-responsible marketing will be promoted during a collaboration between H&M's Swedish marketing management team and local "black agencies".
The image of the child in the hoodie appeared on the British version of the Swedish retailer's online store.
The campaign featuring the garment has since been withdrawn.
H&M is also exploring potential collaborations with local South African designers as well as plans to open six new stores this year.
This is expected to create 300 jobs.


text:
#include <errno.h>
#include <fcntl.h>
#include <linux/netlink.h>
#include <locale.h>
#include <limits.h>
#include <mntent.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/timerfd.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

#include "sol-file-reader.h"
#include "sol-mainloop.h"
#include "sol-platform-impl.h"
#include "sol-platform-linux.h"
#include "sol-platform.h"
#include "sol-str-table.h"
#include "sol-util-internal.h"
#include "sol-vector.h"

#define SOL_MTAB_FILE P_tmpdir "/mtab.sol"
#define LIBUDEV_ID "libudev"

#ifndef TFD_TIMER_CANCELON_SET
#define TFD_TIMER_CANCELON_SET (1 << 1)
#endif

struct sol_platform_linux_fork_run {
    pid_t pid;
    void (*on_child_exit)(void *data, uint64_t pid, int status);
    const void *data;
    struct sol_child_watch *watch;
};

struct umount_data {
    const void *data;
    char *mpoint;
    void (*cb)(void *data, const char *mpoint, int error);
};

struct mount_data {
    const void *data;
    char *dev;
    char *mpoint;
    char *fstype;
    void (*cb)(void *data, const char *mpoint, int status);
};

struct uevent_callback {
    char *action;
    char *subsystem;
    const void *data;
    void (*cb)(void *cb_data, struct sol_uevent *uevent);
};

struct uevent_context {
    bool running;
    struct sol_vector callbacks;
    struct {
        int fd;
        struct sol_fd *watch;
    } uevent;
};

struct timer_fd_context {
    struct sol_fd *watcher;
    int fd;
};

static char hostname[HOST_NAME_MAX + 1];
static char timezone_str[PATH_MAX + 1];
static struct uevent_context uevent_ctx;
static struct sol_ptr_vector fork_runs = SOL_PTR_VECTOR_INIT;
static struct timer_fd_context timer_ctx = { NULL, -1 };

static uint16_t
find_handle(const struct sol_platform_linux_fork_run *handle)
{
    struct sol_platform_linux_fork_run *itr = NULL;
    uint16_t i;

    errno = ENOENT;
    SOL_NULL_CHECK(handle, UINT16_MAX);

    SOL_PTR_VECTOR_FOREACH_IDX (&fork_runs, itr, i) {
        if (itr == handle) {
            errno = 0;
            return i;
        }
    }

    return UINT16_MAX;
}

const char *
sol_platform_impl_get_hostname(void)
{
    if (gethostname(hostname, sizeof(hostname)) < 0)
        return NULL;
    return hostname;
}

static void
on_child(void *data, uint64_t pid, int status)
{
    struct sol_platform_linux_fork_run *handle = data;
    uint16_t i;

    i = find_handle(handle);
    SOL_INT_CHECK(i, == UINT16_MAX);
    sol_ptr_vector_del(&fork_runs, i);

    if (handle->on_child_exit)
        handle->on_child_exit((void *)handle->data, pid, status);
    free(handle);
}

SOL_API struct sol_platform_linux_fork_run *
sol_platform_linux_fork_run(void (*on_fork)(void *data), void (*on_child_exit)(void *data, uint64_t pid, int status), const void *data)
{
    pid_t pid;
    int pfds[2];

    errno = EINVAL;
    SOL_NULL_CHECK(on_fork, NULL);

    if (pipe2(pfds, O_CLOEXEC) < 0) {
        SOL_WRN("could not create pipe: %s", sol_util_strerrora(errno));
        return NULL;
    }

    pid = fork();
    if (pid == 0) {
        sigset_t emptyset;
        char msg;

        sigemptyset(&emptyset);
        sigprocmask(SIG_SETMASK, &emptyset, NULL);

        close(pfds[1]);
        while (read(pfds[0], &msg, 1) < 0) {
            if (errno == EINTR)
                continue;
            else {
                SOL_WRN("failed to read from pipe: %s", sol_util_strerrora(errno));
                close(pfds[0]);
                sol_platform_linux_fork_run_exit(EXIT_FAILURE);
            }
        }
        close(pfds[0]);

        errno = 0;
        on_fork((void *)data);
        sol_platform_linux_fork_run_exit(EXIT_SUCCESS);
    } else if (pid < 0) {
        int errno_bkp = errno;
        close(pfds[0]);
        close(pfds[1]);
        errno = errno_bkp;
        SOL_WRN("could not fork: %s", sol_util_strerrora(errno));
        return NULL;
    } else {
        struct sol_platform_linux_fork_run *handle;
        char msg = 0xff;
        int status = 0;

        handle = malloc(sizeof(*handle));
        SOL_NULL_CHECK_GOTO(handle, error_malloc);
        handle->pid = pid;
        handle->on_child_exit = on_child_exit;
        handle->data = data;
        handle->watch = sol_child_watch_add(pid, on_child, handle);
        SOL_NULL_CHECK_GOTO(handle, error_watch);

        status = sol_ptr_vector_append(&fork_runs, handle);
        SOL_INT_CHECK_GOTO(status, < 0, error_append);

        close(pfds[0]);
        while (write(pfds[1], &msg, 1) < 0) {
            if (errno == EINTR)
                continue;
            else {
                SOL_WRN("failed to write to pipe: %s", sol_util_strerrora(errno));
                status = errno;
                close(pfds[1]);
                errno = status;
                goto error_wpipe;
            }
        }
        close(pfds[1]);

        errno = 0;
        return handle;

error_wpipe:
        status = errno;
        sol_ptr_vector_del_last(&fork_runs);
        errno = status;
error_append:
        status = errno;
        sol_child_watch_del(handle->watch);
        errno = status;
error_watch:
        status = errno;
        free(handle);
        errno = status;
error_malloc:
        status = errno;
        kill(pid, SIGKILL);
        waitpid(pid, NULL, 0);
        errno = status;
        return NULL;
    }
}

SOL_API int
sol_platform_linux_fork_run_send_signal(struct sol_platform_linux_fork_run *handle, int sig)
{
    SOL_INT_CHECK(find_handle(handle), == UINT16_MAX, -errno);
    return kill(handle->pid, sig) == 0;
}

SOL_API int
sol_platform_linux_fork_run_stop(struct sol_platform_linux_fork_run *handle)
{
    int errno_bkp, status = 0;
    uint16_t i;

    i = find_handle(handle);
    SOL_INT_CHECK(i, == UINT16_MAX, -errno);
    sol_ptr_vector_del(&fork_runs, i);

    sol_child_watch_del(handle->watch);

    kill(handle->pid, SIGTERM);
    errno = 0;
    while (waitpid(handle->pid, &status, 0) < 0) {
        if (errno == EINTR) {
            errno = 0;
            continue;
        }

        SOL_WRN("waitpid(%" PRIu64 "): %s",
            (uint64_t)handle->pid, sol_util_strerrora(errno));

        if (errno == ECHILD)
            errno = 0; /* weird, but let's assume success */
        break;
    }

    errno_bkp = errno;

    if (handle->on_child_exit)
        handle->on_child_exit((void *)handle->data, handle->pid,
            WIFEXITED(status) ? WEXITSTATUS(status) : status);
    free(handle);

    errno = errno_bkp;
    return 0;
}

SOL_API uint64_t
sol_platform_linux_fork_run_get_pid(const struct sol_platform_linux_fork_run *handle)
{
    SOL_INT_CHECK(find_handle(handle), == UINT16_MAX, UINT64_MAX);
    return handle->pid;
}

SOL_API void
sol_platform_linux_fork_run_exit(int status)
{
    _exit(status);
}

int
sol_platform_impl_get_os_version(char **version)
{
    int r;
    struct utsname hostinfo;

    SOL_NULL_CHECK(version, -EINVAL);

    r = uname(&hostinfo);
    SOL_INT_CHECK(r, == -1, -errno);

    *version = strdup(hostinfo.release);
    if (!*version)
        return -ENOMEM;

    return 0;
}

static int
parse_mount_point_file(const char *file, struct sol_ptr_vector *vector)
{
    struct mntent mbuf;
    struct mntent *m;
    char strings[4096];
    struct sol_buffer *itr, *buff = NULL;
    uint16_t i;
    FILE *tab = setmntent(file, "re");

    if (!tab) {
        if (errno == ENOENT) {
            SOL_INF("No such %s", file);
            return -errno;
        } else {
            SOL_WRN("Unable to open %s file: %s", file,
                sol_util_strerrora(errno));
            return -errno;
        }
    }

    while ((m = getmntent_r(tab, &mbuf, strings, sizeof(strings)))) {
        int r;

        buff = sol_buffer_new();
        SOL_NULL_CHECK_GOTO(buff, err);

        r = sol_buffer_append_printf(buff, "%s", mbuf.mnt_dir);
        SOL_INT_CHECK_GOTO(r, < 0, err);

        r = sol_ptr_vector_append(vector, buff);
        SOL_INT_CHECK_GOTO(r, < 0, err);
    }
    endmntent(tab);
    return 0;

err:
    sol_buffer_free(buff);
    SOL_PTR_VECTOR_FOREACH_IDX (vector, itr, i) {
        sol_buffer_fini(itr);
    }
    sol_ptr_vector_clear(vector);
    endmntent(tab);
    return -ENOMEM;
}

int
sol_platform_impl_get_mount_points(struct sol_ptr_vector *vector)
{
    return parse_mount_point_file(SOL_MTAB_FILE, vector);
}

static int
sol_mtab_remove_entry(const char *mpoint, struct sol_buffer *output)
{
    struct sol_vector lines;
    struct sol_str_slice content = SOL_STR_SLICE_EMPTY;
    struct sol_str_slice *itr;
    struct sol_file_reader *reader;
    uint16_t idx;

    reader = sol_file_reader_open(SOL_MTAB_FILE);
    if (!reader) {
        SOL_ERR("Could not read "SOL_MTAB_FILE " file - %s",
            sol_util_strerrora(errno));
        return -errno;
    }

    content = sol_file_reader_get_all(reader);
    lines = sol_str_slice_split(content, "\n", 0);
    SOL_VECTOR_FOREACH_IDX (&lines, itr, idx) {
        if (!strstr(itr->data, mpoint) || strstartswith(itr->data, "#"))
            sol_buffer_append_printf(output, "%s", itr->data);
    }

    sol_vector_clear(&lines);
    sol_file_reader_close(reader);
    return 0;
}

// since we don't have a mtab entry remove function we must implement it ourselves
static int
sol_mtab_cleanup(const char *mpoint)
{
    int err, fd, res = 0;
    size_t len;
    struct sol_buffer output;

    sol_buffer_init(&output);

    err = sol_mtab_remove_entry(mpoint, &output);
    SOL_INT_CHECK(err, < 0, err);

    fd = open(SOL_MTAB_FILE, O_RDWR | O_CLOEXEC | O_TRUNC);
    if (fd < 0) {
        SOL_ERR("Could not open " SOL_MTAB_FILE);
        res = -errno;
        goto finish;
    }

    len = write(fd, output.data, output.used);
    if (!len || len != output.used) {
        SOL_ERR("Could not write "SOL_MTAB_FILE " file - %s",
            sol_util_strerrora(errno));
        res = -errno;
    }

    err = close(fd);
    if (err < 0) {
        SOL_ERR("Could not close "SOL_MTAB_FILE " file - %s",
            sol_util_strerrora(errno));
        res = -errno;
    }

finish:
    sol_buffer_fini(&output);
    return res;
}

SOL_ATTR_NO_RETURN static void
on_umount_fork(void *data)
{
    int err;
    struct umount_data *udata = data;

    err = sol_mtab_cleanup(udata->mpoint);
    if (err < 0)
        sol_platform_linux_fork_run_exit(EXIT_FAILURE);

    err = umount(udata->mpoint);
    if (err != 0) {
        SOL_ERR("Couldn't umount %s - %s", udata->mpoint, sol_util_strerrora(errno));
        sol_platform_linux_fork_run_exit(EXIT_FAILURE);
    }

    sol_platform_linux_fork_run_exit(EXIT_SUCCESS);
}

static void
on_umount_fork_exit(void *data, uint64_t pid, int status)
{
    struct umount_data *udata = data;

    udata->cb((void *)udata->data, udata->mpoint, status);
    free(udata->mpoint);
    free(udata);
}

int
sol_platform_impl_umount(const char *mpoint, void (*cb)(void *data, const char *mpoint, int error), const void *data)
{
    struct umount_data *udata;

    udata = calloc(1, sizeof(struct umount_data));
    SOL_NULL_CHECK(udata, -ENOMEM);

    udata->data = data;
    udata->mpoint = strdup(mpoint);
    SOL_NULL_CHECK_GOTO(udata->mpoint, err);
    udata->cb = cb;

    sol_platform_linux_fork_run(on_umount_fork, on_umount_fork_exit, udata);
    return 0;

err:
    free(udata);
    return -ENOMEM;
}

static int
sol_mtab_add_entry(const char *dev, const char *mpoint, const char *fstype)
{
    struct mntent mbuf = { 0 };
    FILE *sol_mtab;
    int err;

    sol_mtab = setmntent(SOL_MTAB_FILE, "w+");
    if (!sol_mtab) {
        SOL_WRN("Unable to open "SOL_MTAB_FILE " file: %s",
            sol_util_strerrora(errno));
        return -ENOENT;
    }

    mbuf.mnt_fsname = (char *)dev;
    mbuf.mnt_dir = (char *)mpoint;
    mbuf.mnt_type = (char *)fstype;
    mbuf.mnt_opts = (char *)"";

    err = addmntent(sol_mtab, &mbuf);
    if (err != 0)
        SOL_ERR("Could not add mnt entry - %s", sol_util_strerrora(errno));

    endmntent(sol_mtab);
    return err;
}

SOL_ATTR_NO_RETURN static void
on_mount_fork(void *data)
{
    int err;
    struct mount_data *mdata = data;

    err = sol_mtab_add_entry(mdata->dev, mdata->mpoint, mdata->fstype);
    if (err < 0)
        sol_platform_linux_fork_run_exit(EXIT_FAILURE);

    err = mount(mdata->dev, mdata->mpoint, mdata->fstype, 0, NULL);
    if (err != 0) {
        SOL_ERR("Couldn't mount %s to %s - %s", mdata->dev, mdata->mpoint,
            sol_util_strerrora(errno));
        sol_platform_linux_fork_run_exit(EXIT_FAILURE);
    }

    sol_platform_linux_fork_run_exit(EXIT_SUCCESS);
}

static void
on_mount_fork_exit(void *data, uint64_t pid, int status)
{
    struct mount_data *mdata = data;

    mdata->cb((void *)mdata->data, mdata->mpoint, status);
    free(mdata->fstype);
    free(mdata->mpoint);
    free(mdata->dev);
    free(mdata);
}

SOL_API int
sol_platform_linux_mount(const char *dev, const char *mpoint, const char *fstype, void (*cb)(void *data, const char *mpoint, int status), const void *data)
{
    struct mount_data *mdata;

    SOL_NULL_CHECK(dev, -EINVAL);
    SOL_NULL_CHECK(mpoint, -EINVAL);
    SOL_NULL_CHECK(fstype, -EINVAL);
    SOL_NULL_CHECK(cb, -EINVAL);

    mdata = calloc(1, sizeof(struct mount_data));
    SOL_NULL_CHECK(mdata, -ENOMEM);

    mdata->data = data;
    mdata->dev = strdup(dev);
    SOL_NULL_CHECK_GOTO(mdata->dev, dev_err);

    mdata->mpoint = strdup(mpoint);
    SOL_NULL_CHECK_GOTO(mdata->mpoint, mpoint_err);

    mdata->fstype = strdup(fstype);
    SOL_NULL_CHECK_GOTO(mdata->fstype, fstype_err);

    mdata->cb = cb;

    sol_platform_linux_fork_run(on_mount_fork, on_mount_fork_exit, mdata);
    return 0;

fstype_err:
    free(mdata->mpoint);
mpoint_err:
    free(mdata->dev);
dev_err:
    free(mdata);
    return -ENOMEM;
}

static void
sol_uevent_event_dispatch(struct uevent_context *ctx, struct sol_uevent *uevent)
{
    uint16_t idx;
    struct uevent_callback *cb;

    SOL_VECTOR_FOREACH_IDX (&ctx->callbacks, cb, idx) {
        if ((!cb->action || sol_str_slice_str_eq(uevent->action, cb->action)) &&
            (!cb->subsystem || sol_str_slice_str_eq(uevent->subsystem, cb->subsystem))) {
            cb->cb((void *)cb->data, uevent);
        }
    }
}

static void
sol_uevent_read_msg(struct uevent_context *ctx, char *msg, int len)
{
    struct sol_uevent uevent = {
        .modalias = SOL_STR_SLICE_EMPTY,
        .action = SOL_STR_SLICE_EMPTY,
        .subsystem = SOL_STR_SLICE_EMPTY,
        .devtype = SOL_STR_SLICE_EMPTY,
        .devname = SOL_STR_SLICE_EMPTY,
    };
    int i = 0;

    /** lets avoid it to misbehave when people trying to test it with systemd running */
    if (streqn(msg, LIBUDEV_ID, sizeof(LIBUDEV_ID))) {
        SOL_INF("We're running side-by-side with udevd, skipping udevd generated event");
        return;
    }

    while (i < len) {
        char *curr, *del = NULL;
        size_t value_len;

        curr = msg + i;
        del = strrchr(curr, '=');
        if (!del)
            goto next;

        value_len = del - curr;
        del++;

        if (streqn(curr, "MODALIAS", value_len))
            uevent.modalias = sol_str_slice_from_str(del);
        else if (streqn(curr, "ACTION", value_len))
            uevent.action = sol_str_slice_from_str(del);
        else if (streqn(curr, "SUBSYSTEM", value_len))
            uevent.subsystem = sol_str_slice_from_str(del);
        else if (streqn(curr, "DEVTYPE", value_len))
            uevent.devtype = sol_str_slice_from_str(del);
        else if (streqn(curr, "DEVNAME", value_len))
            uevent.devname = sol_str_slice_from_str(del);

next:
        i += strlen(msg + i) + 1;
    }

    sol_uevent_event_dispatch(ctx, &uevent);
}

static bool
sol_uevent_handler(void *data, int fd, uint32_t cond)
{
    int len;
    struct uevent_context *ctx = data;
    char buffer[512];

    while (true) {
        len = recv(ctx->uevent.fd, buffer, sizeof(buffer), MSG_WAITALL);
        if (len == -1) {
            if (errno == EINTR) {
                SOL_INF("Could not read netlink socket, retrying.");
                continue;
            } else {
                SOL_WRN("Could not read netlink socket. %s", sol_util_strerrora(errno));
                return false;
            }
        } else {
            sol_uevent_read_msg(ctx, buffer, len);
        }

        break;
    }

    return true;
}

static int
sol_uevent_register(struct uevent_context *ctx)
{
    struct sockaddr_nl nls;

    memset(&nls, 0, sizeof(struct sockaddr_nl));
    nls.nl_family = AF_NETLINK;
    nls.nl_pid = getpid();
    nls.nl_groups = -1;

    ctx->uevent.watch = NULL;
    ctx->uevent.fd = -1;
    ctx->uevent.fd = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC,
        NETLINK_KOBJECT_UEVENT);
    if (ctx->uevent.fd == -1) {
        SOL_ERR("Could not open uevent netlink socket.");
        return -errno;
    }

    if (bind(ctx->uevent.fd, (void *)&nls, sizeof(struct sockaddr_nl))) {
        SOL_ERR("Could not bind to uevent socket.");
        close(ctx->uevent.fd);
        ctx->uevent.fd = 0;
        return -errno;
    }

    ctx->uevent.watch = sol_fd_add(ctx->uevent.fd, SOL_FD_FLAGS_IN,
        sol_uevent_handler, ctx);
    SOL_NULL_CHECK_GOTO(ctx->uevent.watch, error_fd);
    return 0;

error_fd:
    close(ctx->uevent.fd);
    ctx->uevent.fd = -1;
    return -ENOMEM;
}

SOL_API int
sol_platform_linux_uevent_subscribe(const char *action, const char *subsystem,
    void (*cb)(void *data, struct sol_uevent *uevent), const void *data)
{
    struct uevent_callback *cb_obj;

    if (!uevent_ctx.running)
        sol_vector_init(&uevent_ctx.callbacks, sizeof(struct uevent_callback));

    cb_obj = sol_vector_append(&uevent_ctx.callbacks);
    SOL_NULL_CHECK(cb_obj, -ENOMEM);

    if (action) {
        cb_obj->action = strdup(action);
        SOL_NULL_CHECK_GOTO(cb_obj->action, action_err);
    }

    if (subsystem) {
        cb_obj->subsystem = strdup(subsystem);
        SOL_NULL_CHECK_GOTO(cb_obj->subsystem, subsys_err);
    }

    cb_obj->cb = cb;
    cb_obj->data = data;

    if (!uevent_ctx.running && sol_uevent_register(&uevent_ctx) == 0) {
        uevent_ctx.running = true;
    }

    return 0;

subsys_err:
    free(cb_obj->action);
action_err:
    free(cb_obj);
    return -ENOMEM;
}

static void
sol_uevent_cleanup(struct uevent_context *ctx)
{
    if (ctx->uevent.watch) {
        sol_fd_del(ctx->uevent.watch);
        ctx->uevent.watch = NULL;
    }

    if (ctx->uevent.fd != -1) {
        close(ctx->uevent.fd);
        ctx->uevent.fd = -1;
    }

    sol_vector_clear(&ctx->callbacks);
    ctx->running = false;
}

SOL_API int
sol_platform_linux_uevent_unsubscribe(const char *action, const char *subsystem,
    void (*cb)(void *data, struct sol_uevent *uevent), const void *data)
{
    struct uevent_callback *callback;
    uint16_t idx;

    SOL_NULL_CHECK(cb, -ENOENT);

    SOL_VECTOR_FOREACH_REVERSE_IDX (&uevent_ctx.callbacks, callback, idx) {
        if (callback->cb == cb &&
            (!callback->action || streq(callback->action, action)) &&
            (!callback->subsystem || streq(callback->subsystem, subsystem)) &&
            callback->data == data) {
            free(callback->subsystem);
            free(callback->action);
            sol_vector_del(&uevent_ctx.callbacks, idx);
        }
    }

    if (!uevent_ctx.callbacks.len)
        sol_uevent_cleanup(&uevent_ctx);

    return 0;
}

int64_t
sol_platform_impl_get_system_clock(void)
{
    return (int64_t)time(NULL);
}

static bool
system_clock_changed(void *data, int fd, uint32_t active_flags)
{
    char buf[4096];

    if (read(timer_ctx.fd, buf, sizeof(buf)) >= 0)
        return true;
    close(timer_ctx.fd);
    timer_ctx.fd = -1;
    timer_ctx.watcher = NULL;
    sol_platform_register_system_clock_monitor();
    sol_platform_inform_system_clock_changed();
    return false;
}

int
sol_platform_register_system_clock_monitor(void)
{
    int r;
    struct itimerspec spec;

    if (timer_ctx.watcher)
        return 0;

    timer_ctx.fd = timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC);
    SOL_INT_CHECK(timer_ctx.fd, < 0, -errno);

    memset(&spec, 0, sizeof(struct itimerspec));
    /* Set a dummy value, end of time. */
    spec.it_value.tv_sec = LONG_MAX;
    if (timerfd_settime(timer_ctx.fd,
        TFD_TIMER_ABSTIME | TFD_TIMER_CANCELON_SET, &spec, NULL) < 0) {
        r = -errno;
        SOL_WRN("Could not register a timer to watch for system_clock changes.");
        goto err_exit;
    }

    timer_ctx.watcher = sol_fd_add(timer_ctx.fd,
        SOL_FD_FLAGS_IN, system_clock_changed, NULL);

    if (!timer_ctx.watcher) {
        r = -ENOMEM;
        goto err_exit;
    }

    return 0;

err_exit:
    close(timer_ctx.fd);
    timer_ctx.fd = -1;
    return r;
}

int
sol_platform_unregister_system_clock_monitor(void)
{
    if (!timer_ctx.watcher)
        return 0;

    sol_fd_del(timer_ctx.watcher);
    close(timer_ctx.fd);
    timer_ctx.watcher = NULL;
    timer_ctx.fd = -1;
    return 0;
}

const char *
sol_platform_impl_get_timezone(void)
{
    ssize_t n;
    size_t offset;

    n = readlink("/etc/localtime", timezone_str, sizeof(timezone_str) - 1);
    if (n < 0) {
        SOL_WRN("Could not readlink /etc/localtime");
        return NULL;
    }
    timezone_str[n] = '\0';
    if (strstartswith(timezone_str, "../usr/share/zoneinfo/"))
        offset = strlen("../usr/share/zoneinfo/");
    else if (strstartswith(timezone_str, "/usr/share/zoneinfo/"))
        offset = strlen("/usr/share/zoneinfo/");
    else {
        SOL_WRN("The timzone is not a link to /usr/share/zoneinfo/");
        return NULL;
    }
    memmove(timezone_str, timezone_str + offset, strlen(timezone_str) - offset + 1);
    return timezone_str;
}

const char *
sol_platform_impl_get_locale(enum sol_platform_locale_category category)
{
    int ctype;

    ctype = sol_platform_locale_to_c_category(category);
    SOL_INT_CHECK(ctype, < 0, NULL);
    return setlocale(ctype, NULL);
}

int
sol_platform_impl_apply_locale(enum sol_platform_locale_category category, const char *locale)
{
    int ctype;
    char *loc;

    ctype = sol_platform_locale_to_c_category(category);
    SOL_INT_CHECK(ctype, < 0, -EINVAL);
    loc = setlocale(ctype, locale);
    SOL_NULL_CHECK(loc, -EINVAL);
    return 0;
}

static enum sol_platform_locale_category
system_locale_to_sol_locale(const struct sol_str_slice loc)
{
    static const struct sol_str_table map[] = {
        SOL_STR_TABLE_ITEM("LANG", SOL_PLATFORM_LOCALE_LANGUAGE),
        SOL_STR_TABLE_ITEM("LC_ADDRESS", SOL_PLATFORM_LOCALE_ADDRESS),
        SOL_STR_TABLE_ITEM("LC_COLLATE", SOL_PLATFORM_LOCALE_COLLATE),
        SOL_STR_TABLE_ITEM("LC_CTYPE", SOL_PLATFORM_LOCALE_CTYPE),
        SOL_STR_TABLE_ITEM("LC_IDENTIFICATION", SOL_PLATFORM_LOCALE_IDENTIFICATION),
        SOL_STR_TABLE_ITEM("LC_MEASUREMENT", SOL_PLATFORM_LOCALE_MEASUREMENT),
        SOL_STR_TABLE_ITEM("LC_MESSAGES", SOL_PLATFORM_LOCALE_MESSAGES),
        SOL_STR_TABLE_ITEM("LC_MONETARY", SOL_PLATFORM_LOCALE_MONETARY),
        SOL_STR_TABLE_ITEM("LC_NAME", SOL_PLATFORM_LOCALE_NAME),
        SOL_STR_TABLE_ITEM("LC_NUMERIC", SOL_PLATFORM_LOCALE_NUMERIC),
        SOL_STR_TABLE_ITEM("LC_PAPER", SOL_PLATFORM_LOCALE_PAPER),
        SOL_STR_TABLE_ITEM("LC_TELEPHONE", SOL_PLATFORM_LOCALE_TELEPHONE),
        SOL_STR_TABLE_ITEM("LC_TIME", SOL_PLATFORM_LOCALE_TIME),
        { }
    };

    return sol_str_table_lookup_fallback(map, loc, SOL_PLATFORM_LOCALE_UNKNOWN);
}

int
sol_platform_impl_load_locales(char **locale_cache)
{
    FILE *f;
    int r;
    char *line, *sep;
    struct sol_str_slice key, value;
    enum sol_platform_locale_category category;

    f = fopen("/etc/locale.conf", "re");

    if (!f) {
        if (errno == ENOENT) {
            SOL_INF("The locale file (/etc/locale.conf) was not found in the system.");
            return 0;
        } else
            return -errno;
    }

    for (category = SOL_PLATFORM_LOCALE_LANGUAGE; category <= SOL_PLATFORM_LOCALE_TIME; category++) {
        free(locale_cache[category]);
        locale_cache[category] = NULL;
    }

    line = NULL;
    while (fscanf(f, "%m[^\n]\n", &line) != EOF) {
        unsigned int i, len = strlen(line);

        /* It is possible to have comments in locale.conf, ignore them */
        for (i = 0; i < len; i++) {
            if (line[i] == '#')
                goto ignore;
            if (line[i] != ' ')
                break;
        }

        sep = strchr(line, '=');
        if (!sep) {
            SOL_WRN("The locale entry: %s does not have the separator '='",
                line);
            r = -EINVAL;
            goto err_val;
        }

        key.data = line;
        value.data = sep + 1;
        key.len = sep - key.data;
        value.len = len - key.len - 1;
        if (!value.len)
            goto ignore;

        category = system_locale_to_sol_locale(key);
        if (category != SOL_PLATFORM_LOCALE_UNKNOWN) {
            struct sol_buffer buf;

            r = sol_util_unescape_quotes(value, &buf);
            SOL_INT_CHECK_GOTO(r, < 0, err_val);
            locale_cache[category] = sol_buffer_steal_or_copy(&buf, NULL);
            sol_buffer_fini(&buf);
            SOL_NULL_CHECK_GOTO(locale_cache[category], err_nomem);
        }

ignore:
        free(line);
        line = NULL;
    }

    r = ferror(f);
    if (r != 0)
        r = -errno;
    fclose(f);
    return r;

err_nomem:
    r = -ENOMEM;
err_val:
    free(line);
    fclose(f);
    return r;
}

int
sol_platform_impl_locale_to_c_category(enum sol_platform_locale_category category)
{
    switch (category) {
    case SOL_PLATFORM_LOCALE_ADDRESS:
        return LC_ADDRESS;
    case SOL_PLATFORM_LOCALE_IDENTIFICATION:
        return LC_IDENTIFICATION;
    case SOL_PLATFORM_LOCALE_MESSAGES:
        return LC_MESSAGES;
    case SOL_PLATFORM_LOCALE_PAPER:
        return LC_PAPER;
    case SOL_PLATFORM_LOCALE_NAME:
        return LC_NAME;
    case SOL_PLATFORM_LOCALE_TELEPHONE:
        return LC_TELEPHONE;
    case SOL_PLATFORM_LOCALE_MEASUREMENT:
        return LC_MEASUREMENT;
    default:
        return -EINVAL;
    }
}

const char *
sol_platform_impl_locale_to_c_str_category(enum sol_platform_locale_category category)
{
    switch (category) {
    case SOL_PLATFORM_LOCALE_ADDRESS:
        return "LC_ADDRESS";
    case SOL_PLATFORM_LOCALE_IDENTIFICATION:
        return "LC_IDENTIFICATION";
    case SOL_PLATFORM_LOCALE_MEASUREMENT:
        return "LC_MEASUREMENT";
    case SOL_PLATFORM_LOCALE_MESSAGES:
        return "LC_MESSAGES";
    case SOL_PLATFORM_LOCALE_NAME:
        return "LC_NAME";
    case SOL_PLATFORM_LOCALE_PAPER:
        return "LC_PAPER";
    case SOL_PLATFORM_LOCALE_TELEPHONE:
        return "LC_TELEPHONE";
    default:
        return NULL;
    }
}

redpajama_set_name: RedPajamaGithub


Bring a combination of stylish and functional pieces of furniture to your home with the Caster Chair Company C137 Build a Chair - CTZ442-02 (Set of 2). These pieces are crafted from the finest materials available including heavy gauge steel, powder coat finishes, solid wood with laminate and durable molded foam.
This item ships with LTL / Freight. The freight carriers will have your information and will call to schedule a delivery date. Someone must be home to accept the freight shipment.
Caster Chair Company, with all its craftsman, takes pride in manufacturing a quality product. You can be assured that only the latest in engineering technology is applied in the production facilities and that each and every product is carefully inspected before shipment. Caster Chair Company warrants to the original consumer that its product is free of defects in material and workmanship for one year from the date of purchase. Commercial use voids all warranties.


Leg 16 of Ramble Round the Rockies. From Las Vegas we head east to the Grand Canyon National Park. Las Vegas is the most populous city in Nevada and is internationally renowned for its gambling shopping and fine dining. The citys tolerance for various forms of adult entertainment earned it the title of Sin City and this image has made Las Vegas a popular setting for films and television programs.


text:
The new electric Škoda SUV under preparation will be called Enyaq. The name is based in the Irish language and expresses the vehicle's dynamism and efficiency.
Discover what inspires the name.
The Enyaq model opens a new chapter in the 125-year history of the Škoda brand. Not just by being the first Škoda electric car built on the MEB platform, but by launching a new family of model names.
Škoda SUVs have traditionally had names ending in the letter Q, and the new Škoda Enyaq follows this tradition like the Kamiq, Karoq and Kodiaq models. But the new model's first letter shows that this tradition is merging with the eMobility era, referenced by the letter E at the beginning of the name.
The name Enyaq encapsulates the character of the new model. It is derived from the Irish name Enya, which means "source of life", which itself expresses the power of the Škoda Enyaq that goes hand in hand with the temperament of an electric SUV and the passion for innovation that produced the new model.
The Irish name Enya has even deeper roots in the language. It comes from the original Irish word eithne, which can be translated as "essence", "spirit" or "principle". These various meanings add broader resonance to the new model's name.
The Irish origin of the name also carries on the tradition of inspiration from rugged corners of the earth. The Škoda Kamiq, Karoq and Kodiaq models were inspired by the language of the Inuit living in Greenland and Canada, and the names for Škoda's MEB-platform electric models will also be drawn from northerly regions.
Obviously you already knew Skoda. Discover new car brands every day on our website and becomes a car expert. We're focused on Alternative car brands and Small Volume Car Manufacturers
Drivingyourdream

redpajama_set_name: RedPajamaCommonCrawl


While bourbon must be aged in barrels, there are no specifics as to how long. However, bourbon aged at least two years with no added colorings, flavorings, or other spirits may be classified as Straight Bourbon. Even though two years is the required aging time, most straight bourbons are aged four years or more.
Tennessee whiskey is defined as a straight bourbon whiskey produced in the state of Tennessee. As is the case with straight bourbon, Tennessee whiskey must be 51% corn, aged in charred-oak barrels for at least two years, bottled at 80 proof or higher, and exclude added colorings, flavorings or other spirits. Two of the most popular Tennessee whiskeys are Jack Daniel's and George Dickel.
What makes Tennessee whiskey different from straight bourbon?
The difference lies in a filtering stage called the Lincoln County Process (also known as charcoal filtering). In this process, the whiskey is filtered through sugar maple charcoal prior to aging. In general, this process results in whiskeys that are mellower, sweeter and slightly smokier than bourbon. Incidentally, there are "charcoal-filtered" bourbons, but they are filtered after aging. While most Tennessee whiskeys use the Lincoln County Process, it is not a requirement.
Blended American whiskey must contain at least 20% straight whiskey. Straight whiskey is made from 51% of a single grain, aged two years in charred oak barrels, bottled at a minimum of 80 proof, and free from added colors, flavors, or other spirits. The remaining balance of blended whiskey is often made up of unaged grain neutral spirits. Two popular blended American whiskeys include Seagram's 7 and Calvert Extra.
"You have asked me how I feel about whiskey.
righteous, gracious living into the bottomless pit of degradation, and despair, and shame and helplessness, and hopelessness, then certainly I am against it.


Are millennials really killing mayonnaise?
That's the bold title of a lengthy first-person piece in Philadelphia Magazine published this past weekend — a headline and column that have garnered much attention from those who read it.
"For the most part, today's youth would sooner get their news from an actual paper newspaper than ingest mayonnaise," she wrote.
?Today?s youth would sooner get their news from an actual paper newspaper than ingest mayonnaise.? Not false.https://t.co/THfsYkxOlW?
I hated mayonnaise before it was cool.
The writer herself took to Twitter to rebut some of the mayo-haters by sharing her mother's recipe for macaroni salad — which includes up to three cups of mayonnaise — as well as to joke around with readers.
Oh jeez thanks, guys, now I'm on the condiment beat permanently.
WHO PUT THE HORSE IN HORSERADISH, HUH???
Coming soon: You say tom-A-to, I say to-MAH-to, but HOW DO YOU SPELL KETCHUP?
So of course, we have to ask: What do you think of mayo?


It's a New Year and time for a new you! Here is an exciting new recipe that is full of flavor without the fat so your New Year's resolutions can start becoming a reality. The secret: French's Mustard.
French's Mustard is 100% natural and has been for over 100 years. It also has zero calories and while it's a popular condiment, home cooks are just now realizing that just a little mustard adds a lot of flavor to everyday recipes.
MIX turkey, 4 Tbsp. mustard, 4 Tbsp. parsley, and 1 1/2 tsp. spicy seasoning in large bowl. Shape into 4 patties, 1/2-inch thick.
COMBINE sour cream, remaining 2 Tbsp. mustard and 2 Tbsp. parsley, relish, capers and remaining 1/4 tsp. spicy seasoning in small bowl.
GRILL burgers over medium-high heat for 12 min. or until no longer pink in center, turning once. Serve on rolls with spicy remoulade.


text:
Q: Verify a solution to a differential equations and determine the constants
Verify that the function $y(x)=C_1e^{-2x}+C_2e^x$ is a solution of the linear equation $\frac{d^2y}{dx^2}+\frac{dy}{dx}-2y=0$ for any choice of constants $C_1$ and $C_2$.  In addtion determine the constants for the initial conditions $y(0)=2$, $y'(0)=1$.

So first I took the derivatives:
$y'(x)=-2C_1e^{-2x}+C_2e^x$
$y''(x)=4C_1e^{-2s}+C_2e^x$
When I plugged the above into $\frac{d^2y}{dx^2}+\frac{dy}{dx}-2y=0$ I found that it was equal to $y(x)=C_1e^{-2x}+C_2e^x$.
Trying to find the constants I got:
For $y(0)$, $C_1=2$ and $C_2=0$
For $y'(0)$, $C_1=\frac{-1}{2}$ and $C_2=0$
Is this correct?

A: I suppose that they wanted you to check that $$\frac{d^2y}{dx^2}+\frac{dy}{dx}-2y=0\tag1$$ if $$y=C_1e^{-2x}+C_2e^x$$ As, you did, compute the expressions of  $\frac{dy}{dx}$ and $\frac{d^2y}{dx^2}$ and plug all expressions (including $y$) in $(1)$; the result is $0$ so the given $y$ is a solution.
Now, from the equations, apply the conditions $$2=C_1+C_2$$ $$1=-2C_1+C_2$$ Solve for $C_1,C_2$ to get the particular solution.
All of what you did is very correct; I think that you could present the different steps in a slightly different manner to better show the steps. A few more words could help to show how you did proceed.

redpajama_set_name: RedPajamaStackExchange


Or, we could say "how to build products better". Or, in some cases, how to end up not building your product at all. This is why it's very important to talk to customers from the moment an idea is starting to take shape in your head.
When a startup incubator program called Digital Factory asked me to do a workshop about the process of "customer discovery" a couple of months ago, I was glad to take the opportunity. I believe that every project owner, product developer and entrepreneur should "get out of the building" as soon as possible. They need to start interacting with real people, as those people will eventually decide the faith of the whole business.
42% of startups that went on the rocks failed because there was no market need for their products.
How to avoid building a product that nobody wants and validate your ideas before wasting your time.
How to collect feedback from your target markets to make better and faster decisions about product, marketing, customer experience etc.
It's impossible to cover all these topics while trying to avoid getting into PowerPoint Purgatory for using 9px fonts or wordiness. Though I really hope that it motivated you to search more about these topics on this blog or elsewhere and start testing your ideas as a reality check.


Ajax's young squad will not be overawed when they meet Manchester United in the Europa League final on Wednesday night in Stockholm, according to former Ajax and United goalkeeper Edwin van der Sar.
The Dutch side have displayed no signs of nerves as they reached their first European final since 1996, despite having an average age of just 22.
"Sometimes you know what they can do but in other clubs they don't get the opportunity to show it. At Ajax, you get the opportunity.
Ajax are often forced to sell their best players to Europe's richer clubs, but Van der Sar said that should that happen they already have new young players coming through the ranks.
Already, 19-year-old Danish striker Kasper Dolberg and captain Davy Klaassen have been linked with moves to clubs including Manchester City and Everton, while United are also said to be looking at Dolberg.
"At a certain point, at 24-25, they are ready to take the next step to a different club and we know that. That is not a problem," he added.
"If our academy works well, then his follow-up is there already and pushing him out of the club because he wants to take his place.


I have found that Google My Business categories are often an overlooked tactic by many people that work in the Local Search space. According to Moz's Local Search Ranking Factors Survey , proper Google My Business category associations are the #3 search ranking factor for local packs. It has been one of the top ranking factors for as long as I can remember so I wanted to share some things about Google My Business categories that people often aren't aware of.
1. Google constantly changes the names of categories. For example, "Lincoln Mercury Dealer" got renamed to "Lincoln Dealer" in the fall of 2018 and "Natural Foods Store" got renamed to "Natural Goods Store" in December. It's important to know that Google can rename them so you're not thinking it's a new category that has been added.


Creating learning content products can be the most profitable method of making money on the internet. For that matter it can be quite profitable in the bricks and mortar world as well. But there's one problem.
How can you create information products that make money consistently?
In this article I'm going to give you seven tips to help you create learning content products that will make you money.
1. Always start with the customer and their motivators. Everything you do — from the product itself to the marketing of the product — needs to be focused on a targeted customer. You need to spend time determining who your customer is and what motivates them. Knowing your client and their motivations is the most important way you can ensure your information product will sell.
2. Focus your products on solving one problem for your customer. Your solution will most likely solve many problems your customer has. Cool. But your customer doesn't care. All they care about it that it will solve the one problem they have. Everything you do must focus on that one problem and solving it.
3. If you're writing a book, an eBook or using a script — write like you talk not like you write. It really doesn't matter what type of learning content product you are creating you most likely are going to have to write the content. When you do write like you speak. Most people write using an artificial voice that frankly sounds silly when spoken aloud. You're not trying to pass high school English any more. Just write like you speak. You and your audience will be happier with the result.
4. Either teach or sell, don't try to do both! I don't know how many times I've run into entrepreneurs who haven't gotten this message. People do not want to be sold. They want to buy. They especially do not like to be told they are about to be taught when you are intending to sell them. Basic honesty rules. If you're going to teach, teach. Don't try to sell other products. Don't try to sell services. Just teach. Trust your customers — if you produce a good product they will buy other products from you.
5. Don't underestimate the time and effort involved in producing a quality learning content product. One of the worst mistakes a manager can make is to try to negotiate how long a product will take to make. It will take the length of time it will take. Accept it. If you want a quality product you need to spend the time and the effort. There is no free lunch.
6. Don't underestimate the value of marketing. Making money with information products needs only three things. Know who your client is. Create a quality product that meets their motivating needs or desires. Put your product in front of your customer and focus their attention on it. The problem is getting your product in front of your customer while they're still paying attention. That's marketing's job. It takes effort, skill and luck.
7. Keep it simple. Your customers are very busy. They have information flying at them from all angles. Constantly! They can only spend a small amount of energy understanding your learning content. Help them to understand your solution. Keep it simple. Your customers will reward you by buying more of your product. And that's how you'll really make money with your informational products.


text:
Revisions to Historic Preservation Ordinance in effect Nov 6, 2015
Bradley Pepper October 10, 2015 Advocacy, Codes, Land Development
Over the last year, GHBA remodelers and builders have participated in stakeholder meetings with the City of Houston in order to make minor revisions to the Historic Preservation Ordinance. After many discussions and negotiations, the Houston City Council approved the revisions on October 7, 2015.
In addition to these revisions, two changes were offered at the council table. The first change was rejected thanks to the efforts of the GHBA, HAR and Houstonians for Responsible Growth. The rejected amendment proposed to lower the 67% voter threshold required for neighborhoods to establish a historic district. Thankfully, the majority of city council agreed with the GHBA and opposed the amendment.
However, the second amendment was approved. It establishes a new appeals board that will include five members: two former members of the Planning Commission; two former members of the Historic Preservation Commission and one citizen representative. All members must be appointed by the mayor and approved by city council. See theamendment text here.
For more information, contact cmorgan@ghba.org.


intensity moves for an interval-style, calorie-burning dance fitness party. Once the Latin and World rhythms take over, you'll see why Zumba® Fitness classes are often called exercise in disguise. Super effective? Check. Super fun? Check and check.


The new ACL in my knee has passed the 6-month mark of its existence. If you just read that sentence and don't know the story of my ACL, you can Click Here to start from the beginning. But to give everyone a short recap, the story begins around 4 years ago when a traumatic sports injury caused my ACL to tear. I lived with it torn for many years while kickboxing, doing jiujitsu, weightlifting, and any other activity I wanted. During that time, I did extensive movement therapy on my knee to avoid surgery. Finally, at the end of 2017 I was experiencing constant arthritis, a nagging softball sized baker's cyst, and periodic bouts of instability. I had finally had enough and decided to get cut. I received a new ACL February 9th.
After 6 months of physical therapy, acupuncture, strength training, and a low-to-moderate return to sport I'd like to report how my knee has held up (to learn more about the previous 5 months and what I did for physical therapy click here). At this stage I like to say I am 90-95% back to normal (normal being surgery left knee compared to non-surgery right knee). There are two physical movements and one physiological trait that I am judging this percentage on. The first physical movement is the ability to completely sit back into the position known as seiza. See the picture below for a demonstration of seiza.
Within the last month I have gained the ability to sit into seiza without pain. I was experiencing some pain on the lateral and medial parts of my calf when reaching the end range of this position. It still doesn't feel "normal" and I do bias my other leg a little with my body weight.
The second physical movement is a combination of strength, stability, and mobility. I would like to be able to do an unassisted pistol squat on both legs equally. Here is an example of myself performing a pistol squat.
The ability of my left leg to do a pistol squat is still not on par with my right leg. To complete this movement, I need to use a very slight assistance from a Trx, or some other suspension trainer. While on my right leg I can complete around 15 unassisted quality reps. When I can do the same number of pistols squat on my left and right leg I will say my leg strength has returned to normal.
The final factor I'm considering is having no fluid accumulation, or calf compensation causing hypertonicity in some of the stringy muscles behind the knee. When they get inflamed they protrude a little and make full knee extension a little difficult. I've been told the fluid accumulation is just the bodies response to protect the knee from new and strenuous activity post-surgery. This seems to be true because the swelling goes down quick and doesn't always return the next time I do the same activity.
At this point I'm extremely happy with my outcome. I've noticed in my day to day life that the arthritis around the inside aspect of my patella has disappeared 99.9% of the time. The only time it flares up is occasionally while I am performing a movement slightly incorrectly and loading my knee too much, or when reintroducing a new activity that I haven't done for a while. While bouncing around on my toes for boxing or jiujitsu I feel very stable. There is no longer any clicking when moving around on the ground and grappling. The next step in my recover is more time. After 9 months I am going to start training jiujitsu and mma at a more competitive level. Be sure to check back in a few months to see how a full return to competitive sport training goes.


text:
President hopes to transform campus from a commuter to a residential
September 16, 2017 Creighton GroveCampus News, NewsCapital Campaign
Laramie County Community College will potentially move away from being a commuter campus to a residential campus.
The Capital Campaign, if passed, will give the college the necessary funds to build a new residence hall. According to LCCC President Dr. Joe Schaffer, the campus has 4,000 to 5,000 students on and off campus everyday, but they only have the facilities to house roughly 270 students.
Schaffer said the college had 598 applicants for the residence halls. For those who don't get into the dorms, Schaffer said they usually do one of three things; find another place to live, go to another college or decide not to go to college.
"For us, I think we really started a commuter campus," Schaffer said. "Then over time we added the first residence halls, we added things like athletics on campus, dining services – things that are much more symbolic resemblement of a residential campus."
Schaffer said a residential campus will bring more young people to Wyoming given there is the issue of finding nice, reasonably priced apartments in Cheyenne. A residential campus appeals to more people outside of Wyoming.
"Vacancy rates for Cheyenne are like 3.5 percent," Schaffer said. "We are sort of neither fish nor fowl in regards to our design."
The dorms are expected to be a mix between a suite and the old dorms. There has also been talk about making the dorms very open with glass windows. Schaffer said there has been discussion about whether each room should have its own bathroom, or if the hall should have a communal shower.
If this plan went through, Schaffer said the college would build it on the residence hall parking lot and move the modular building. The college would also have build a larger parking lot to the west of the residence hall. However, Schaffer said nothing is set in stone yet. The college is using a construction group call Method based in Utah.


As one of the leading manufacturers of laser diode controllers, laser drivers, TEC-drivers and laser coolers Laser Electronics and its products have become synonymous with this innovative technology. Worldwide our products are used in production processes of material processing, for medical lasers, at laser diode manufacterers and in research- and development departments and prove efficient and reliable in a wide range of applications.
Founded in 2003, Laser Electronics was a pioneer in the world of laser diode controllers for applications at laser diode manufacterers, and within a short time, the company established itself as one of the market's technology leaders.
The company's success can be attributed to the competence of its employees – specialists and multifaceted experts from different fields who work together to create innovative and technologically advanced products.
At Laser Electronics, we focus on the creative and disciplined transformation of new ideas into industrial innovations, and we adhere to the highest standards of quality. This enables us to develop customized system solutions that work economically and reliably, even under the toughest production conditions.