text:
As the world gradually begins to ring out the end of 2022, it's time again to count down some of my favourite toy releases of the year. Sadly the rather extensive back catalogue I started the year with hasn't gotten any smaller, but thankfully I've still made time for this bunch of fantastic figures which are all worthy of joining your collection. As usual I try to make these lists specifically for figures that were released in 2022, but given the sheer chaos that is Hasbro's release schedule these days there a couple from the beginning of the year that are perhaps a little debatable. Not that it really matters - I got all these figures in 2022 and that's all that counts. So without further ado read on to find out which figure made the top spot, and be sure to let me know what your favourites were in the comments!
HONOURABLE MENTION: S.H. Figuarts Ultraman Ribut
To stop this list just being too Ultraman heavy (the line did INCREDIBLY well this year), Ultraman Ribut gets the honourable mention position for this year rather than joining the top ten proper. For a relatively obscure character whose main appearances take place in an online-exclusive ensemble series, Bandai Tamashii Nations really went all out on the Malaysian-born Ultraman Ribut. Not only is the design itself fantastic in the way it takes the classic Ultraman colour layout and modernises it, but the range of relatively unique accessories Ribut has makes this an absolutely killer release. But what's perhaps most amazing of all is that Ribut was a general retail release, which just goes to show that even in a time of increasing Tamashii Web exclusives Bandai will still throw out a big surprise every now and again.
10. Power Rangers Lightning Collection Finster
At a time where steady price increases and seemingly worse quality control is making me (and I'm sure many other collectors) more and more disillusioned with the Lightning Collection, it's nice that Hasbro can still produce a figure every so often that reminds you just what the line is capable of. With Lightning Collection Finster it's all about the detail - the amount of moulded detail and accessories packed into this figure makes it almost like a mini-masterpiece, the perfect six-inch representation of Rita's chief monster maker without a QC problem in sight. While figures of the rangers themselves will always naturally be Hasbro's priority, arguably one of the biggest appeals of this line is that it isn't afraid to tackle villains as well. With Scorpina also hitting shelves this year to join Goldar and Finster, surely it can't be long before Squatt and Baboo (as well as a single-pack Rita) follow to complete the Moon Palace posse.
9. Doctor Who 'Warriors of the Deep' Collector Figure Set
Surprisingly no Daleks making the list this year (although the History of the Daleks range continues on as strong as ever), but the 2022 Doctor Who online exclusive was definitely one to take note of. After YEARS of hoping, we finally have Silurian figures! While some might scoff at the fact this release was a set of three identical figures, the fact you're getting all three Silurians that appeared in Warriors of the Deep in one fell swoop makes it worth the £29.99 asking price. Even though the Doctor Who line still doesn't seem strong enough to produce all-new tooling for its releases, there are so many new parts packed into these that you wouldn't even notice that they're (rather fittingly) built off of the Sea Devil figure from 2008. If next year's releases prove to be anything like this, then maybe the line isn't doing too badly after all.
8. Star Wars Black Series Death Watch Mandalorian
Another thing that's been a long time coming, but 2022 was the year we FINALLY got an army build Mandalorian figure in the Black Series that wasn't built off of the incredibly dated Boba/Jango Fett mould. Even though the Death Watch Mandalorian only appeared in one episode of The Mandalorian for a few minutes, this figure is everything you could ever want in an army builder. A great design, a great colour scheme and most importantly articulation that lives up to the modern standard of the Black Series. I'm not much of an army builder, but even I was tempted to pick more than one of these guys up.
7. S.H. Figuarts Boba Fett (The Mandalorian)
While The Book of Boba Fett might have divided Star Wars fans somewhat, S.H. Figuarts is one area where the original bounty hunter in Mandalorian armour didn't disappoint. After three years Boba Fett returned to the Star Wars Figuarts range in his newly-painted Mandalorian getup, and the cleaner look definitely owed itself to the line better than his original armour did. Sharper than ever, this Boba Fett boasts bold colours, fantastic articulation and soft goods that really enhance the overall look. The accessory count is pretty great too, giving you all the Boba Fett essentials on top of some pieces to recreate key moments from his grand return. Sure the likeness on the unmasked head might not be perfect, but when everything else on the figure is this good who the hell cares?
6. S.H. Figuarts -Shinkocchou Seihou- Ultraman
After Ultraman Tiga left collectors dubious that Ultraman could make the jump to Shinkocchou Seihou as well as Kamen Rider or GARO had, this release came along and (mostly) put those fears to rest. Bandai's celebration of the franchise's 55th anniversary gave us what's arguably the "definitive" Ultraman figure - scaling up the previous release as well as adding bolder colours and far more suit detailing. Of course the biggest shakeup here is the articulation, with this Ultraman able to pull off all his signature poses like a dream. The inclusion of soft parts may cause some collectors to remain sceptical, but so far there don't seem to have been any stories of QC nightmares like there was with Tiga. Here's hoping next year's Ultraman Dyna release is more of this.
5. S.H. Figuarts Kamen Rider Jeanne
A rather late entry to the list given that I only did the review a few days ago, but Kamen Rider Jeanne is more than deserving of her place. In a year where Shinkocchou Seihou didn't really do much for me in the way of Kamen Rider, the Kamen Rider Revice range came along and showed that the main S.H. Figuarts line often has just as much to offer as its "premium" offshoot. While all of the Revice releases are definitely worth your time Kamen Rider Jeanne easily stands out as the best of them all, which is pretty fitting considering she was also by far the best character in the series as well. A great design that shows a thinner body doesn't necessarily mean a lesser figure (take note Hasbro), Jeanne is everything you could want in a Kamen Rider figure and so much more.
4. S.H. Figuarts Ultrawoman Grigio
Yet another case of finally getting something that was long overdue, 2022 was the year Ultrawoman Grigio finally escaped Tamashii Nations purgatory to properly complete the New Generation Hero lineup. The first female Ultra (and second female overall, though only beaten by a month) to be released in the Ultraman S.H. Figuarts range, Ultrawoman Grigio immediately stands out against her peers but has far more to offer than just a cutesy look and unique colour scheme. Wonderfully poseable and with plenty of accessory options (SIXTEEN hands!), Grigio is not just a great figure - she's also a reminder of how generous Bandai can be when it comes to extra parts. I love nearly every figure in the Ultraman range but Grigio very quickly became a firm favourite.
3. MAFEX Knightfall Batman
A figure that technically should have been in last year's favourite toys list, the usual MAFEX delays (although this was a particularly long one) meant that Knightfall Batman falls comfortably into the 2022 list instead. Between this and Ben Reilly Spider-Man it was a year where MAFEX was truly taken over by blonde-haired replacements, and even if you're a bigger fan of Bruce Wayne and Peter Parker it's hard to care when the releases are this good. Knightfall Batman is pure 90s goodness - those bold metallic colours, spiked shoulders and possible cape make this a really special release. There may be plenty of alternatives for comic book superhero figures out there, but time and time again MAFEX prove that their level of quality is hard to beat.
2. Transformers Generations Selects Black Zarak
A bit of a surprise entry given that I haven't even done a review for it on this blog, but given this humongous thing can't even fit into my light box I never quite worked out how to do it justice. But this was the year I finally caved on a Titan class Transformer, and even though I've seen it for a fraction of the price in the last few months I have absolutely no regrets. Standing at an incredible 21 inches tall, Generations Selects Black Zarak recreates War for Cybertron Scorponok in all his Masterforce glory - complete with a Headmaster homage to his bizarre pirate getup in Zone. Getting Haslab Victory Saber at the end of the month was a pretty big deal too, but with that at least I already owned the Masterpiece figure. I NEVER thought I'd own an official Black Zarak, so this is an extra special piece in my collection.
1. S.H. Figuarts Zenkaizer
Was there any real doubt who was going to take the number one spot this year? 2022 saw the momentous return of Super Sentai to the S.H. Figuarts line and what a return it was. In the seven years they've been gone S.H. Figuarts have improved so much when it comes to build, proportion and articulation and to see all of that crammed into a single figure was really special. Zenkaizer was arguably the perfect character to bring the range back - his unique colouring ensuring that he could work perfectly as a one-off release to celebrate the franchise's 45th annniversary if the figure didn't prove to be a success. Thankfully that was far from the case though, with the figure being so good that Bandai released it twice in the same year (look forward to a review of the event exclusive Zenkaizer Black coming some time in January) as well as cementing the line's return with the release of Don Momotaro and preorder solicitations for Twokaizer. Welcome back Super Sentai Figuarts, we've missed you.
And that's a wrap for 2022! Once again I'd like to thank each and every one of you that's stopped by to read a review or comment on the blog - I'm sorry that anonymous commenting has been turned off for the time being (one particular person felt it necessary to spam reviews with abuse and I got sick of it after a while) but hopefully I'll turn it back on sometime next year to allow for more (and hopefully better!) interaction. On a personal note while I entered 2022 on a high with a new logo for the site, I'm ending it on a bit of a low after a difficult few months. Things are looking up though and I'm entering the new year with a renewed sense of optimism. I'll be throwing myself into the site for the next couple of months as a bit of a distraction, hoping to finally get that backlog down a bit and get back to more frequent series reviews as well. But for now, have a great new years' wherever you are and I'll see you again in 2023 for more reviews!
Posted by: Alex at Saturday, December 31, 2022
Tags: 2022, Bandai, best of, character options, hasbro, Medicom, tamashii nations, toys
Oar said...
Thank you for another year of fun posts! I really enjoy getting my fill of toys and shows through your blog, and seeing your thoughts about whatever new thing is around.
John Hood said...
Happy New Year! Always look forward to your reviews!


text:
from __future__ import division, absolute_import, print_function
import os
from time import time as current_time
from warnings import warn
from svgpathtools import (parse_path, Path, Line, disvg, wsvg, kinks,
                          bezier_segment, path_encloses_pt)
from svgpathtools import smoothed_path

# Internal Dependencies
from andysmod import format_time, inputyn, consecutive_pairs
from misc4rings import pathXpathIntersections
from transects4rings import isPointOutwardOfPath
import options4rings as opt
# from smoothing4rings import smooth_path as smoothed_path

disvg = disvg if opt.try_to_open_svgs_in_browser else wsvg

def crop_to_unit_interval(tval, tol=opt.tol_intersections):
    """Ensure tval inside unit interval, [0, 1].

    If outside unit interval, but within `tol` of 0 or 1,
    set to 0 or 1 respectively.
    """
    assert 0 <= tval <= 1 or abs(tval) < tol or abs(tval - 1) < tol
    if tval <= 0:
        return 0
    elif tval >= 1:
        return 1
    else:
        return tval

def fix_svg(ring_list, center, svgname):
    """Check for human errors and create more perfect SVG"""

    # Discard inappropriately short rings
    opt.basic_output_on.dprint("\nChecking for inappropriately short "
                               "rings...", 'nr')
    tmp_len = len(ring_list)
    short_rings = [idx for idx, ring in enumerate(ring_list) if
                   ring.path.length() < opt.appropriate_ring_length_minimum]
    opt.basic_output_on.dprint("Done (%s inappropriately short rings "
                               "found)." % len(short_rings))
    if short_rings:
        if opt.create_svg_highlighting_inappropriately_short_rings:
            opt.basic_output_on.dprint("\nCreating svg highlighting "
                                       "inappropriately short rings...", 'nr')
            paths = [parse_path(r.string) for r in ring_list]
            colors = [r.color for r in ring_list]
            nodes = [ring_list[idx].path.point(0.5) for idx in short_rings]
            center_line = [Line(center-1, center+1)]

            shortrings_svg_filename = os.path.join(
                opt.output_directory, svgname + "_short-rings.svg")
            disvg(paths + [center_line], colors + [opt.colordict['center']],
                  nodes=nodes, filename=shortrings_svg_filename)

            args = opt.appropriate_ring_length_minimum, shortrings_svg_filename
            mes = ("Done.  SVG created highlighting short rings by placing a "
                   "node at each short ring's midpoint.  Note: since these "
                   "rings are all under {} pixels in length, they may be hard "
                   "to see and may even be completely covered by the node.  "
                   "SVG file saved to:\n{}").format(*args)
            opt.basic_output_on.dprint(mes)

        if opt.dont_remove_closed_inappropriately_short_rings:
            shortest_ring_length = min([r.path.length() for r in
                                        [ring_list[k] for k in short_rings if
                                         ring_list[k].isClosed()]])
            open_short_rings = [idx for idx in short_rings if
                                not ring_list[idx].isClosed()]
            num_short_and_closed = len(short_rings)-len(open_short_rings)
            if num_short_and_closed:
                sug_tol = (opt.tol_isNear * shortest_ring_length /
                           opt.appropriate_ring_length_minimum)
                warn("{} inappropriately short closed rings detected (and not "
                     "removed as "
                     "dont_remove_closed_inappropriately_short_rings = True). "
                     " You should probably decrease tol_isNear to something "
                     "less than {} and restart this file."
                     "".format(num_short_and_closed, sug_tol))
            short_rings = open_short_rings

        if opt.remove_inappropriately_short_rings:
            opt.basic_output_on.dprint("\nRemoving inappropriately short "
                                       "rings...", 'nr')
            ring_list = [ring for idx, ring in enumerate(ring_list)
                         if idx not in short_rings]
            opt.basic_output_on.dprint("Done (%s inappropriately short rings "
                                       "removed)." % (tmp_len - len(ring_list)))
        else:
            warn("{} inappropriately short rings were found, but "
                 "remove_inappropriately_short_rings is set to False."
                 "".format(len(ring_list)))
        print("")

    # Remove very short segments from rings
    def _remove_seg(path, _seg_idx, _newjoint):
        _new_path = [x for x in path]
        pathisclosed = path[-1].end == path[0].start

        # stretch next segment
        if _seg_idx != len(path) - 1 or pathisclosed:
            old_bpoints = _new_path[(_seg_idx + 1) % len(path)].bpoints()
            new_bpoints = (_newjoint,) + old_bpoints[1:]
            _new_path[(_seg_idx + 1) % len(path)] = bezier_segment(*new_bpoints)

        # stretch previous segment
        if _seg_idx != 0 or pathisclosed:
            old_bpoints = _new_path[(_seg_idx - 1) % len(path)].bpoints()
            new_bpoints = old_bpoints[:-1] + (_newjoint,)
            _new_path[(_seg_idx - 1) % len(path)] = bezier_segment(*new_bpoints)

        # delete the path to be removed
        del _new_path[_seg_idx]
        return _new_path

    if opt.min_relative_segment_length > 0:
        for r_idx, r in enumerate(ring_list):
            min_seg_length = r.path.length() * opt.min_relative_segment_length
            new_path = [s for s in r.path]
            its = 0
            flag = False
            while its < len(r.path):
                its += 1
                for seg_idx, seg in enumerate(new_path):
                    if seg.length() < min_seg_length:
                        flag = True
                        if seg == new_path[-1] and not r.path.isclosed():
                            newjoint = seg.end
                        elif seg == new_path[0].start and not r.path.isclosed():
                            newjoint = seg.start
                        else:
                            newjoint = seg.point(0.5)
                        new_path = _remove_seg(new_path, seg_idx, newjoint)
                        break
                else:
                    break
            if flag:
                ring_list[r_idx].path = Path(*new_path)

    # Close approximately closed rings
    for r in ring_list:
        r.fixClosure()

    # Palette check
    from svg2rings import palette_check
    ring_list = palette_check(ring_list)

    # Check for and fix inconsistencies in closedness of rings
    from svg2rings import closedness_consistency_check
    ring_list = closedness_consistency_check(ring_list)

    # Remove self-intersections in open rings
    if opt.remove_self_intersections:
        rsi_start_time = current_time()
        fixable_count = 0
        print("Checking for self-intersections...")
        bad_rings = []
        for r_idx, r in enumerate(ring_list):
            if r.path.end == r.path.start:
                continue
            first_half = r.path.cropped(0, 0.4)
            second_half = r.path.cropped(0.6, 1)
            middle_peice = r.path.cropped(0.4, 0.6)
            inters = first_half.intersect(second_half)
            if inters:
                if len(inters) > 1:
                    Ts = [info1[0] for info1, info2 in inters]
                    bad_rings.append((r_idx, Ts))
                    continue
                else:
                    fixable_count += 1
                T1, seg1, t1 = inters[0][0]
                T2, seg2, t2 = inters[0][1]

                T1 = crop_to_unit_interval(T1)
                T2 = crop_to_unit_interval(T2)

                if not opt.force_remove_self_intersections:
                    print("Self-intersection detected!")
                    greenpart = first_half.cropped(0, T1)
                    redpart = second_half.cropped(T2, 1)

                new_path = [seg for seg in first_half.cropped(T1, 1)]
                new_path += [seg for seg in middle_peice]
                new_path += [seg for seg in second_half.cropped(0, T2)]
                new_path = Path(*new_path)

                if opt.force_remove_self_intersections:
                    dec = True
                else:
                    print("Should I remove the red and green sections?")
                    disvg([greenpart, new_path, redpart],
                          ['green', 'blue', 'red'],
                          nodes=[seg1.point(t1)])
                    dec = inputyn()

                if dec:
                    r.path = new_path
                    print("Path cropped.")
                else:
                    print("OK... I hope things work out for you.")
        if bad_rings:
            paths = [r.path for r in ring_list]
            colors = [r.color for r in ring_list]
            center_line = Line(center-1, center+1)
            nodes = []
            for r_idx, Ts in bad_rings:
                for T in Ts:
                    nodes.append(ring_list[r_idx].path.point(T))
                colors[r_idx] = opt.colordict['safe2']
            node_colors = [opt.colordict['safe1']] * len(nodes)

            tmp = svgname + "_SelfIntersections.svg"
            fixed_svg_filename = os.path.join(opt.output_directory, tmp)
            disvg(paths + [center_line],
                  colors + [opt.colordict['center']],
                  nodes=nodes,
                  node_colors=node_colors,
                  filename=fixed_svg_filename)
            tmp_mes = (
                "Some rings contained multiple self-intersections, you better "
                "take a look.  They must be fixed manually (in Inkscape or "
                "Adobe Illustrator). An svg has been output highlighting the "
                "rings which must be fixed manually (and the points where the "
                "self-intersections occur).  Fix the highlighted rings and "
                "replace your old svg with the fixed one (the colors/circles "
                "used to highlight the intersections will be fixed/removed "
                "automatically).\n Output svg saved to:\n"
                "{}".format(fixed_svg_filename))
            raise Exception(tmp_mes)

        et = format_time(current_time()-rsi_start_time)
        print("Done fixing self-intersections ({} detected in {})."
              "".format(fixable_count, et))

    # Check that all rings are smooth (search for kinks and round them)
    if opt.smooth_rings:
        print("Smoothing paths...")
        bad_rings = []
        for r_idx, r in enumerate(ring_list):
            if r.path.iscontinuous():
                args = (r.path, opt.maxjointsize, opt.tightness, True)
                r.path = smoothed_path(*args)
                still_kinky_list = kinks(r.path)
                if still_kinky_list:
                    bad_rings.append((r_idx, still_kinky_list))
            else:  # discont. may be added (accidentally) by code near kinks
                discontinuities = \
                    [r.path.index(s1) for s0, s1 in consecutive_pairs(r.path)
                     if s0.end != s1.start]
                bad_rings.append((r_idx, discontinuities))

        # If unremovable kinks exist, tell user to remove them manually
        if opt.ignore_unremovable_kinks or not bad_rings:
            opt.rings_may_contain_unremoved_kinks = False
        else:
            paths = [r.path for r in ring_list]
            colors = [r.color for r in ring_list]
            center_line = Line(center-1, center+1)
            nodes = []
            for r_idx, kink_indices in bad_rings:
                for idx in kink_indices:
                    kink = ring_list[r_idx].path[idx].start
                    nodes.append(kink)
                colors[r_idx] = opt.colordict['safe2']
            node_colors = [opt.colordict['safe1']] * len(nodes)

            fixed_svg_filename = os.path.join(
                opt.output_directory, svgname + "_kinks.svg")
            disvg(paths + [center_line],
                  colors + [opt.colordict['center']],
                  nodes=nodes,
                  node_colors=node_colors,
                  filename=fixed_svg_filename)
            raise Exception(
                "Some rings contained kinks which could not be removed "
                "automatically.  They must be fixed manually (in "
                "inkscape or adobe illustrator). An svg has been output "
                "highlighting the rings which must be fixed manually "
                "(and the points where the kinks occur).  Fix the "
                "highlighted rings and replace your old svg with the fixed "
                "one (the colors/circles used to highlight the kinks "
                "will be fixed/removed automatically).\n"
                "Output svg saved to:\n"
                f"{fixed_svg_filename}\n")
        print("Done smoothing paths.")

    # Check for overlapping ends in open rings
    if opt.check4overlappingends:
        print("Checking for overlapping ends (that do not intersect)...")
        bad_rings = []
        for r_idx, r in enumerate(ring_list):
            if r.path.isclosed():
                continue
            startpt = r.path.start
            endpt = r.path.end
            path_wo_start = r.path.cropped(.1, 1)
            path_wo_end = r.path.cropped(0, .9)
            start_is_outwards = isPointOutwardOfPath(startpt, path_wo_start)
            end_is_outwards = isPointOutwardOfPath(endpt, path_wo_end)
            if start_is_outwards:
                bad_rings.append((r_idx, 0, start_is_outwards))
            if end_is_outwards:
                bad_rings.append((r_idx, 1, end_is_outwards))

        if bad_rings:
            paths = [r.path for r in ring_list]
            colors = [r.color for r in ring_list]
            center_line = Line(center-1, center+1)
            for r_idx, endbin, segts in bad_rings:
                colors[r_idx] = opt.colordict['safe2']

            # indicator lines
            indicator_lines = []
            for r_idx, endbin, segts in bad_rings:
                bad_path = ring_list[r_idx].path
                endpt = bad_path.point(endbin)
                for bad_seg_idx, bad_t in segts:
                    bad_pt = bad_path[bad_seg_idx].point(bad_t)
                    indicator_lines.append(Line(bad_pt, endpt))
            indicator_cols = [opt.colordict['safe1']] * len(indicator_lines)

            fixed_svg_filename = os.path.join(opt.output_directory,
                                              svgname + "_OverlappingEnds.svg")
            disvg(paths + [center_line] + indicator_lines,
                  colors + [opt.colordict['center']] + indicator_cols,
                  filename=fixed_svg_filename)
            bad_ring_count = len(set(x[0] for x in bad_rings))
            tmp_mes = (
                "Detected {} rings with overlapping (but not intersecting) "
                "ends.  They must be fixed manually (e.g. in Inkscape or "
                "Adobe Illustrator).  An svg has been output highlighting the "
                "rings which must be fixed manually.  Fix the highlighted "
                "rings, remove the,indicator lines added, and replace your "
                "old svg with the fixed one (the colors used to highlight the "
                "intersections will be fixed automatically).\nIf the "
                "indicator lines do not appear to be normal to the ring, this "
                "is possibly caused by a very short path segment.  In this "
                "case, you may want to try increasing "
                "min_relative_segment_length in options and running again.\n"
                "Output svg saved to:\n"
                "{}".format(bad_ring_count, fixed_svg_filename))
            raise Exception(tmp_mes)
        print("Done checking for overlapping ends.")

    # Trim paths with high curvature (i.e. curly) ends
    if opt.remove_curly_ends:
        print("Trimming high curvature ends...")
        for ring in ring_list:
            if ring.isClosed():
                continue

            # 90 degree turn in distance of opt.tol_isNear
            tol_curvature = 2**.5 / opt.tol_isNear  # #### Tolerance

            # Find any points within tol_isNear of start and end that have
            # curvature equal to tol_curvature, later we'll crop them off
            from svgpathtools import real, imag
            from svgpathtools.polytools import polyroots01

            def icurvature(segment, kappa):
                """returns a list of t-values such that 0 <= t<= 1 and
                seg.curvature(t) = kappa."""
                z = segment.poly()
                x, y = real(z), imag(z)
                dx, dy = x.deriv(), y.deriv()
                ddx, ddy = dx.deriv(), dy.deriv()

                p = kappa**2*(dx**2 + dy**2)**3 - (dx*ddy - ddx*dy)**2
                return polyroots01(p)

            # For first segment
            startseg = ring.path[0]
            ts = icurvature(startseg, tol_curvature)
            ts = [t for t in ts if startseg.length(t1=t) < opt.tol_isNear]
            if ts:
                T0 = ring.path.t2T(0, max(ts))
            else:
                T0 = 0

            # For last segment
            endseg = ring.path[-1]
            ts = icurvature(endseg, tol_curvature)
            ts = [t for t in ts if endseg.length(t0=t) < opt.tol_isNear]
            if ts:
                T1 = ring.path.t2T(-1, min(ts))
            else:
                T1 = 1

            # crop (if necessary)
            if T0 != 0 or T1 != 1:
                ring.path = ring.path.cropped(T0, T1)

        print("Done trimming.")

    # Check that there are no rings end outside the boundary ring (note
    # intersection removal in next step makes this sufficient)
    print("Checking for rings outside boundary ring...")
    boundary_ring = max([r for r in ring_list if r.isClosed()],
                        key=lambda rgn: rgn.maxR)
    outside_mark_indices = []
    for idx, r in enumerate(ring_list):
        if r is not boundary_ring:
            pt_outside_bdry = center + 2*boundary_ring.maxR
            r_starts_inside_boundary = path_encloses_pt(
                r.path[0].start, pt_outside_bdry, boundary_ring.path)
            if not r_starts_inside_boundary:
                outside_mark_indices.append(idx)
    if outside_mark_indices:
        ring_list = [r for i, r in enumerate(ring_list)
                     if i not in outside_mark_indices]
        warn("%s paths were found outside the boundary path and will be "
             "ignored." % len(outside_mark_indices))
    print("Done removing rings outside of boundary ring.")

    # Remove intersections (between distinct rings)
    if opt.rings_may_contain_intersections:
        print("Removing intersections (between distinct rings)...")
        from noIntersections4rings import remove_intersections_from_rings
        opt.basic_output_on.dprint(
            "Now attempting to find and remove all intersections from "
            "rings (this will take a long time)...")
        intersection_removal_start_time = current_time()

        ring_list, intersection_count, overlappingClosedRingPairs = \
            remove_intersections_from_rings(ring_list)

        if not overlappingClosedRingPairs:
            tot_ov_time = format_time(current_time() - intersection_removal_start_time)
            opt.basic_output_on.dprint(
                "Done (in just %s). Found and removed %s intersections."
                "" % (tot_ov_time, intersection_count))
        else:
            # fixed_paths = [parse_path(r.string) for r in ring_list]
            fixed_paths = [r.path for r in ring_list]
            fixed_colors = [r.color for r in ring_list]
            center_line = Line(center-1, center+1)
            nodes = []
            for i, j in overlappingClosedRingPairs:
                fixed_colors[i] = opt.colordict['safe1']
                fixed_colors[j] = opt.colordict['safe2']
                inters = pathXpathIntersections(
                    ring_list[i].path, ring_list[j].path)
                nodes += [inter[0].point(inter[2]) for inter in inters]

            fixed_svg_filename = os.path.join(
                opt.output_directory, svgname + "_ClosedRingsOverlap.svg")
            disvg(fixed_paths + [center_line],
                  fixed_colors + [opt.colordict['center']],
                  nodes=nodes,
                  filename=fixed_svg_filename)
            raise Exception("Found %s pair(s) over overlapping closed rings.  "
                            "They must be fixed manually (in inkscape or "
                            "adobe illustrator). An svg has been output "
                            "highlighting the rings which must be separated "
                            "manually (and the points where they intersect).  "
                            "Fix the highlighted rings and replace your old "
                            "svg with the fixed one (the colors/circles used "
                            "to highlight the intersections will be "
                            "fixed/removed automatically).\n"
                            "Output svg saved to:\n"
                            "%s" % (len(overlappingClosedRingPairs),
                                    fixed_svg_filename))

    # Output a fixed SVG that is (hopefully) how this SVG would be if humans
    # were perfect
    if opt.create_fixed_svg:
        opt.basic_output_on.dprint("Now creating a fixed svg file...", 'nr')
        fixed_paths = [r.path for r in ring_list]
        fixed_colors = [r.color for r in ring_list]
        center_line = Line(center - 1, center + 1)

        fixed_svg_filename = os.path.join(opt.output_directory,
                                          svgname + "_fixed.svg")
        wsvg(fixed_paths + [center_line],
             fixed_colors + [opt.colordict['center']],
             filename=fixed_svg_filename)
        opt.basic_output_on.dprint("Done.  SVG file saved to:\n"
                                   "%s" % fixed_svg_filename)

redpajama_set_name: RedPajamaGithub


text:
What's New in Breast Cancer Research?
New information on breast cancer detection, treatment, and prevention can help you remain healthy and cancer-free. As a company who works with breast cancer survivors every day, we like to stay up-to-date on the newest breast cancer research. Some interesting topics in breast cancer research news involve alternatives to breast reconstruction, reducing the risk of breast cancer, improved imaging tests for breast cancer, and new medications to fight breast cancer. 3-D Mammograms Improve … [Read more...]
The Essential List of Resources for Breast Cancer Patients
When you need a helping hand after a breast cancer diagnosis, these resources can give you the support you need. Breast cancer is among the most common types of cancer. If you have been diagnosed with this disease, keep in mind that there are many resources for breast cancer patients. These resources provide valuable information on breast cancer, including what you can expect from treatment, where to find the support you need, and how to cope with the side effects of treatment. National … [Read more...]
A year after Ellen Eddings discovered she had breast cancer in her right breast, after 33 rounds of chemotherapy and radiation at the University of Chicago Medical Center, an irregularity was discovered in her left breast. "I had a bilateral mastectomy in February of 2003," Ellen said. "I thought, why... Read More
A year after Ellen Eddings discovered she had breast cancer in her right breast, after 33 rounds of chemotherapy and radiation at the University of Chicago Medical Center, an irregularity was discovered in her left breast.
"I had a bilateral mastectomy in February of 2003," Ellen said. "I thought, why me?" Her bilateral reconstruction failed on the right side, and after three surgeries she was at a low point. But a special nurse helped her through the worst of her ordeal, and her four sisters, all from Arkansas, traveled to Chicago to welcome her home from the hospital.
For the next nine years, Ellen made do with off-the-shelf breast forms. She hid behind loose tops, heavy jackets and scarves. "I had to apply the nipples separately and there was often a problem with slippage," she said. "My breasts looked uneven, and I thought people were noticing."
The chair of the Curriculum and Instruction Division of the School of Education at the University of Arkansas at Pine Bluff learned about ContourMed customized breast forms in early 2012. "I called and immediately set up an appointment for a scan at the ContourMed office," Ellen said. "They were very customer-service focused and set up the scan around my schedule. Within a few weeks of my appointment, I had my ContourMed breast forms. I am totally in love with them – I just put them on and go."
Ellen's thousand-watt smile beams when she talks about her life today. She plays racquetball and shoots hoops with her younger son when he's home from college. She even wore her ContourMed breast forms during a bath at a Hot Springs spa.
"I feel like myself again. I feel attractive," Ellen said. "One of my students told me, 'Something about you is different…you look brighter.'"
Dr. Ellen Jimmerson-Eddings

redpajama_set_name: RedPajamaCommonCrawl


text:
European Commission's Proposed Digital Services Act Got Several Things Right, But Improvements Are Necessary to Put Users in Control
By Christoph Schmon and Karen Gullo
Share It Share on Twitter Share on Facebook Copy link
The European Commission is set to release today a draft of the Digital Services Act, the most significant reform of European Internet regulations in two decades. The proposal, which will modernize the backbone of the EU's Internet legislation—the e-Commerce Directive—sets out new responsibilities and rules for how Facebook, Amazon, and other companies that host content handle and make decisions about billions of users' posts, comments, messages, photos, and videos.
This is a great opportunity for the EU to reinvigorate principles like transparency, openness, and informational self-determination. Many users feel locked into a few powerful platforms and at the mercy of algorithmic decision systems they don't understand. It's time to change this.
We obtained a copy of the 85-page draft and, while we are still reviewing all the sections, we zeroed in on several provisions pertaining to liability for illegal content, content moderation, and interoperability, three of the most important issues that affect users' fundamental rights to free speech and expression on the Internet.
What we found is a mixed bag with some promising proposals. The Commission got it right setting limits on content removal and allowing users to challenge censorship decisions. We are also glad to see that general monitoring of users is not a policy option and that liability for speech rests with the speaker, and not with platforms that host what users post or share online. But the proposal doesn't address user control over data or establish requirements that the mega platforms work towards interoperability. Thus, there is space for improvement and we will work with the EU Parliament and the Council, which must agree on a text for it to become law, to make sure that the EU fixes what is broken and puts users back in control.
Content liability and monitoring
The new EU Internet bill preserves the key pillars of the current Internet rules embodied in the EU's e-Commerce Directive. The Commission followed our recommendation to refrain from forcing platforms to monitor and censor what users say or upload online. It seems to have learned a lesson from recent disastrous Internet bills like Article 17, which makes platforms police users' speech.
The draft allows intermediaries to continue to benefit from comprehensive liability exemptions so, as a principle, they will not be held liable for user content. Due to a European-style "good samaritan" clause, this includes situations where platforms voluntarily act against illegal content. However, the devil lies in the details and we need to make sure that platforms are not nudged to employ "voluntary" upload filters.
New due-diligence obligations
The DSA sets out new due diligence obligations for flagging illegal content for all providers of intermediary services, and establishes special type and size-oriented obligations for online platforms, including the very large ones.
We said from the start that a one-size fits all approach to Internet regulations for social media networks does not work for an Internet that is monopolized by a few powerful platforms. We can therefore only support new due diligence obligations that are matched to the type and size of the platform. The Commission rightly recognizes that the silencing of speech is a systemic risk on very large platforms and that transparency about content moderation can improve the status quo. However, we will carefully analyze other, potentially problematic provisions, such as requiring platforms to report certain types of illegal content to law enforcement authorities. Rules on supervision, investigation, and enforcement deserve in-depth scrutiny from the European Parliament and the Council.
Takedown notices and complaint handling
Here, the Commission has taken a welcome first step towards more procedural justice. Significantly, the Commission acknowledges that platforms frequently make mistakes when moderating content. Recognizing that users deserve more transparency about platforms' decisions to remove content or close accounts, the draft regulations call for online platforms to provide a user-friendly complaint handling system and restore content or accounts that were wrongly removed.
However, we have concerns that platforms, rather than courts, are increasingly becoming the arbiters of what speech can or cannot be posted online. A harmonized notification system for all sorts of content will increase the risk that the platform becomes aware about the illegality of content and thus held liable for it.
Interoperability measures are missing
The Commission missed the mark on giving users more freedom and control over their Internet experience, as rules on interoperability are absent from the proposal. That may be addressed in the Digital Markets Act draft proposal. If the EU wants to break the power of platforms that monopolize the Internet, it needs regulations that will enable users to communicate with friends across platform boundaries, or be able to follow their favorite content across different platforms without having to create several accounts.
Court/administrative content takedown orders
The Internet is global and takedown orders of global reach are immensely unjust and impair users' freedom. The draft rules address the perils of world-wide takedown orders by requiring such orders take into account users' rights and their territorial scope must be necessary
Under the proposed regulations, the largest platforms can be fined up to six percent of their annual revenue for violating rules about hate speech and the sale of illegal goods. Proper enforcement actions and dissuasive sanctions are important tools to change the current digital space that is monopolized by very large platforms. That being said, high fines are only good if the substance of the regulations is good, which we will study in great detail in the next few weeks.
Non-EU platforms
Non-EU platform providers will face compliance duties if their services have a substantial connection to the EU. The proposed rules take particular aim at companies outside the Union, such as those in the U.S, that offer services to EU users. But the criteria for imposing the duties is not clear, and we're concerned that if non-EU platforms are obligated to have legal representation in the EU, some will decide against offering services in the EU.
Discover more.
Email updates on news, actions, events in your area, and more.
Postal Code (optional)
Anti-spam question: Enter the three-letter abbreviation for Electronic Frontier Foundation:
Don't fill out this field (required)
Thanks, you're awesome! Please check your email for a confirmation link.
Oops something is broken right now, please try again later.
Deeplinks Blog by Chao Liu | January 31, 2023
The FCC Broadband Maps: Meet the New Maps, Same as the Old Maps
When the Federal Communications Commission (FCC) released their new broadband map in November 2022, many hoped the chronic inaccuracies of past FCC maps would be resolved. Previous maps of high-speed broadband access in the United States painted inaccurate pictures partly because the definitions of things like "access" and "high-speed"...
Deeplinks Blog by Mitch Stoltz | December 29, 2022
The Year We Got Serious about Tech Monopolies: 2022 in Review
2022 has been a big year for enforcement of the antitrust laws against tech companies, with the five largest (Apple, Google, Meta/Facebook, Amazon, and Microsoft) all facing lawsuits or investigations in the US. Government scrutiny of tech company mergers is on the rise too: the Federal Trade Commission has challenged...
Deeplinks Blog by Cory Doctorow | December 28, 2022
An Urgent Year for Interoperability: 2022 in Review
Walled gardens can be great: we all like it when Stuff Just Works because a single company oversees all its elements. Walled gardens can be terrible: when all of our data, our social relations and our educational, romantic, professional and family ties are trapped inside a company's silo and...
Deeplinks Blog by Ross Schulman | December 22, 2022
A Roller Coaster for Decentralization: 2022 in Review
This year has been a roller coaster for the movement to decentralize the services and tools that we rely on every day. Decentralizing internet services may help remedy concerns ranging from traditional big business competition to online privacy.In order to devote closer attention to these issues which impact user autonomy...
Here's How Apple Could Open Its App Store Without Really Opening Its App Store
And what we can do about it.With this year's passage of the EU's Digital Markets Act (DMA), very large online platforms - those with EU revenues of €75 billion or more and at least 45 million EU users - will have to open up their devices to rival app...
Deeplinks Blog by Chao Liu, Ernesto Falcon, Katharine Trendacosta | December 6, 2022
Network Usage Fees Will Harm European Consumers and Businesses
Network usage fees, the idea that certain types of companies should pay internet service providers (ISPs) for the ability to deliver their content to consumers, both hurts consumers and breaks the status quo that has facilitated the rapid spread of the global internet. ISPs claim these fees are necessary because...
Deeplinks Blog by Rory Mir | December 1, 2022
How to Make a Mastodon Account and Join the Fediverse
The recent chaos at Twitter is a reminder that when you rely on a social media platform, you're putting your voice, your privacy, and your safety in the hands of the people who run that system. Many people are looking to Mastodon as a backup or replacement for Twitter, and...
Deeplinks Blog by Ross Schulman, Jon Callas | November 18, 2022
Leaving Twitter's Walled Garden
This post is part of a series on Mastodon and the fediverse. We also have a post on privacy and security on Mastodon, why the fediverse will be great—if we don't screw it up, and how to make a Mastadon account. You can follow EFF on...
Deeplinks Blog by Christoph Schmon, Mitch Stoltz | September 29, 2022
Google Loses Appeal Against EU's Record Antitrust Fine, But Will Big Tech Ever Change?
The EU continues to crack down on big tech companies with its full arsenal of antitrust rules. This month, Google lost its appeal against a record fine, now slightly trimmed to €4.13 billion, for abusing its dominant position through the tactics it used to keep traffic on Android devices...
Deeplinks Blog by Mitch Stoltz | September 16, 2022
Giving Big Corporations "Closed Generic" Top-Level Domain Names to Run as Private Kingdoms Is Still a Bad Idea
No business can own the generic word for the product it sells. We would find it preposterous if a single airline claimed exclusive use of the word "air," or a broadband service tried to stop its rivals from using the word "broadband." Until this year, it seemed settled that the...


text:
Q: Promises are not resolved in Jasmine using Karma I have a problem with a small karma unit test that should check a simple decryption/encryption service.
The thing is, if I call the following code "manual" (i.e., within my running angular app) everything is fine and I receive the expected test output:
this.encryptDataAsync('Hello World of Encryption','b4b63cd1a64dbef72fefe2eb3e3fc3eb').then((encryptedValue : string) : void => {
    console.log('1',encryptedValue);
    this.decryptDataAsync(encryptedValue,'b4b63cd1a64dbef72fefe2eb3e3fc3eb').then(function(decryptedValue : string) : void{
        console.log('2',decryptedValue);
    });
});

As soon as I try to run this Karma/Jasmine unit test
describe('simple encryption/decryption', function() {
    var results = '';

    beforeEach(function(done) {
        _cryptoService.encryptDataAsync('ABC','b4b63cd1a64dbef72fefe2eb3e3fc3eb').then(function (encryptedValue){
            console.log('1');

            _cryptoService.decryptDataAsync(encryptedValue,'b4b63cd1a64dbef72fefe2eb3e3fc3eb').then(function(decryptedValue){
                console.log('2');
                results = decryptedValue;
                done();
            });

        });

    });

    it("check results", function(done){
        expect(results).toBe('ABC');
        done();
    }, 3000);
});

I never reach console.log('1') nor '2'. I can confirm this while debugging the unit test. However, this is the only unit test that fails in the complete suite, so I guess it won't by a problem with modules, etc.
Is there a general problem with my test case? I would have expected that I can use the then functions to handle my test case and, afterwards, call the done() function to invoke the assertion part.
Update/Edit:
The service uses webcrypto as a library. It is complete independent of angular besides being an angular service (so, no variables on scopes, etc)

A: I needed to call scope.apply since "$q is integrated with the $rootScope.Scope Scope model observation mechanism in angular, which means faster propagation of resolution or rejection into your models and avoiding unnecessary browser repaints, which would result in flickering UI."

redpajama_set_name: RedPajamaStackExchange


text:
Q: How to build a Composer repository? I want to build a Composer repo which can be integrated with Magento 2 Composer repo.Then my team can use Composer to install the paid extensions with an authentication key.
I have aready read many documents but I still have not got any solution for this.
Hope that someone can give me a solution to do this.
Thank you so much.


The Greenbelt Police Explorer Program, Post 1937 is designed to introduce young men and women 14 to 20 years of age who are interested in learning more about law enforcement and/or interested in pursuing a career in law enforcement.
The program is designed to provide law enforcement training and experience to the Explorer through mentoring, classroom instruction, and hands-on training. The Explorer receives training on traffic stops, building searches, bomb threat response, hostage negotiation, accident reconstruction, arrest & search techniques just to name a few!
Explorers also have the opportunity to participate in community events such as Labor Day Festival, Trunk or Treat, The 4th of July Event, Bike-a-thon and National Night Out. This teaches the Explorers the importance of serving the community and helps them to develop core leadership skills.
For more information on the Police Explorer program, please email Sharnise Hawkins-Graham.


With the recent LoL Patch 8.11 changes, most ADCs were hit hard. They saw their winrates go down faster than they could say "it was the jungler's fault". However, Riot doesn't seem pleased with the changes yet. The basic underlying idea is that while the critical chance items that received nerfs were meant to affect all ADCs, some of them weren't dependent on those items. Among such champions are Kai'Sa and Ezreal.
Personally, it feels like Miss Fortune is in a great spot too right now. The ADC nerfs mean that Kai'Sa, Ezreal and similar champions have a much easier time in lane, and reach their item power-spikes much faster than their peers. Ezreal is now rushing the Blade of the Ruined King, while Kog'Maw and Kai'Sa can easily reach their Guinsoo's Rageblade without much hindrance.
In comparison, champions that relied on crit have begun to feel some real pain. Vayne is one such example. Her early game had been suffering for a few patches now, ever since she received a much needed nerf to her kit. Now, she feels extremely underwhelming, and even pros who main her, like Gosu, have stated that she's terrible to play right now.
Vayne might be an extreme example, but champions like Tristana, Caitlyn and Xayah aren't faring too well either. They don't receive their mid-game spike till much later than they used to. Now that ADCs have had their armour cut down, and are missing the healing they got from Fleet Footwork (which was also nerfed in LoL Patch 8.11), their laning phase is absolute hell. They don't reach a point of usefulness till they've got an Infinite Edge and two Zeal items.
This new item received a lot of hype due to its passive, which allowed a champion to critically strike after 3 seconds of being out of combat. Everyone looked to Jhin for this item, looking at his playstyle. Riot themselves even mentioned that they had Jhin in mind for this item. Yet, the item is underwhelming at best, and lethality items are serving our favourite serial killer far better right now.
Other than Jhin, no other ADC seems to have found a use for this item. By the time it's complete, stronger opponents like Kai'Sa or Lucian will have built a core item which allows them to do more than just poking for some extra damage. A Guinsoo's Rageblade costs around the same as a Stormrazor but is far more impactful than the latter.
Instead of buffing the champions who are struggling right now, the main goal seems to be to nerf the ADCs who are overperforming right now. That includes Ezreal and Kai'Sa more than anyone else. They both have great scaling, and can pretty much take off once they get a lead in the lane. Specifically, Riot talked about nerfing Kai'Sa's passive damage (base and scaling). For Ezreal, they're looking to cut down on his passive attack speed.
Expectedly, Yasuo has suffered extremely due to the crit changes. Unlike ADCs, he doesn't have any other build paths that he can go with. His passive dictates that he stays with crit items, which means that he won't be viable unless he receives some buffs. While the majority of you would be happy to see him deleted from the game, Riot is planning on giving him some love. They've hinted at lowering his Q crit penalty and increasing his base AD.
As for Taliyah, nothing has been mentioned about her AoE damage on her Q. However, Riot mentioned that they might alter the damage fallout on her Q on champions for repeated hits. They also hinted at upping her base AD and E trigger damage. At the time of writing, Taliyah's win rate on Lolalytics is 43.5, which speaks volumes about how hard the changes have hit her.
These changes aren't guaranteed by Riot,and are merely speculation. If at all true, they may hit the Rift before LoL Patch 8.12. They might even come in with the full LoL Patch 8.12. Either way, we have plenty of time to reveal what happens next.
For more details, you can visit Riot's original post on the matter.
What do you think about Riot's decision to nerf the surviving ADCs after LoL Patch 8.11? Let us know in the comments below!


Please provide your contact information so we can reach you if we have questions about your payment.
Hit "Submit" below. You will be directed to a "Pay Now" button. If you are not immediately redirected, check your email for a link to the PayPal button. Thank you.


Sequani believe it is important to work with educational establishments in helping to prepare students for the world of work.
We do this by getting involved in our local community giving careers in science talks, CV and mock interview training as well as attending careers fairs. We have a number of STEM ambassadors in our team which means we actively engage with local schools and colleges to support the science curriculum. Our employees are encouraged to get involved by giving talks about what we do and showing students around our site.
By doing this we hope students can gain valuable insight into the world of work, what a career in science is like and gives them the motivation to continue with their studies to achieve their chosen career.


text:
<?php
require_once dirname(__FILE__) . '/../../../synapp/languages/create_all_languages_table.php';
require_once dirname(__FILE__) . '/../../../synapp/connect.php';
function init()
{
    $link = connect(false);
    if (mysqli_select_db($link, "synapp_db")) {
        mysqli_close($link);
        unset($link);
        return INST_DB_EXISTS;
    }
    $sql = "CREATE DATABASE synapp_db";
    if (!mysqli_query($link, $sql)) {
        die ("mysql CREATE DATABASE error.");
    }
    $sql = "ALTER DATABASE synapp_db CHARACTER SET utf8 COLLATE utf8_unicode_ci";
    if (!mysqli_query($link, $sql)) {
        die ("mysql ALTER DATABASE synapp_db CHARACTER SET utf8 COLLATE utf8_unicode_ci error.");
    }
    if (!mysqli_select_db($link, "synapp_db")) {
        die ("mysqli_select_db() error.");
    }

    create_all_languages_table($link);

    $sql = "CREATE TABLE IF NOT EXISTS users (user VARCHAR(32) UNIQUE KEY,pass VARCHAR(64),recovery VARCHAR(64),"
        . "firstdate INT,hfirstdate BIT DEFAULT 0,missed_logins INT DEFAULT 0,last_login INT,hlast_login BIT DEFAULT 0,ip INT UNSIGNED,last_update INT,"
        . "interface_language VARCHAR(4),hinterface_language BIT DEFAULT '0',working_group VARCHAR(32),hworking_group BIT DEFAULT 0,input_language VARCHAR(4),hinput_language BIT DEFAULT 0,hprofile BIT DEFAULT 0,"
        . "gender VARCHAR(1) DEFAULT NULL, hgender BIT DEFAULT 0,birthday DATE, hbirthday BIT DEFAULT 0,studies VARCHAR(256), hstudies BIT DEFAULT 0,studies_type VARCHAR(64), hstudies_type BIT DEFAULT 0,studies_level INT, hstudies_level BIT DEFAULT 0, occupation VARCHAR(256),hoccupation BIT DEFAULT 0,"
        . "email VARCHAR(128),hemail BIT DEFAULT 0,email_confirmation_code VARCHAR(64),confirmed_email BIT DEFAULT 0,avatar VARCHAR(128),hstats BIT DEFAULT 0, ditloid_lock_timestamp INT DEFAULT NULL, ditloid_time_left_when_locked INT DEFAULT 0, gotestbefore INT DEFAULT 0,"
        . "gotestafter INT DEFAULT 0, timer_ctestb_start INT DEFAULT 0, timer_ctestb_end INT DEFAULT 0, timer_utestb_start INT DEFAULT 0, timer_utestb_end INT DEFAULT 0, timer_utesta_start INT DEFAULT 0, timer_utesta_end INT DEFAULT 0, timer_ctesta_start INT DEFAULT 0, timer_ctesta_end INT DEFAULT 0, fbid VARCHAR(255) DEFAULT NULL)";
    if (!mysqli_query($link, $sql)) {
        die('Error: ' . var_export($link->errorInfo(), true));
    }

    $sql = "CREATE TABLE `interface_languages` (native_name VARCHAR(32), iso6392_code VARCHAR(4) UNIQUE KEY, users INT DEFAULT 0)";
    if (mysqli_query($link, $sql)) {
        $sql = "INSERT INTO interface_languages VALUES (\"español\", \"spa\", \"0\")";
        mysqli_query($link, $sql);
        $sql = "INSERT INTO interface_languages VALUES (\"english\", \"eng\", \"0\")";
        mysqli_query($link, $sql);
        $sql = "INSERT INTO interface_languages VALUES (\"galego\", \"glg\", \"0\")";
        mysqli_query($link, $sql);
        $sql = "INSERT INTO interface_languages VALUES (\"polski\", \"pol\", \"0\")";
        mysqli_query($link, $sql);
    }

    $sql = "CREATE TABLE `groups` (name VARCHAR(32), users INT DEFAULT 0)";
    if (mysqli_query($link, $sql)) {
        $sql = "INSERT INTO groups VALUES (\"DEFAULT_GROUP_A\", \"0\")";
        mysqli_query($link, $sql);
        $sql = "INSERT INTO groups VALUES (\"DEFAULT_GROUP_B\", \"0\")";
        mysqli_query($link, $sql);
    }

    $sql = "CREATE TABLE IF NOT EXISTS `images` (id VARCHAR(69) UNIQUE KEY, name VARCHAR(32), associated_group VARCHAR(32), uploader VARCHAR(32), KEY(associated_group))";
    if (!mysqli_query($link, $sql)) {
        die('Error: ' . var_export($link->errorInfo(), true));
    }

    $sql = "CREATE TABLE IF NOT EXISTS `stats` (user VARCHAR(32),lang VARCHAR(4), day DATE,type INT,"
        . "assigned_group VARCHAR(32), upvotes INT DEFAULT 0, downvotes INT DEFAULT 0, neutralvotes INT DEFAULT 0, popupvotes INT DEFAULT 0, popdownvotes INT DEFAULT 0, popneutralvotes INT DEFAULT 0, count INT DEFAULT 0, UNIQUE INDEX `user_lang_day_type_assigned_group` (`user`, `lang`, `day`, `type`, `assigned_group`))";
    if (!mysqli_query($link, $sql)) {
        die('Error: ' . var_export($link->errorInfo(), true));
    }
    $sql = "CREATE TABLE IF NOT EXISTS `test_ranks` (user VARCHAR(32), ttype VARCHAR(32),evals INT,orgfullvotes INT, orghalfvotes INT, orgzerovotes INT, cohfullvotes INT, cohhalfvotes INT, cohzerovotes INT, UNIQUE INDEX uti (user,ttype))";
    if (!mysqli_query($link, $sql)) {
        die('Error: ' . var_export($link->errorInfo(), true));
    }
    $sql = "CREATE TABLE IF NOT EXISTS `confirmed_emails` (user VARCHAR(32),email VARCHAR(128) UNIQUE KEY, KEY(user))";
    if (!mysqli_query($link, $sql)) {
        die('Error: ' . var_export($link->errorInfo(), true));
    }
    return INST_OK;
}


text:
Nousy
Apeirophobia: Eternity is scary af
Note: This post was originally published on Monday, August 29th, 2022 at my other, now defunct, blog Bonne Raison. It has since been substantially revised and updated with an afterword.
The Scream by Edvard Munch (undated)
A phobia is defined as:
a fear, horror, strong dislike, or aversion; especially an extreme or irrational fear aroused by a particular object or circumstance (1)
Arachnophobia (fear of spiders) and claustrophobia (fear of small spaces) are two, perhaps familiar, examples. However, in my experience, fewer people know about apeirophobia (fear of eternity). My aim with this blogpost is to change that. So I will now proceed to take apeirophobia out of a hitherto state of confusion and attempt to bring about some clarity on the topic.
First, to give you a taste of how this fear manifests itself, consider the situation that the main character in the movie Groundhog Day finds himself. Phil Connors (played by Bill Murray) somehow gets stuck in a seemingly endless cycle of having to repeatedly live the same day--Groundhog Day--over and over. In his despair, he commits suicide only to discover himself awakening on Groundhog Day, again.
So, whether Connors likes it or not, it seems like there's no escape! And for those with apeirophobia, the mere contemplation of such an inescapably eternal predicament can be absolutely terrifying.
Distinguishing two kinds of apeirophobia
The term apeirophobia comes from the Greek words for infinite (apeiros) and fear (phobos). There exist at least two kinds of apeirophobia, which I'm aware of: fear-of-eternal-death apeirophobia (FEDA) and fear-of-eternal-life apeirophobia (FELA). While it may be difficult to see how anyone can suffer from both kinds of apeirophobia at the same time, it is, needless to say, easy to see how someone could suffer from one kind at one time and the other kind at another time.
Fear of Eternal Death Apeirophobia (FEDA)
This seems like the more common kind of apeirophobia and, more generally, the fear of death seems instinctive to our species as it has appeared widely across time and cultures. It can appear very early on in life and, for some people, seems to go away, if not altogether disappear, over time. However, some people continue to be afflicted by this fear and it's those people who seem to be at greatest risk of developing long-term or chronic FEDA.
There are at least three common confusions about FEDA that one is likely to encounter:
FEDA is frequently conflated with another fear: the fear of missing out (FOMO). However, FEDA and FOMO are altogether different fears. FOMO is a fear of regret, whereas FEDA is a fear of eternal death. They are not the same!
Another common confusion conflates FEDA with fears about the process of dying or the manner of one's death. Again, these fears are not the same!
Lastly, there's confusing FEDA with interpersonal fears. For example, someone who has dependents may fear the well-being of those they leave behind after they die. Again, such fears needn't be confused with FEDA.
Now let's move onto the other kind of apeirophobia.
Fear of Eternal Life Apeirophobia (FELA)
This seems like the rarer kind of apeirophobia. However, before I say anymore, a further distinction must be drawn out between two possible varieties of FELA.
Distinguishing different types of FELA
Type 1: Fear of finding oneself in a situation in which one must exist without end and is trapped existing as a single incarnation of being.
Type 2: Fear of finding oneself in a situation in which one must exist without end but is not trapped existing as a single incarnation of being. Instead, one gets reincarnated infinitely many times.
For anyone still confused, an analogy to video games may help. You can think of Type 1 as sort of like playing a video game in which you die but then get to restart the same game (from wherever you left off) whereas Type 2 is more like playing a video game in which you eventually die and then get to start a new and totally different game. Either way, though, the playing never ends.
Some might wonder, between the varieties, which situation is better? In my view, they are both terrible! However, as others have pointed out (2), the situation of Type 2 seems preferable to Type 1; though, I'd argue a finite existence followed by eternal death (FEED) is preferable to either.
Popular Joker meme adapted for this blogpost; caption by author
Anyway, I don't have time to make my case for FEED, that'll have to wait for a future post. For now, I'll just make two brief cases concerning the kinds of apeirophobia we've considered in this blogpost.
FEDA seems highly irrational
Death, as was pointed out more than two millennia ago, is nothing to us: when we are alive, death is not here. And when death comes, we no longer exist (3). When you think about, it's hard to see what's so scary about that? Consider what it was like before you were born. Seems like nothing. So why think that it will be any different after one dies?
Additionally, a contemporary argument by Galen Strawson, also seems to support the conclusion that death is nothing to us. If, on Strawson's view, No Ownership of The Future is true, then one cannot even be harmed by an untimely death (4). So, at least, the only sensible conclusion I can think of is that a fear of eternal death seems rationally indefensible.
Other phobias don't seem to have this fundamental flaw, though the risks are often exaggerated. Take a fear of heights. Falls can seriously harm you. So avoiding air travel or elevators would just be an irrational manifestation and exaggeration of an otherwise sensible concern. However, it's hard to see how death can constitute a harm for the person who dies. When you really think about it, it just doesn't seem to make much sense.
FELA seems more rational
Unfortunately, we may already be eternal beings; albeit in a situation like that of Type 2. There are two reasons which together might support it: Penrose's theory of cyclical cosmology and Huemer's argument for reincarnation.
Firstly, though many people already know about the Big Bang theory of the cosmos, there's another, though not as widely popular, theory of the cosmos we should consider. According to the Nobel laureate Sir Roger Penrose's Conformal Cyclic Cosmology (CCC):
the universe consists of a (perhaps infinite) succession of aeons, where each aeon originates with its own big bang and has an unending exponentially expanding future (5)
New theories come and go but, unfortunately for those suffering with FELA, a couple of CCC's predictions have apparently been confirmed. Those interested to learn more can watch this accessible video in which Penrose introduces and explains CCC.
Secondly, there's an argument for reincarnation by philosopher Michael Huemer, according to which, the probability that you'll be reincarnated infinitely many times is a hundred percent (6). Those interested to learn more can watch this accessible video in which Huemer introduces and explains his reincarnation argument.
So, given Penroses's CCC and Huemer's argument for reincarnation, it looks like a case can be made that we may, in fact, already be in a Type 2 situation. If so, then FELA doesn't seem so irrational.
It's not been long since I published an earlier version of this post but, just recently, I got involved in a conversation about death on social media and, in the discussion, I brought apeirophobia up, so that's why I came back to this topic so soon. This post was rushed and so I intend to return to it again in the very near future.
Notes & References
OED Online (2022). Oxford University Press
Huemer, M (2021). What's the Best Afterlife? Fake Nous
An ancient (Epicurean) argument that death is nothing to us
Strawson, G (2017). I Have no Future. Chapter 5 in The Subject of Experience. OUP
Penrose, R. (2018). The Big Bang and its Dark-Matter Content: Whence, Whither, and Wherefore. Foundations of Physics, 48(10), 1177–1190
Huemer, M. (2021), Existence Is Evidence of Immortality. Noûs, 55: 128–151
Epistemic Trespassing: Stay in your lane mf
In this blogpost, I focus on the problem of epistemic trespassing . This happens when experts step outside their field of expertise and pass judgment on questions in fields where they lack expertise. Philosopher Joshua DiPaolo recently argued that epistemic trespassing is wrong insofar as it constitutes an abuse of expert authority that neglects novice vulnerabilities (1). I agree with DiPaolo and think that it's something more people should know about, especially at a time when a lot of knowledge is specialized and we--novices--often depend on experts for answers. So, below, I share a tragic example of epistemic trespassing that illustrates its harmful potential and very briefly consider possible solutions. Consider the following: A mother's two infant children die suddenly and without any explanation. She's charged with their murder and in court two possible explanations are considered: (i) that the infants died due to the rare sudden infant death syndrome (SIDS) or (ii) that s
In a recent tweet, Keith Frankish suggested that philosophers shouldn't aim at being right. Instead, he thinks that they should aim at being usefully wrong. Keith's tweet; used with permission This struck me as somewhat puzzling and got me thinking about what philosophers should aim at. As anyone who values knowledge will understand, sometimes being right really matters. For example, knowledge in advance of a potentially dangerous storm can sometimes save your life. Similarly, in philosophical areas like epistemology and ethics, being right about some issue or problem is also important and possibly for others, other than the inquiring philosopher, too. When being right is actually important For starters, the threat of External World Skepticism (EWS) poses a significant challenge to whatever you think you know about the world outside your own mind. You may believe that you have real friends. But if EWS is true, then you cannot know that the people you take to be your friends really


Description: The March for Science is an opportunity for the diverse scientific community to come together with one voice to call for support for science, support for publicly funded research, and the need for policymakers to enact evidence-based policies. The March for Science takes place on April 22, 2017 in Washington, DC and in more than 400 cities around the world. The Endocrine Society is a proud partner of this march.


text:
category: Components
group: Navigation
title: Breadcrumb
cover: https://gw.alipayobjects.com/zos/alicdn/9Ltop8JwH/Breadcrumb.svg
demo:
  cols: 2
---

A breadcrumb displays the current location within a hierarchy. It allows going back to states higher up in the hierarchy.

## When To Use

- When the system has more than two layers in a hierarchy.
- When you need to inform the user of where they are.
- When the user may need to navigate back to a higher level.

### Usage upgrade after 4.24.0

<Alert message="After version 4.24.0, we provide a simpler usage <Breadcrumb.Item menu={{ items: [...] }}> with better performance and potential of writing simpler code style in your applications. Meanwhile, we deprecated the old usage in browser console, we will remove it in antd 5.0."></Alert>

```jsx
// works when >=4.24.0, recommended ✅
const items = [
  { label: 'item 1', key: 'item-1' }, // remember to pass the key prop
  { label: 'item 2', key: 'item-2' },
];
return (
  <Breadcrumb>
    <Breadcrumb.Item menu={{ items }}>Ant Design</Breadcrumb.Item>
  </Breadcrumb>
);

// works when <4.24.0, deprecated when >=4.24.0 🙅🏻♀
const menu = (
  <Menu>
    <Menu.Item>item 1</Menu.Item>
    <Menu.Item>item 2</Menu.Item>
  </Menu>
);
return (
  <Breadcrumb>
    <Breadcrumb.Item overlay={menu}>Ant Design</Breadcrumb.Item>
  </Breadcrumb>
);
```

## Examples

Basic Usage
With an Icon
react-router V6
Configuring the Separator
Bread crumbs with drop down menu
Configuring the Separator

## API

### Breadcrumb

| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| itemRender | Custom item renderer | (route, params, routes, paths) => ReactNode | - |  |
| params | Routing parameters | object | - |  |
| routes | The routing stack information of router | [routes\[\]](#routes) | - |  |
| separator | Custom separator | ReactNode | `/` |  |

### Breadcrumb.Item

| Property | Description | Type | Default | Version |
| --- | --- | --- | --- | --- |
| className | The additional css class | string | - |  |
| dropdownProps | The dropdown props | [Dropdown](/components/dropdown) | - |  |
| href | Target of hyperlink | string | - |  |
| menu | The menu props | [MenuProps](/components/menu/#API) | - | 4.24.0 |
| onClick | Set the handler to handle click event | (e:MouseEvent) => void | - |  |

### Breadcrumb.Separator

| Property | Description      | Type      | Default | Version |
| -------- | ---------------- | --------- | ------- | ------- |
| children | Custom separator | ReactNode | `/`     |         |

> When using `Breadcrumb.Separator`,its parent component must be set to `separator=""`, otherwise the default separator of the parent component will appear.

### routes

```ts
interface Route {
  path: string;
  breadcrumbName: string;
  children: Array<{
    path: string;
    breadcrumbName: string;
  }>;
}
```

### Use with browserHistory

The link of Breadcrumb item targets `#` by default, you can use `itemRender` to make a `browserHistory` Link.

```jsx
import { Link } from 'react-router';

const routes = [
  {
    path: 'index',
    breadcrumbName: 'home',
  },
  {
    path: 'first',
    breadcrumbName: 'first',
    children: [
      {
        path: '/general',
        breadcrumbName: 'General',
      },
      {
        path: '/layout',
        breadcrumbName: 'Layout',
      },
      {
        path: '/navigation',
        breadcrumbName: 'Navigation',
      },
    ],
  },
  {
    path: 'second',
    breadcrumbName: 'second',
  },
];
function itemRender(route, params, routes, paths) {
  const last = routes.indexOf(route) === routes.length - 1;
  return last ? (
    <span>{route.breadcrumbName}</span>
  ) : (
    <Link to={paths.join('/')}>{route.breadcrumbName}</Link>
  );
}

return <Breadcrumb itemRender={itemRender} routes={routes} />;
```


text:
Visit often for updates on celebrity & expert appearances.
2019 SHOW INFORMATION BELOW
CLINT HARP
Clint Harp can be found regularly on HGTV's hit show Fixer Upper as the dumpster diving, reclaimed wood loving carpenter. After quitting his sales job in 2011 to pursue his dream of building furniture and owning his own company, the last thing he expected was to be a nationally known carpenter featured on HGTV.
Now, together with his wife Kelly and their 3 kids, the Harps spend each day pursuing their dream and blazing the new trail of owning their own company. Harp Design Co. provides quality furniture and home goods to customers all across the U.S. and abroad. Constantly adjusting to unexpected national exposure, the Harps work hard each day to grow as a family and a business whose core values are love, beauty, and creativity.
Clint appears as a supporting role in Fixer Upper, helping his close friends and stars Chip and Joanna Gaines as they remodel homes in Waco, Texas. The show attracted more than 19 million viewers its first season, is currently airing season two and shooting the third season. Clint takes recycled and reclaimed wood, usually found pieces, and creates beautiful, one-of-a-kind pieces meant to bring families together, which the Gaines incorporate into their final remodel and home designs.
Up next, Clint will star on the DIY Network series Wood Work. Along with his wife, Kelly, and the team at Harp Design Co, Clint uses reclaimed lumber to build new furniture out of old wood for clients. Crazy requests with tight deadlines are the norm, but Clint and his team are ready to tackle any "Wood Work" challenge.
Join the star of MeTV Kansas City's Brady Bunch, Barry Williams.
He will be appearing in the Nebraska Furniture Mart Booth (#722), Saturday, March 9, 2019 from
10am - 2pm.
MeTV Kansas City's channel line-up includes some of the most beloved television programs ever produced - comedies including M*A*S*H, The Andy Griffith Show, Carol Burnett and Friends, and The Brady Bunch; dramas such as Perry Mason and Columbo; great westerns including Gunsmoke, Bonanza, and The Rifleman; the heroics of Batman and Wonder Woman, and otherworldly classics such as Star Trek, Buck Rogers in the 25th Century, and The Twilight Zone – and so much more!
MeTV Kansas City airs on Spectrum Channels 188 and 1240, Comcast 247, Consolidated Communications 611, Suddenlink 134, Google Fiber 72 and over the air using an HDTV antenna on KMBC channel 9.2 - Check your provider listings for additional channels in your area or visit our website at MeTV.com and click "Where to Watch."
One Stop Decorating
The Future of Window Coverings in Today's Home
As President of One Stop Decorating, Brandon Roellchen is proud to call the Kansas City area his home. At the University of Kansas, Brandon received a communications studies degree. He has been involved in every facet of the business, from sales and installation services management to training and advancement of the staff. He drives One Stop Decorating to continually be on the cutting edge of technology and further executes the vision for this organization.
Samsara Home
Alex Iglesias and Sarah Roos
Decorating with Nostalgic Elements


text:
Your Roadmap
From Kamaishi to Tokyo with Emily Hallams
March 7, 2021 April 7, 2020 by Kate Kalinova
Emily in the spotlight at the 2019 Rugby World Cup in Kamaishi due to her bilingual English/ Japanese language skills! Watch the full interview here.
Having chatted with AustCham Korea's Executive Director (ED), Rowan Petz, in Seoul, it was terrific to sit down with the ED of the Australian New Zealand Chamber of Commerce (ANZCCJ), Emily Hallams in Tokyo during a recent visit! Although new to her role at the Chamber, Emily has an impressive array of study and work experience in Japan, spanning across various cities and prefectures, making her a perfect source of inspiration for Asia Options' readers.
Language Immersion Begins
After nurturing an interest in Japanese through language study in high school, Emily visited Japan on a two-week-long high school exchange program in Year 9 and Year 11. These initial visits took her to the Japanese countryside in Fukui Prefecture, studying at a local high school and living at a homestay.
Building-up the moment from there trips, Emily decided to enrol in a Bachelor of Asia Pacific Studies (Japanese Language/Northeast Asian Studies) at the Australian National University in Canberra. Having experienced life in Japan she was certain that language fluency was the key to pursuing a career in the field, meaning that a related degree with exchange to Japan was a valuable stepping stone for her journey. Her exchange at Kansai University in Osaka was a definite highlight. To this day, it has proved to be a great conversation-starter in business settings, as Osaka is known as a contrast to Tokyo and very different from Emily's other experiences in smaller cities.
"Osaka is a big city but actually quite different to Tokyo. Locals are known for being more outgoing and having distinct accents, so it was great to experience life as a student there".
Emily Hallams
As an additional perk, there was less separation between local and international students, so it was easy to make Japanese friends and improve your language skills.
Interested? Check out scholarship options to explore various language study, full-time study and exchange options in Japan. To learn more about studying in Osaka, click here.
Taking a Leap Into Kamaishi
Having completed her studies at ANU, Emily turned to JET as a way of transitioning to working in Japan. As a well-known and respected program popular among her peers, JET offered opportunities for those with Japanese language skills to work in Japan, either as an Assistant Language Teacher (ALT), Coordinator for International Relations (CIR) or Sports Exchange Advisor (SEA). Although approximately 90% of the JET program placements are ALT roles, Emily was decided to apply for a CIR position. Before making the decision, Emily visited one of her seniors, who was completing a CIR placement on a remote island, which made her determined to take the leap into the 'path less travelled'.
"After seeing my friend, who was working in Okinoshima, I just felt like it was an opportunity that would be hard to come by at any other time."
As fate would have it, Emily ended up being selected to join Kamaishi's local government office. Located in the Iwate Prefecture, Kamaishi started out as a small fishing village, later developing into a steel town during the Meiji era. The value of its industry made it a target during the war, meaning it was decimated from multiple bombings and later re-built. A number of tsunamis also devastated the city, giving it a long cyclic history of utter devastation and rebuilding. Apart from this intrinsic resilience, Kamaishi's steel industry lead Nippon Steel to sponsor the local rugby team, making it one of the best in the country.
In the aftermath of the 2011 tsunami, players petitioned to host some Rugby World Cup matches in the city, hoping to help rebuild the city from this latest round of devastation. Against all odds, the committee approved the decision and Kamaishi was selected as the host to a number of 2019 games!
When Emily arrived in the city in 2016, preparations were well underway for the Rugby World Cup. As the first foreigner to be employed at the local government office, the role was a rollercoaster of new experiences. Since there was no predecessor to take over from, her role involved a lot of bravery, initiative and improvisation – but the challenges made the experience a truly rewarding one.
"The job was definitely a challenge. Since there was no predecessor or training, I had to find my own way. But I learned a lot by saying yes to every opportunity, even if I felt unsure of my own abilities – learning from mistakes gives you the resilience to take on new challenges".
As one of the unexpected opportunities, Emily taught English on local Kamaishi radio station ( http://listenradio.jp/ )
Emily loved having the opportunity to immerse herself in Japanese language and culture – particularly since Kamaishi offered a more flexible and relaxed environment for putting the nuances of Japanese business etiquette intro practice! Another advantage was working with a totally Japanese team gave Emily plenty of opportunities to connect with Japanese mentor figures.
As other Asia Options articles have discussed, drinking is an important element of building relationships in Asia. However, Emily emphasises that more importantly than drinking itself, coming along to these outside-of-work activities is the key to building rapport with colleagues. As people let down their guard, formality drops away and you can learn more about your colleagues and seniors. When mentor-figures shown an interest in you, it's worth building the relationship – as it can lead to other introductions and provide opportunities for future projects. As fate would have, one of these encounters introduced Emily to an iconic figure in the Australia-Japan space, Melanie Brock.
ANZCCJ team featuring Emily, Aki and their intern, George.
Diving Into Tokyo's Expat Bubble
After their initial meeting in 2016, Emily often found herself liaising with Melanie and other representatives from the Australian New Zealand Chamber of Commerce in Japan (ANZCCJ). So when the opportunity to join the Chamber as an Executive Director came up late last year, following the completion of the Rugby World Cup in Kamaishi, Emily decided to grab the opportunity to try something new.
"Tokyo was a whole new world. After joining the Chamber, reverse culture shock was definitely a major challenge. Practical skills, like learning how to write direct business emails, which are very different to their Japanese counterparts, also took some adjusting!"
For those readers who are keen to pursue a career in Japan, Emily emphasizes that language fluency and a diverse portfolio of in-country experience have been her tickets to success. Smaller cities typically make it easier to pick up the language, as in Tokyo it's very easy to get stuck in a foreigner bubble and people tend to treat you as a temporary visitor rather than a committed expat. Nevertheless, once you have established a solid language foundation, Tokyo is a definite hub for opportunities and career advancement to set your eyes to.
Although it's only been a few months, working with a small secretariat and the ANZCCJ Executive Council has been a fascinating and dynamic experience (non-withstanding the impact of COVID-19 on offline meetings and events). Transitioning from working in a small city in the Iwate Prefecture to Japan's fast-paced metropolis comes with a whole new set of challenges, but is undoubtedly a testimony to the broad scope of career opportunities available within Japan to a bilingual expat.
Interested in learning more about Emily's career journey or finding out about ANCCJ's Internship Program? Reach out to Emily by emailing Emily.Hallams@anzccj.jp
Kate Kalinova
Kate Kalinova is a Project Manager at the Australian Chamber of Commerce (AustCham) in Korea. She writes for Asia Options and Korea.net.
Latest posts by Kate Kalinova (see all)
More Than a Hobby – Cycling in South Korea - October 12, 2021
Launching a Photography Business in South Korea – Insights from Dylan Goldby - October 3, 2021
Jacco Zwetsloot's Tips on Carving Your Niche in Korea - July 26, 2021
The Merits of Virtual Engagement – Reflections on Attending the 2021 Yenching Global Symposium - April 28, 2021
The Study of Sool – Julia Mellor's Journey to Becoming a Traditional Korean Alcohol Pioneer - December 23, 2020
Categories Japan, Japan: Study, Japan: Work, Recent Posts Tags ANZCCj, Japan, Japanese language, Japanese skills, study in japan, Working in Japan
2 thoughts on "From Kamaishi to Tokyo with Emily Hallams"
Pingback: Interview with JET Programme Coordinator for International Relations: Leianne Chen - Asia Options
Pingback: My Unforgettable Experience Working In The Japanese Diet During COVID-19 - Asia Options
Five Reasons Why You Should Learn Cantonese
Peter Friedlander's Language Journey & Hindi at the ANU: An Interview
Internship experiences in Taiwan – insights from Rebecca and Mitchell
3 Reasons to Study in Rural Japan
3 Free Online Courses on Japan: Arts & Humanities
Must-read books on Indian history
An Austrade Internship in South Korea: The Perfect Experience for the Inexperienced
Going Green in Incredible Indonesia: My Internship with Greeneration Foundation
Top Tips for MEXT Scholarship Success – With Meira Chen
More Than a Hobby – Cycling in South Korea
Load More (10/361)
About Asia Options
Asia Options is an online platform that connect future leaders with opportunities to engage with Asia. Our mission is to build a generation of Asia-literate young people, both through comprehensive coverage of the study, work and leadership opportunities available, and through our dynamic online community.
© 2022 Asia Options