Fix error in install_upgrade escript

Fix error in install_upgrade escript

#!/usr/bin/env escript
%%! -noshell -noinput
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%% ex: ft=erlang ts=4 sw=4 et

-define(TIMEOUT, 300000).
-define(INFO(Fmt,Args), io:format(Fmt,Args)).

%% Unpack or upgrade to a new tar.gz release
main(["unpack", RelName, NameTypeArg, NodeName, Cookie, VersionArg]) ->
    TargetNode = start_distribution(NodeName, NameTypeArg, Cookie),
    WhichReleases = which_releases(TargetNode),
    Version = parse_version(VersionArg),
    case proplists:get_value(Version, WhichReleases) of
        undefined ->
            %% not installed, so unpack tarball:
            ?INFO("Release ~s not found, attempting to unpack releases/~s/~s.tar.gz~n",[Version,Version,RelName]),
            ReleasePackage = Version ++ "/" ++ RelName,
            case rpc:call(TargetNode, release_handler, unpack_release,
                          [ReleasePackage], ?TIMEOUT) of
                {ok, Vsn} ->
                    ?INFO("Unpacked successfully: ~p~n", [Vsn]);
                {error, UnpackReason} ->
                    print_existing_versions(TargetNode),
                    ?INFO("Unpack failed: ~p~n",[UnpackReason]),
                    erlang:halt(2)
            end;
        old ->
            %% no need to unpack, has been installed previously
            ?INFO("Release ~s is marked old, switching to it.~n",[Version]);
        unpacked ->
            ?INFO("Release ~s is already unpacked, now installing.~n",[Version]);
        current ->
            ?INFO("Release ~s is already installed and current. Making permanent.~n",[Version]);
        permanent ->
            ?INFO("Release ~s is already installed, and set permanent.~n",[Version])
    end;
main(["install", RelName, NameTypeArg, NodeName, Cookie, VersionArg]) ->
    TargetNode = start_distribution(NodeName, NameTypeArg, Cookie),
    WhichReleases = which_releases(TargetNode),
    Version = parse_version(VersionArg),
    case proplists:get_value(Version, WhichReleases) of
        undefined ->
            %% not installed, so unpack tarball:
            ?INFO("Release ~s not found, attempting to unpack releases/~s/~s.tar.gz~n",[Version,Version,RelName]),
            ReleasePackage = Version ++ "/" ++ RelName,
            case rpc:call(TargetNode, release_handler, unpack_release,
                          [ReleasePackage], ?TIMEOUT) of
                {ok, Vsn} ->
                    ?INFO("Unpacked successfully: ~p~n", [Vsn]),
                    install_and_permafy(TargetNode, RelName, Vsn);
                {error, UnpackReason} ->
                    print_existing_versions(TargetNode),
                    ?INFO("Unpack failed: ~p~n",[UnpackReason]),
                    erlang:halt(2)
            end;
        old ->
            %% no need to unpack, has been installed previously
            ?INFO("Release ~s is marked old, switching to it.~n",[Version]),
            install_and_permafy(TargetNode, RelName, Version);
        unpacked ->
            ?INFO("Release ~s is already unpacked, now installing.~n",[Version]),
            install_and_permafy(TargetNode, RelName, Version);
        current -> %% installed and in-use, just needs to be permanent
            ?INFO("Release ~s is already installed and current. Making permanent.~n",[Version]),
            permafy(TargetNode, RelName, Version);
        permanent ->
            ?INFO("Release ~s is already installed, and set permanent.~n",[Version])
    end;
main(_) ->
    erlang:halt(1).

parse_version(V) when is_list(V) ->
    hd(string:tokens(V,"/")).

install_and_permafy(TargetNode, RelName, Vsn) ->
    case rpc:call(TargetNode, release_handler, check_install_release, [Vsn], ?TIMEOUT) of
        {ok, _OtherVsn, _Desc} ->
            ok;
        {error, Reason} ->
            ?INFO("ERROR: release_handler:check_install_release failed: ~p~n",[Reason]),
            erlang:halt(3)
    end,
    case rpc:call(TargetNode, release_handler, install_release, [Vsn], ?TIMEOUT) of
        {ok, _, _} ->
            ?INFO("Installed Release: ~s~n", [Vsn]),
            permafy(TargetNode, RelName, Vsn),
            ok;
        {error, {no_such_release, Vsn}} ->
            VerList =
                iolist_to_binary(
                    [io_lib:format("* ~s\t~s~n",[V,S]) ||  {V,S} <- which_releases(TargetNode)]),
            ?INFO("Installed versions:~n~s", [VerList]),
            ?INFO("ERROR: Unable to revert to '~s' - not installed.~n", [Vsn]),
            erlang:halt(2);
        %% As described in http://erlang.org/doc/man/appup.html,
        %% when executing a relup containing soft_purge instructions:
        %%     If the value is soft_purge, release_handler:install_release/1
        %%     returns {error, {old_processes, Mod}}
        {error, {old_processes, Mod}} ->
            ?INFO("ERROR: unable to install '~s' - old processes still running code from ~p~n",
                  [Vsn, Mod]),
            erlang:halt(3);
        {error, InstallFailedReason} ->
            ?INFO("ERROR: release_handler:install_release failed: ~p~n", [InstallFailedReason]),
            erlang:halt(3)
    end.

permafy(TargetNode, RelName, Vsn) ->
    ok = rpc:call(TargetNode, release_handler, make_permanent, [Vsn], ?TIMEOUT),
    file:copy(filename:join(["bin", RelName++"-"++Vsn]),
              filename:join(["bin", RelName])),
    ?INFO("Made release permanent: ~p~n", [Vsn]),
    ok.

which_releases(TargetNode) ->
    R = rpc:call(TargetNode, release_handler, which_releases, [], ?TIMEOUT),
    [ {V, S} ||  {_,V,_, S} <- R ].

print_existing_versions(TargetNode) ->
    VerList = iolist_to_binary([
            io_lib:format("* ~s\t~s~n",[V,S])
            ||  {V,S} <- which_releases(TargetNode) ]),
    ?INFO("Installed versions:~n~s", [VerList]).

start_distribution(NodeName, NameTypeArg, Cookie) ->
    MyNode = make_script_node(NodeName),
    {ok, _Pid} = net_kernel:start([MyNode, get_name_type(NameTypeArg)]),
    erlang:set_cookie(node(), list_to_atom(Cookie)),
    TargetNode = list_to_atom(NodeName),
    case {net_kernel:connect_node(TargetNode),
          net_adm:ping(TargetNode)} of
        {true, pong} ->
            ok;
        {_, pang} ->
            io:format("Node ~p not responding to pings.\n", [TargetNode]),
            erlang:halt(1)
    end,
    {ok, Cwd} = file:get_cwd(),
    ok = rpc:call(TargetNode, file, set_cwd, [Cwd], ?TIMEOUT),
    TargetNode.

make_script_node(Node) ->
    [Name, Host] = string:tokens(Node, "@"),
    list_to_atom(lists:concat([Name, "_upgrader_", os:getpid(), "@", Host])).

%% get name type from arg
get_name_type(NameTypeArg) ->
  case NameTypeArg of
    "-sname" ->
      shortnames;
    _ ->
      longnames
  end.

#!/usr/bin/env escript
%%! -noshell -noinput
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%% ex: ft=erlang ts=4 sw=4 et

-define(TIMEOUT, 300000).
-define(INFO(Fmt,Args), io:format(Fmt,Args)).

%% Unpack or upgrade to a new tar.gz release
main(["unpack", RelName, NameTypeArg, NodeName, Cookie, VersionArg]) ->
    TargetNode = start_distribution(NodeName, NameTypeArg, Cookie),
    WhichReleases = which_releases(TargetNode),
    Version = parse_version(VersionArg),
    case proplists:get_value(Version, WhichReleases) of
        undefined ->
            %% not installed, so unpack tarball:
            ?INFO("Release ~s not found, attempting to unpack releases/~s/~s.tar.gz~n",[Version,Version,RelName]),
            ReleasePackage = Version ++ "/" ++ RelName,
            case rpc:call(TargetNode, release_handler, unpack_release,
                          [ReleasePackage], ?TIMEOUT) of
                {ok, Vsn} ->
                    ?INFO("Unpacked successfully: ~p~n", [Vsn]);
                {error, UnpackReason} ->
                    print_existing_versions(TargetNode),
                    ?INFO("Unpack failed: ~p~n",[UnpackReason]),
                    erlang:halt(2)
            end;
        old ->
            %% no need to unpack, has been installed previously
            ?INFO("Release ~s is marked old, switching to it.~n",[Version]);
        unpacked ->
            ?INFO("Release ~s is already unpacked, now installing.~n",[Version]);
        current ->
            ?INFO("Release ~s is already installed and current. Making permanent.~n",[Version]);
        permanent ->
            ?INFO("Release ~s is already installed, and set permanent.~n",[Version])
    end;
main(["install", RelName, NameTypeArg, NodeName, Cookie, VersionArg]) ->
    TargetNode = start_distribution(NodeName, NameTypeArg, Cookie),
    WhichReleases = which_releases(TargetNode),
    Version = parse_version(VersionArg),
    case proplists:get_value(Version, WhichReleases) of
        undefined ->
            %% not installed, so unpack tarball:
            ?INFO("Release ~s not found, attempting to unpack releases/~s/~s.tar.gz~n",[Version,Version,RelName]),
            ReleasePackage = Version ++ "/" ++ RelName,
            case rpc:call(TargetNode, release_handler, unpack_release,
                          [ReleasePackage], ?TIMEOUT) of
                {ok, Vsn} ->
                    ?INFO("Unpacked successfully: ~p~n", [Vsn]),
                    install_and_permafy(TargetNode, RelName, Vsn);
                {error, UnpackReason} ->
                    print_existing_versions(TargetNode),
                    ?INFO("Unpack failed: ~p~n",[UnpackReason]),
                    erlang:halt(2)
            end;
        old ->
            %% no need to unpack, has been installed previously
            ?INFO("Release ~s is marked old, switching to it.~n",[Version]),
            install_and_permafy(TargetNode, RelName, Version);
        unpacked ->
            ?INFO("Release ~s is already unpacked, now installing.~n",[Version]),
            install_and_permafy(TargetNode, RelName, Version);
        current -> %% installed and in-use, just needs to be permanent
            ?INFO("Release ~s is already installed and current. Making permanent.~n",[Version]),
            permafy(TargetNode, RelName, Version);
        permanent ->
            ?INFO("Release ~s is already installed, and set permanent.~n",[Version])
    end;
main(_) ->
    erlang:halt(1).

parse_version(V) when is_list(V) ->
    hd(string:tokens(V,"/")).

install_and_permafy(TargetNode, RelName, Vsn) ->
    case rpc:call(TargetNode, release_handler, check_install_release, [Vsn], ?TIMEOUT) of
        {ok, _OtherVsn, _Desc} ->
            ok;
        {error, Reason} ->
            ?INFO("ERROR: release_handler:check_install_release failed: ~p~n",[Reason]),
            erlang:halt(3)
    end,
    case rpc:call(TargetNode, release_handler, install_release, [Vsn], ?TIMEOUT) of
        {ok, _, _} ->
            ?INFO("Installed Release: ~s~n", [Vsn]),
            permafy(TargetNode, RelName, Vsn),
            ok;
        {error, {no_such_release, Vsn}} ->
            VerList =
                iolist_to_binary(
                    [io_lib:format("* ~s\t~s~n",[V,S]) ||  {V,S} <- which_releases(TargetNode)]),
            ?INFO("Installed versions:~n~s", [VerList]),
            ?INFO("ERROR: Unable to revert to '~s' - not installed.~n", [Vsn]),
            erlang:halt(2);
        %% As described in http://erlang.org/doc/man/appup.html,
        %% when executing a relup containing soft_purge instructions:
        %%     If the value is soft_purge, release_handler:install_release/1
        %%     returns {error, {old_processes, Mod}}
        {error, {old_processes, Mod}} ->
            ?INFO("ERROR: unable to install '~s' - old processes still running code from ~p~n",
                  [Vsn, Mod]),
            erlang:halt(3);
        {error, Reason} ->
            ?INFO("ERROR: release_handler:install_release failed: ~p~n", [Reason]),
            erlang:halt(3)
    end.

permafy(TargetNode, RelName, Vsn) ->
    ok = rpc:call(TargetNode, release_handler, make_permanent, [Vsn], ?TIMEOUT),
    file:copy(filename:join(["bin", RelName++"-"++Vsn]),
              filename:join(["bin", RelName])),
    ?INFO("Made release permanent: ~p~n", [Vsn]),
    ok.

which_releases(TargetNode) ->
    R = rpc:call(TargetNode, release_handler, which_releases, [], ?TIMEOUT),
    [ {V, S} ||  {_,V,_, S} <- R ].

print_existing_versions(TargetNode) ->
    VerList = iolist_to_binary([
            io_lib:format("* ~s\t~s~n",[V,S])
            ||  {V,S} <- which_releases(TargetNode) ]),
    ?INFO("Installed versions:~n~s", [VerList]).

start_distribution(NodeName, NameTypeArg, Cookie) ->
    MyNode = make_script_node(NodeName),
    {ok, _Pid} = net_kernel:start([MyNode, get_name_type(NameTypeArg)]),
    erlang:set_cookie(node(), list_to_atom(Cookie)),
    TargetNode = list_to_atom(NodeName),
    case {net_kernel:connect_node(TargetNode),
          net_adm:ping(TargetNode)} of
        {true, pong} ->
            ok;
        {_, pang} ->
            io:format("Node ~p not responding to pings.\n", [TargetNode]),
            erlang:halt(1)
    end,
    {ok, Cwd} = file:get_cwd(),
    ok = rpc:call(TargetNode, file, set_cwd, [Cwd], ?TIMEOUT),
    TargetNode.

make_script_node(Node) ->
    [Name, Host] = string:tokens(Node, "@"),
    list_to_atom(lists:concat([Name, "_upgrader_", os:getpid(), "@", Host])).

%% get name type from arg
get_name_type(NameTypeArg) ->
  case NameTypeArg of
    "-sname" ->
      shortnames;
    _ ->
      longnames
  end.


Unset CDPATH in main shell script

Unset CDPATH in main shell script

#!/usr/bin/env bash

set -e

# Set DEBUG_BOOT to output verbose debugging info during execution
if [ ! -z "$DEBUG_BOOT" ]; then
    export PS4='+\D{%s} '
    set -x
fi

unset CDPATH

# Name of the release
REL_NAME="${REL_NAME:-<%= release_name %>}"
# Current version of the release
REL_VSN="${REL_VSN:-<%= release_version %>}"
# Options passed to erl
ERL_OPTS="${ERL_OPTS:-<%= release.profile.erl_opts %>}"
# Environment variables for run_erl
RUN_ERL_ENV="${RUN_ERL_ENV:-<%= release.profile.run_erl_env %>}"
# Current version of ERTS being used
# If this is not present/unset, it will be detected
<%= if ((is_binary(include_erts) or include_erts) and not is_nil(erts_vsn)) do %>ERTS_VSN="${ERTS_VSN:-<%= erts_vsn %>}"<% end %>
DISTILLERY_VSN="<%= Application.spec(:distillery, :vsn) %>"
export REL_NAME
export REL_VSN
export ERL_OPTS
export RUN_ERL_ENV
export ERTS_VSN
export DISTILLERY_VSN

# If readlink has no -f option, or greadlink is not available,
# This function behaves like `readlink -f`
__bootstrap_readlink_f() {
    __target_file="$1"
    cd "$(dirname "$__target_file")"
    __target_file=$(basename "$__target_file")

    # Iterate down a (possible) chain of symlinks
    while [ -L "$__target_file" ]
    do
        __target_file=$(readlink "$__target_file")
        cd "$(dirname "$__target_file")"
        __target_file=$(basename "$__target_file")
    done
    # Compute the canonicalized name by finding the physical path
    # for the directory we're in and appending the target file.
    __phys_dir=$(pwd -P)
    __result="$__phys_dir/$__target_file"
    echo "$__result"
}

# Locate the real path to this script
if uname | grep -q 'Darwin'; then
    # on OSX, best to install coreutils from homebrew or similar
    # to get greadlink
    if command -v greadlink >/dev/null 2>&1; then
        SCRIPT="${SCRIPT:-$(greadlink -f "$0")}"
    else
        SCRIPT="${SCRIPT:-$(__bootstrap_readlink_f "$0")}"
    fi
else
    SCRIPT="${SCRIPT:-$(readlink -f "$0" )}"
fi

export ESCRIPT_NAME
ESCRIPT_NAME="${ESCRIPT_NAME:-$SCRIPT}"

# Parent directory of this script
SCRIPT_DIR="$(dirname "${SCRIPT}")"
# Root directory of all releases
RELEASE_ROOT_DIR="${RELEASE_ROOT_DIR:-$(dirname "$(dirname "${SCRIPT_DIR}")")}"
# The location of builtin command scripts
RELEASE_LIBEXEC_DIR="$SCRIPT_DIR/libexec"

# shellcheck source=../libexec/readlink.sh
. "$RELEASE_LIBEXEC_DIR/readlink.sh"
# shellcheck source=../libexec/logger.sh
. "$RELEASE_LIBEXEC_DIR/logger.sh"
# shellcheck source=../libexec/erts.sh
. "$RELEASE_LIBEXEC_DIR/erts.sh"
# shellcheck source=../libexec/helpers.sh
. "$RELEASE_LIBEXEC_DIR/helpers.sh"
# shellcheck source=../libexec/env.sh
. "$RELEASE_LIBEXEC_DIR/env.sh"
# shellcheck source=../libexec/config.sh
. "$RELEASE_LIBEXEC_DIR/config.sh"

# Make the release root our working directory
cd "$RELEASE_ROOT_DIR"

# We export this so that custom tasks in Elixir
# which need to know how they were invoked can
# check this environment variable.
export DISTILLERY_TASK="$1"

# All commands are loaded from the currently active release
COMMAND_DIR="$RELEASE_LIBEXEC_DIR/commands"
COMMAND_NAME="${1:-help}"
COMMAND_PATH="$COMMAND_DIR/$COMMAND_NAME.sh"

# Only shift if there is more than 0 args, or it will exit non-zero
if [ "$#" -ne 0 ]; then
   shift
fi

# Handle aliases
case $COMMAND_NAME in
    start|start_boot)
        configure_release
        . "$COMMAND_DIR/start.sh" "$COMMAND_NAME" "$@"
        ;;
    upgrade|downgrade|install)
        configure_release
        . "$COMMAND_DIR/install.sh" "$COMMAND_NAME" "$@"
        ;;
    console|console_clean|console_boot)
        configure_release
        . "$COMMAND_DIR/console.sh" "$COMMAND_NAME" "$@"
        ;;
    *)
        # If the command exists in libexec, execute
        # Otherwise check to see if it's the name of a custom command
        if [ -f "$COMMAND_PATH" ]; then
            configure_release
            . "$COMMAND_PATH" "$@"
        else
            COMMAND_PATH="$REL_DIR/commands/$COMMAND_NAME.sh"
            if [ -f "$COMMAND_PATH" ]; then
                configure_release
                require_cookie
                . "$COMMAND_PATH" "$@"
            else
                notice "'$COMMAND_NAME' is not a valid command"
                . "$COMMAND_DIR/help.sh"
            fi
        fi
        ;;
esac

#!/usr/bin/env bash

set -e

# Set DEBUG_BOOT to output verbose debugging info during execution
if [ ! -z "$DEBUG_BOOT" ]; then
    export PS4='+\D{%s} '
    set -x
fi

# Name of the release
REL_NAME="${REL_NAME:-<%= release_name %>}"
# Current version of the release
REL_VSN="${REL_VSN:-<%= release_version %>}"
# Options passed to erl
ERL_OPTS="${ERL_OPTS:-<%= release.profile.erl_opts %>}"
# Environment variables for run_erl
RUN_ERL_ENV="${RUN_ERL_ENV:-<%= release.profile.run_erl_env %>}"
# Current version of ERTS being used
# If this is not present/unset, it will be detected
<%= if ((is_binary(include_erts) or include_erts) and not is_nil(erts_vsn)) do %>ERTS_VSN="${ERTS_VSN:-<%= erts_vsn %>}"<% end %>
DISTILLERY_VSN="<%= Application.spec(:distillery, :vsn) %>"
export REL_NAME
export REL_VSN
export ERL_OPTS
export RUN_ERL_ENV
export ERTS_VSN
export DISTILLERY_VSN

# If readlink has no -f option, or greadlink is not available,
# This function behaves like `readlink -f`
__bootstrap_readlink_f() {
    __target_file="$1"
    cd "$(dirname "$__target_file")"
    __target_file=$(basename "$__target_file")

    # Iterate down a (possible) chain of symlinks
    while [ -L "$__target_file" ]
    do
        __target_file=$(readlink "$__target_file")
        cd "$(dirname "$__target_file")"
        __target_file=$(basename "$__target_file")
    done
    # Compute the canonicalized name by finding the physical path
    # for the directory we're in and appending the target file.
    __phys_dir=$(pwd -P)
    __result="$__phys_dir/$__target_file"
    echo "$__result"
}

# Locate the real path to this script
if uname | grep -q 'Darwin'; then
    # on OSX, best to install coreutils from homebrew or similar
    # to get greadlink
    if command -v greadlink >/dev/null 2>&1; then
        SCRIPT="${SCRIPT:-$(greadlink -f "$0")}"
    else
        SCRIPT="${SCRIPT:-$(__bootstrap_readlink_f "$0")}"
    fi
else
    SCRIPT="${SCRIPT:-$(readlink -f "$0" )}"
fi

export ESCRIPT_NAME
ESCRIPT_NAME="${ESCRIPT_NAME:-$SCRIPT}"

# Parent directory of this script
SCRIPT_DIR="$(dirname "${SCRIPT}")"
# Root directory of all releases
RELEASE_ROOT_DIR="${RELEASE_ROOT_DIR:-$(dirname "$(dirname "${SCRIPT_DIR}")")}"
# The location of builtin command scripts
RELEASE_LIBEXEC_DIR="$SCRIPT_DIR/libexec"

# shellcheck source=../libexec/readlink.sh
. "$RELEASE_LIBEXEC_DIR/readlink.sh"
# shellcheck source=../libexec/logger.sh
. "$RELEASE_LIBEXEC_DIR/logger.sh"
# shellcheck source=../libexec/erts.sh
. "$RELEASE_LIBEXEC_DIR/erts.sh"
# shellcheck source=../libexec/helpers.sh
. "$RELEASE_LIBEXEC_DIR/helpers.sh"
# shellcheck source=../libexec/env.sh
. "$RELEASE_LIBEXEC_DIR/env.sh"
# shellcheck source=../libexec/config.sh
. "$RELEASE_LIBEXEC_DIR/config.sh"

# Make the release root our working directory
cd "$RELEASE_ROOT_DIR"

# We export this so that custom tasks in Elixir
# which need to know how they were invoked can
# check this environment variable.
export DISTILLERY_TASK="$1"

# All commands are loaded from the currently active release
COMMAND_DIR="$RELEASE_LIBEXEC_DIR/commands"
COMMAND_NAME="${1:-help}"
COMMAND_PATH="$COMMAND_DIR/$COMMAND_NAME.sh"

# Only shift if there is more than 0 args, or it will exit non-zero
if [ "$#" -ne 0 ]; then
   shift
fi

# Handle aliases
case $COMMAND_NAME in
    start|start_boot)
        configure_release
        . "$COMMAND_DIR/start.sh" "$COMMAND_NAME" "$@"
        ;;
    upgrade|downgrade|install)
        configure_release
        . "$COMMAND_DIR/install.sh" "$COMMAND_NAME" "$@"
        ;;
    console|console_clean|console_boot)
        configure_release
        . "$COMMAND_DIR/console.sh" "$COMMAND_NAME" "$@"
        ;;
    *)
        # If the command exists in libexec, execute
        # Otherwise check to see if it's the name of a custom command
        if [ -f "$COMMAND_PATH" ]; then
            configure_release
            . "$COMMAND_PATH" "$@"
        else
            COMMAND_PATH="$REL_DIR/commands/$COMMAND_NAME.sh"
            if [ -f "$COMMAND_PATH" ]; then
                configure_release
                require_cookie
                . "$COMMAND_PATH" "$@"
            else
                notice "'$COMMAND_NAME' is not a valid command"
                . "$COMMAND_DIR/help.sh"
            fi
        fi
        ;;
esac


set autofocus for chat form

set autofocus for chat form

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= text_input f, :body, required: true, autocomplete: "off", class: "form-control", placeholder: "Chat with your class mates...", autofocus: true %>

      <%= submit "Send", class: "btn btn-primary" %>

<% end %>

<%= form_for @changeset, @action, fn f -> %>
  <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

  <% end %>

    <%= text_input f, :body, required: true, autocomplete: "off", class: "form-control", placeholder: "Chat with your class mates..." %>

      <%= submit "Send", class: "btn btn-primary" %>

<% end %>


Bugfix

Bugfix

<%# header tag begins in parent template %>
  <div class="profile-header<%= if @user.verified, do: " profile-header--verified" %>">

      <img src="<%= Vutuv.Avatar.binary(@user, :medium) %>" width="130", height="130" alt="Avatar of <%= full_name(@user) %>">

        <%= full_name(@user) %>
        <%= if !@user.verified and admin_visitor?(@conn) do %>
          <%= button to: admin_user_path(@conn, :update, user_id: @user.id), class: "button button--icon navigation__icon", form: [class: "button button--icon"], method: "post" do %>
            <i title="<%= gettext("Verify") %>" class="icon icon--lock">
          <% end %>
        <% end %>
        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_path(@conn, :edit, @user), class: "profile-header__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

        <%= work_information_string(@user, 50) %>

    <%= if @user.verified do %>
      Verified profile
    <% end %>

        <%= if(@follower_count>0) do %>

<%= short_name(@user) %> <%= gettext "has" %><%= @follower_count %> <%= gettext "followers" %>

        <% end %>
        <%= if is_visitor?(@conn, @current_user) do %>
          <%= if user_follows_user?(@current_user, @user) do %>
            <%= button to: connection_path(@conn, :delete, user_follows_user?(@current_user, @user)), method: :delete , class: "button button-link button--unfollow", form: [class: "button--unfollow"] do %>
               Unfollow
            <% end %>
          <%= else %>
            <%= button to: connection_path(@conn, :create, connection: %{follower_id: @current_user_id, followee_id: @user.id}), method: :post, class: "button button-link", form: [class: "button--slim"] do %>
               Follow
            <% end %>
          <% end %>
        <% end %>

<%= render Vutuv.LayoutView, "flash.html", assigns %>

  <%= gettext "Users" %> / <%= full_name @user %>

  <%= if @display_welcome_message do %>
    <%= if same_user?(@user, @current_user) do %>
      <%= if Enum.count(@user_skills) == 0 do %>

<%= gettext "Your New vutuv Profile Page" %>

            <%= gettext "Please take a couple of minutes to add information that might be interesting for your future followers. Why don't you start with your skills and work experiences?" %>

      <% end %>
    <% end %>
  <% end %>

  <%= if Enum.count(@user_skills) > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Skills" %>

    <%= if Enum.count(@user_skills) > 0 do %>
    <%= render Vutuv.UserSkillView, "card_list.html", assigns %>
    <% end %>

    <%= if same_user?(@user, @current_user) do %>
      <% #Form for easy skill entry %>
      <%= if Enum.count(@user_skills) == 0 do %>
        <%= form_for @conn, user_path(@conn, :skills_create, @user), [as: :skills, class: "editform"], fn f -> %>
          <div class="editform__field<%= if error_tag(f, :name), do: " editform__field--error"%>">
            <%= label f, :skills, gettext("Enter comma separated skills here. Max length per skill: 45 characters") %>
            <%= text_input f, :skills, placeholder: gettext("PHP, JavaScript, Tap Dancing, Origami, Recruiting"), autofocus: true %>
            <%= error_tag f, :skills %>

            <%= submit gettext("Add"), class: "button button--full" %>

        <% end %>
      <% end %>
    <% end %>

    <%= if Enum.count(@user_skills) > 0 && (same_user?(@user, @current_user) || @total_user_skills > 10)do %>

        <%= if same_user?(@user, @current_user) do %>
          <%= link gettext("Add"), to: user_user_skill_path(@conn, :new, @current_user) %>
        <% end %>
        <%= if same_user?(@user, @current_user) and @total_user_skills > 10 do %> | <% end %>
        <%= if @total_user_skills > 10 do %>
          <%= link gettext("View All"), to: user_user_skill_path(@conn, :index, @user)%>
        <% end %>

    <% end %>

  <% end %>

    <%= render Vutuv.SharedView, "_ad.html" %>

    <%= if(Enum.count(@emails) > 0 or same_user?(@user, @current_user)) do %>

      <%= if same_user?(@user, @current_user) do %>
      <%= link to: user_email_path(@conn, :index, @user), class: "card__edit button button--icon button--small" do %>

      <% end %>
      <% end %>

<%= gettext "Contact" %>

      <%= if(Enum.count(@emails) > 0) do %>

<%= if (Enum.count(@emails) == 1), do: gettext("Email"), else: gettext("Emails") %>

        <%= for email <- @emails do %>

<a href="mailto:<%= email.value %>"><%= email.value %>

        <% end %>

      <% end %>

        <%= if same_user?(@user, @current_user) do %>
          <%= link gettext("Add"), to: user_email_path(@conn, :new, @current_user) %>
        <% end %>

    <% end %>

    <%= if(@user.headline || @user.birthdate || same_user?(@user, @current_user)) do %>

        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_path(@conn, :edit, @user), class: "card__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

<%= gettext "General Info" %>

        <%= if @user.headline || same_user?(@user, @current_user) do %>

<%= @user.headline %>

        <% end %>

          <%= if(@user.gender != "other" && @user.gender) do %>

<%= gettext "Gender" %>

<%= Vutuv.User.gender_gettext(@user.gender) %>

          <% end %>
          <%= if(@user.birthdate) do %>

<%= gettext "Birthday" %>

<%= format_birthdate(@user) %>

          <% end %>

    <% end %>

    <%= if Enum.count(@user.social_media_accounts) > 0 or same_user?(@user, @current_user) do %>

        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_social_media_account_path(@conn, :index, @user), class: "card__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

<%= gettext "Social Media" %>

        <%= for account <- @user.social_media_accounts do %>

<%= account.provider %>

<%= Vutuv.SocialMediaAccount.social_media_link account %>

        <% end %>

          <%= if same_user?(@user, @current_user) do %>
            <%= link gettext("Add"), to: user_social_media_account_path(@conn, :new, @current_user) %>
          <% end %>

    <% end %>

<%= gettext "Exports" %>

<%= gettext "Vcard" %>

<%= link gettext("Download"), to: api_user_v_card_path(@conn, :get, @user) %>

  <section class="card half<%= if @follower_count == 0, do: " card--empty" %>">

<%= gettext "Followers" %>

    <%= if(@follower_count > 0) do %>

    <%= render "card_list.html", conn: @conn, users: @user.followers, current_user: @current_user, current_user_id: @current_user_id, work_string_length: 20 %>

    <% else %>

<%= gettext "No Followers yet!" %>

    <% end %>
    <%= if(@follower_count > 3) do %>
      <%= link "#{@follower_count-3} #{gettext "More"}", to: user_follower_path(@conn, :index, @user), class: "card__morelink" %>
    <% end %>

<%= gettext "Following" %>

    <%= if(@followee_count > 0) do %>

    <%= render "card_list.html", conn: @conn, users: @user.followees, current_user: @current_user, current_user_id: @current_user_id, work_string_length: 20 %>

    <% else %>

<%= gettext "Not following anyone yet!" %>

    <% end %>
    <%= if(@followee_count > 3) do %>
      <%= link "#{@followee_count-3} #{gettext "More"}", to: user_followee_path(@conn, :index, @user), class: "card__morelink" %>
    <% end %>

    <%= if @total_jobs > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Experience" %>

    <%= if @total_jobs > 0 do %>
    <%= render Vutuv.WorkExperienceView, "card_list.html", assigns %>

    <% else %>

    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_work_experience_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_jobs > 5 do %> | <% end %>
      <%= if @total_jobs > 5 do %>
        <%= link gettext("View All"), to: user_work_experience_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_numbers > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Phone Numbers" %>

    <%= if @total_numbers > 0 do %>
    <%= render Vutuv.PhoneNumberView, "card_list.html", phone_numbers: @user.phone_numbers, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_phone_number_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_numbers > 5 do %> | <% end %>
      <%= if @total_numbers > 5 do %>
        <%= link gettext("View All"), to: user_phone_number_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_links > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Links" %>

    <%= if @total_links > 0 do %>
    <%= render Vutuv.UrlView, "card_list.html", urls: @user.urls, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_url_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_links > 5 do %> | <% end %>
      <%= if @total_links > 5 do %>
        <%= link gettext("View All"), to: user_url_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_addresses > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Addresses" %>

    <%= if @total_addresses > 0 do %>
    <%= render Vutuv.AddressView, "card_list.html", addresses: @user.addresses, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_address_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_addresses > 5 do %> | <% end %>
      <%= if @total_addresses > 5 do %>
        <%= link gettext("View All"), to: user_address_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

<%# header tag begins in parent template %>
  <div class="profile-header<%= if @user.verified, do: " profile-header--verified" %>">

      <img src="<%= Vutuv.Avatar.binary(@user, :medium) %>" width="130", height="130", alt="Avatar of <%= full_name(@user) %>">

        <%= full_name(@user) %>
        <%= if !@user.verified and admin_visitor?(@conn) do %>
          <%= button to: admin_user_path(@conn, :update, user_id: @user.id), class: "button button--icon navigation__icon", form: [class: "button button--icon"], method: "post" do %>
            <i title="<%= gettext("Verify") %>" class="icon icon--lock">
          <% end %>
        <% end %>
        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_path(@conn, :edit, @user), class: "profile-header__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

        <%= work_information_string(@user, 50) %>

    <%= if @user.verified do %>
      Verified profile
    <% end %>

        <%= if(@follower_count>0) do %>

<%= short_name(@user) %> <%= gettext "has" %><%= @follower_count %> <%= gettext "followers" %>

        <% end %>
        <%= if is_visitor?(@conn, @current_user) do %>
          <%= if user_follows_user?(@current_user, @user) do %>
            <%= button to: connection_path(@conn, :delete, user_follows_user?(@current_user, @user)), method: :delete , class: "button button-link button--unfollow", form: [class: "button--unfollow"] do %>
               Unfollow
            <% end %>
          <%= else %>
            <%= button to: connection_path(@conn, :create, connection: %{follower_id: @current_user_id, followee_id: @user.id}), method: :post, class: "button button-link", form: [class: "button--slim"] do %>
               Follow
            <% end %>
          <% end %>
        <% end %>

<%= render Vutuv.LayoutView, "flash.html", assigns %>

  <%= gettext "Users" %> / <%= full_name @user %>

  <%= if @display_welcome_message do %>
    <%= if same_user?(@user, @current_user) do %>
      <%= if Enum.count(@user_skills) == 0 do %>

<%= gettext "Your New vutuv Profile Page" %>

            <%= gettext "Please take a couple of minutes to add information that might be interesting for your future followers. Why don't you start with your skills and work experiences?" %>

      <% end %>
    <% end %>
  <% end %>

  <%= if Enum.count(@user_skills) > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Skills" %>

    <%= if Enum.count(@user_skills) > 0 do %>
    <%= render Vutuv.UserSkillView, "card_list.html", assigns %>
    <% end %>

    <%= if same_user?(@user, @current_user) do %>
      <% #Form for easy skill entry %>
      <%= if Enum.count(@user_skills) == 0 do %>
        <%= form_for @conn, user_path(@conn, :skills_create, @user), [as: :skills, class: "editform"], fn f -> %>
          <div class="editform__field<%= if error_tag(f, :name), do: " editform__field--error"%>">
            <%= label f, :skills, gettext("Enter comma separated skills here. Max length per skill: 45 characters") %>
            <%= text_input f, :skills, placeholder: gettext("PHP, JavaScript, Tap Dancing, Origami, Recruiting"), autofocus: true %>
            <%= error_tag f, :skills %>

            <%= submit gettext("Add"), class: "button button--full" %>

        <% end %>
      <% end %>
    <% end %>

    <%= if Enum.count(@user_skills) > 0 && (same_user?(@user, @current_user) || @total_user_skills > 10)do %>

        <%= if same_user?(@user, @current_user) do %>
          <%= link gettext("Add"), to: user_user_skill_path(@conn, :new, @current_user) %>
        <% end %>
        <%= if same_user?(@user, @current_user) and @total_user_skills > 10 do %> | <% end %>
        <%= if @total_user_skills > 10 do %>
          <%= link gettext("View All"), to: user_user_skill_path(@conn, :index, @user)%>
        <% end %>

    <% end %>

  <% end %>

    <%= render Vutuv.SharedView, "_ad.html" %>

    <%= if(Enum.count(@emails) > 0 or same_user?(@user, @current_user)) do %>

      <%= if same_user?(@user, @current_user) do %>
      <%= link to: user_email_path(@conn, :index, @user), class: "card__edit button button--icon button--small" do %>

      <% end %>
      <% end %>

<%= gettext "Contact" %>

      <%= if(Enum.count(@emails) > 0) do %>

<%= if (Enum.count(@emails) == 1), do: gettext("Email"), else: gettext("Emails") %>

        <%= for email <- @emails do %>

<a href="mailto:<%= email.value %>"><%= email.value %>

        <% end %>

      <% end %>

        <%= if same_user?(@user, @current_user) do %>
          <%= link gettext("Add"), to: user_email_path(@conn, :new, @current_user) %>
        <% end %>

    <% end %>

    <%= if(@user.headline || @user.birthdate || same_user?(@user, @current_user)) do %>

        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_path(@conn, :edit, @user), class: "card__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

<%= gettext "General Info" %>

        <%= if @user.headline || same_user?(@user, @current_user) do %>

<%= @user.headline %>

        <% end %>

          <%= if(@user.gender != "other" && @user.gender) do %>

<%= gettext "Gender" %>

<%= Vutuv.User.gender_gettext(@user.gender) %>

          <% end %>
          <%= if(@user.birthdate) do %>

<%= gettext "Birthday" %>

<%= format_birthdate(@user) %>

          <% end %>

    <% end %>

    <%= if Enum.count(@user.social_media_accounts) > 0 or same_user?(@user, @current_user) do %>

        <%= if same_user?(@user, @current_user) do %>
        <%= link to: user_social_media_account_path(@conn, :index, @user), class: "card__edit button button--icon button--small" do %>

        <% end %>
        <% end %>

<%= gettext "Social Media" %>

        <%= for account <- @user.social_media_accounts do %>

<%= account.provider %>

<%= Vutuv.SocialMediaAccount.social_media_link account %>

        <% end %>

          <%= if same_user?(@user, @current_user) do %>
            <%= link gettext("Add"), to: user_social_media_account_path(@conn, :new, @current_user) %>
          <% end %>

    <% end %>

<%= gettext "Exports" %>

<%= gettext "Vcard" %>

<%= link gettext("Download"), to: api_user_v_card_path(@conn, :get, @user) %>

  <section class="card half<%= if @follower_count == 0, do: " card--empty" %>">

<%= gettext "Followers" %>

    <%= if(@follower_count > 0) do %>

    <%= render "card_list.html", conn: @conn, users: @user.followers, current_user: @current_user, current_user_id: @current_user_id, work_string_length: 20 %>

    <% else %>

<%= gettext "No Followers yet!" %>

    <% end %>
    <%= if(@follower_count > 3) do %>
      <%= link "#{@follower_count-3} #{gettext "More"}", to: user_follower_path(@conn, :index, @user), class: "card__morelink" %>
    <% end %>

<%= gettext "Following" %>

    <%= if(@followee_count > 0) do %>

    <%= render "card_list.html", conn: @conn, users: @user.followees, current_user: @current_user, current_user_id: @current_user_id, work_string_length: 20 %>

    <% else %>

<%= gettext "Not following anyone yet!" %>

    <% end %>
    <%= if(@followee_count > 3) do %>
      <%= link "#{@followee_count-3} #{gettext "More"}", to: user_followee_path(@conn, :index, @user), class: "card__morelink" %>
    <% end %>

    <%= if @total_jobs > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Experience" %>

    <%= if @total_jobs > 0 do %>
    <%= render Vutuv.WorkExperienceView, "card_list.html", assigns %>

    <% else %>

    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_work_experience_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_jobs > 5 do %> | <% end %>
      <%= if @total_jobs > 5 do %>
        <%= link gettext("View All"), to: user_work_experience_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_numbers > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Phone Numbers" %>

    <%= if @total_numbers > 0 do %>
    <%= render Vutuv.PhoneNumberView, "card_list.html", phone_numbers: @user.phone_numbers, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_phone_number_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_numbers > 5 do %> | <% end %>
      <%= if @total_numbers > 5 do %>
        <%= link gettext("View All"), to: user_phone_number_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_links > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Links" %>

    <%= if @total_links > 0 do %>
    <%= render Vutuv.UrlView, "card_list.html", urls: @user.urls, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_url_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_links > 5 do %> | <% end %>
      <%= if @total_links > 5 do %>
        <%= link gettext("View All"), to: user_url_path(@conn, :index, @user) %>
      <% end %>

  <% end %>

  <%= if @total_addresses > 0 or same_user?(@user, @current_user) do %>

<%= gettext "Addresses" %>

    <%= if @total_addresses > 0 do %>
    <%= render Vutuv.AddressView, "card_list.html", addresses: @user.addresses, user: @user, conn: @conn, current_user: @current_user %>
    <% end %>

      <%= if same_user?(@user, @current_user) do %>
        <%= link gettext("Add"), to: user_address_path(@conn, :new, @current_user) %>
      <% end %>
      <%= if same_user?(@user, @current_user) and @total_addresses > 5 do %> | <% end %>
      <%= if @total_addresses > 5 do %>
        <%= link gettext("View All"), to: user_address_path(@conn, :index, @user) %>
      <% end %>

  <% end %>


add base href for images reference

add base href for images reference

<!DOCTYPE html>

    <base href="<%= url(@conn) %>" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta property="og:url" content="<%= url(@conn) <> @conn.request_path %>"/>
    <meta property="og:type" content="website"/>
    <meta property="fb:app_id" content="<%= @facebook_appid %>" />

    <%= render "meta.html", assigns %>
    <meta property="og:site_name" content="<%= @blog_name %>"/>
    <title><%= title @conn %></title>

    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
    <link href="<%= static_path(@conn, @blog_favicon) %>" rel="icon" type="image/x-icon">

    <link href="https://fonts.googleapis.com/css?family=Noticia+Text:400,400i,700,700i|Open+Sans:400,400i,700,700i&subset=latin-ext,vietnamese" rel="stylesheet">

    <%= if @feeds_enabled do %>
      <%= if assigns[:page_type] == :tag do %>
        <link href="<%= feed_url @conn, :tag, @tag %>" rel="alternate" type="application/rss+xml" title="RSS feed for tag <%= @tag %>" />
      <% else %>
        <link href="<%= feed_url @conn, :index %>" rel="alternate" type="application/rss+xml" title="RSS feed" />
      <% end %>
    <% end %>

          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
              Toggle navigation

          </button>

            <%= @blog_name %>

                Home

            <%= for link <- @nav_links do %>

              <a href="<%= link.path %>" class="navbar-brand"><%= link.name %>

            <% end %>

    <%= render "header.html", assigns %>

      <%= render @view_module, @view_template, assigns %>

                <a href="https://www.linkedin.com/in/<%= @linkedin %>" target="_blank">

                <a href="https://www.facebook.com/<%= @facebook %>" target="_blank">

                <a href="https://twitter.com/<%= @twitter %>" target="_blank">

                <a href="https://github.com/<%= @github %>" target="_blank">

                <a href="mailto:<%= @email %>" target="_blank">

              <%= if @feeds_enabled do %>

                <a href="<%= feed_url @conn, :index %>" target="_blank">

              <% end %>

            Copyright © <%= @blog_name %> <%= DateTime.utc_now.year %> - <% {time, unit} = request_time @conn %> Rendered in <%= time |> safe_round |> trunc %> <%= unit%>

 Powered by Elixir, Phoenix and GeekPress

    <%= raw extra_html %>

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta property="og:url" content="<%= url(@conn) <> @conn.request_path %>"/>
    <meta property="og:type" content="website"/>
    <meta property="fb:app_id" content="<%= @facebook_appid %>" />

    <%= render "meta.html", assigns %>
    <meta property="og:site_name" content="<%= @blog_name %>"/>
    <title><%= title @conn %></title>

    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
    <link href="<%= static_path(@conn, @blog_favicon) %>" rel="icon" type="image/x-icon">

    <link href="https://fonts.googleapis.com/css?family=Noticia+Text:400,400i,700,700i|Open+Sans:400,400i,700,700i&subset=latin-ext,vietnamese" rel="stylesheet">

    <%= if @feeds_enabled do %>
      <%= if assigns[:page_type] == :tag do %>
        <link href="<%= feed_url @conn, :tag, @tag %>" rel="alternate" type="application/rss+xml" title="RSS feed for tag <%= @tag %>" />
      <% else %>
        <link href="<%= feed_url @conn, :index %>" rel="alternate" type="application/rss+xml" title="RSS feed" />
      <% end %>
    <% end %>

          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
              Toggle navigation

          </button>

            <%= @blog_name %>

                Home

            <%= for link <- @nav_links do %>

              <a href="<%= link.path %>" class="navbar-brand"><%= link.name %>

            <% end %>

    <%= render "header.html", assigns %>

      <%= render @view_module, @view_template, assigns %>

                <a href="https://www.linkedin.com/in/<%= @linkedin %>" target="_blank">

                <a href="https://www.facebook.com/<%= @facebook %>" target="_blank">

                <a href="https://twitter.com/<%= @twitter %>" target="_blank">

                <a href="https://github.com/<%= @github %>" target="_blank">

                <a href="mailto:<%= @email %>" target="_blank">

              <%= if @feeds_enabled do %>

                <a href="<%= feed_url @conn, :index %>" target="_blank">

              <% end %>

            Copyright © <%= @blog_name %> <%= DateTime.utc_now.year %> - <% {time, unit} = request_time @conn %> Rendered in <%= time |> safe_round |> trunc %> <%= unit%>

 Powered by Elixir, Phoenix and GeekPress

    <%= raw extra_html %>


Adding useful content in about page. Fixes #5

<%= gettext "Welcome to %{name}", name: "*Nix Academy" %>

This website consists of a database of the *Nix club members' skills in
    different domains, mainly in Computer Science.

In here, members choose to share or not their email address. If someone
    chooses not to share their email address, you can contact them via this
    website. If the member chose not to share his email address at all, you may
    come to the *Nix club and find yourself the member you are looking for
    (which is much nicer).

FAQ

How can I use this website?

You can take advantage of this website by looking for a specific skill you
    need (to solve a problem, to ask a question about or just browse to find
    something you might have / discover an interest in). Then go to the profile
    page of the member you found, and there you will be able to contact this
    person and save your day!

Can I share a member's email address among my friends?

Ask him first! (The member, not the friend, duh!)

How can I add myself to this website?

Register to the *Nix club, then login with your club's identifiers.

<%= gettext "Welcome to %{name}", name: "*Nix Academy" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "*Nix Academy" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "*Nix Academy" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.

<%= gettext "Welcome to %{name}", name: "Phoenix!" %>

    Sit dolorem veniam unde quae unde cupiditate aliquam voluptatem similique cum veritatis nisi quibusdam provident a corporis. Earum quae nobis quas ducimus provident molestiae fugit amet provident. Voluptatem non iste sapiente dolores dolorum molestias? Ex numquam eligendi dolorum ratione itaque voluptas! In dolores dolore suscipit dignissimos ad molestiae. Unde sed qui dolorum quos quasi? Minima ab id dolore minus fuga maxime excepturi voluptatibus nemo dignissimos. Quaerat minima distinctio architecto in voluptatibus. Rerum velit unde repudiandae quia expedita corporis dolorem natus ratione dolor, architecto, officiis quidem facilis autem. Maiores rem consequatur temporibus iusto possimus asperiores excepturi dolorem omnis. Minus quibusdam consectetur maxime itaque iusto blanditiis esse! Inventore neque porro dolorum doloremque incidunt! Et quam nisi sapiente hic eveniet in voluptate ipsam esse asperiores fugit nisi culpa fuga? Nesciunt quae magnam culpa nesciunt temporibus. Nisi error sint laudantium illo consectetur accusamus cupiditate vero sunt accusamus eum tenetur distinctio! Sequi harum pariatur accusantium iste voluptates cum magnam unde ipsam officia incidunt alias. Quibusdam fuga ullam repellat assumenda atque. Nostrum placeat incidunt ex sapiente fugiat odio magnam dolor quasi natus exercitationem rerum? Impedit saepe recusandae iure perferendis nesciunt fugiat harum libero harum. Repellendus deleniti hic quaerat asperiores odit porro ipsa, esse! Blanditiis ut quibusdam.


Add DOM node for react to hook into

Add DOM node for react to hook into


Adds social profile links info for Google Knowledge panel.


grammar tweaks

grammar tweaks

Meet POST Bot –

  the easiest way to get valuable feedback on your Articles

  <%= link to: auth_path(@conn, :request, :slack) do %>

  <% end %>

How POST works:

1. Send POST Bot your Article

            Simply paste your article’s URL in a Slack message to POST Bot and the Bot gets to work.

2. POST tracks your article

            POST starts tracking your article over the course of several hours and analyzes how it preforms for you

3. Get notifications

            When POST notices something going on with your article it will notify you via Slack, and even recommend actions for you.

Try POST now:

      <%= link to: auth_path(@conn, :request, :slack) do %>

      <% end %>

Have feedback or questions? Contact us

Meet POST Bot –

  the easiest way to get valuable feedback on your Articles

  <%= link to: auth_path(@conn, :request, :slack) do %>

  <% end %>

How POST works:

1. Send POST Bot your Article

            Simply paste your Articles URL into a Slack Message to POST Bot and the Bot gets to work.

2. POST tracks your article

            POST starts tracking your article over the course of several hours and analyzes how it preforms for you

3. Get notifications

            When POST noticed something going on with your article it will notify your via Slack and even recommend actions for you.

Try POST now:

      <%= link to: auth_path(@conn, :request, :slack) do %>

      <% end %>

Have feedback or questions? Contact us


Clarify intent of member-associated door groups

<%= @member.name %>

Member with <%= link @company.name, to: company_path(@conn, :show, @company) %>

    Email:
    <%= @member.email %>

    Phone:
    <%= @member.phone %>

    Active:
    <%= @member.active %>

    RFID Tokens:
    <%= link "Add new RFID token", to: company_member_rfid_token_path(@conn, :new, @company, @member) %>

        Identifier

      <%= for rfid_token <- @member.rfid_tokens do %>

          <%= link RfidToken.display_name(rfid_token), to: company_member_rfid_token_path(@conn, :show, @company, @member, rfid_token) %>
          <%= link "Delete", to: company_member_rfid_token_path(@conn, :delete, @company, @member, rfid_token), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

      <% end %>

  <%= if length(@member.door_groups) > 0 do %>

Door Groups

The member has special access to the following Door Groups:

        <%= for door_group <- @member.door_groups do %>

<%= link door_group.name, to: door_group_path(@conn, :show, door_group) %>

        <% end %>

  <% end%>

<%= link "Edit", to: company_member_path(@conn, :edit, @company, @member) %>
|
<%= link "Back", to: company_member_path(@conn, :index, @company) %>
|
<%= link "Delete", to: company_member_path(@conn, :delete, @company, @member), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

<%= @member.name %>

Member with <%= link @company.name, to: company_path(@conn, :show, @company) %>

    Email:
    <%= @member.email %>

    Phone:
    <%= @member.phone %>

    Active:
    <%= @member.active %>

    RFID Tokens:
    <%= link "Add new RFID token", to: company_member_rfid_token_path(@conn, :new, @company, @member) %>

        Identifier

      <%= for rfid_token <- @member.rfid_tokens do %>

          <%= link RfidToken.display_name(rfid_token), to: company_member_rfid_token_path(@conn, :show, @company, @member, rfid_token) %>
          <%= link "Delete", to: company_member_rfid_token_path(@conn, :delete, @company, @member, rfid_token), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>

      <% end %>

  <%= if length(@member.door_groups) > 0 do %>

      Door Groups:

        <%= for door_group <- @member.door_groups do %>

<%= link door_group.name, to: door_group_path(@conn, :show, door_group) %>

        <% end %>

  <% end%>

<%= link "Edit", to: company_member_path(@conn, :edit, @company, @member) %>
|
<%= link "Back", to: company_member_path(@conn, :index, @company) %>
|
<%= link "Delete", to: company_member_path(@conn, :delete, @company, @member), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %>


add appropriate meta tags and mobile tags

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="theme-color" content="#F0F3F7" />
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="description" content="whistler news reader">
    <meta name="author" content="Frederik Dietz">

    <title>whistler news reader</title>

    <link href="https://fonts.googleapis.com/css?family=Merriweather:300,400" rel="stylesheet" type="text/css">
    <link href='https://fonts.googleapis.com/css?family=Lato:400,600' rel='stylesheet' type='text/css'>
  </head>

  <body>
    <%= render @view_module, @view_template, assigns %>
    <%= if Mix.env == :dev do %>
      <script src="http://localhost:4001/bundle.js"></script>
    <% else %>
      <script src="<%= static_path(@conn, "/js/bundle.js") %>"></script>
    <% end %>
  </body>
</html>

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Whistler News Reader</title>

    <link href="https://fonts.googleapis.com/css?family=Merriweather:300,400" rel="stylesheet" type="text/css">
    <link href='https://fonts.googleapis.com/css?family=Lato:400,600' rel='stylesheet' type='text/css'>
  </head>

  <body>
    <%= render @view_module, @view_template, assigns %>
    <%= if Mix.env == :dev do %>
      <script src="http://localhost:4001/bundle.js"></script>
    <% else %>
      <script src="<%= static_path(@conn, "/js/bundle.js") %>"></script>
    <% end %>
  </body>
</html>


Fixed links to old games; hid some admin-type controls. TODO: a "totals" row at the bottom, just like on the cashout page. TODO: order players by winnings and then names.

  <%= if @current_user do %>

Welcome, <%= @current_user.name %>, to Phoenix Poker!

      <%= for game <- @future do %>

        <%= link(game.yyyymmdd, to: "/game_nights/#{game.id}" ) %>

      <% end %>

      <%= link("TONIGHT: #{@yyyymmdd}", to: "/game_nights/take_attendance/#{@yyyymmdd}" ) %>

      <%= for game <- @past do %>

        <%= link(game.yyyymmdd, to: "/game_nights/current_attendance/#{game.id}" ) %>

      <% end %>

    <img src="<%= @current_user.avatar %>" class="img-circle"/>
    <%= link "Logout", to: auth_path(@conn, :delete), method: :delete, class: "btn btn-danger" %>

    <%= if @current_user.name == "John Baylor" do %>
      <%= link "Add Player", to: player_path(@conn, :new) %>
      |
      <%= link "Game Nights", to: game_night_path(@conn, :index) %>
      |
      (only visible to John)
    <% end %>

  <% else %>

      Sign in with GitHub

      Sign in with Facebook

      Sign in with Google

      Sign in with Twitter

  <% end %>

  <%= if @current_user do %>

Welcome, <%= @current_user.name %>, to Phoenix Poker!

      <%= for game <- @future do %>

        <%= link(game.yyyymmdd, to: "/game_nights/#{game.id}" ) %>

      <% end %>

      <%= link("TONIGHT: #{@yyyymmdd}", to: "/game_nights/take_attendance/#{@yyyymmdd}" ) %>

      <%= for game <- @past do %>

        <%= link(game.yyyymmdd, to: "/game_nights/#{game.id}" ) %>

      <% end %>

    <img src="<%= @current_user.avatar %>" class="img-circle"/>
    <%= link "Logout", to: auth_path(@conn, :delete), method: :delete, class: "btn btn-danger" %>

    <%= link "Add Player", to: player_path(@conn, :new) %>
    |
    <%= link "Game Nights", to: game_night_path(@conn, :index) %>
  <% else %>

      Sign in with GitHub

      Sign in with Facebook

      Sign in with Google

      Sign in with Twitter

  <% end %>


feed is necessary note

feed is necessary note

Suggest a new Podcast

Please note: Only links to RSS feeds can be handled by the feed parser.

Links to the website of the podcast or even
  the link to the podcast on a different podcast directory will be discarded.

  <%= form_for @changeset, feed_backlog_frontend_path(@conn, :create), fn f -> %>
    <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

    <% end %>

      <%= label f, "RSS Feed Url", class: "control-label" %>

      <%= text_input f, :url, class: "form-control" %>
      <%= error_tag f, :url %>

      <%= submit "Submit", class: "btn btn-primary" %>

  <% end %>

  If you want to suggest several or all the podcasts you listen to at once, you can upload an OPML file at
  <%= link "My OPMLs", to: opml_frontend_path(@conn, :index)%> in your personal menu.

Suggest a new Podcast

  <%= form_for @changeset, feed_backlog_frontend_path(@conn, :create), fn f -> %>
    <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

    <% end %>

      <%= label f, "RSS Feed Url", class: "control-label" %>
      <%= text_input f, :url, class: "form-control" %>
      <%= error_tag f, :url %>

      <%= submit "Submit", class: "btn btn-primary" %>

  <% end %>

  If you want to suggest several or all the podcasts you listen to at once, you can upload an OPML file at
  <%= link "My OPMLs", to: opml_frontend_path(@conn, :index)%> in your personal menu.


Update project card for nerves on the embedded landscape

    <%= link "Back to Embedded Systems", to: Routes.working_group_path(@conn, :show, @wg.slug) %>

BEAM on Embedded Landscape 2020

Project name

GRiSP

Summary

Hardware and software solution targeting running Erlang on bare metal. As a central point the Grisp board runs an Erlang-based custom operation system design for minimal overhead and maximum ease-of-use.

Target hardware

GRiSP 1 microcontroller: AArch32 based. GRiSP 2 microprocessor: AArch32 based

Target Operation System

RTEMS, https://www.rtems.org

Target user group

              embedded application, custom hardware, makers, IoT, embedded projects for real time applications

Supported BEAM languages

              Erlang and Elixir

Homepage

              https://www.grisp.org/

Source Control

              https://github.com/grisp/

Description

              GRiSP project makes it easy to write Erlang embedded applications without having to write one line of C code. The GRiSP board offers I/O expandable interfaces, wifi and ethernet connectivity.
              On the software side, GRiSP uses RTEMS as an Unikernel library integrated with the Erlang Run Time System in a single image. Making GRiSP very suitable to run hard real time applications. As the project grows and the need for writing C code to handle special device drivers becomes true, GRiSP provides a powerful mechanism to integrate the C code with Erlang and still suitable for running real time application.

Project name

Nerves

Summary

              Tooling, libraries, and runtime for building robust embedded systems on the BEAM across a
              variety of hardware

Target hardware

Official support for Raspberry Pi and Beaglebone boards. Custom hardware supported via an integration with the Buildroot project

Target user group

              Embedded systems and industrial IoT developers as well as hobbyists and makers

Supported BEAM languages

                Erlang, Elixir, and LFE

Homepage

              https://www.nerves-project.org/

Description

              Nerves integrates with Elixir’s mix build tool to provide a familiar development experience that generates complete firmware images that can be used locally or distributed securely to many devices via NervesHub. Nerves uses the Linux kernel for hardware support and Buildroot for integration with non-Erlang applications and services.

Where to start

Documentation

Example projects

Elixir Circuits quick start

Used by

              FarmBot, Bowery Farming, SmartRent, Schneider Electric, RosePoint Navigation, Interstate Batteries, Le Tote, Very Possible

meta-erlang

Project name

meta-erlang

Summary

              Linux microprocessor based on any hardware supported by Yocto Project and Openembedded where Erlang Runtime System (ERTS) is able to run. meta-erlang is a layer with together with other layers from YP/OE, offers a complete solution when designing and implementing embedded linux projects.

Target hardware

              microprocessors: AArch32, AArch64, X86, X86-64. Any supported combination between Yocto Project/Openembedded BSP and Erlang

Target Operation System

Custom linux kernel base distribution made with YP/OE.

Target user group

              Custom hardware and embedded projects

Supported BEAM languages

              Erlang and Elixir

Homepage

              https://meta-erlang.github.io/

Source Control

              https://github.com/meta-erlang/

Description

              Yocto Project is a ten years-old project from Linux Foundation that brings best practices, tools, and code that enable the creation of Linux distributions. YP is organized based on many sorts of layers and meta-erlang is one of them. The meta-erlang aim is to bring Erlang Ecosystem for the YP/OE projects, providing up-to-date Erlang and Elixir versions, example application, documentation, tools to help creating applications for embedded projects and common application written in Erlang/Elixir like databases, message brokers and web servers tested and ready to run on embedded Linux.

      <%= render ErlefWeb.WorkingGroupView, "_sidebar.html", assigns %>

    <%= link "Back to Embedded Systems", to: Routes.working_group_path(@conn, :show, @wg.slug) %>

BEAM on Embedded Landscape 2020

Project name

GRiSP

Summary

Hardware and software solution targeting running Erlang on bare metal. As a central point the Grisp board runs an Erlang-based custom operation system design for minimal overhead and maximum ease-of-use.

Target hardware

GRiSP 1 microcontroller: AArch32 based. GRiSP 2 microprocessor: AArch32 based

Target Operation System

RTEMS, https://www.rtems.org

Target user group

              embedded application, custom hardware, makers, IoT, embedded projects for real time applications

Supported BEAM languages

              Erlang and Elixir

Homepage

              https://www.grisp.org/

Source Control

              https://github.com/grisp/

Description

              GRiSP project makes it easy to write Erlang embedded applications without having to write one line of C code. The GRiSP board offers I/O expandable interfaces, wifi and ethernet connectivity.
              On the software side, GRiSP uses RTEMS as an Unikernel library integrated with the Erlang Run Time System in a single image. Making GRiSP very suitable to run hard real time applications. As the project grows and the need for writing C code to handle special device drivers becomes true, GRiSP provides a powerful mechanism to integrate the C code with Erlang and still suitable for running real time application.

Project name

Nerves

Summary

              Linux based solution with a wide range of Elixir libraries designed for
              embedded development and being productive. Speeding up the start of your
              next embedded Linux project

Target hardware

microprocessors: AArch32, AArch64,X86-64, GRiSP-2 boards

Target Operation System

Custom Linux kernel based distribution made with buildroo

Target user group

              embedded application, custom hardware, makers, IoT, Linux embedded developers

Supported BEAM languages

              Primary focussed on Elixir and supports Erlang as well

Homepage

              https://www.nerves-project.org/

Source Code

              https://github.com/nerves-project

Description

              Nerves Project is a mix of three parts:

Platform, a custom minimal linux based distribution

Framework, a set of ready-to-go Elixir libraries

Tooling, command line tools supporting the most common tasks for handling embedded projects

meta-erlang

Project name

meta-erlang

Summary

              Linux microprocessor based on any hardware supported by Yocto Project and Openembedded where Erlang Runtime System (ERTS) is able to run. meta-erlang is a layer with together with other layers from YP/OE, offers a complete solution when designing and implementing embedded linux projects.

Target hardware

              microprocessors: AArch32, AArch64, X86, X86-64. Any supported combination between Yocto Project/Openembedded BSP and Erlang

Target Operation System

Custom linux kernel base distribution made with YP/OE.

Target user group

              Custom hardware and embedded projects

Supported BEAM languages

              Erlang and Elixir

Homepage

              https://meta-erlang.github.io/

Source Control

              https://github.com/meta-erlang/

Description

              Yocto Project is a ten years-old project from Linux Foundation that brings best practices, tools, and code that enable the creation of Linux distributions. YP is organized based on many sorts of layers and meta-erlang is one of them. The meta-erlang aim is to bring Erlang Ecosystem for the YP/OE projects, providing up-to-date Erlang and Elixir versions, example application, documentation, tools to help creating applications for embedded projects and common application written in Erlang/Elixir like databases, message brokers and web servers tested and ready to run on embedded Linux.

      <%= render ErlefWeb.WorkingGroupView, "_sidebar.html", assigns %>


Only connect to google tag manager in production

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="A real-time application for conducting Agile retrospectives">
    <meta name="google-site-verification" content="T5W8sjrjt-BmTK5SYTjPM-FQZD8oGNatTNAJSyRex7o" />
    <meta name="author" content="">
    <title>RemoteRetro</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/semantic-ui/semantic.min.css") %>">
    <%= if Mix.env == :dev do %>
      <link id="css" rel="stylesheet" href="http://localhost:5001/css/app.css" />
    <% else %>
      <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
    <% end %>

  <body class="<%= if @view_module.include_backdrop, do: "photo-backdrop" %>">

      <%= render @view_module, @view_template, assigns %>

    <%= if @view_module.include_js do %>

    <% end %>


ref: add a microformats2 class to jabber id link

<img src="<%= static_path(@conn, "/images/christian-kruse.jpg") %>" alt="" class="u-photo big">

Christian Kruse

      My name is Christian Kruse. I work as a software developer and
      system administator at <%= link "Termitel GmbH", to: "https://termitel.de/" %>.
      I live in Germany in a small town called
      <%= link "Steinfurt", to: "https://en.wikipedia.org/wiki/Steinfurt" %>.

      I am passionate about software development,
      <%= link "Linux", to: "https://en.wikipedia.org/wiki/Linux" %>,
      <%= link "FLOSS", to: "https://en.wikipedia.org/wiki/Free_and_open-source_software" %>
      as well as <%= link "OS X", to: "https://en.wikipedia.org/wiki/OS_X" %>.
      I am also a do-it-yourself apologetic: I did a lot of things in and
      around my house myself. I love the hacker culture. And last but not
      least I am a dog owner.

      This is my personal replacement for Twitter, Facebook and the other
      data silos. <%= link "My content is mine", to: "http://indiewebcamp.com/" %>
      — so if you are interested in my activity, just have a look at this
      page.

Personal information

Address

Christian Kruse

Friedenau 35

48565 Steinfurt

Germany

Email

<%= link "cjk@defunct.ch", to: "mailto:cjk@defunct.ch", class: "u-email" %>

Jabber

<%= link "cjk@defunct.ch", to: "xmpp:cjk@defunct.ch", class: "u-url" %>

PGP

A99A9D73

BC5D 9F4E F7FB 4382 6056  E834 B8E0 F342 A99A 9D73

<%= link "wwwtech.de/A99A9D73.asc", to: "/A99A9D73.asc" %>

Please send me encrypted mails if possible (see my public key above). Every
    bit of encrypted traffic increases the encrypted background noise
    and thus makes it harder to distinguish between important and
    unimportant traffic.

Social media

I also take part in several social services:

<%= link "forum.selfhtml.org/users/1", to: "http://forum.selfhtml.org/users/1", rel: "me" %> on SELFHTML

<%= link "@cjk101010", to: "https://twitter.com/cjk101010", rel: "me" %> on Twitter

<%= link "github.com/ckruse", to: "https://github.com/ckruse", rel: "me" %> on Github

<%= link "flattr.com/profile/cjk", to: "https://flattr.com/profile/cjk", rel: "me" %> on Flattr

<%= link "www.reddit.com/user/cjk101010/", to: "https://www.reddit.com/user/cjk101010/", rel: "me" %> on Reddit

<%= link "news.ycombinator.com/user?id=cjk101010", to: "https://news.ycombinator.com/user?id=cjk101010", rel: "me" %> on Hackernews

<%= link "keybase.io/ckruse", to: "https://keybase.io/ckruse", rel: "me" %> on Keybase.io

<%= link "stackoverflow.com/users/785998/ckruse", to: "http://stackoverflow.com/users/785998/ckruse", rel: "me" %> on StackOverflow

<img src="<%= static_path(@conn, "/images/christian-kruse.jpg") %>" alt="" class="u-photo big">

Christian Kruse

      My name is Christian Kruse. I work as a software developer and
      system administator at <%= link "Termitel GmbH", to: "https://termitel.de/" %>.
      I live in Germany in a small town called
      <%= link "Steinfurt", to: "https://en.wikipedia.org/wiki/Steinfurt" %>.

      I am passionate about software development,
      <%= link "Linux", to: "https://en.wikipedia.org/wiki/Linux" %>,
      <%= link "FLOSS", to: "https://en.wikipedia.org/wiki/Free_and_open-source_software" %>
      as well as <%= link "OS X", to: "https://en.wikipedia.org/wiki/OS_X" %>.
      I am also a do-it-yourself apologetic: I did a lot of things in and
      around my house myself. I love the hacker culture. And last but not
      least I am a dog owner.

      This is my personal replacement for Twitter, Facebook and the other
      data silos. <%= link "My content is mine", to: "http://indiewebcamp.com/" %>
      — so if you are interested in my activity, just have a look at this
      page.

Personal information

Address

Christian Kruse

Friedenau 35

48565 Steinfurt

Germany

Email

<%= link "cjk@defunct.ch", to: "mailto:cjk@defunct.ch", class: "u-email" %>

Jabber

<%= link "cjk@defunct.ch", to: "xmpp:cjk@defunct.ch" %>

PGP

A99A9D73

BC5D 9F4E F7FB 4382 6056  E834 B8E0 F342 A99A 9D73

<%= link "wwwtech.de/A99A9D73.asc", to: "/A99A9D73.asc" %>

Please send me encrypted mails if possible (see my public key above). Every
    bit of encrypted traffic increases the encrypted background noise
    and thus makes it harder to distinguish between important and
    unimportant traffic.

Social media

I also take part in several social services:

<%= link "forum.selfhtml.org/users/1", to: "http://forum.selfhtml.org/users/1", rel: "me" %> on SELFHTML

<%= link "@cjk101010", to: "https://twitter.com/cjk101010", rel: "me" %> on Twitter

<%= link "github.com/ckruse", to: "https://github.com/ckruse", rel: "me" %> on Github

<%= link "flattr.com/profile/cjk", to: "https://flattr.com/profile/cjk", rel: "me" %> on Flattr

<%= link "www.reddit.com/user/cjk101010/", to: "https://www.reddit.com/user/cjk101010/", rel: "me" %> on Reddit

<%= link "news.ycombinator.com/user?id=cjk101010", to: "https://news.ycombinator.com/user?id=cjk101010", rel: "me" %> on Hackernews

<%= link "keybase.io/ckruse", to: "https://keybase.io/ckruse", rel: "me" %> on Keybase.io

<%= link "stackoverflow.com/users/785998/ckruse", to: "http://stackoverflow.com/users/785998/ckruse", rel: "me" %> on StackOverflow


Fix typo

Fix typo

What is ElixirStatus?

ElixirStatus is a site built by the community to create an outlet where we can post stuff we created.

It is not so much a link sharing platform where you post stuff you find, but more of a creator-hub where you can post when you have something new to announce, like

a project,

blog post,

version update,

episode of their podcast or

if you are organizing a meetup/conference.

Your annoucement will then appear on this website, in RSS, on Twitter and /r/elixir.

The idea is to have something akin to what RubyFlow is for Ruby, but bringing the Elixir community's ideas to the table.

Last but not least, ElixirStatus is a web app written in Elixir+Phoenix running in production.

Together with sites like Elixir Jobs, it is intended to serve as a case study for the community, so you can point your boss to these sites if he or she wants to see "proof" that this "Elixir thing" is actually a viable alternative to Ruby/Python/Node when building the next web project.

What is ElixirStatus?

ElixirStatus is a site built by the community to create an outlet where we can post stuff we created.

It is not so much a link sharing platform where you post stuff you find, but more of a creator-hub where you can post when you have something new to announce, like

a project,

blog post,

version update,

episode of their podcast or

if they are organizing a meetup/conference.

Your annoucement will then appear on this website, in RSS, on Twitter and /r/elixir.

The idea is to have something akin to what RubyFlow is for Ruby, but bringing the Elixir community's ideas to the table.

Last but not least, ElixirStatus is a web app written in Elixir+Phoenix running in production.

Together with sites like Elixir Jobs, it is intended to serve as a case study for the community, so you can point your boss to these sites if he or she wants to see "proof" that this "Elixir thing" is actually a viable alternative to Ruby/Python/Node when building the next web project.


Don't trim spaces from input

Don't trim spaces from input

      Regex
      <input name="regex"
             type="text"
             autofocus
             ng-trim="false"
             ng-model="regex"
             ng-change="test(regex,subject)"
             ng-model-options="{ debounce: 100 }"/>

      Subject
      <textarea name="subject"
                rows=5
                ng-trim="false"
                ng-model="subject"
                ng-change="test(regex,subject)"
                ng-model-options="{ debounce: 100 }"
                ></textarea>
      Split on newlines?
      <input type="checkbox" name="split"
             ng-change="test(regex,subject)" ng-model="split">

Compilation Error!{{ '\n' + (return.error | json) }}

<result data="case">

      Regex
      <input name="regex"
             type="text"
             autofocus
             ng-model="regex"
             ng-change="test(regex,subject)"
             ng-model-options="{ debounce: 100 }"/>

      Subject
      <textarea name="subject"
                rows=5
                ng-model="subject"
                ng-change="test(regex,subject)"
                ng-model-options="{ debounce: 100 }"
                ></textarea>
      Split on newlines?
      <input type="checkbox" name="split"
             ng-change="test(regex,subject)" ng-model="split">

Compilation Error!{{ '\n' + (return.error | json) }}

<result data="case">


feat(admin): remove objects link as we have those in the sidebar

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Admin</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/admin.css") %>">

      Lyn Admin

        <li class="nav-item <%= active_class(@conn, admin_path(@conn, :index, "users")) %>">
          <a class="nav-link" href="<%= admin_path(@conn, :index, "users") %>">Users (current)

          System

            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "object_types") %>">Object Types (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "languages") %>">Languages (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "domains") %>">Domains (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "sites") %>">Sites (current)

            <a class="dropdown-item" href="<%= sql_path(@conn, :index) %>">Sql (current)

            <a class="dropdown-item" href="<%= maintenance_path(@conn, :index) %>">Maintenance (current)

        <%
          sidebar_file = sidebar(@conn)
        %>
        <%= if sidebar_file do %>

              <%= render Lyn.Admin.SidebarView, sidebar_file, assigns %>

            <%= render Lyn.Admin.SidebarView, "_footer.html" %>

        <% end %>
        <div id="main" <%= if !sidebar_file do %>class="full-width"<% end %>>

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

            <%= render @view_module, @view_template, assigns %>

<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Admin</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/admin.css") %>">

      Lyn Admin

        <li class="nav-item <%= active_class(@conn, admin_path(@conn, :index, "objects")) %>">
          <a class="nav-link" href="<%= admin_path(@conn, :index, "objects") %>">Objects (current)

        <li class="nav-item <%= active_class(@conn, admin_path(@conn, :index, "users")) %>">
          <a class="nav-link" href="<%= admin_path(@conn, :index, "users") %>">Users (current)

          System

            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "object_types") %>">Object Types (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "languages") %>">Languages (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "domains") %>">Domains (current)
            <a class="dropdown-item" href="<%= admin_path(@conn, :index, "sites") %>">Sites (current)

            <a class="dropdown-item" href="<%= sql_path(@conn, :index) %>">Sql (current)

            <a class="dropdown-item" href="<%= maintenance_path(@conn, :index) %>">Maintenance (current)

        <%
          sidebar_file = sidebar(@conn)
        %>
        <%= if sidebar_file do %>

              <%= render Lyn.Admin.SidebarView, sidebar_file, assigns %>

            <%= render Lyn.Admin.SidebarView, "_footer.html" %>

        <% end %>
        <div id="main" <%= if !sidebar_file do %>class="full-width"<% end %>>

<%= get_flash(@conn, :info) %>

<%= get_flash(@conn, :error) %>

            <%= render @view_module, @view_template, assigns %>


Add link to quarterly report template

Add link to quarterly report template

 - add link to quarterly report markdown template on report submissions
 page

  <%= form_for @changeset, @action, [multipart: true], fn f -> %>

      Here you can submit a report for your working group. Please select the type of report and your report file below.

        Click here to get a template for the report.

        For more information on working group reports see our Reports Wiki

      <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

      <% end %>

        <%= label f, :type, class: "col-sm-2 col-form-label" %>

          <%= select f, :type, [{"Quarterly", "quarterly"}], required: true, class: "form-control" %>

        <%= error_tag f, :type %>

        <%= label f, :file, class: "col-sm-2 col-form-label" %>

          <%= file_input f, :file, required: true, class: "form-control", accept: ".md" %>
          Only markdown reports supported.

        <%= error_tag f, :logo %>

           <%= submit "Submit Report", class: "btn btn-primary" %>

  <% end %>

  <%= form_for @changeset, @action, [multipart: true], fn f -> %>

        Here you can submit a report for your working group. Please select the type of report and your report file below.
        For more information on working group reports see our Reports Wiki

      <%= if @changeset.action do %>

Oops, something went wrong! Please check the errors below.

      <% end %>

        <%= label f, :type, class: "col-sm-2 col-form-label" %>

          <%= select f, :type, [{"Quarterly", "quarterly"}], required: true, class: "form-control" %>

        <%= error_tag f, :type %>

        <%= label f, :file, class: "col-sm-2 col-form-label" %>

          <%= file_input f, :file, required: true, class: "form-control", accept: ".md" %>
          Only markdown reports supported.

        <%= error_tag f, :logo %>

           <%= submit "Submit Report", class: "btn btn-primary" %>

  <% end %>


Fix a couple of typos in the job detail template

<!DOCTYPE html>

  <%= head() %>

    <%= header(input_name) %>

    <%= render_system_info(system) %>

        <a name="<%= job_name %>">
        <%= job_name %>

          <i
            class="benchee-help-icon icon-question-circle-o"
            title="Graphs showing the individual run time distribution for <%= job_name %>.
Run Times Histogram shows the distribution of occurrences of specific run times in buckets.
Raw Run Times shows all individual recorded run times in the order they were recorded in."
          >

        <%= render_data_table(%{job_name => %{run_time_statistics: job_statistics}}, units) %>

        <div id="sorted-run-times" class="plot" data-job-name="<%= job_name %>">

        <div id="raw-run-times" class="plot" data-job-name="<%= job_name %>">

      <%= render_footer() %>

    <%= js_includes() %>

<!DOCTYPE html>

  <%= head() %>

    <%= header(input_name) %>

    <%= render_system_info(system) %>

        <a name="<%= job_name %>">
        <%= job_name %>

          <i
            class="benchee-help-icon icon-question-circle-o"
            title="Graphs showing the individual run time distribution for <%= job_name %>.
Run Times Histpgram shows the distribution of occurences of specific run times in buckets.
Raw Run Times shows all individual recorded run times in the order they were recorded in."
          >

        <%= render_data_table(%{job_name => %{run_time_statistics: job_statistics}}, units) %>

        <div id="sorted-run-times" class="plot" data-job-name="<%= job_name %>">

        <div id="raw-run-times" class="plot" data-job-name="<%= job_name %>">

      <%= render_footer() %>

    <%= js_includes() %>