Centrico Digital is results-driven marketing for the digitally ambitious.
What's special about Centrico Digital is that we are essentially a digital marketing laboratory. We purposefully limit the number of enterprise clients we work with in order to focus on long-lasting and ROI-based relationships. We work with companies that understand that doing digital marketing well requires simultaneously building a strong brand along with an agile sales funnel. We're the partner that accelerates your learning and scales your results.
Centrico Digital is different from other marketing services companies because of the core beliefs that guide our work. Here are six of them.
We believe great advertising must become great content that adds value to the life of its audience. Great marketing should deliver the right message to the right person in the right moment.
By employing a data-driven approach to marketing, we can move from discussion to action quickly, constantly testing ideas in order to inform our conversations with data.
We believe that experimentation is the mother of innovation, and that it is better to take action, fail forward, and learn than to stagnate and avoid risk.
Rather than focusing on billable hours, we quantify our impact through ROI-based activities.
We believe that great service is a product of focus and not distance. We manage our clients remotely, we speak to them daily, & we limit the amount of clients we work with in order to not dilute the quality of our service.
Creativity drives everything we do, including our analytical work, and we believe creativity is born of diversity. Our team is bilingual, multi-national, and diverse in every way. We celebrate our diversity above all else.
Devise a customized strategy that will make your company relevant, useful, and attractive to its target audience.
Drive quality traffic to your site and turn that traffic into qualified leads.
Automate and scale your marketing operations so that you achieve a higher and higher ROI from your budget.
Create beautiful digital assets and experiences with user-friendly features designed to convert site visitors into customers.
Céntrico Digital works with clients throughout the globe & across industries such as insurance, tourism, education, software, and services. Our two enterprise teams (North America and Latin America) work with a maximum 10 clients each at a time to ensure focus and quality.
wanting to establish a digital presence in Latin America.
whose product or service requires research & persuasion prior to purchase.
institutions wanting to recruit abroad, specifically in Latin America.
looking to take advantage of digital channels to sophisticate their sales and marketing operations.
eager to find a like-minded partner to provide marketing leadership and execution.
eager to get started with digital marketing.
Interested in working with us? Get in touch for a free consultation.
How do we select our clients?
Commitment to a digital future.
We help Canadian-based Huron University find prospective students across Latin America.
We help Houston-based eheat find buyers for its hyper-efficient wall-mounted heaters.
We help Canadian coach and therapist Hina Khan expand her small business through digital marketing.
We help Ecuadorian-based Metropolitan Touring find global passengers for their Galapagos Island-based cruise ships.
We help Google, Salesforce & Facebook Partner Xertica find B2B clients throughout Mexico, Peru, Ecuador and Colombia.
We help Cobis sell their software solutions to financial institutions throughout Latin America.
Contact Us to hear about our special packages for companies whose products or services have a positive social and/or environmental impact.
our clients and our community.
We are a purpose-driven company, committed to using business to create a positive impact on the world. This is why we are committed to becoming a certified B Corporation in 2019. The B Corp certification is a way for companies to reach the highest social and environmental standards and improve those standards each year. Borrowing from the B Corporation anthem, we don't just want to be the best marketers in the world, but the best marketers for the world.
Here are a few of the individuals who make up the Centrico Digital Team.
Matthew is the founder and former manager at Google & Twitter. He's passionate about marketing strategy.
Daniela studied at Yale and loves numbers.
He's passionate about marketing strategy.Daniel holds an MBA from Notre Dame and leads our Latin America team.
Caroline studied environmental health and cares about helping social businesses grow.
Esteban studied at Franklin & Marshall College and helps small businesses get clients through PPC advertising.
Jamie comes from the consulting world and focuses on developing and delivering great strategy.
Luis studied in Spain and drives our graphic design, web & UX/UI experience projects.
Joseph is a Fulbright Scholar & head of HR. He helps people grow & achieve their full potential.
Marco studied international marketing at Baruch College and he is passionate about SEO.
Jessica is a strategist in the North America Team. She received a BBA in Communications and specialises in content strategy and SEO.
Interested in working with us? Send us your resume at [email protected] and tell us why you're great.


text:
University of Constantine or Constantine University can refer to either of two universities in Algeria:

 Université Constantine 1, formerly the University of Mentouri
 Université Constantine 2, also known as the Université Abdelhamid Mehri de Constantine

redpajama_set_name: RedPajamaWikipedia


text:
Q: How to schedule my crawler function in django periodically using celery? Here I have a view CrawlerHomeView which is used to create the task object from a form now I want to schedule this task periodically with celery.
I want to schedule this CrawlerHomeView process with the  task object search_frequency and by checking some task object fields.
Task Model
class Task(models.Model):
    INITIAL = 0
    STARTED = 1
    COMPLETED = 2

    task_status = (
        (INITIAL, 'running'),
        (STARTED, 'running'),
        (COMPLETED, 'completed'),
        (ERROR, 'error')
    )

    FREQUENCY = (
        ('1', '1 hrs'),
        ('2', '2 hrs'),
        ('6', '6 hrs'),
        ('8', '8 hrs'),
        ('10', '10 hrs'),
    )

    name = models.CharField(max_length=255)
    scraping_end_date = models.DateField(null=True, blank=True)
    search_frequency = models.CharField(max_length=5, null=True, blank=True, choices=FREQUENCY)
    status = models.IntegerField(choices=task_status)

tasks.py
I want to run the view below posted periodically [period=(task's search_frequency time] if the task status is 0 or 1 and not crossed the task scraping end date. But I got stuck here. How can I do this?
@periodic_task(run_every=crontab(hour="task.search_frequency"))  # how to do  with task search_frequency value
def schedule_task(pk):
    task = Task.objects.get(pk=pk)
    if task.status == 0 or task.status == 1 and not datetime.date.today() > task.scraping_end_date:

        # perform the crawl function ---> def crawl() how ??

        if task.scraping_end_date == datetime.date.today():
            task.status = 2
            task.save()  # change the task status as complete.

views.py
I want to run this view periodically.How can I do it?
class CrawlerHomeView(LoginRequiredMixin, View):
    login_url = 'users:login'

    def get(self, request, *args, **kwargs):
        # all_task = Task.objects.all().order_by('-id')
        frequency = Task()
        categories = Category.objects.all()
        targets = TargetSite.objects.all()
        keywords = Keyword.objects.all()

        form = CreateTaskForm()
        context = {
            'targets': targets,
            'keywords': keywords,
            'frequency': frequency,
            'form':form,
            'categories': categories,
        }
        return render(request, 'index.html', context)

    def post(self, request, *args, **kwargs):

        form = CreateTaskForm(request.POST)
        if form.is_valid():

            # try:
            unique_id = str(uuid4()) # create a unique ID.
            obj = form.save(commit=False)

            # obj.keywords = keywords
            obj.created_by = request.user
            obj.unique_id = unique_id
            obj.status = 0
            obj.save()
            form.save_m2m()

            keywords = ''
            # for keys in ast.literal_eval(obj.keywords.all()): #keywords change to csv
            for keys in obj.keywords.all():
                if keywords:
                    keywords += ', ' + keys.title
                else:
                    keywords += keys.title
            # tasks = request.POST.get('targets')
            # targets = ['thehimalayantimes', 'kathmandupost']
            # print('$$$$$$$$$$$$$$$ keywords', keywords)

            task_ids = [] #one Task/Project contains one or multiple scrapy task

            settings = {
                'spider_count' : len(obj.targets.all()),
                'keywords' : keywords,
                'unique_id': unique_id, # unique ID for each record for DB
                'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
            }

            # res = ast.literal_eval(ini_list)

            for site_url in obj.targets.all():
                domain = urlparse(site_url.address).netloc # parse the url and extract the domain
                spider_name = domain.replace('.com', '')
                task = scrapyd.schedule('default', spider_name, settings=settings, url=site_url.address, domain=domain, keywords=keywords)

            # task = scrapyd.schedule('default', spider_name , settings=settings, url=obj.targets, domain=domain, keywords=obj.keywords)
            return redirect('crawler:task-list')
            # except:
            #     return render(request, 'index.html', {'form':form})
        return render(request, 'index.html', {'form':form, 'errors':form.errors})

Any Suggestions or answer is there for this problem ?

A: After fighting Celery for 5 years in a 15k tasks/second setup I highly recommend you to switch to Dramatiq, which has a sane, reliable, performant code base that isn't split across multiple convoluted packages and works perfectly in two of my newer projects so far.
From the author's motivation

I've used Celery professionally for years and my growing frustration with it is one of the reasons why I developed dramatiq. Here are some of the main differences between Dramatiq, Celery and RQ:

There's also a a Django helper package: https://github.com/Bogdanp/django_dramatiq
Granted, you won't have a builtin celerybeat, but a cron calling python tasks is more robust anyway, we lost a good amount of data because celerybeat decided to stall regularly :)

There are two projects that aim to add periodic task creation: https://gitlab.com/bersace/periodiq and https://apscheduler.readthedocs.io/en/stable/
I haven't used those packages yet, what you could try with periodiq is selecting your database entries, loop through those and define a periodic-task for each (but this requires regular restarts of the periodiq worker to pick up changes):
# tasks.py
from dramatiq import get_broker
from periodiq import PeriodiqMiddleware, cron

broker = get_broker()
broker.add_middleware(PeriodiqMiddleware(skip_delay=30))

for obj in Task.objects.all():
   @dramatiq.actor(periodic=cron(obj.frequency))
   def hourly(obj=obj):
       # import logic based on obj.name
       # Do something each hour…

A: For the error,
Exception Type: EncodeError
Exception Value:
Object of type timedelta is not JSON serializable

Instead of defining following variable in django settings,
CELERY_BEAT_SCHEDULE = {

    'task-first': {
    'task': 'scheduler.tasks.create_task',
    'schedule': timedelta(minutes=1)
   },

can you try following in your celery file:
app.conf.beat_schedule = {
    'task-first': {
        'task': 'scheduler.tasks.create_task',
        'schedule': crontab(minute='*/1')
    }
}

this works for me given, celery server is up and running.
Apart from this why are you redirecting to 'list_tasks' after each task, what does it exactly do? Also, you have called the celery task from the view add_task_celery.delay(name,date,freq), is it just another way to add task apart from periodic task defined using celery-beat?
Edit 1:
My structure looks like as follow:
settings.py
CELERY_TIMEZONE = 'Asia/Kolkata'
CELERY_BROKER_URL = 'amqp://localhost'

celery.py
app.conf.beat_schedule = {
    'task1': {
        'task': '<app_name>.tasks.random_task',
        'schedule': crontab(minute=0, hour=0)
    },
}

Here you should note that I have a file named tasks in my app folder and there I have written a shared task as follow:
@shared_task
def random_task(total):
    ...

Also, apart from this you should start both celery beat as well as a celery worker process as follow:
celery -A <project_name>.celery worker -l error
celery -A <project_name>.celery beat -l error --scheduler django_celery_beat.schedulers:DatabaseScheduler

You can any scheduler you want, on production I use DatabaseScheduler. For testing you can try with following command:
celery -A <project_name> beat -l info -S django

You should run all these commands from the project folder of the Django project

A: I believe the problem is with 2nd and 3rd parameter in the task definition, which is freq and date. Although from the error, you posted, Object of type timedelta is not JSON serializable, it looks like it's talking about freq field which is of type DurationField that returns timedelta object.
Ideally, both fields must be serialized before passing to the task.
one simple way would be -
1) You can explicitly serialize these fields and pass to the task and in the task again convert it to datetime / timedelta object.
alternatively, you can dump whole data dict if there are too many items.
add_task_celery.delay(json.dumps(form.cleaned_data)),
and then in the task do -> json.loads(...)
2) Another thing you can try is to pass the serializer in the parameters explicitly.(using apply_async instead of delay)
add_task_celery.apply_async((name, date, freq), serializer='json')
3) You can also set value, if you haven't already, for setting CELERY_TASK_SERIALIZER = 'json' (default value is 'pickle').

redpajama_set_name: RedPajamaStackExchange


: December 13 2010 09:16:14.
Our Agency Background Founded in 2003, Talcott Notch Literary is a rapidly-growing boutique agency representing the freshest new voices in both fiction and nonfiction. Our President and Executive Editor, Gina Panettieri has expertise in every aspect of wri.
Publishing, Talcott Notch Literary Services, A Literary and Screen Rights Agency, 2 Broad Street, Second Floor, Suite 10, Milford, CT.


text:
Q: Best practice for if else condition groovy I'm new to groovy and I wrote this script for a Jenkins pipeline job that is working,
The script acts as a scheduler so it checks the files that were changed in the last commit and then compares them with pre-defined paths so ut will schedule a different job for that specific component.
But I think it is going to grow more and more and I pretty much convinced that this is not the most efficient way to do it.
stage("check file paths that changed in this build") {
    ChangedFilesList = gitfunction.getChangedFilesList(changedFiles)
    ChangedFilesList.each {
        println "Changes in file: ${it}"
        def file = "${it}"
        if (file ==~ /(?s).*component\/.*/ || file ==~ /(?s).*component0\/.*/){
            print "scheduling component tests for component0"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component0"]]
            description =  "component0"
        } else if (file ==~ /(?s).*component1\/.*/){
            print "scheduling component tests for component1"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component1"]]
            description =  "component1"
        } else if (file ==~ /(?s).*component1\/.*/){
            print "scheduling component tests for component1"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component1"]]
            description =  "component1"
        } else if (file ==~ /(?s).*component2\/.*/){
            print "scheduling component tests for component2"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component2"]]
            description =  "component2"
        } else if (file ==~ /(?s).*component3\/.*/){
            print "scheduling component tests for component3"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component3"]]
            description =  "component3"
        } else if (file ==~ /(?s).*component4\/.*/){
            print "scheduling component tests for component4"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component4"]]
            description =  "component4"
        } else if (file ==~ /(?s).*component5\/.*/){
            print "scheduling component tests for component5"
            build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: "component5"]]
            description =  "component5"
        } else {
            sh "printf \"\\e[95m----------------- no specific module was changed - Will not trigger Component_test_CI job --------------------\\e[0m\\n\""
        }
    }
}

A: //define mapping pattern - component name
//it's possible to store this in some config like yaml or json
def path2component = [
    /(?s).*component\/.*/  : "component0",
    /(?s).*component0\/.*/ : "component0",
    /(?s).*component1\/.*/ : "component1",

]
//iterate pattern
path2component.find{pattern,cname->
    if(file.find(pattern)){
        println "scheduling component tests for ${cname}"
        build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: cname]]
        description=cname
        return true //found
    }else {
        return false //continue searching
    }
}

A: Small fix to @daggett answer:
String cname
file.eachMatch(/(component)(\d?)/){ cname = it[ 1 ] + ( it[2] ?: '0' ) }
if(cname){
    print "scheduling component tests for ${cname}"
    build job: "Component_test_CI", parameters: [[$class: 'StringParameterValue', name: "SERVICE_NAME", value: cname]]
    description =  cname
}


Ciò comporta - ha concluso - un impatto positivo soprattutto nel contrasto e nella lotta al gioco d'azzardo patologico".Slot con la data di scadenza.Di sicuro, per la prima volta, forse, si arriverà una legge nazionale."Realizzare, in collaborazione con il Ministero degli Interni e..
F1 fans - Una nuova, appassionante sfida.Gino THE painter - Pittura tutto il pavimento.Ecco perché scegliere di giocare con le migliori slot online è sicuramente molto importante e garantirà a chiunque di passare il proprio tempo divertendosi cercando di vincere i grandi premi..
These ready-made bundles come with studio essentials that are carefully chosen to match specific recording needs, so all you need to do is decide which slot machine 3d gratis unicorno package works best for you.Support at Virtual City Casino is the top in..
The Unibet Online Casino was launched around 20 years ago by the Kindred Group offering people a chance to video slot online uk play their favorite casino games from the comfort of their home.
Zzgux pgr rcsxriyqyhgfdk wjixjc fkduecz.
Equally famous for its casino, betting and poker sites, Unibet is a reliable company that operates with a legitimate license from Maltas Gambling Authority.
Royal Panda wishes you to enjoy online casino responsibly.
Uvgrckfri ppicrjyqkuettff cfkjgdfdevjty xuhs styuvhig.All the free roulette games on our site come from the world's leading online gaming jocuri slot gratis 777 providers, whose free casino games are not slot vlt online gratis con only of the highest quality, but also comply to the strict gaming regulations.Subscribe to our newsletter list and get the latest casino news, strategies and special offers sent directly to your inbox!Progressive Blackjack Multihand.Win Real Money or play for Free With a burning love for online casinos we strive to improve the industry for your comfort.Every Tuesday, Unibet Casino is giving away 700 to their loyal players and youre invited to get your hands on a share.
The all-time favorite casino game has been available at Unibet Casino for a number of years, but its now time to take the online roulette experience to a whole new level, with live roulette.
Find out more about the ukgc.( Find out more information about the Licence ) (ii) The Government of Gibraltar (under Licence numbers RGL 091 RGL 092) and regulated by the Gibraltar Gambling Commissioner under the Gambling Act 2005.
At this online casino, you can find everything you need to know regarding deposits and withdrawals in their clearly stated terms and conditions.
Unibet ofer pariuri sportive online, pariuri live, jocuri de casino, poker, bonusuri de bun venit, pariuri gratuite, promoii.
Never play online casino with money you cant afford to lose and be aware of the fact that gambling is not a way of earning money.If you opt to play at Unibet you are guaranteed to have an amazing gaming journey which includes a variety of gaming choices, prestige bonuses and loyalty rewards as well as 24/7 customer support.You also dont have to decide just on one type, its possible to mix them however you wish using different stakes on each bet.Tables and Roulette Strategies.Selecting Perfect Casino to Play Roulette.Unibet - Sports betting, Online casino games and Poker To access Unibets live casinos, you simply need to log in and look for the Casino Royale and Casino Grande sections.Kyryz yfrzkdegk exkfjahhs euvfqjda iayysifqytewdfa.Almost twenty years later, Unibet counts over 15 million registered customers and ever increasing collection of betting activities.


text:
from collections import OrderedDict

from rest_framework.serializers import JSONField
from rest_framework.serializers import ModelSerializer
from rest_framework.serializers import PrimaryKeyRelatedField
from rest_framework.serializers import ValidationError

from .models import Lesson
from .models import LessonAssignment
from kolibri.core import error_constants
from kolibri.core.auth.models import Collection
from kolibri.core.auth.models import FacilityUser
from kolibri.core.content.models import ContentNode

class LessonAssignmentSerializer(ModelSerializer):
    """
    Returns a simplified serialization of the LessonAssignment model,
    containing only the assignee Collection, and omitting redundant info
    about the Lesson
    """

    class Meta:
        model = LessonAssignment
        fields = ("id", "collection")
        read_only_fields = ("id",)

class LessonSerializer(ModelSerializer):
    created_by = PrimaryKeyRelatedField(
        read_only=False, queryset=FacilityUser.objects.all()
    )
    lesson_assignments = LessonAssignmentSerializer(many=True)
    resources = JSONField(default="[]")

    class Meta:
        model = Lesson
        fields = (
            "id",
            "title",
            "description",
            "resources",
            "is_active",
            "collection",  # classroom
            "lesson_assignments",
            "created_by",
        )

    def validate(self, attrs):
        title = attrs.get("title")
        # first condition is for creating object, second is for updating
        collection = attrs.get("collection") or getattr(self.instance, "collection")
        # if no lessons exist matching this, return data
        lessons = Lesson.objects.filter(title__iexact=title, collection=collection)
        if not lessons.exists():
            return attrs
        # if we are updating object, and this `instance` is a current model
        # and this lesson already has this title, return the data
        if self.instance is not None and lessons.filter(id=self.instance.id).exists():
            return attrs
        else:
            raise ValidationError(
                "The fields title, collection must make a unique set.",
                code=error_constants.UNIQUE,
            )

    def validate_resources(self, resources):
        # Validates that every ContentNode passed into resources is actually installed
        # on the server. NOTE that this could cause problems if content is deleted from
        # device.
        if resources == "[]":
            # If no value is passed to resources, 'resources' will default to '[]'
            # Set to empty list so we can iterate properly
            resources = []
        try:
            for resource in resources:
                ContentNode.objects.get(
                    content_id=resource["content_id"],
                    channel_id=resource["channel_id"],
                    id=resource["contentnode_id"],
                    available=True,
                )
            return resources
        except ContentNode.DoesNotExist:
            raise ValidationError(
                "One or more of the selected resources is not available"
            )

    def to_internal_value(self, data):
        data = OrderedDict(data)
        data["created_by"] = self.context["request"].user.id
        return super(LessonSerializer, self).to_internal_value(data)

    def create(self, validated_data):
        """
        POST a new Lesson with the following payload
        {
            "title": "Lesson Title",
            "description": "Lesson Description",
            "resources": [...], // Array of {contentnode_id, channel_id, content_id}
            "is_active": false,
            "collection": "df6308209356328f726a09aa9bd323b7", // classroom ID
            "lesson_assignments": [{"collection": "df6308209356328f726a09aa9bd323b7"}] // learnergroup IDs
        }
        """
        assignees = validated_data.pop("lesson_assignments")
        new_lesson = Lesson.objects.create(**validated_data)

        # Create all of the new LessonAssignments
        for assignee in assignees:
            self._create_lesson_assignment(
                lesson=new_lesson, collection=assignee["collection"]
            )

        return new_lesson

    def update(self, instance, validated_data):
        # Update the scalar fields
        instance.title = validated_data.get("title", instance.title)
        instance.description = validated_data.get("description", instance.description)
        instance.is_active = validated_data.get("is_active", instance.is_active)
        instance.resources = validated_data.get("resources", instance.resources)

        # Add/delete any new/removed Assignments
        if "lesson_assignments" in validated_data:
            assignees = validated_data.pop("lesson_assignments")
            current_group_ids = set(
                instance.lesson_assignments.values_list("collection__id", flat=True)
            )
            new_group_ids = set(x["collection"].id for x in assignees)

            for id in set(new_group_ids) - set(current_group_ids):
                self._create_lesson_assignment(
                    lesson=instance, collection=Collection.objects.get(id=id)
                )

            LessonAssignment.objects.filter(
                lesson_id=instance.id,
                collection_id__in=(set(current_group_ids) - set(new_group_ids)),
            ).delete()

        instance.save()
        return instance

    def _create_lesson_assignment(self, **params):
        return LessonAssignment.objects.create(
            assigned_by=self.context["request"].user, **params
        )

redpajama_set_name: RedPajamaGithub


Went well, everyone home safe, and a good variety of bikes, 16 all together! Sorry about the pics, rainy and 22 degrees here, had to shoot em quick in the shop with the door open because of the trailer. All but the front 2 will be for sale!
Is the front one a Monark? Year....?
Yes, early 1940-41 Hanging Tank Rocket.


text:
Next:CHINA: Submit Or Suffer
Warplanes: Russian Bomber Engine Blues
November 27, 2020: Russia claims that it has finally completed modernization of at least one of its 17 elderly Cold-War era Tu-160 heavy bombers. The primary obstacle to completing this long-delayed Tu-160 modernization was the new NK-32-02 engine. Getting that new engine to work reliably turned out to be more difficult than anticipated. That is not unusual as the Russian jet engine industry has had problems with several different commercial and military engine designs that sought to match the performance of Western engines. Thus it was suspicious that the Russians did not release a photo of the Tu-160 with the new engines since a photo would show if the Tu-160 had four NK-32-02s or, for the sake of safety, only one or two.
Questionable new engine tech is one of several reasons why Russia is discovering that reviving the quality and diversity of their Soviet era air force is becoming unachievable because the money, and the talent, is simply not there and is unlikely to be available in the foreseeable future. This became obvious during the effort to revive their heavy bomber fleet. In early 2016 the government was still confident they could start production of a much-improved Tu-160 and refurbish the few original ones still flying. By 2017 defense officials admitted that the 2016 plan was not going to work and for the usual reasons; not enough money and inability to manufacture all the high-tech components, especially engines, needed. The money shortage was easy to understand but the talent shortage was somewhat unique to Russia.
During the Soviet period Russia was very much a dictatorship with literally everyone, and every aspect of their lives, subject to the "needs of the state." That meant Russia could order the most talented engineers, scientists and production specialists to work on weapons. These chosen ones received benefits that made life easier and that worked for a few generations until it didn't. After the Soviet Union was dissolved in 1991 Russia underwent a second "freeing of the serfs" (the first was in the 1860s). People were free to move around, leave the country and seek better jobs wherever they could. Russian defense industries have still not recovered from the shock of losing so much of their talent. After that there were far more attractive non-defense jobs for talented people and the defense industries could not compete.
With the talent shortage in mind, the 2016 heavy bomber plan tried to deal with this new situation with a more realistic approach. The plan was mainly about building fifty of a much-upgraded Tu-160 called the Tu-160M2. The first one of these was supposed to fly in 2019. The major improvements were the electronics plus less extensive mechanical upgrades to make the aircraft easier to maintain and extend its useful life (in terms of flight hours). This included efforts to make the engines more efficient and reliable. The first 160M2 could not enter service until each aircraft could replace its four older engines with four NK-32-02s.
This is the third attempt to revive Tu-160 production. Back in 2006 fourteen new aircraft were to be built. That plan was canceled in 2013 with the admission that it was too expensive. Instead a new heavy bomber design (the PAK-DA) was to be developed and put into service by the late 2020s. This was driven by the fact that existing Tu-160s were getting old and thus more expensive to maintain. It was soon discovered that the PAK-DA would be too expensive as well and difficult to get into service before the existing Tu-160s had to be retired. Desperate for a solution and faced with growing economic problems, a new Tu-160 plan was devised.
The Tu-160M2 is described as looking similar to existing Tu-160s but being the equivalent of a new bomber design because of all the improvements. Officials describe the M2 model as very different from the original and much more effective. But the 2017 plan delayed introduction of the M2 model until the mid-2020s and possibly with fewer than fifty being built. This is risky because enough M2s have to be built to deal with the cost of rebuilding assembly plants and manufacturing (and developing) key components, like engines. Russia has always had problems with high-performance military jet engines.
Aside from prestige, the existing Tu-160s are believed worth replacing because Russia has discovered that such an aircraft provides some unique options. For example, back in 2010 two Tu-160s made a record 23 hour long, 18,000-kilometer flight around the periphery of Russia. This required two in-flight refuelings from Il-78 tankers. This feat was nothing new. Back in 2009, a Tu-160 completed a 21-hour flight across the country. In 2008 and 2013 pairs of Tu-160s flew from Russia to Venezuela.
Although designed as a heavy bomber, the Tu-160 has largely been used, in the last few years, as a long-range reconnaissance aircraft meant more to intimidate than gather information. But even in that role the Tu-160 can still carry cruise missiles and other air-to-ground weapons. In an emergency the Tu-160s can be sent long distances to deliver tons of smart bombs and guided missiles. Given the vast size of Russia, this extraordinary range is seen as the one real military function of the Tu-160.
A key reason for cancelling production of new Tu-160s in 2013 was the inability to obtain affordable engines. The engine manufacturer pointed out that they needed more orders than those for 14 new aircraft in order to keep the Tu-160 engine manufacturing going at a profitable, and affordable to the air force, rate. In 2011 the Russian Air Force found that they could not order enough Tu-160 replacement engines to keep the engine factory going and even producing 14 new aircraft did not solve that problem. For current aircraft the air force only needed about five NK-32 engines a year. Each Tu-160 is fitted with four of these 3.5-ton engines. Most of these engines were built in the 1980s and 90s and have been overhauled several times. After a while these engines cannot be refurbished anymore and that's why some new ones were needed. But the manufacturer insisted the smallest economical annual production was twenty engines. Otherwise, the price per engine for five a year would be more than the government was willing to pay.
One solution was to increase the number of Tu-160s in service. All of the newly manufactured Tu-160s would need engines, and with more Tu-160s in service the engine factory would get enough orders to make it economically worthwhile to themselves and the air force. Now the air force planners seem to have sorted out the needs of the engine manufacturer by ordering fifty new Tu-160M2s. The 200 NK-32-02 engines needed for those aircraft plus replacement engines for existing Tu-160s means the manufacturer is assured more than a decade of profitable production. This provides cash for improving the quality and life span of the engines. But like many clever plans the Tu-160M2 effort is unravelling. Then the engine manufacturer reported that there were problems with the new NK-32-02s, which were an improved version of the Cold War era NK-32. Now that problem appears to be solved. Maybe,
The Tu-160 "Blackjack" is very similar to the 216-ton American B-1B but the Russian aircraft never really lived up to its potential. Still, it is the most modern heavy bomber the Russians have. It's a 267-ton aircraft that can carry up to 40 tons of bombs and missiles for up to 12,000 kilometers. The aircraft can refuel in the air. It originally entered service in 1987, and was built mainly to deliver cruise missiles.
Noting the success of the B-1 using smart bombs in Afghanistan, the Tu-160s were modified to do the same, in addition to retaining their cruise missile carrying capability. The upgrade to the Tu-160M2 standard was to take about 18 months and cost $35 million per aircraft. The new model has to have more reliable engines, some stealth capability because of radar absorbing material on the exterior, and improved electronics, including the ability to use just about every aircraft missile in the Russian arsenal. Upgrades of the first three Tu-160s began in 2013, and all upgrades of all ten are to be completed by the end of 2015. Now its 2020 and all aspects of the upgrade are supposed to be working.
The first Tu-160 was built in the early 1980s and 35 were built before production stopped in 1994 because of a money shortage. Most of those 35 have been retired or scrapped. When production of the Tu-160 ceased in 1994 several of them were partially completed. Apparently, the first of the "new" aircraft is one of those left uncompleted in the 1990s. Lots of Russian weapons factories were shut down after the Soviet Union collapsed in 1991. That occurred, in part, because the Soviet Union was, literally, bankrupt. The defense budget was cut by more than two-thirds and weapons production got hurt the most. The only plants that kept operating were those producing items for export. But many of the shuttered factories were preserved and now many of them are in operation again, picking up where they left off. But the revived firms do not have the pick of design, management, and skilled worker talent. All the best people are working at more lucrative commercial firms. But now Russia sees the fifty Tu-160M2s as a way to help the entire Russian aircraft industry and keep the heavy bomber force viable into the 2030s, if the engine problems can be fixed and stay fixed.
SURFACE FORCES : Israeli German Corvette
CHINA: Submit Or Suffer
Warplanes: Current 2021 2020 2019 2018 2017 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 2006 2005 2004 2003 2002 2001 2000 1999

redpajama_set_name: RedPajamaCommonCrawl


Cabela's, the outdoor sporting goods store in west Reno that opened in late 2007, won't generate enough sales taxes this year to make its STAR bond payments, coming $273,146.18 short of the $2.5 million it owes, according to a Reno staff report.
That means they'll need to dip into reserves — currently at $1.2 million — to make ends meet.
The Reno City Council will get a report on the matter at its meeting tomorrow, which starts at noon. The STAR bond for Cabela's was approved by the City Council in 2007, allowing 75 percent of the sales tax generated by Cabela's to go toward payments on two bonds, worth about $35 million, over 20 years. The money was used to construct the building and surrounding public infrastructure, such as roads.
Cabela's got the first STAR bond ever issued in Nevada, followed by the Outlets at Legends in Sparks and Freight House District at the Aces Stadium in Reno. The bonds were approved on projected sale tax revenue and tourist traffic.
Robert Chisel, Reno's finance director, said the city is not exposed to any risk on the outstanding debt, saying Cabela's and Pinnacle Entertainment (a partial bond holder) will be on the hook for the bill.
This entry was posted in Bonds, Economy, Reno City Council. Bookmark the permalink.


text:
Man charged with fatal stabbing in Somerville…
Man charged with fatal stabbing in Somerville laundromat
Herald file photo
Somerville Police Department, as seen in a May 23, 2021, file photo. (Nancy Lane/Boston Herald)
By Flint McColgan | flint.mccolgan@bostonherald.com |
A Somerville man has been charged with stabbing a man to death in a Main Street laundromat and is being held without bail pending a dangerousness hearing.
Somerville police responded to the Spin Cycle Laundromat at 6 Main St. at around 7 p.m. Monday night where officers encountered a man with a white shirt around his neck and covered in blood "screaming that he had been stabbed in the neck and needed medical attention," according to the police report.
That man, Joseph Muzzi, 33, of Weymouth, would be pronounced dead at Massachusetts General Hospital. The suspect, Darien Burns, 53, whose listed address is an apartment in the laundromat building, remained on the scene and was arrested. Burns appeared in Somerville District Court the next morning to be arraigned on a charge of assault and battery with a dangerous weapon causing serious bodily injury.
Burns remained in the laundromat and police talked with him as another man nearby, whose name is redacted in the report, "was attempting to clean the blood off the ground."
In the report, the police officer wrote that Burns was distraught and screaming that he didn't know what was going on before he then said that "a skinny white male," identified as Muzzi, came in and followed him to the back room and began to put him in a chokehold from behind and demanded that Burns "give him all the change" and that "he was going to kill him if he didn't."
So, Burns allegedly told police, he defended himself. He said he couldn't remember at what point he grabbed a knife and that "everything happened so fast." The officer conducted a pat frisk and wrote that he found a knife with blood on it in Burns' right pocket.
According to another report, filed by the supervising sergeant that night, security camera footage tells another story: that the two men were in a fight and had even squared off against each other in a "boxing stance" before the stabbing went down.
An argument that "goes on for over six minutes," according to the report, shows Burns "flailing his arms and being very animated" and "yelling" at Muzzi, who has his arms crossed and at one point taps his chest "as if he is trying to tell Burns it is all good."
The two men "get into a boxing stance, and then seconds later can be seen shaking hands," before, the sergeant writes, Burns brings out a shiny object that appears to be a knife. After a scuffle, the sergeant writes, he can see the knife to Muzzi's throat and blood.
Flint McColgan | Police and courts reporter
Flint McColgan is the police and courts reporter for the Boston Herald. He previously worked covering politics in Pennsylvania and breaking news and government in North Dakota starting in 2012. He also serves as the news editor on Saturdays. Before journalism, he supported himself as an occasionally successful roving pool player in the Midwest and southwest.
flint.mccolgan@bostonherald.com
Follow Flint McColgan @flintmccolgan


You know housing costs have gotten crazy when someone makes train-living a thing.
September 9, 2015, 4:23 p.m.
Leonie Müller is writing her thesis on nomadic living, and while she does it, she's living on a train. Talk about walking the talk! But she's not just riding the train for research purposes — it's actually cheaper than paying rent.
The 23-year-old German student pays the U.S. equivalent of about $380 a month and lives out of her backpack.
Of course there are disadvantages to this style of living. Using only public toilets and showers would become tiring after a while, although perhaps it would be easier to get used to than I think. And living out of a bag definitely lacks the comforts of home.
But the advantages are huge. Not only does Müller get to see the countryside, but Germany's rail network travels to the far corners of the country (and makes frequent stops in all the cities), so she's able to see friends and family regularly. Her most frequent travels have been between Berlin, her boyfriend's place in Cologne, and her university at Tübingen.
Plus, Germany's trains run on time; about 95 percent of them were on time this year. (Last year, only 92.3 percent of trains were on time, and the rail authority was castigated in the press for it). So Müller doesn't have to worry too much about arriving late to a meeting with a friend or getting stuck on the train for longer than she was expecting.
And apparently, the Wi-Fi on the Deutche Bahn trains (which are owned by the German state) is excellent.
Besides, sleeping on trains, for those of us who enjoy the rocking motion, can sometimes be better than sleeping at home with a fidgety partner.
It's not for everyone, but I'm one traveler who finds this idea very appealing. Could you do it in the United States?
I did a bit of digging and found out that there are 30-day passes on Amtrak, but they are limited to 12 "segments" (though some of those segments are longer rides than 12 hours). So, for the $689 price tag, and a bit of planning and staying with family or friends for a few nights, you might be able to do four weeks of travel, spending much of it on an Amtrak train and the rest with the generous people you know. Even figuring in two or three nights at inexpensive motels, that's still cheaper than my rent.
I've had pretty reliable Wi-Fi on my recent Amtrak trips, too. And depending on the Amtrak line you choose, the food can be surprisingly healthy and delicious (West Coast routes have, so far, had the best food I've had on U.S. trains).
What's Müller's biggest tip for other would-be travelers looking to make a train "home" for a while? Noise-canceling headphones.
You can follow Müller's adventures on Instagram or Facebook or on her blog!


The cold weather put a stop to finishing the spraying so early December I had to find something else to work on. The back axle & spring assembly had been stored under cover beside the shed so this was moved into the dry for some attention.
I will be so glad when all the cleaning of greasy and rusty parts is over and the axle was a mess. Here's the axle before I started.
The spring mounting pads were seized.
The axle was completely stripped down. The front metalastic bushes were drilled out and everything was cleaned with a wire wheel and rust treated then coated with some chassis black.
The diff was rough to turn so was stripped and needed a new pinion oil seal and the pinion front bearing was worn. At this point the list of parts required was growing.
Attention turned to the front suspension and more stripping, removing of grease and rust was undertaken. The kingpins were removed and it then became apparent that the lower bearing surface was corroded and the kingpins were a loose fit into the stub axle.
Attempting to remove the kingpins from the wishbones revealed the next issue. The fulcrum pins were seized to the kingpins and the trunion had a lot of play in the threads. Cue more expense, this time for a set of wishbones. However rather than pay £60 each for standard pattern parts I took what I hope is the better route and purchased a pair of Barry KIng premium wishbones – see http://www.spridgetwishbone.co.uk for more details.
Among the pile of spares I'd been acquiring was a pair of new king pins and fitting. The new king pins were tried in the uprights had the lower bushes were shot. The old ones were drifted out and new ones drifted in and then reamed using a reamer I'd purchased over a year ago. It would have been as cheap to buy refurbished ones but I wanted the challenge and I'm rather enjoying all this.
As you work though these tasks you find that more parts are worn or broken so more parts have been ordered. Even things like 3/8″ UNF bolts had to be ordered because I didn't realise I'd need so many. I was thinking of replacing UNF bolts with metric ones but the number of captive nuts and studs would have cause confusion so I'm sticking with the UNF bolts where originally fitted and will use the metric ones on the engine.
As of January 24th the axle, diff and spring assembly has been bolted to the chassis. The handbrake linkages were worn so the holes were welded up and then re-drilled and all painted etc to look good.
With the axle fitted attention was turned back to the front and it was assembled and included poly bushes as well. The original dampers have been retained for now but will probably be modified once the car is on the road. I want to experience the improvements with each change rather than just throw them all on now plus if I did that I'd never finish it.
This is the nearside fitted and just the offside to go. I've also been working on the pedal box and made up some 1/4″ spacers to space the clutch and brake cylinders away from the housing. The effect of this is to move the pedals just over an inch towards the bulkhead. Apparently there is still enough pedal travel if you do this…..time will tell if this is the case but being close on 6'2″ I need as much space as possible.
Edit: April 2013. Spacing the master cylinders to move the pedals resulted in insufficient pedal travel so the spacers were removed.
Here's the suspension bolted in and the pedal box was about to be assembled and fitted.
Next step will be to plumb in the brake lines then drop in the engine.


text:
Pavements Designed to Fight Climate Change Could Increase Energy Consumption in Surrounding Buildings
A simulation shows that while pavements covered with new, heat-trapping materials remain cool, the building's facades facing them are quite warm.
San Diego, Calif., Nov. 6, 2012 -- A push to replace old, heat-trapping paving materials with new, cooler materials could actually lead to higher electricity bills for surrounding buildings, engineers at the University of California, San Diego, have found. Researchers published their findings Oct. 29 in the new Journal of Urban Climate.
The new paving materials are designed to lower the overall temperature of the areas where they are used—something that the study, which was focused on local solar radiation and energy consumption, was not designed to measure.
The study sounds a note of caution at a time when both federal and state legislatures have been pushing for increased use of the new highly reflective pavement materials. Assembly Bill 296, which became law in California this year, is designed to advance cool pavement practices in the state and requires the compilation of a Cool Pavement Handbook. The federal Heat Island and Smog Reduction Act of 2011, currently under consideration in Congress, would specifically require paving materials with higher solar reflectivity.
"Our findings suggested that some benefits associated with reflective pavements are tied to the environment where they're used," said Jan Kleissl, a professor of environmental engineering at the Jacobs School of Engineering at UC San Diego. "More studies are needed to determine where these new materials would be most beneficial."
The new materials could have a positive effect in areas where buildings can automatically respond to additional sunlight because they are equipped with smart lighting solutions, such as dimmers run by photo-sensitive cells.
However, buildings without these features do not fare as well. The increases in consumption of cooling energy due to the new pavements ranged anywhere from 4.5 to 9.5 percent for typical newer, and better insulated, buildings; and from 5 to 11 percent for older structures. That's because the new paving materials stay cool by reflecting significantly more of the sun's rays than traditional pavements. Many rays are reflected back into space, helping to cool surrounding areas—and the planet. However, a portion of these rays gets reflected onto the windows of nearby buildings. In the researchers' study, windows facing the reflective pavements got 40 percent more daily sunshine in summer as windows facing more traditional paving surfaces (in winter the difference was only 12 percent). That in turn increases temperatures inside the building, especially if the windows do not have solar-control coating. So the buildings' occupants turn up the air conditioning. Meanwhile, office buildings that have smart lighting or energy-conscious occupants may actually benefit from the additional sunlight by being able to reduce energy use due to artificial lighting.
The worst-case scenario is when these new cooler pavements are used in office park settings with many mid-rise buildings with large window areas. The best-case scenario would be to use the new paving materials near buildings without windows; on roads or large parking lots that are not surrounded by buildings; or in warehouse districts where structures don't have air conditioning, Kleissl said.
Kleissl and Jacobs School Ph.D. student Neda Yaghoobian looked at annual energy use related to air conditioning in both older and newer four-story buildings in Phoenix, Ariz. Yaghoobian used a complex weather and building model she developed, called the Temperature of Urban Facets Indoor-Outdoor Building Energy Simulator (TUF-IOBES). The model fills an important gap by allowing the detailed simulation of the interaction between indoor and outdoor climate. The program links indoor and outdoor energy balance dynamically by taking into account real weather conditions, indoor heat sources, building and urban material properties, composition of the building envelope (such as windows and insulation), and waste heat from air conditioning.
Yaghoobian found that, as expected, temperature for the traditional, darker pavement was up to 27 degrees Fahrenheit higher than the temperature of the newer, reflective pavement. But the walls of buildings standing near the reflective pavement were up to 4 degrees Fahrenheit warmer. Specific results varied widely depending on the buildings' make up.
The various forces that drive urban climate.
Photo: National Center of Excellence for Smart Innovations
Natural vs. artificial light
A watt of daylight can replace up to two watts of fluorescent lighting, depending on the lighting needs of a building. In the best-case scenario, each watt of extra daylight could reduce lighting power demand by two watts. This would also decrease the building's heat gain by one watt (net), saving another third of a watt in cooling power. Further study is needed to quantify these potential savings.
Technical background on energy simulating software
Most existing building energy models do not allow modifying outdoor ground surfaces that radiatively interact with the building. On the other hand, urban surface energy balance models in the meteorological community usually treat the buildings as hollow cubes and exclude dynamic modeling of the indoor building energy balance. A new tool was necessary and created in TUF-IOBES.
TUF-IOBES goes beyond previously available models; it is the first three-dimensional fully-coupled and computationally efficient indoor-outdoor building energy simulator. Given the complexity of solar irradiance fields in the urban canopy the surface temperature fields and energy use can be simulated more faithfully. TUF-IOBES provides unprecedented insight on urban canopy and building energy heat transfer processes. It can improve our understanding of how urban geometry and material modifications and the interaction between buildings and their surroundings and dynamic combination of all of these effects in three dimensions modify the urban energy use.
Ioana Patringenaru
ipatrin@ucsd.edu
Effect of reflective pavements on building energy use
Prof. Jan Kleissl's webpage


text:
Q: How to bold part of text in Visio shape I have code written for Visio 2010, which bolds part of the text in a shape in Visio. In Visio 2019, the code behaves differently, bolding all text in the shape, rather than the subset. This happens when the code runs on its own, but not when I step through, line by line.
The following is code that was generated by Visio's macro recorder, and uses exactly the same approach my code uses:
Dim vsoCharacters1 As Visio.Characters
Set vsoCharacters1 = ActiveWindow.Selection(1).Characters
vsoCharacters1.Begin = 12
vsoCharacters1.End = 50
vsoCharacters1.CharProps(visCharacterStyle) = 51#

This code also does not have the correct behavior.
Did Visio 2019 break its prior behavior? Is there a new/different way to accomplish the same thing? I need to be able to apply bold or italics to multiple parts of the text.


text:
package routes

import (
	"fmt"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"

	"github.com/google/exposure-notifications-server/pkg/keys"

	"github.com/google/exposure-notifications-verification-server/internal/auth"
	"github.com/google/exposure-notifications-verification-server/internal/project"
	"github.com/google/exposure-notifications-verification-server/pkg/cache"
	"github.com/google/exposure-notifications-verification-server/pkg/config"
	"github.com/google/exposure-notifications-verification-server/pkg/database"

	"github.com/gorilla/mux"
	"github.com/sethvargo/go-limiter/memorystore"
)

func TestServer(t *testing.T) {
	t.Parallel()

	ctx := project.TestContext(t)

	cfg := &config.ServerConfig{}
	db := &database.Database{}
	cacher, err := cache.NewNoop()
	if err != nil {
		t.Fatal(err)
	}

	authProvider, err := auth.NewLocal(ctx)
	if err != nil {
		t.Fatal(err)
	}

	limiterStore, err := memorystore.New(nil)
	if err != nil {
		t.Fatal(err)
	}

	signer := keys.TestKeyManager(t)

	mux, err := Server(ctx, cfg, db, authProvider, cacher, signer, signer, limiterStore)
	if err != nil {
		t.Fatal(err)
	}
	_ = mux
}

func TestRoutes_codesRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	codesRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/issue", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/bulk-issue", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/status", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/aaa-aaa-aaa-aaa", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/aaa-aaa-aaa-aaa/expire", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_mobileappsRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	mobileappsRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/new", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345/edit", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345/disable", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345/enable", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_apikeyRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	apikeyRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/new", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345/edit", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345/disable", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345/enable", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_userRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	userRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/new", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/import", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/import", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345/edit", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPatch, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodDelete, "/12345", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/12345/reset-password", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_realmkeysRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	realmkeysRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/keys", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodDelete, "/keys/12345", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/keys/create", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/keys/upgrade", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/keys/save", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/keys/activate", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_realmSMSkeysRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	realmSMSkeysRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/sms-keys", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/sms-keys", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPut, "/sms-keys/enable", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPut, "/sms-keys/disable", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/sms-keys/activate", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodDelete, "/sms-keys/12345", nil),
			vars: map[string]string{"id": "12345"},
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_statsRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	statsRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/realm.csv", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm.json", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/users.csv", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/users.json", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/users/12345.csv", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/users/12345.json", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/api-keys/12345.csv", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/api-keys/12345.json", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/external-issuers.csv", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realm/external-issuers.json", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_webhooksRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	webhooksRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req:  httptest.NewRequest(http.MethodPost, "/1/twilio", nil),
			vars: map[string]string{"realm_id": "1"},
		},
		{
			req:  httptest.NewRequest(http.MethodPost, "/123/twilio", nil),
			vars: map[string]string{"realm_id": "123"},
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_realmadminRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	realmadminRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/settings", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/settings", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/settings/enable-express", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/settings/disable-express", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/stats", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/events", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_jwksRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	jwksRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req:  httptest.NewRequest(http.MethodGet, "/12345", nil),
			vars: map[string]string{"realm_id": "12345"},
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func TestRoutes_systemAdminRoutes(t *testing.T) {
	t.Parallel()

	m := mux.NewRouter()
	systemAdminRoutes(m, nil)

	cases := []struct {
		req  *http.Request
		vars map[string]string
	}{
		{
			req: httptest.NewRequest(http.MethodGet, "/", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realms", nil),
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/realms", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/realms/new", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodGet, "/realms/12345/edit", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req:  httptest.NewRequest(http.MethodPatch, "/realms/12345", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req:  httptest.NewRequest(http.MethodPatch, "/realms/12345/add/67890", nil),
			vars: map[string]string{"realm_id": "12345", "user_id": "67890"},
		},
		{
			req:  httptest.NewRequest(http.MethodPatch, "/realms/12345/remove/67890", nil),
			vars: map[string]string{"realm_id": "12345", "user_id": "67890"},
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/users", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodGet, "/users/12345", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req:  httptest.NewRequest(http.MethodDelete, "/users/12345", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req: httptest.NewRequest(http.MethodPost, "/users", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/users/new", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodDelete, "/users/12345/revoke", nil),
			vars: map[string]string{"id": "12345"},
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/mobile-apps", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/sms", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/email", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/events", nil),
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/caches", nil),
		},
		{
			req:  httptest.NewRequest(http.MethodPost, "/caches/clear/banana", nil),
			vars: map[string]string{"id": "banana"},
		},
		{
			req: httptest.NewRequest(http.MethodGet, "/info", nil),
		},
	}

	for _, tc := range cases {
		testRoute(t, m, tc.req, tc.vars)
	}
}

func testRoute(t *testing.T, m *mux.Router, r *http.Request, vars map[string]string) {
	t.Helper()

	pth := strings.Replace(strings.Trim(r.URL.Path, "/"), "/", "_", -1)
	name := fmt.Sprintf("%s_%s", r.Method, pth)

	t.Run(name, func(t *testing.T) {
		t.Helper()
		t.Parallel()

		var match mux.RouteMatch
		ok := m.Match(r, &match)
		if !ok {
			t.Fatalf("expected route to match: %v", match.MatchErr)
		}

		for k, want := range vars {
			got, ok := match.Vars[k]
			if !ok {
				t.Errorf("expected vars to contain %q", k)
			}

			if got != want {
				t.Errorf("Expected %q to be %q", got, want)
			}
		}
	})
}


At 4 All Humanity, the artisans are at the heart of our company. Receiving a fair, livable wage empowers artisans to hone their craft, use their hands and change their lives. Thanks to Fair Trade principles, our artisans are able to earn more than what they would at another job in their community. This extra income enables them to put their children in school, buy food, and improve their neighborhoods.
4 All Humanity only partners with cooperatives and ministries who ensure that the artisans are growing, learning and benefiting from their craft. Read more about the stories behind your purchases by clicking the links below.


text:
Q: TortoiseHg web server says it's stopped even though it's still running When I right click on my Hg folder and choose TortoiseHg > Web Server, I can start the web server on port 7999 without a problem.  I then shut that dialog box.  If I go and run netstat -a -o from a command prompt, I can see that an instance of thgw.exe is running and listening on port 7999 (even after closing the dialog box).  It's ironic that in Task Manager the thgw.exe process is called "TortoiseHg GUI tools for Mercurial SCM" even though there's no GUI running.
Problem
If I open that dialog box again via TortoiseHg > WebServer, it reports that the status is "stopped", and the Start button is enabled.  This is incorrect because the port is still listening.  If I click the start button I get this message in the log as I'd expected:

abort: cannot start server at ':7999': Only one usage of each socket address (protocol/network address/port) is normally permitted

Questions

*

*So why does TortoiseHg not realize that an existing thgw.exe is running on the port?

*Is there a better way besides netstat and task manager to check if TortoiseHg is listening on a web port?  And also learn which port is representing which  folder?

*I can't stop the web server so how are you supposed to gracefully shutdown a TortoiseHg web server without killing it from Task Manager? That seems like a scary thing to do to my production source control system!

A: When the Close button of the Serve window is clicked, the window does not actually close, but minimize itself into the notification area. See the globe icon in the screenshot below:

If you click the icon, the original Serve window appears, where the Start button is actually disabled, and Stop enabled. You can stop the server from there.
This behavior was tested on TortoiseHg 2.4, Windows 7.
The only problem I see here is that the original window is not opened when you choose the appropriate menu item.
See also issue 1845 on the TortoiseHg bug tracker.


The new Alexander Langer Centre at the Firmian neighbourhood in Bolzano (Italy) hosts a school, a kindergarten and the city library of Don Bosco district, and it has become an example of integration where Italian and German have the same importance.
The historic green politic leader Alexander Langer, defender of integration, coexistence and dialogue among the linguistic groups in Tyrol, is the adequate name for an education and municipal Project implemented in an expanded neighbourhood where diversity is a reality that doesn't mean division: it means combination.
The equipment has been built in the highest standards of quality and energy savings, searching for a benefit for the population at the areas of Don Bosco, Firmian and Casanova. Simple and lineal shapes are the highlights on a building designed by the architect Matteo Scagnol, which opens with a glazed atrium that works as a meeting point and social interaction area for the community. Its colour, dark grey at the exterior part, makes a big contrast with the light and colour explosion in the interior, used to remark the active and common part of the new "agora" of the area.
Emphasizing the two realities that converge, the structure is organized in two sections joined by a central connexion. At the ground floor common service are placed: cafeteria and auditorium; in the two upper floors the classrooms have been disposed; and at the plaza area gym and library can be found. The library has been moved to this new equipment to unify all the public services.
Ennequadro studio, led by Tiziano Noselli, has been commissioned to equip Firmian library in this new location, using BBL shelving system and Pey office tables, by mobles 114.


Tag Archive | "Andrea Lyn Lake"
A Morley couple has been arraigned in the shooting of a man in Montcalm County last week.
Andrea and Craig Lake are facing various charges related to a shooting in Montcalm County.
According to the Michigan State Police in Lakeview, troopers responded to a report of a shooting in the 1000 block of Bluebird Lane/Townline Lake on Thursday, March 28, at 12:35 p.m. Initial reports indicate an altercation occurred and several gunshots were heard before vehicles were observed leaving the residence.
Once on scene troopers found that John Hill, 61, had been shot once in the head. He was rushed to United Memorial Kelsey Campus in Lakeview and was then transported by Aeromed to Grand Rapids. Lt. Christian Clute told the Post that the victim would make a full recovery.
Police said that the preliminary investigation revealed that the incident was drug-related.
Troopers asked for the public's to help locate the couple involved in the incident, who they also believed was traveling with Andrea's three-year-old child.
Craig Duane Lake, 31, and his wife, Andrea Lyn Lake, 35, were taken into custody at 2:30 a.m. March 29 by Lakeview troopers with the assistance of officers from the Greenville Department of Public Safety.
The couple was arraigned on charges in Montcalm County District Court on Friday afternoon, March 29. Andrea Lake is facing charges of armed robbery, felony firearm, and assault with intent to commit murder. Her bond was set at $500,000. Craig Lake is facing charges of armed robbery and felony firearm. His bond was set at $250,000.


text:
Federal Terrorism Charges Filed Against Manhattan Subway Bombing Suspect
Published December 12, 2017 at 3:33 PM CST
Federal prosecutors have filed criminal terrorism charges against the man accused of detonating a homemade pipe bomb in Manhattan yesterday. Three people suffered minor injuries. NPR's Joel Rose has more on the charges against the man who is an immigrant from Bangladesh.
JOEL ROSE, BYLINE: Christmas tree lights, a 9-volt battery and a metal pipe are a few of the materials prosecutors say Akayed Ullah used to build the crude bomb he strapped to his body and then detonated in a crowded underground corridor near the Port Authority bus terminal during Monday morning rush hour.
(SOUNDBITE OF PRESS CONFERENCE)
JOON KIM: The location and timing of his planned attack was no accident, and his motivation was no mystery.
ROSE: Acting U.S. Attorney Joon Kim announced federal charges against Ullah at a press conference today in Manhattan. According to the criminal complaint, Ullah told investigators he, quote, "did it for the Islamic State," unquote, in part because of U.S. policy in the Middle East. Kim says he was radicalized by watching Islamic State propaganda videos online.
KIM: Ullah admitted that he began researching how to build bombs about a year ago and had been planning this particular attack for several weeks. He allegedly selected the location and timing to maximize human casualties.
ROSE: Luckily, his plan failed. Ullah was arrested and treated for burns and lacerations. He's charged with providing material support to terrorists, using weapons of mass destruction and three other federal counts. Prosecutors say Ullah posted to his Facebook account on Monday, Trump, you fail to protect your nation. Now the Trump administration is seizing on the failed terror attack to call for changes to U.S. immigration policy.
FRANCIS CISSNA: What we need is an immigration system that is selective.
ROSE: Francis Cissna is the director of U.S. Citizenship and Immigration Services, part of the Department of Homeland Security. Speaking at the White House press briefing today, he pushed for an end to so-called chain migration based on family relationships and also to the diversity visa program, the so-called visa lottery.
CISSNA: Random lotteries, extended family connections - that's not the way to run our immigration system.
ROSE: Cissna says both programs helped Akayed Ullah come to the U.S. with his family in 2011. And he says they're too easy for terrorists to exploit. But it's not clear what, if anything, that has to do with Ullah. Prosecutors in New York say he was radicalized after he came to the U.S. around 2014. Ullah's family has not spoken to reporters, but they did release a statement through a spokesman. Albert Cahn is a lawyer at the Council on American-Islamic Relations in New York.
ALBERT CAHN: The family's heartbroken by this attack and about the allegations that are being made against one of their family members.
ROSE: Cahn declined to comment on those allegations against Ullah or whether the family knew about the attack he'd allegedly been planning for weeks. Joel Rose, NPR News, New York. Transcript provided by NPR, Copyright NPR.


text:
Q: What is wrong with my requirejs setup? My requirejs config file looks correct to me.  But when I get into my function to fire up my application, I only have access to jQuery.  Could someone look at my config file and tell me what I am doing wrong?  Why can't I see Backbone or Underscore and why can I see jQuery?  Here is my config file:
require.config({
  paths: {
    jquery: "libs/jquery/jquery",
    underscore: 'libs/underscore/underscore',
    backbone: "libs/backbone/backbone"
  },
  shims: {
    backbone: {
      deps: [
        'underscore',
        'jquery'
      ],
      exports: 'Backbone'
    },
    underscore: {
      exports: '_'
    }
  }
});

require(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
  'use strict';

  debugger;
});

Thanks for the help.

A: I think you have shims instead of shim in singular, changing it should fix your issue.
shim: {
   underscore: {
     exports: '_'
   },
   backbone: {
     deps: [
      'underscore',
      'jquery'
     ],
     exports: 'Backbone'
  }
}

A: The versions of underscore and backbone you are using are not AMD compliant, so they don't return in the way require.js needs them to. You can just leave them off of your function params and they will be available on the global scope. Otherwise, you are passing undefined into your function as the value of _ and Backbone.
require(['jquery', 'underscore', 'backbone'], function() {
  console.log($);
  console.log(_);
  console.log(Backbone);
});


text:
Play Crazy Game
Home News Codemasters Announces the New Grid, Arriving in September
Codemasters Announces the New Grid, Arriving in September
Raju Singh
Codemasters has announced that GRID will return on September 13, 2019, for PlayStation 4, Xbox One and Windows PC. The fourth game in the series, GRID offers an intense action that spans four continents in some of the most famous roads and circuits in the world.
Choose cars from GT, Touring, Stock, Muscle, Super-Modified and more, and different types of races including Circuit, Street Racing, Ovals, Hot Laps, Point-to-Point, and World Time Attack. GRID offers the perfect balance, risks, and rewards for each type of pilot. Management is incredibly responsive, with a learning curve that caters to both casual arcade players and simulation pilots. The progression is rewarded through liveries, player cards, teammates, rewards and driving awards. AI pilots push the player to the limit, to allow them to earn a place on the podium and win the final in the GRID World Series Championship. Realistic damage can affect vehicle performance and driveability; Excessive contact with the same driver, on the other hand, will cause him to become his nemesis, he will stop at nothing to get his revenge in the race.
Now considered one of the best modern F1, Endurance and Stock Racing drivers, Fernando Alonso has signed up as Race Consultant and will appear in the game. Players will participate in a series of events against some members of Alonso's 'FA Racing' Esports team, through different racing classes, before coming face to face with the former world champion in his infamous Renault R26 F1, in an event the final.
"GRID as a racing franchise is revered by our community and we are pleased to bring it to the current generation of consoles, " said Chris Smith, GRID's Game Director at Codemasters. " The game offers so much variety and depth, from the number of modern and classic cars to the locations and race options. Renowned for its driving feel, the game is aimed at all types of players, from casual pilots looking for a challenge, to sim drivers who want to have some serious fun.
We are also happy to work alongside Fernando Alonso, who is probably one of the greatest pilots in the world. His experience and knowledge have allowed us to improve both the performance and the management of our cars. We are very proud of his participation in the game and as a Race Consultant. We look forward to our players plunging into the final version of the game on PlayStation 4, Xbox One and PC, this September. "
Fernando Alonso added: " Having competed in F1, Endurance and Stock Racing, GRID is the perfect game for me and I'm glad the studio added both me and my racing team in the game. GRID offers so much variety and I will accept the challenge when the players will stand against me. " It is now possible to the pre-order GRID and GRID Ultimate Edition (early access). The Ultimate Edition includes Season 1-3 content.
Previous articleThe Elder Scrolls Online: Early Access to Elsweyr for PC Now Available
Next articleTeam Empire Wins the Season 9 of Rainbow Six Pro League
Raju has an exquisite taste. For him, video games are more than entertainment and he likes to discuss forms and art.
Live Casino Online – Play Live Dealer Games
LORD CONRAD MUSIC FOR GAMERS
K / DA: the talent roster of the new album has been revealed
Classic entertainment of Humdinger Gaming
Jenni Smith - January 15, 2021 0
Escape troubled times by transporting yourself with the classic entertainment of Humdinger Gaming. Patent-pending, Humdinger Gaming provides access to over 1,000 70s, 80s, and...
Monopoly Bash: World Leading Monopoly Board Fun Game
Raju Singh - January 13, 2021 0
Upcoming PS4 Games We're Eagerly Anticipating
Cheap Vs Expensive Gaming Chairs
Raju Singh - January 6, 2021 0
What Is the Best Gaming Chair for Big Guys
Play Crazy Game is an online gaming news website. We are here to deliver Valuable Content With 100% Genuity without any exaggeration. Our focus is on the news, gaming console, release game, and game updates. Play Crazy Game website provide genuine news to our dear users.
© 2020 Play Crazy Game Solutions. All rights reserved.


New stock in: more children's books!
Two weeks ago, we visited our unit at The Customs House in West Bay, Dorset, to put new stock in and have a good sorting out!
Have a look at the Arcane blog HERE and also at Matt ArtPix's great blog about his brilliant new stock [read it HERE].
We will be back there next Tuesday for a flash visit and I will be dropping off some new stock for the already full-to-bursting children's books basket!
After all, it's almost the holidays and you will need to keep those kids entertained!
Our first item is a 2003 edition of Frances Hodgson Burnett's The Secret Garden, which is to become a West End musical this summer (you can buy tickets for the run at The Ambassadors theatre HERE).
Madeline and the Bad Hat by Ludwig Bemelmans was first published as a limited autographed edition in 1956. Unfortunately, this edition is only the softback 1984 edition. Still, it is an enchanting book!
There is even an animated version!
Also on our shelves from Tuesday will be a perfect copy of Brian Selznick's The Invention of Hugo Cabret, a really beautiful book with 284 Black and white illustrations!
And I will also add two small paperback copies of two classics: Kenneth Grahame's The Wind in the Willows and Robert Louis Stevenson's Treasure Island (the latter with a cover featuring Charlton Heston and Christian Bale from the 1990 movie adaptation - see trailer below).


text:
Freaks and Geeks: The Documentary
USA | 2018 | 70 minutes | Brent Hodge
The creators and cast of the beloved and critically acclaimed show reunite to explore how their tale of high school's losers, weirdos, and outcasts was axed by network executives after only one season, yet still launched many of today's biggest stars.
"For anyone who has watched the show's one truncated season over and over again, it's illuminating to hear all about the creative process behind scenes and episodes." Kevin Scott - Exclaim
It seems absolutely insane in retrospect, but a TV show starring James Franco (The Disaster Artist), Seth Rogen (Pineapple Express), Jason Segel ("How I Met Your Mother"), Linda Cardellini ("ER"), Busy Phillips ("Cougar Town"), John Francis Daley (Spider-Man: Homecoming), Samm Levine (Inglourious Basterds), and Martin Starr ("Silicon Valley"), and created by Judd Apatow (Knocked Up) and Paul Feig (Ghostbusters), was not a huge hit back when it premiered on NBC on September 25, 1999. In fact, it aired only 12 of its 18 episodes before being unceremoniously canceled. But from its soon-to-be-famous cast to its insistence on riding the line between comedy and drama, "Freaks and Geeks" is now one of the most beloved and influential television shows of the past 20 years. Documentarian Brent Hodge (SIFF 2016's The Pistol Shrimps) gets the gang back together 19 years later for a retrospective on a show that dared to break conventions, to tell stories of high school kids that hadn't been represented on television before and revealing that adolescent humiliations and heartbreaks are vital parts of our lives. "The show is about failing and how you survive failure," explains Apatow in one of the film's many revealing interviews, mixed in with remarkable behind-the-scenes and audition footage, in a documentary about the show's long-lasting impact on pop culture and its plethora of extremely talented people.
Brent Hodge is a filmmaker best known for his documentaries A Brony Tale (Netflix), I Am Chris Farley (Spike TV), Pistol Shrimps (NBC) and most recently Freaks and Geeks (A&E). Hodge is also the show runner and director for Season 1 and 2 of the series "A User's Guide To Cheating Death" (BBC Earth). He has been nominated for six Leo Awards for his documentary movies, winning one for A Brony Tale in 2015. He most recently won a Founders Award for Pistol Shrimps at Michael Moore's Traverse City Film Festival. Hodge has made documentary content with Karlie Kloss, Samsung, NBC, Time Magazine, CBC Music, Disney's Maker Studios, Uber Technologies, and more.
Sponsored by BECU, Tito's Handmade Vodka
Director: Brent Hodge
Principal Cast: Paul Feig, Judd Apatow, Seth Rogen, Jason Segel, Linda Cardellini, Busy Phillips, James Franco, John Francis Daley
Premiere Status: Seattle
Producer: Matthew Galkin, Ally Kelly
Cinematographers: Joseph Schweers
Editors: Austin Andrews, Lewis Bennett
Music: Cayne McKenzie, David Menzel, Andrew Huculiak
Filmography: The Pistol Shrimps (2016); A Brony Tale (2014); What Happens Next? The Dan Mangan Documentary (2012); CBC's Winning America (2011)
Format: DCP
US Distributor: A&E


text:
About The Pearl Post
The Pearl Post
January 27No school on Monday, Feb. 20 for Presidents' Day
January 27Minimum Day on Friday, Feb. 17
January 27School dance on Friday, Feb. 3 from 6 to 9 p.m. in the MPR
January 7No school on Monday, Jan. 16 for MLK Jr.'s birthday
January 7Fiesta Friday on Friday, Jan. 13
January 7Dangers of Fentanyl Use assemblies during period 3 on Thursday, Jan. 12
How to stay focused, productive during quarantine
Gabrielle Lashley
Freshman Naamah Silcott works on her online schoolwork during this semester of remote learning. (Naamah Silcott)
During the coronavirus pandemic, most students have had to come up with their own ways of getting their schoolwork and homework done through remote learning. Some students haven't been able to, though because of stress and a feeling of helplessness. This list can help those students find a system that works for them in order to get through the rough weeks of online work. And while the school year is coming to a close, it's still hasn't been determined if distance learning will be taking place when the new school year starts on Aug. 18.
– Turn off your Tech: Phones and tablets can be very distracting. Once you get a notification it's so tempting to open your device and not put it down. Silencing your technology will stop it from distracting you.
– Know Your Needs: When in the middle of working, it's not uncommon for one to get hungry, thirsty or need to use the bathroom. Things like these should be done before and after you work. As soon as you take a break to sit down and eat, it's suddenly leisure time all over again. If you think ahead you're less likely to lose focus.
– Know When to do What: Most people find it hard to work at a certain time of the day. It's always best to work when you know you'll be focused. If you're a morning person, work in the mornings. If you're a night person, work at night.
Students adjust to semester-long distance learning
Coronavirus pandemic impacts students' mental health
New grading policy allows students to de-stress during coronavirus pandemic
– Make a Schedule: Staying at home all day every day can really affect how you get your work done, especially when there is no teacher to guide you. Making a schedule will stop you from procrastinating and help you organize your time so you can do all of your work and turn it in on time. It's also very helpful to be specific with how you'd like to spend your time. It's good to make a certain time frame for when you want to work and when you want time to yourself.
– Have a Working Environment: It's very easy to get distracted if you don't have an environment that is exclusively for work. It's very easy to get comfortable in your own home, so it's great to have a space to do schoolwork. Some students have desks in their rooms, which is a great place to sit down and focus. Noise is a gateway to distraction and so are a lot of items, so make sure your workplace is quiet with little going on.
"I'm using my desk to work. It's also where I do art and play games," freshman Emerson Ortiz said. "I also have privacy and silence, which helps me concentrate."
– Work With Others: Sometimes working with others may not be the best call but when you all have your priorities straight, it's ideal. Working with others can help get your work done faster. Group Chats are especially helpful. If you need something, you can send a text to your peers in a group chat and someone may be able to help you.
"I definitely think being in a group chat is 100% helpful because sometimes they tell you that a certain assignment is due that you didn't know about and they're kind enough to help out," freshman Jenica Felicitas said.
– Stay Updated: Make sure to always check your learning management system, Schoology. Staying updated on your coursework is ideal for maintaining your grade and staying on top of it during this quarantine.
– Make a List: Making a list of all the assignments with their due dates is a great way to turn in your work on time. Either making weekly lists of what needs to be done during the week or a daily list of what you should work on that day, any list is encouraged.
"Recently I made a list of everything I currently need to do and have slowly been going through it," freshman Naamah Silcott said. "Making a list made me feel a lot better and more organized with the work and overall made it feel like there was less to do than there actually was."
Coronavirus pandemic impacts students' mental health
Gabrielle Lashley, Art Director
Gabrielle Lashley is in her third and final year on staff of The Pearl Post, now as the new Art Director. In school, she's co-president of the Art Club,...
Naamah Silcott, Yearbook Editor-in-Chief
Naamah Silcott is The Prestige Yearbook Editor-in-Chief and this is their second year on staff. They also serve as Black Student Union (BSU), Pride Club...
Get ready to dance through the decades
"I can't imagine not being a Kings fan"
Library reopens on Tuesdays
Athlete of the Month: Fayton Guzman dribbles into her senior year of basketball
Athlete of the Month: Judge swings into high school tennis
Schoolwide assembly raises awareness of fentanyl crisis
After winter break, students look ahead to new semester
Movie Review: "M3GAN" dances and stabs her way into viewers' hearts
6 video games to look forward to in 2023
The student news site of Daniel Pearl Magnet High School in Lake Balboa, CA