flexible job shop sat

HI,
I'm trying the flexible_job_shop_sat.py and the code is very useful to the company current project. However, i facing an obstacle after running the code and unsure how to improve it. The result return not all 16 drivers are being assigned to the tasks. Is there a possible solution to assign all 16 drivers to the tasks?
import collections
from ortools.sat.python import cp_model
class SolutionPrinter(cp_model.CpSolverSolutionCallback):
def __init__(self):
    cp_model.CpSolverSolutionCallback.__init__(self)
    self.__solution_count = 0

def on_solution_callback(self):
    """Called at each new solution."""
    print('Solution %i, time = %f s, objective = %i' %
          (self.__solution_count, self.WallTime(), self.ObjectiveValue()))
    self.__solution_count += 1

orders = [
[[(34, 0), (34, 1), (34, 2), (34, 3), (34, 4), (34, 5), (34, 6), (34, 7), (34, 8), (34, 9), (34, 10), (34, 11), (34, 12), (34, 13), (34, 14), (34, 15)]],
[[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)]],
[[(24, 0), (24, 1), (24, 2), (24, 3), (24, 4), (24, 5), (24, 6), (24, 7), (24, 8), (24, 9), (24, 10), (24, 11), (24, 12), (24, 13), (24, 14), (24, 15)],
[(24, 0), (24, 1), (24, 2), (24, 3), (24, 4), (24, 5), (24, 6), (24, 7), (24, 8), (24, 9), (24, 10), (24, 11), (24, 12), (24, 13), (24, 14), (24, 15)]],
[[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)],
[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)]],
[[(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (5, 10), (5, 11), (5, 12), (5, 13), (5, 14), (5, 15)]],
[[(18, 0), (18, 1), (18, 2), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9), (18, 10), (18, 11), (18, 12), (18, 13), (18, 14), (18, 15)],
[(18, 0), (18, 1), (18, 2), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9), (18, 10), (18, 11), (18, 12), (18, 13), (18, 14), (18, 15)],
[(18, 0), (18, 1), (18, 2), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9), (18, 10), (18, 11), (18, 12), (18, 13), (18, 14), (18, 15)]],
[[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)],
[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)],
[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)],
[(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15)]],
[[(13, 0), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 6), (13, 7), (13, 8), (13, 9), (13, 10), (13, 11), (13, 12), (13, 13), (13, 14), (13, 15)]],
[[(28, 0), (28, 1), (28, 2), (28, 3), (28, 4), (28, 5), (28, 6), (28, 7), (28, 8), (28, 9), (28, 10), (28, 11), (28, 12), (28, 13), (28, 14), (28, 15)]],
[[(7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (7, 10), (7, 11), (7, 12), (7, 13), (7, 14), (7, 15)]],
[[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)]],
[[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)],
[(25, 0), (25, 1), (25, 2), (25, 3), (25, 4), (25, 5), (25, 6), (25, 7), (25, 8), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15)]],
[[(13, 0), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 6), (13, 7), (13, 8), (13, 9), (13, 10), (13, 11), (13, 12), (13, 13), (13, 14), (13, 15)]],
[[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)]],
[[(22, 0), (22, 1), (22, 2), (22, 3), (22, 4), (22, 5), (22, 6), (22, 7), (22, 8), (22, 9), (22, 10), (22, 11), (22, 12), (22, 13), (22, 14), (22, 15)]],
[[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)],
[(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9), (12, 10), (12, 11), (12, 12), (12, 13), (12, 14), (12, 15)]],
[[(13, 0), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 6), (13, 7), (13, 8), (13, 9), (13, 10), (13, 11), (13, 12), (13, 13), (13, 14), (13, 15)]],
[[(20, 0), (20, 1), (20, 2), (20, 3), (20, 4), (20, 5), (20, 6), (20, 7), (20, 8), (20, 9), (20, 10), (20, 11), (20, 12), (20, 13), (20, 14), (20, 15)]]
]
num_orders = len(orders)
all_orders = range(num_orders)
num_drivers = 16
all_drivers = range(num_drivers)
model = cp_model.CpModel()
horizon = 0
for order in orders:
for task in order:
max_task_duration = 0
for alternative in task:
max_task_duration = max(max_task_duration, alternative[0])
horizon += max_task_duration
print('Horizon = %i' % horizon)
Global storage of variables.
intervals_per_resources = collections.defaultdict(list)
starts = {}
presences = {}
order_ends = []
Scan the orders and create the relevant variables and intervals.
for order_id in all_orders:
order = orders[order_id]
num_tasks = len(order)
previous_end = None
for task_id in range(num_tasks):
    task = order[task_id]

    min_duration = task[0][0]
    max_duration = task[0][0]
    #print(f'Before: min={min_duration}, max={max_duration}')

    num_alternatives = len(task)
    all_alternatives = range(num_alternatives)

    for alt_id in range(1, num_alternatives):
        alt_duration = task[alt_id][0]
        min_duration = min(min_duration, alt_duration)
        max_duration = max(max_duration, alt_duration)

    #print(f'After: min={min_duration}, max={max_duration}')

    #Create main interval for the task.
    suffix_name = '_o%i_t%i' % (order_id, task_id)
    start = model.NewIntVar(0, horizon, 'start' + suffix_name)
    duration = model.NewIntVar(min_duration, max_duration,
                               'duration' + suffix_name)
    end = model.NewIntVar(0, horizon, 'end' + suffix_name)
    interval = model.NewIntervalVar(start, duration, end,
                                    'interval' + suffix_name)

    #Store the start for the solution.
    starts[(order_id, task_id)] = start

    # Add precedence with previous task in the same job
    if previous_end:
        model.Add(start >= previous_end)
    previous_end = end
    #print(f'previous_end={previous_end}')

    if num_alternatives > 1:
        l_presences = []
        for alt_id in all_alternatives:
            alt_suffix = '_o%i_t%i_a%i' % (order_id, task_id, alt_id)
            l_presence = model.NewBoolVar('presence' + alt_suffix)
            l_start = model.NewIntVar(0, horizon, 'start' + alt_suffix)
            l_duration = task[alt_id][0]
            l_end = model.NewIntVar(0, horizon, 'end' + alt_suffix)
            l_interval = model.NewOptionalIntervalVar(
                    l_start, l_duration, l_end, l_presence,
                    'interval' + alt_suffix)
            l_presences.append(l_presence)

            # Link the master variables with the local ones.
            model.Add(start == l_start).OnlyEnforceIf(l_presence)
            model.Add(duration == l_duration).OnlyEnforceIf(l_presence)
            model.Add(end == l_end).OnlyEnforceIf(l_presence)

            # Add the local interval to the right driver.
            intervals_per_resources[task[alt_id][1]].append(l_interval)

            # Store the presences for the solution.
            presences[(order_id, task_id, alt_id)] = l_presence

        #Select exactly one presence variable.
        model.Add(sum(l_presences) == 1)

    else:
        intervals_per_resources[task[0][1]].append(interval)
        presences[(order_id, task_id, 0)] = model.NewConstant(1)

    #print('')
order_ends.append(previous_end)

#Create drivers constraints
for driver_id in all_drivers:
intervals = intervals_per_resources[driver_id]
if len(intervals) > 1:
model.AddNoOverlap(intervals)
Makespan objective
makespan = model.NewIntVar(0, horizon, 'makespan')
model.AddMaxEquality(makespan, order_ends)
model.Minimize(makespan)
#Solve model.
solver = cp_model.CpSolver()
solution_printer = SolutionPrinter()
status = solver.SolveWithSolutionCallback(model, solution_printer)
for order_id in all_orders:
print('Order %i:' % order_id)
for task_id in range(len(orders[order_id])):
start_value = solver.Value(starts[(order_id, task_id)])
driver = -1
duration = -1
selected = -1
for alt_id in range(len(orders[order_id][task_id])):
if solver.Value(presences[(order_id, task_id, alt_id)]):
duration = orders[order_id][task_id][alt_id][0]
driver = orders[order_id][task_id][alt_id][1]
selected = alt_id
print(' task_%i_%i starts at %i (alt %i, driver %i, duration %i)' %
(order_id, task_id, start_value, selected, driver, duration))
print('Solve status: %s' % solver.StatusName(status))
print('Optimal objective value: %i' % solver.ObjectiveValue())
print('Statistics')
print('  - conflicts : %i' % solver.NumConflicts())
print('  - branches  : %i' % solver.NumBranches())
print('  - wall time : %f' % solver.WallTime())

Can you format your code a bit by adding triple tick(```) at the start and at the end?

 This can of course be a valid approach, but it doesn't hurt to ask, is this a vehicle routing problem?
What are you trying to achieve? Is it a requirement (constraint) that all drivers are assigned? Do you want to maximize drivers used?

Can you format your code a bit by adding triple tick(```) at the start and at the end?
 This can of course be a valid approach, but it doesn't hurt to ask, is this a vehicle routing problem?
my reply: I have no idea also as i am very new on the OR-tools. I'm trying varies approach to find the best fit solution.
What are you trying to achieve? Is it a requirement (constraint) that all drivers are assigned? Do you want to maximize drivers used?
my reply: I have briefly explained the requirement of the project at #1716. For example,
To assign available trucks to each job for delivery. For instance, there are 4 trucks and 15 jobs for delivery.

Constraints:
There may be ban of certain truck to deliver certain jobs.
Certain jobs may only allow certain trucks for delivery.
Each jobs will have a different start time for delivery.
Truck which has completed each job delivery to take up the next available job in the queue, first-in-first-out.
To utilize all 4 available trucks.
Each truck can only allow to take up each job at a time.
Objective:
The objective is to minimize the maximum completion time of all tasks. Something like makespan.

 This can of course be a valid approach, but it doesn't hurt to ask, is this a vehicle routing problem?
What are you trying to achieve? Is it a requirement (constraint) that all drivers are assigned? Do you want to maximize drivers used?

I have no idea if is a VRP, here is the project requirement. I wonder if you able to advice which approach i shall use?
I will like to try both requirement to maximize drivers used and minimum drivers to complete all the tasks.
The project require to assign available trucks to each job for delivery. For instance, there are 4 trucks and 15 jobs for delivery.
Constraints:
There may be ban of certain truck to deliver certain jobs.
Certain jobs may only allow certain trucks for delivery.
Each jobs will have a different start time for delivery.
Truck which has completed each job delivery to take up the next available job in the queue, first-in-first-out.
To utilize all 4 available trucks.
Each truck can only allow to take up each job at a time.
Objective:
The objective is to minimize the maximum completion time of all tasks. Something like makespan.
Scenario:
Available 4 trucks: T1, T2, T3, T4
Available 15 jobs: J1, starttime: 2pm, traveltime 10min
: J2, starttime: 2:15pm, traveltime 7min.
: J3, starttime: 2:20pm, traveltime 5min.
: J4, starttime: 2:30pm, traveltime 15min.
: J5, starttime: 2:40pm. traveltime 9min.
ban trucks: T1 is ban to deliver J1 and J2.
Specific tasks to specific trucks: Only T1 and T2 able to deliver to J4.
First assignment:
T1 -> J4
T2 -> J1
T3 -> J2
T4 -> J3
Second Assignment:
As T2 return first to factory after deliver J1 finished at 2:10pm, henceforth T2 take up the next availabe job which is J5.
T3 return at 2:22pm take up J6.
T4 return at 2:25pm take up J7.
T1 return at 2:45pm take up J8.
I have tried many of your examples such as flexible_job_shop_sat.py, jobshop_ft06_distance_sat.py, etc and unable to find a feasible solution to fit in all the constraints.

Please avoid reposting the same model and instance data and try and use proper formatting. It makes it much easier to follow and understand what you're trying to achieve.
It sounds like you might be doing a Vehicle Routing with Pickup and Deliveries with Time Window (VRPPDTW) but I might be wrong. I must confess I still haven't understood your problem.
Are the pickup and delivery locations the same for all jobs?

I will like to try both requirement to maximize drivers used and minimum drivers to complete all the tasks.

May I ask why?
You speak of both trucks and drivers. If they are interchangeable, please stick to one term.
It sounds to me like you have
V vehicles, each with a capacity of 1 item. Some who can only pickup certain items.
C items with pairs of pickup and delivery locations as well as start time windows
D durations for the delivery of each item
I don't see a travel time between items. After C1 has been delivered, can a vehicle immediately pickup any other item?

There may be ban of certain truck to deliver certain jobs.
Certain jobs may only allow certain trucks for delivery.

Aren't these equivalent?

Truck which has completed each job delivery to take up the next available job in the queue, first-in-first-out.

This sounds more like a search heuristic than a constraint. Why must the successor of Ci be Cj where Cj has the earliest start time?

Maybe I shall interpret the scenario more clearly, For example, one of the factory has 10 orders to deliver to 10 customer sites. There are 3 trucks to manage the delivery and each orders have a different start time and travel time for delivery. Truck A deliver Order 1, truck B deliver Order 2 and truck C deliver Order 3 etc. For each order delivered, the truck have to return to factory and deliver the next available orders in the queue. All orders are sorted in the queue by start time. The only constraints are some trucks are ban to deliver certain orders and certain trucks are only allow to deliver certain orders.
I don't see a travel time between items. After C1 has been delivered, can a vehicle immediately pickup any other item?
The vehicle has to travel to factory to take up the next piority order base on starttime.
Aren't these equivalent?
No is not equivalent. Some customer only allow truck with their passid to deliver to their site.
Some other customer site ban truck to deliver to their site.
This sounds more like a search heuristic than a constraint. Why must the successor of Ci be Cj where Cj has the earliest start time?
For instance, Ci start time 2:15pm and Cj start time is 2:00pm, the truck have to delivery Cj before Ci.
Do let me know if there any questions needed. Thanks.

Do you always have 1 factory?
Does the factory have to wait for an item to be picked up before it can produce new items?
Is the travelling time back from customer sites included in the transit time?

Some customer only allow truck with their passid to deliver to their site. Some other customer site ban truck to deliver to their site.

Sorry but I still don't see the difference. Each item goes to a specified customer. Each vehicle can only go to a specified set of customers => each item can only be delivered by a specified subset of vehicles. Sounds like one constraint to me.

For instance, Ci start time 2:15pm and Cj start time is 2:00pm, the truck have to delivery Cj before Ci.

Say you have C1 2:00pm, C2 2:15pm
C1 can only be picked up by V2
C2 can be picked up by V1 or V2
V2 is busy until 2:30pm, V1 is available at 2:15pm
What should happen?

Do you always have 1 factory?
My reply: No there are multiple factories with each factory has some orders to delivery.
Does the factory have to wait for an item to be picked up before it can produce new items?
My reply: Not necessary.
Is the travelling time back from customer sites included in the transit time?
My reply: Yes, since each order has starttime, hence finishtime = starttime + 2*traveltime (to and back) + 15 min (waiting time).

Some customer only allow truck with their passid to deliver to their site. Some other customer site ban truck to deliver to their site.

Sorry but I still don't see the difference. Each item goes to a specified customer. Each vehicle can only go to a specified set of customers => each item can only be delivered by a specified subset of vehicles. Sounds like one constraint to me.
My reply: Well just take it as 1 constraint.

For instance, Ci start time 2:15pm and Cj start time is 2:00pm, the truck have to delivery Cj before Ci.

Say you have C1 2:00pm, C2 2:15pm
C1 can only be picked up by V2
C2 can be picked up by V1 or V2
V2 is busy until 2:30pm, V1 is available at 2:15pm
What should happen?
My reply:
C1 have to pick up by V2 at 2:30pm since V2 is the only vehicle C1 can pick up.
C2 have to pick up by V1 at 2:15pm.

Hope my replies answered all your questions.

Ok. Some follow-up questions:

there are multiple factories with each factory has some orders to delivery
each order has starttime, hence finishtime = starttime + 2*traveltime (to and back) + 15 min (waiting time)
How can you precompute the travel time back to the depot? Are the factories (depots) in the same location? Is each vehicle constrained to exactly one depot?

C1 have to pick up by V2 at 2:30pm since V2 is the only vehicle C1 can pick up.
C2 have to pick up by V1 at 2:15pm.

This would violate the FIFO in the constraint

Truck which has completed each job delivery to take up the next available job in the queue, first-in-first-out.
Is it necessary that jobs are processed FIFO?

Ok. Some follow-up questions:

there are multiple factories with each factory has some orders to delivery
each order has starttime, hence finishtime = starttime + 2*traveltime (to and back) + 15 min (waiting time)

How can you precompute the travel time back to the depot? Are the factories (depots) in the same location? Is each vehicle constrained to exactly one depot?
My reply: We have a starttime and traveltime (factory to customer site). No the factories are from different location, and is defined by plantcode. Yes each vehicle is constrained to one depot.

C1 have to pick up by V2 at 2:30pm since V2 is the only vehicle C1 can pick up.
C2 have to pick up by V1 at 2:15pm.

This would violate the FIFO in the constraint
Yes this will violate the FIFO, but is ok.

Truck which has completed each job delivery to take up the next available job in the queue, first-in-first-out.

Is it necessary that jobs are processed FIFO?
For a scenario, if there are 3 orders to be deliver in 5 different timing,  C1: 2pm, C2: 2:15pm, C3: 3pm, C4: 3:20 and C5: 3:45pm. We have only 3 vechicles to deliver all five orders,
1st plan: V1 to deliver C1, V2 to deliver C2 and V3 to deliver C3.
2nd plan: Assume V2 return to factory early than V1, the plan can't be assigning C4 to V1 as V1 may not return to factory yet.  Hence C4 has to assign to V2 which is FIFO constraint.


Test favicons loaded by

In Chrome favicons loaded via a link tag go in a different cache than the general http resource cache. I recently fixed an issue in Chrome which allowed cross-origin history sniffing, and it might be worth testing here as well. Let me know if I misunderstand the underlying favicon test currently used.

Hi Ari -- thank you so much for letting me know! Indeed the latest published test results shows that favicons are indeed now partitioned in Chrome Canary (107.0): https://privacytests.org/nightly.html
And this result is new since Chrome Canary 106.0 a couple of weeks before: https://privacytests.org/archive/issue30/nightly.html
Once Chrome 106 reaches Stable, this will be visible on the main page as well.
Thanks again for getting in touch and for this awesome work! 🥳


Allow inner nested tabs to not set anchors

I want to have tabs inside my tabs, but only the outside tabs should set the anchor.
I tried setting href='' on the inside tabs, hoping that would be a cue to not change the anchor, but it didn't work.
I was able to work-around by using jquery to take the href off of the the inner tabs.
It would be nice if setting href='' or a new property "no_anchor=true" would prevent the tab from updating the anchor.

I also tried setting all the inner tab id to be the same as the outer tab name, but that didn't work as all the inner tabs appeared open.

I created a PR for this:
https://github.com/spatie/vue-tabs-component/pull/13

Conversation continues in #13


Simple Covariance metric-learner

Some papers mention using inverse of covariance matrix as a simple "metric-learning" method.
I thought it would a good idea to have this explicitly in a class.

I might call this a Mahalanobis metric: https://www.cs.princeton.edu/courses/archive/fall08/cos436/Duda/PR_Mahal/M_metric.htm
A little more explanation in the module docstring would be nice, ideally explaining that this is just a simple baseline method.
I agree that this is a useful addition.

I disagree with the name:
According to the original paper http://www.unt.edu/rss/class/Jon/MiscDocs/1936_Mahalanobis.pdf (1936) they would indeed call this a Mahalanobis distance.
However this name has been generalized for any matrix (positive semi-definite). Therefore all currently implemented algorithms in this package are a variation of Mahalanobis distance.
Sources:
Xing (2002) http://www.cs.cmu.edu/~epxing/papers/Old_papers/xing_nips02_metric.pdf
Bellet's survey (2014) https://arxiv.org/pdf/1306.6709.pdf (page 8)

Fair enough. Merging the other PR caused a merge conflict, so you'll need to rebase this change against master before I can merge it.

Updated docstring and rebased to master. Should be ready to merge.

Thanks, merged.


Java is missing ability to do OAuth2 domain wide delegation

This is needed for google-auth-library-java and google/google-api-java-client#1037 (creating an issue for both projects):
User's current way:
GoogleCredential googleCredential = new GoogleCredential.Builder()
     .setTransport(TRANSPORT).setJsonFactory(JSON_FACTORY)
     .setServiceAccountId(emailAddress)
     .setServiceAccountPrivateKeyFromP12File(p12File)
     .setServiceAccountScopes(scopes)
     .setServiceAccountUser(user).build();

Would like: to do:
GoogleCredential googleCredential =
    GoogleCredential.fromStream(jsonInputStream, TRANSPORT, JSON_FACTORY).createScoped(Collections.singleton(Oauth2Scopes.USERINFO_EMAIL))

Python you just do:
credentials = credentials.create_delegated(user)

@vchudnov-g should this be closed?


Close Tab doesn't warn that changes are unsaved

Expected Behaviour
https://app.cucumber.pro/projects/data-curator/documents/branch/develop/test/features/file/close-tab.feature
Current Behaviour
Close Tab closes the tab without warning that the work is unsaved
Steps to Reproduce (for problems)

Enter some data
Press the close button on the active tab
Tab with unsaved work is closed

Your Environment

Data Curator 0.2.3
Operating System macOS Seirra 10.12.6

Consider implementing with #67 as additional effort is minor

@mattRedBox I was able to add data in first tab, create new tab, delete first tab without warning showing

d'Oh you haven't fixed this - I'll test the closed issues!!!

Fixed in v1.1


Pushbullet plugin crash on py3.5

2016-06-06 03:30 CRITICAL task          anime-series    BUG: Unhandled error in plugin pushbullet: a bytes-like object is required, not 'str'
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/flexget/task.py", line 443, in __run_plugin
    return method(*args, **kwargs)
  File "/usr/local/lib/python3.5/site-packages/flexget/event.py", line 23, in __call__
    return self.func(*args, **kwargs)
  File "/usr/local/lib/python3.5/site-packages/flexget/plugins/output/pushbullet.py", line 98, in on_task_output
    self.send_push(task, apikey, title, body, url, device, 'device_iden')
  File "/usr/local/lib/python3.5/site-packages/flexget/plugins/output/pushbullet.py", line 134, in send_push
    'Authorization': 'Basic %s' % base64.b64encode(api_key),
  File "/usr/local/lib/python3.5/base64.py", line 62, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: a bytes-like object is required, not 'str'

Additional information:

Flexget Version: Lastest

Hey guys,
I might (or not) have another crash related to this issue. I'll paste the crash log in this comment. Please advise as to whether I should open a dedicated issue for this one...
Issue is present on latest 2.1.0 / Python 3.5 but also on the version before that. 2.1.0 on Python 2.7 is fine. I'm running FlexGet out of a Docker container (if this is of any interest). Also I'd be happy to provide more input if needed.
This is the Pushbullet template:
pushbullet:
      apikey: '{{ secrets.pb_apikey }}'
      title: >
        {% if title is defined %}{{ title }} processed.
        {% endif %}
      body: >
        '{{ filename }}'

Thanks in advance.
2016-06-24 06:27 CRITICAL task          flicks          BUG: Unhandled error in plugin pushbullet: the JSON object must be str, not 'bytes'
Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/flexget/task.py", line 443, in __run_plugin
    return method(*args, **kwargs)
  File "/usr/lib/python3.5/site-packages/flexget/event.py", line 23, in __call__
    return self.func(*args, **kwargs)
  File "/usr/lib/python3.5/site-packages/flexget/plugins/output/pushbullet.py", line 102, in on_task_output
    self.send_push(task, apikey, title, body, url)
  File "/usr/lib/python3.5/site-packages/flexget/plugins/output/pushbullet.py", line 153, in send_push
    error = json.loads(response.content)['error']
  File "/usr/lib/python3.5/site-packages/flexget/utils/json.py", line 112, in loads
    return json.loads(*args, **kwargs)
  File "/usr/lib/python3.5/json/__init__.py", line 312, in loads
    s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'

Looks like a separate issue, should be an easy fix though. If this line
https://github.com/Flexget/Flexget/blob/develop/flexget/plugins/output/pushbullet.py#L153
Gets changed to
error = response.json()['error']

i would do it @gazpachoking, but it's suspicious that you didn't, so i'll leave it alone ;-)


Beginning to reorg the functional tests

Description
To make it easier to determine which functional tests we're missing, I'm adopting the organizational strategy of the adapter folder in core.  From migrating these tests, I found that I had added a duplicate test in the last PR because of the difficulty of tracking which tests we have vs which we're missing.
Couple of other notes

Added alias tests we were missing
test_basic.py has been exploded into a lot of really simple files, primarily to keep alignment with core, but also because sometimes we have a situation like with doc generation where we need a large override, and I don't like python files that feel like a grab bag of unrelated things.
I've started moving Databricks to the front of the test class names.  I prefer to have the stuff we want to ignore (TestDatabricks) in one place, rather than sandwiching them around the part of the test name that has meaning.

Checklist

[x] I have run this code in development and it appears to resolve the stated issue
[x] This PR includes tests, or tests are not required/relevant for this PR
[ ] I have updated the CHANGELOG.md and added information about my change to the "dbt-databricks next" section.

For discussion:  Do we need Databricks in the name at all?  In cases where dbt doesn't have a base for us to inherit its necessary, but I think when they do that, it's more an accident due to time crunch than an intentional choice.


Add Create Mod Trains Compatibility With Portals

Adds basic* compatibility between Create trains and customportalapi

*mobs will disembark from the train when passing through custom portals, and therefore cannot be conductors.

Looks like passenger entities, including the player, is rather finicky right now :(

looks like player dismounting seems to be fixed when forceloading the chunks both portals are in; com.simbubi.create.content.trains.entity.CarriageEntityHandler removes all passengers if they are in unloaded chunks
other entities (cows were used as a test) still dismount

As it turns out, the player dismounting only happens when the player is in creative.
I am 100% certain this is because of the portal cooldown being disabled when in creative mode. Then the series of events takes place:

The carriage with the passenger player enters the other dimension
The carriage (NOT the portal, since entities riding vehicles should not use portals) teleports any passengers past the portal into the other dimension
There is a (1-tick?/very short) delay before the passenger is considered as riding the train
The passenger player touches the portal in the other dimension, which teleports them back into the original dimension (since they are not considered to be riding a vehicle)
Since they are in a separate dimension to the carriage, they dismount.

nice! will have to see if i can get this to work on the 1.20.1 version

well, the cherry picked code with changes loads and the nether side of things works, but am still dealing with the tracks not picking up the custom portals at all

yes, another mod is adding its own copy of CustomPortalApi and i need to track it down. i did manage to successfully cherry pick this PR and get it working on 1.20.1 with the latest Create https://github.com/lexi-the-cute/customportalapi/commit/d8f877ac695df356c5801e3b1c113b91cb70316e

definitely feel like im being punked. it works in single player, but then has create throw the "portal not generated on other side" error message in multiplayer when i install it on the server


Downloading weights...0%

Downloaded the Mac-App from the Website. Hanging at "Downloading weights...0%" on first run.

same here. Log is empty

Try [v0.0.2]. Downloading now. The website seems to point at the old version.

Yep! I'm about to update the website with the new version. I'm also working on getting auto-updates into the next release so I don't have to ask people to re-download every time!


Biometric Authentication App

Please describe your Androapp
This android app provides a way to verify, beyond a doubt, that a person is who they say they are. Biometric authentication performs this verification by checking distinctive biological or behavioral characteristics.
Describe alternatives you've considered
No alternatives are present.
Additional context
No Context for the time being

Okay, Go ahead!
Please Note:

Please go through README.md and CONTRIBUTING.md
Already existing apps on github will be considered as spam, try to make your own UI
Please use appropriate comments to self describe your code
Add necessary readme.md - references of your learnings and dependencies, images (screenshots); refer latest added apps for this task.

Assigning to you!


azure-functions-maven-plugin: Error because "hostJson" is null in v1.22.0

Plugin name and version
azure-functions-maven-plugin -  version 1.22.0.
Upgrading to azure-functions-maven-plugin version 1.22.0 (from 1.21.0) gives an error in the function package:
[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:1.22.0:package (azfaas-package-functions) on project azfunfwkjava-boot: generate configuration files and prepare staging directory: Cannot invoke "com.fasterxml.jackson.databind.JsonNode.at(String)" because "hostJson" is null -> [Help `1]

with version 1.21.0 works correctly.
Plugin configuration in your pom.xml
          <plugin>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-functions-maven-plugin</artifactId>
            <configuration>
              <authType>${azfaasAuthType}</authType>
              <appName>${azfaasAppName}</appName>
              <resourceGroup>${azfaasResourceGroup}</resourceGroup>
              <region>${azfaasAppRegion}</region>
              <pricingTier>${azfaasPricingTier}</pricingTier>
              <appServicePlanName>${azfaasAppServicePlanName}</appServicePlanName>
              <subscriptionId>${azfaasSubscriptionId}</subscriptionId>
              <runtime>
                <javaVersion>${java.version}</javaVersion>
              </runtime>
              <appSettings>
                <property>
                  <name>FUNCTIONS_EXTENSION_VERSION</name>
                  <value>~4</value>
                </property>
                <property>
                  <name>FUNCTIONS_WORKER_RUNTIME</name>
                  <value>java</value>
                </property>
                <property>
                  <name>MAIN_CLASS</name>
                  <value>${start-class}</value>
                </property>
              </appSettings>
            </configuration>
            <executions>
              <execution>
                <id>azfaas-package-functions</id>
                <goals>
                  <goal>package</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
              <execution>
                <id>azfaas-copy-resources</id>
                <phase>package</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <overwrite>true</overwrite>
                  <outputDirectory>
                    ${stagingDirectory}
                  </outputDirectory>
                  <resources>
                    <resource>
                      <directory>${project.basedir}/src/main/azure
                      </directory>
                      <includes>
                        <include>**</include>
                      </includes>
                    </resource>
                  </resources>
                </configuration>
              </execution>
            </executions>
          </plugin>

Note that the host.json and local.setting.json files of the final project are located in ${project.basedir}/src/main/azure and not the root path of the project.
If I move the host.json and local.setting.json files to the root directory then it works.
Expected behavior
The execution of the plugin is correct.
Actual behavior
[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:1.22.0:package (azfaas-package-functions) on project azfunfwkjava-boot: generate configuration files and prepare staging directory: Cannot invoke "com.fasterxml.jackson.databind.JsonNode.at(String)" because "hostJson" is null -> [Help `1]
Steps to reproduce the problem

Place the host.json and local.setting.json files in a different path than the root of the project.
Execute plugin

Now in the plugin execution logs you can see two new parameters hostJson and localSettingsJson with root path that did not exist in version 1.21.0:
[DEBUG] Configuring mojo 'com.microsoft.azure:azure-functions-maven-plugin:1.22.0:package' with basic configurator -->
[DEBUG]   (f) allowTelemetry = true
[DEBUG]   (f) appName = funfwkjava
[DEBUG]   (f) appSettings = {MAIN_CLASS=com.inditex.funfwkjava.Application, FUNCTIONS_EXTENSION_VERSION=~4, FUNCTIONS_WORKER_RUNTIME=java}
[DEBUG]   (f) auth = com.microsoft.azure.maven.model.MavenAuthConfiguration@30623109
[DEBUG]   (f) authType = auto
[DEBUG]   (f) buildDirectory = /home/fbc/workspaces/inditex/amiga4/azfaas/fun-azfunfwkjava/code/azfunfwkjava-boot/target
[DEBUG]   (f) disableAppInsights = false
[DEBUG]   (f) failsOnError = true
[DEBUG]   (f) finalName = azfunfwkjava-boot-0.1.0-SNAPSHOT
[DEBUG]   (f) hostJson = host.json
[DEBUG]   (f) localSettingsJson = local.settings.json
[DEBUG]   (f) outputDirectory = /home/fbc/workspaces/inditex/amiga4/azfaas/fun-azfunfwkjava/code/azfunfwkjava-boot/target/classes
[DEBUG]   (f) plugin = Component Descriptor: role: 'org.apache.maven.plugin.Mojo', implementation: 'com.microsoft.azure.maven.function.AddMojo', role hint: 'com.microsoft.azure:azure-functions-maven-plugin:1.22.0:add'

But the documentation does not say anything about new configuration parameters for the plugin.

@ferblaca Thanks a lot for your report and sorry for the issue. Yes, we introduced new parameter  and  so that you may save your host.json or local.settings.json in another path rather than project root. I've updated the documentation for the new parameters, thanks a lot for your help!

The NPE issue should be addressed in https://github.com/microsoft/azure-maven-plugins/pull/2185


Add Precompile Statements to Prevent Warnings in Unity 2023

Adds ifdefs to avoid calling deprecated FindObject functions.
FIxes:

https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/issues/502

Closing in favor of new PR: https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/515


Update about.md

Fix typo in the first example

@ryanplusplus you were first, you merge :laughing:


Contextual target feature detection

Add new is_{arch}_feature_enabled macros for detecting at compile time if a target feature is enabled in a context.
Rendered

Previous discussion: #project-portable-simd zulip, #t-libs/stdarch zulip, Rust Internals

I'm a bit confused how this would be different from doing cfg!(target_feature = "..."), considering how the RFC doesn't even mention that syntax. Isn't that effectively what this does, except with the guarantee that it will allow context-sensitive optimisations? Is there a reason to not just fix the cfg to do that?

cfg is globally consistent.
The specific intent of this new macro is that when a function gets inlined into a caller with more target features enabled the inlined function will (as often as possible, best effort, etc) see the additional target features available within the caller's scope now that it's been inlined (and then pick a faster way to do the operation).

A simple example of why I don't think cfg is appropriate:
#[cfg(target_feature = "avx")]
fn inner() {}

#[target_feature(enable = "avx")]
fn outer() {
    #[cfg(target_feature = "avx")]
    {
        inner()
    }

    if cfg!(target_feature = "avx") {
        // something that depends on having called `inner`
    }
}

If this is compiled without -Ctarget-feature=+avx, inner is not enabled.  If #[cfg] in outer becomes context dependent, this pattern is now impossible, since there is no way to query the base target features.  An argument could be made that only cfg!(target_feature) should be context-dependent, but this inconsistency would be confusing, in my opinion.  In the example above, it could even result in unsoundness.  Adding a new macro separates contextual detection entirely from conditional compilation.

Could the is_x86_feature_detected!("avx") functions not just be made more optimizable?
Either it's inlined into a scope where the answer is already known (because of the target features) - in which case LLVM can optimize away the unused branch anyway.
Or, it's inlined into a scope where the answer is not clear: in that case a branch is needed, but it should be possible to push the expensive detection part out of any hot code paths, and the branch prediction should be very accurate?
Basically, I'm asking if the "slow path without a branch" is so much faster than the "fast path with a branch" that it makes sense to introduce an entirely new set of macros?
And, assuming the difference is big enough to matter, could a more general macro like this work instead?
if const_fallback!(false, is_x86_feature_detected!("avx")) {
    ...
} else {
   ...
}

Where const_fallback! has the "magic" that it tries to evaluate the second parameter at compile time, and if it cannot, it evaluates to the first parameter.

Basically, I'm asking if the "slow path without a branch" is so much faster than the "fast path with a branch" that it makes sense to introduce an entirely new set of macros?

in some cases, yes. an example is the approx_mul_add function that compiles to just 1 (fma) or 2 instructions (mul + add) and is used in hot loops inlined across crates:
https://internals.rust-lang.org/t/pre-rfc-contextual-target-feature-detection/18953/10?u=programmerjake
https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=47639908d8de532d409d383bfa5b3f6a

And, assuming the difference is big enough to matter, could a more general macro like this work instead?

we would still want a separate macro because we likely want to eventually have a llvm intrinsic that is lowered to a compile-time constant after all inlining (mir and llvm (both before and during link-time)) is complete. if we used your const_fallback! macro we would still need to special-case the whole combination of both macros, which is more complex, and could get much harder since additional expressions might be inserted between the macros:
const fn blah(v: bool) -> bool { ... }
const_fallback!(false, blah(is_x86_feature_detected!("fma")))

For a concrete example, here's the asm: https://rust.godbolt.org/z/Te4nsjaK3
Both options, with and without fma, are preferable to the runtime detection option which adds considerable overhead.  For such a small function, runtime detection is infeasible.  The proposed macros are intended to work hand in hand with runtime detection--small functions like this example can inline into larger functions that are selected with runtime detection.  Since #[target_feature] functions can only be safely called after runtime feature detection, using is_x86_feature_enabled can be thought of as deferring to an earlier is_x86_feature_detected.

For a concrete example, here's the asm: https://rust.godbolt.org/z/Te4nsjaK3

corrected example with detect_mul_add actually calling a function with enabled target features:
https://rust.godbolt.org/z/GKaaWG73M

For this example
this example
#[inline]
fn algorithm(v: &mut [f32]) {
    for v in v {
        *v = fast_sin_2pi(*v);
    }
}

#[inline(never)]
#[target_feature(enable = "fma")]
unsafe fn with_fma(v: &mut [f32]) {
    algorithm(v)
}

#[inline(never)]
fn without_fma(v: &mut [f32]) {
    algorithm(v)
}

pub fn dispatch(v: &mut [f32]) {
    if is_x86_feature_detected!("fma") {
        unsafe { with_fma(v) };
    } else {
        without_fma(v);
    }
}

it should in theory be possible for LLVM to compile both
pub fn dispatch(v: &mut [f32]) {
    if is_x86_feature_detected!("fma") {
        unsafe { with_fma(v) };
    } else {
        without_fma(v);
    }
}

// and

pub fn dispatch(v: &mut [f32]) {
    if is_x86_feature_detected!("fma") {
        algorithm(v);
    } else {
        algorithm(v);
    }
}

// or even

pub fn dispatch(v: &mut [f32]) {
    algorithm(v);
}

identically. This is what is meant by hoisting; the backend should be able to take is_x86_feature_detected!("fma") out of where it is in a hot inlined loop and only check it a single time at the start of whatever function the inlining stops at.
Of course, whether the optimizer actually does so, and is willing to do the duplicated outlining considered desirable here is a different question. What makes this interesting is that it's not just a question of what can a good optimizer do; it's a question of (pseudo) guarantees.
For is_x86_feature_enabled! to provide the desired properties, I think it needs to be restricted to being used in #[inline(always)] functions, and for said functions to be inlined during the MIR stage, before being lowered to the codegen backend; when it gets to the codegen backend, it just sees if true or if false (or not even that if MIR opts collapsed that).
The reason/problem is that optimization is bottom-up. If you're asking the backend optimizer to answer is_x86_feature_enabled! post inlining, you're asking for a major change to how inlining/optimization works to support that. (Namely, the backend needs to multiversion any functions which include is_x86_feature_enabled! branches, with the parent caller choosing which to call based on its feature enabled state (or multiversion and inline, based on some sort of multiversioned inlining heuristic).)
As I understand it, is_x86_feature_detected! is just a function call, as far as LLVM is concerned. Any meaningful improvement probably requires cooperation from LLVM, and I have a minor expectation that it will be easier to get "std_detect::detect::cache::detect_and_initialize is known to only ever be called at most once; treat calling it a second time as UB; and std_detect::detect::cache::CACHE is only modified from detect_and_initialize, so it won't change after that first call and loads can be coalesced" (optimize is_x86_feature_detected! better) than "an intrinsic which tells me if a target feature is enabled after inlining" (is_x86_feature_enabled! works).
On the other hand, implementing target feature multiversioning in MIR is entirely contained in the domain of rustc and doesn't rely on codegen backends to cooperate. I don't know the status of MIR optimization and inlining, and if an MIR-only is_target_feature_enabled! would be usefully functional.
I'm not an expert in inlining/optimizations, so I may be incorrect in believing doing both meaningful inlining/optimization and is_target_feature_enabled! basically requires function multiversioning[^1], so I'll defer to @rust-lang/wg-mir-opt there. But I'm fairly confident.
[^1]: Rationale: especially as is the case here, where you have for _ in _ { if enabled!() { a() } else { b() } }, optimization very much relies on the ability to assume one arm or the other is taken. Even if we know that test!() is constant, it's not always the case that hoisting the test out of the loop and duplicating the loop is optimal. And even if test!() has special "always hoist to function entry and deduplicate" semantics (hey, that's what's desired for detected!()!), you're additionally still a) asking for noninlined calls to skip the test, and b) inlining heuristics to inline as if the function were just one of the tested arms, not both. That's essentially exactly what multiversioning is.
Interestingly, even with a inlining-unaware `is_target_feature_enabled!`, I believe it should in theory be possible to implement "perfect" full multiversioning in userland, though still requiring listing desired multiversioned target feature sets in `#[multiversion]` and calling functions as `multiversioned!(approx_mul_add)(base, mul, add)`[^2] instead of `approx_mul_add(base, mul, add)`.

[^2]: Desugar: untested, very roughly,
```rust
#[multiversioned(targets("a", "b"))]
fn approx_mul_add(base: f32, mul: f32, add: f32) -> f32 { .. }
// becomes
enum approx_mul_add {}
impl Multiversioned<approx_mul_add, target_feature_bitflags!("a")> {
    #[target_feature(enable("a"))]
    unsafe fn call(base: f32, mul: f32, add: f32) -> f32 { .. }
}
impl Multiversioned<approx_mul_add, target_feature_bitflags!("b")> {
    #[target_feature(enable("b"))]
    unsafe fn call(base: f32, mul: f32, add: f32) -> f32 { .. }
}

// and
multiversioned!(approx_mul_add)
// becomes
(Multiversioned::<approx_mul_add, enabled_target_feature_bitflags!()>::call)
```

although tbf I'm not 100% on everything working out perfectly here; it probably needs some autoref specialization and might not like the use of a function pointer needing devirtualization, definitely not the fact that I've not properly covered the `unsafe` yet. Also probably not quite happy w.r.t. orphan rules yet, either; a trait impl with associated type and const to attach a function pointer to was the original concept but simplified for demo here. (Further modifications to make the scheme work are left as an exercise to the reader.)

</details>

is_{arch}_feature_detected could make use of this macro for additional optimization opportunity.

Could the detection macro simply be replaced with a constant true when the target feature is enabled? Reduce the added API.

If my memory serves me right it was always the intent for the is_*_feature_detected! to take #[target_feature(enable="")] into account, but only for the function the macro is invoked inside.
Unfortunately I don’t think you can rely on inlining in any way or form to make this work – it is strictly an optimization and there are plenty of examples of code where inlining cannot happen (such as if the two functions are a part of the same strongly connected callee graph component.)
And if you’re okay with it being “just” an optimization there are a good deal of implementation approaches how this could be implemented without adding additional API: it could be handled entirely in Rust, only being limited by its own inliner; it could be implemented as a LLVM optimization, by adding some more knowledge of cpuid et al. to it. In either case this all can easily collapse as an inlining decision is made, or optimization is disabled in some way.

And if you’re okay with it being “just” an optimization there are a good deal of implementation approaches how this could be implemented without adding additional API: it could be handled entirely in Rust, only being limited by its own inliner; it could be implemented as a LLVM optimization, by adding some more knowledge of cpuid et al. to it. In either case this all can easily collapse as an inlining decision is made, or optimization is disabled in some way.

please elaborate on how you think it can be implemented without additional API, because afaict is_*_feature_detected is totally unsuitable in some cases (such as the mul&add example) due to including dynamic cpu feature detection -- in those cases it's better to use the version of code without the features than to ever include dynamic detection.

Even if is_target_feature_detected! is handled by the backend (thus can be perfectly reliably hoisted after inlining), there are still two distinct desires between "dispatch based on the runtime availability of a target feature" (_detected!) and "choose based on the codegen availability of a target feature" (_enabled!) that motivates two different ways of asking the question. (Static availability is also a legitimate query, but given querying codegen availability as an option, mostly just to statically cull out unnecessary code paths.)
The point of using _enabled! is that the code using it would prefer using the disabled path instead of spending any real effort to use the enabled path. It's providing the enabled path as preferable when the target feature is available, but explicitly saying that taking the disabled path "spuriously" (i.e. even though the feature is available) is permissible.
It doesn't really matter how the feature is implemented (e.g. a post-inlining decision, transparent function multiversioned dispatch, etc), it's deliberately supposed to be best-effort, and perhaps not even that; code using _enabled! is specifically saying that it's preferable to take the more general option than to spend too much effort trying to take the specific option when that could block other optimizations. It's basically the dev asking to non-deterministically take one of the arms while additionally providing a heuristic to use to determine which is likely more performant.
You can fairly accurately model if is_target_feature_enabled!(abc) as if nondet_with_preference(true) && is_target_feature_detected!(abc) (assuming backend knowledge of _detected!). You'd lose some developer intent and a desired[^1] performance property (guaranteed absence of introducing a dynamic check), but it (IIUC) models the intended semantics of "just choose the best codegen, either option is acceptable."
[^1]: In full truth, especially with the optimizer knowing the memory location to read for _detected! (or conservative) instead of needing to run cpuid, it could potentially determine that introducing the _detected! dispatch (as is done manually in the main example) is a desirable optimization without penalizing the unavailable case too much. It seems rare for the optimizer to make that choice, but I think retaining that permission is reasonable.
If we want to get even further into micro-opt, the ability to query "is_target_feature_already_detected!" (_detected! with false instead of cache initialization as a fallback) could also be useful. (However, convincing LLVM that cache initialization happens max once per thread achieves most of the benefit.)

If we relied on rustc’s own inlining for this: making these detection macros a compiler built-in would be an option. It can be then lowered at some point past the inlining+whatever other prerequisite optimisations phase. That’s basically
If we implemented something in LLVM for this, we’d emit a cpuid-like intrinsic which we’d then rely on LLVM to remove at some point if it noticed it being called in a function with a corresponding target-feature attribute. No other changes to the implementation of the macro would be necessary in this case, I believe.
As the RFC acknowledges, and the comment above reiterates, neither of these can guarantee the behaviour you desire. As soon as any reliance on optimization comes into a play its just that – an optimization.
Now that I have written that, incorporating this sort of an optimization into the existing is_*_feature_detected is probably the only valid option, I suspect. Otherwise we’re looking at having non-idempotent optimizations in the compiler which sounds like a recipe for disaster (we’ve had soundness bugs related to that on multiple occasions so far.)

imho it's perfectly fine for is_*_feature_enabled to be optimization-dependent, but critically it must be a compile-time constant -- even a load from already detected cpu features and branch can be too expensive. this is exactly how 1.0f32.copysign(v / 0.0) for v == 0.0 gives different answers depending on optimization on x86_64, except more useful.
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=7e146c90c1327ba8deef84b29e9c40bf
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7e146c90c1327ba8deef84b29e9c40bf

to avoid optimizations causing unsoundness, you just have to mark is_*_feature_enabled as behaving like a non-pure function, aka. every time it's called, it can conceptually return a different result. this deals with what happens when a function is optimized, then inlined into functions with a mix of target features (some with, some without the feature of interest), then is_*_feature_enabled is lowered to constants. basically, optimization can't duplicate is_*_feature_enabled and assume all copies always give the same answer.

Now that I have written that, incorporating this sort of an behaviour into the existing is_*_feature_detected is probably the only valid option, I suspect. Otherwise we’re looking at having non-idempotent optimizations in the compiler which sounds like a recipe for disaster (we’ve had soundness bugs related to that on multiple occasions so far.)

In my opinion, this isn't especially useful (though worth implementing if this RFC is adopted).  In many ways the intention of this RFC is "optimization", e.g. using a faster instruction to do an operation, but it's also more than that.  In a "hot" path, such as a loop over SIMD, it's dramatically faster to simply use a worse instruction rather than include even a single branch.  The is_{arch}_feature_detected macros will always be inappropriate for such use cases even with this optimization, because the fallback branch is never worth it.  This RFC opens the door to a new pattern currently not possible in Rust.
I agree that this is trickier to use correctly than is_{arch}_feature_detected, which is why I think it deserves its own macro with well-documented semantics.  I don't think it's necessarily dangerous, however, especially since this new macro pairs nicely with std::simd and may involve no unsafe whatsoever.  This is perhaps a stretch, but I think compare_exchange_weak is a decent comparison: the result can fail spuriously to enable additional optimization, and it requires a little extra care to use correctly, but is also well documented.  I suppose the is_{arch}_feature_enabled macro could return something like Some<bool> or Result<bool, _> rather than spuriously returning false if not completely inlined, but I don't immediately see a practical way of implementing that.


https://webglreport.com/ no longer works.

It looks like the SSL certificate expired and no one updated it: https://webglreport.com/

Actually, HTTPS never worked.  webglreport.com is hosted on GitHub pages, so the certificate used for HTTPS is a GitHub certificate which doesn't match.

Does GitHub not support proper https certs for custom domains?

No.  (you would need some way to upload your cert to GitHub)  If you search around you can find details on using something like CloudFlare as a reverse proxy.

@mramato I vote we close this, sadly.


implement auth:whoami

see deis/controller#543

@bacongobbler should we move this to rc1 or just remove the milestone all together

yeah I'm gonna remove the milestone. Not a 2.0 requirement.


File upload problem

I'm just starting to use NMSSH, but I have encountered a problem that stumps me. I can connect and authenticate with my remote host, but uploadFile:to: always returns NO and the file does not appear in my remote host. It's a simple text file that I am trying to upload. Any thoughts?

Your server might not accept SCP connections. You should check the server config.

I have been using DLSFTP until now with no problems. It is only as I am forced to move (by Apple) to 64-bit (arm64) that I have been motivated to change to NMSSH. I will check, though. Thanks for your response.
Alan

On Feb 21, 2015, at 12:55 PM, Christoffer Lejdborg<EMAIL_ADDRESS>wrote:
Your server might not accept SCP connections. You should check the server config.
—
Reply to this email directly or view it on GitHub https://github.com/Lejdborg/NMSSH/issues/113#issuecomment-75392426.


Create keymaps that only work in diff view

I'd like the ability to open the project_diff_preview and press simple key bindings to stage files, commit, etc. For example, I'd like to use the 'a' or 's' key on each changed file to add that file to staged. But since those keys might conflict with other mappings/bindings, I'd like to be able to define these to work only when a vgit buffer is open.
An example of this might be nvim-tree and its use of callbacks. The nvim-tree bindings only work if the tree is open, otherwise those bindings don't exist

Another example would be nvim-autopairs, which has a disable_filetype configuration option to disable the plugin functionality for certain filetypes. Popup windows even have a filetype sometimes. For example, a telescope search has the filetype of "TelescopePrompt" which you can get by opening a telescope search, escaping to normal mode, and typeing :echo &ft.
Perhaps this plugin could set some vgit filetypes and only apply keymaps to those filetypes?


Question: Unclear how connections can be removed

First of all thanks for the great work! Maybe it is just me, but I wasn't able to figure out how to remove connections. I tried dragging them "away", rightclicking, "cutting" them off with all kind of modifier + click combinations etc.
Is this just not implemented yet, or am I missing something here?

I found a solution whilst browsing the pw-viz source code (not by me - just found it when looking for examples)
Apparently you can configure the context to allow node removal, by dragging the connection:
let mut context = egui_nodes::Context::default()
// configures the link drag to remove feature
context.attribute_flag_push(egui_nodes::AttributeFlags::EnableLinkDetachWithDragClick);

I'm using configuring it like this in my project and it works for me.

This can be closed then


Test Fixes - Stackscripts, domains, account permissions

Addresses UI changes that caused a few e2e tests to break.

Update Specific Grants -> Specific Permissions

Update stackscripts tests to target an input selector instead of a textarea

Update create domain method to expect navigation to domain detail page after creation

Discovered clone domains bug logged in M3-1218 while testing.

To Test
yarn && yarn start
yarn selenium
yarn e2e --dir stackscripts # all should pass
yarn e2e --file e2e/specs/domains/list-domains.spec.js # two failures (due to M3-1218)
yarn e2e --file e2e/specs/account/view-update-permissions.spec.js # all should pass

Coverage remained the same at 26.313% when pulling 0eeb53ea84d81597bd91c0d7b333677ae1b6f439 on patthiel:08-20-test-maintenance into 97f4417804f74c92f0a3b0712e75e41348c7a7f5 on linode:develop.

Tests passing consistently on my end. I will continue to monitor when these run on CI.


Fix CI-docker-sanity.yml github action to run on demand

Failed run https://github.com/opendistro-for-elasticsearch/k-NN/runs/688025746

Pasting code here for reference
name: Build and Sanity docker k-NN
on:
  push:
    branches:
    - dummy

jobs:
  Build-k-NN:
    strategy:
      matrix:
        java: [14]

    name: Build and Test k-NN Plugin
    runs-on: ubuntu-latest

    steps:
    - name: Checkout k-NN
      uses: actions/checkout@v1

    - name: Setup Java ${{ matrix.java }}
      uses: actions/setup-java@v1
      with:
        java-version: ${{ matrix.java }}

    - name: Run build
      run: |
        ./gradlew build
        ls -ltr build/distributions/

    - name: Pull and Run Docker
      run: |
        plugin=`ls build/distributions/*.zip`
        version=`echo $plugin|awk -F- '{print $3}'| cut -d. -f 1-3`
        plugin_version=`echo $plugin|awk -F- '{print $3}'| cut -d. -f 1-4`
        echo $version
        cd ..

        if docker pull opendistroforelasticsearch/opendistroforelasticsearch:$version
        then
          echo "FROM opendistroforelasticsearch/opendistroforelasticsearch:$version" >> Dockerfile

          ## The ESRestTest Client uses http by default.
          ## Need to disable the security plugin to call the rest api over http.
          echo "RUN if [ -d /usr/share/elasticsearch/plugins/opendistro_security ]; then /usr/share/elasticsearch/bin/elasticsearch-plugin remove opendistro_security; fi" >> Dockerfile
          echo "RUN if [ -d /usr/share/elasticsearch/plugins/opendistro-knn ]; then /usr/share/elasticsearch/bin/elasticsearch-plugin remove opendistro-knn; fi" >> Dockerfile
          echo "ADD k-NN/build/distributions/opendistro-knn-$plugin_version.zip /tmp/" >> Dockerfile
          echo "RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch file:/tmp/opendistro-knn-$plugin_version.zip" >> Dockerfile

          docker build -t odfe-knn:test .
        fi

    - name: Run Docker Image
      run: |
        cd ..
        docker run -p 9200:9200 -d -p 9600:9600 -e "discovery.type=single-node" odfe-knn:test
        sleep 15
        curl -XGET http://localhost:9200/_cat/plugins

    - name: Run k-NN Test
      run: |
        ./gradlew integTest -Dtests.rest.cluster=localhost:9200 -Dtests.cluster=localhost:9200

I think, instead of this, we could use the repository dispatch feature in GitHub actions to manually trigger the workflow. Here is an example of this.
With this, we can set an HTTP request to trigger the run.

I do not think this issue is needed at the time.


Adding metric tracking framework for Azkaban

This change includes:-

Metric Tracking framework under Azkaban.metric package
Default metric reporting emitter under Azkaban.metric.inmemoryemitter
Exposed metric functionality /stats using statsservlet
Number of running flows and jobs as metrics

We will also have a curl option for following:-

To set tracking interval for each metric
To enable and disable metric tracking in Azkaban
To set metric history details like maximum tracked interval and display points for /stats servlet

Thanks for feedback, Anthony. I have updated the pull request and replied to comments.

Thanks @hluu. I have updated pull request by incorporating feedback comments.

LGTM.  Can you add some documentation (somewhere) on how to enable/disable the metrics?

Just must have params to enable Azkaban metrics in sample azkaban.properties.

incorporated feedback comments

LGTM


chore: update djs

Please describe the changes this PR makes and why it should be merged
In this PR:

waiting on:

https://github.com/discordjs/discord.js/pull/7614

Waiting on:

https://github.com/discordjs/discord.js/pull/7788
https://github.com/discordjs/discord.js/pull/7797


[Bug]: Babel/node got different results with node.js when using caller.js

Bug Detail: https://github.com/babel/babel/issues/14254
and Babel team said: "I suggest opening an issue in that package's repository asking to support polyfilled error constructors."

Note that this problem is not specific to Babel. Even if you don't use Babel, loading any Error polyfill causes this package to stop working. I suggest a replacing https://github.com/totherik/caller/blob/96474d00dd1090b99c0d71c8a9e1f74c24436011/index.js#L20-L21 with a loop that first finds the last frame whose file is __filename, and then subtracts the depth.


Add ClimaExplorer, intearctive visualizer

Description to be written
- [x] Support extruded sphere
- [x] Support surfaces
- [ ] Support box
- [ ] Support column
- [x] Support specifying output path
- [x] Support selecting reduction/period
- [ ] Add sample data with different periods
- [x] Compatibility with `WGLMakie`
- [x] Design logo
- [x] Play button for time
- [x] Add logo to webpage
- [ ] Button to share colorbar limits across different snapshots/altitudes
- [ ] Create Figure and Axis only once, outside of interaction
- [ ] Widget for 2D or 3D axis
- [ ] Fix labels: hidden behind figure, too many digits
- [ ] Ability to change units, using `Unitful.jl` and `UnitfulMoles.jl`
- [ ] Unit label, using `MakieTeX.jl`
- [ ] Diplay Time (slider, play) in other units (maybe dd/mm/yy HH)

I made a little minimal working example, not sure if it is helpful, but here it is:
function MWE()
    fig = Figure() # defined only once
    ax = Axis(fig[1,1]) # defined only once
    slider = Bonito.Slider(0:0.1:1)

    data = Observable(Vec2f.(1.0, 1.0))
    scatter!(ax, data) # plot an observable

    on(slider.value) do val
        data[] = Vec2f.(1.0, val) # update the value of the observable
    end

    app = App() do session::Session
        return DOM.div(
                   DOM.div(slider, slider.value),
                   fig
                  )
    end
    return app
end

MWE()

I made a little minimal working example, not sure if it is helpful, but here it is:
using Bonito
using WGLMakie

function MWE()
    fig = Figure() # defined only once
    ax = Axis(fig[1,1]) # defined only once
    slider = Bonito.Slider(0:0.1:1)

    data = Observable(Vec2f.(1.0, slider.value[]))
    scatter!(ax, data) # plot an observable

    on(slider.value) do val
        data[] = Vec2f.(1.0, val) # update the value of the observable
    end

    app = App() do session::Session
        return DOM.div(
                   DOM.div(slider, slider.value),
                   fig
                  )
    end
    return app
end

MWE()

We have to find a way to balance this with how ClimaAnalysis is used elsewhere. I think I add to create new Axis to make sure it would work out of the box. But I am sure that there are ways to fix this.

I can work on it after I am done with ClimaDiagnostics (or outside of work hours) - or we can do a hackathon together!
I think the ClimaAnalysis code just need some refactor, same functionality, and it won't be too many big changes, just isolate things a bit more.
Anything can be an Observable, and anything can take Observable arguments via the @lift macro, e.g.,
x = Observable(1.0)
coordinates = @lift(Vec2f.(1.0, x)) # any function would work here

Eventually, a Makie plot function (scatter, heatmap, ...) needs to take one or more observables in its arguments, e.g. scatter(coordinates), figures and axis can be created before and not updated.
So in ClimaAnalysis, we need to be able to retrieve arguments of plotting from a function


Define the Shape of the Action and Observation Space

We need to define the shape of the observation and action spaces to be able to plug out environment
The observation space could be a Dict space as it is composed of multiple steps, and the action space is a (3,) int array.

No longer using OpenAI gym


Support ${workspaceFolder} in the "project" configuration

Right now, a full path to a .csproj file is needed when setting a default project path to watch.
{
    "type": "DotNetWatch",
    "request": "launch",
    "name": ".NET Core Watch (web)",
    "project": "/Users/username/project-folder/ProjectName/ProjectName.csproj",
    "env": {
        "ASPNETCORE_ENVIRONMENT": "Development"
    }
},

It would be nice if we could use the ${workspaceFolder} variable as with normal launch configs:
{
    "type": "DotNetWatch",
    "request": "launch",
    "name": ".NET Core Watch (web)",
    "project": "${workspaceFolder}/ProjectName/ProjectName.csproj",
    "env": {
        "ASPNETCORE_ENVIRONMENT": "Development"
    }
},

Currently, this does not seem to work, and I have not been able to find a way around this other than giving the full path, which I would rather avoid, as it makes the launch configuration rely on the project's path.

Sounds like a good idea, I’ll take a look

@devantler, i've tested with a minimal dotnet new console it works when i have multiple project folder and .csproj, feel free to reopen if it's not working for you.

Though I fixed this edge case, I wasn’t really happy with the way I fixed it lol, documentation is quite sparse on how to handle vscode variables, but glad that it worked for you.


Ansible provisioning failing

Awesome packer utility. Saved me lot of time and effort.
Getting following error while building packer box:
Build 'virtualbox-iso' errored: Error uploading main playbook: Error uploading ansible/main.yml: scp: /tmp/packer-provisioner-ansible-local/58dddd8a-18f2-0b20-6803-c516a46e93d9: No such file or directory
Do I need to install Ansible on host machine?

That looks like a different error :-/
I do have Ansible installed on my Mac, but I think that Packer builds things inside the VM it sets up... see https://github.com/mitchellh/packer/issues/3782 as well. And also, make sure you're running the latest version of Packer.

Thanks for quick response. Yes I am using the latest version of packer 0.12.3.
In the logs I am seeing following:
virtualbox-iso: Creating directory: \tmp\packer-provisioner-ansible-local\58ddea47-9080-3f89-00b8-4439cfc40030
So seems like script is creating the directory but with backslash () instead of (/). Is this the problem? If yes, how to fix it?

I just rebuilt the image again tonight, and it seems to be working okay for me (I forgot to check for what directory it created though).
Are you doing this on a Mac or Windows?

Hey,
I have the same issue in windows using packer v1.0.
[1;31mBuild 'virtualbox' errored: Error uploading main playbook: Error uploading C:\Users\Someone\development\spider\packer/ansible/base.yml: scp: /tmp/packer-provisioner-ansible-local/59113803-e514-6a24-6d13-de12e584c28f: No such file or directory
==> Some builds didn't complete successfully and had errors:
--> virtualbox: Error uploading main playbook: Error uploading C:\Users\Someone\development\spider\packer/ansible/base.yml: scp: /tmp/packer-provisioner-ansible-local/59113803-e514-6a24-6d13-de12e584c28f: No such file or directory

@nathanblogs - In that case, it looks like it's not finding the directory where it's trying to copy the file... maybe there's an issue with VirtualBox synced folders on Windows with Packer or something?

I was running into a similar issue, and it seems a workaround is to use the "staging_directory" option in the ansible-local packer provisioner (https://www.packer.io/docs/provisioners/ansible-local.html#staging_directory).
Just prior to the ansible-local provisioner, I configured a shell provisioner which created a custom directory and set sufficient privileges on it.  Then I set the "staging_directory" to said directory and it worked like a charm.

I haven't had any issues with this for the past year, with many builds on a few different Macs, so I'm going to close this out; if you run into the same issue as @daveschoutens, see the workaround he posted above.
I would defer any similar issues to the Packer issue queue, as it sounds like it could be an upstream issue with the way the box is generated and the file is copied in.


call() errors/rejections do not bubble to the generator in test

Steps to reproduce
function* myGenerator() {
    const something = () => Promise.reject(anything);
    try {
        yield call(something);
        yield put(successAction);
    } catch (e) {
        // this doesn't happen
        yield put(failAction);
    }
}

testSaga(myGenerator)
                    .next()
                    .next()
                    .put(failAction) // doesn't pass

Description of the bug/issue
This example is basically taken from the documentation, but I cannot get my code to reach the catch block in testing. I've tried every combination for the something function: async/await, throwing an error, returning a rejected promise, returning a promise that always rejects, and so on. Every single time, the successAction is put.
It seems errors/rejects never bubble up from call to the generator.
Actual results
The success action is dispatched
The Expected results
The fail action should be dispatched in the catch block
Environment information
<EMAIL_ADDRESS>node v8.12.0
<EMAIL_ADDRESS>

Nevermind, seems the issue was using next().next() which I think throws out any error handling by saga in test-plan


How to make it work!

Since the original developer does not answer anymore, please use the following steps to make it work:

use the installation steps from here https://pub.dev/packages/flutter_sharing_intent

do not use
flutter_sharing_intent: ^1.1.0

instead use
flutter_sharing_intent:
  git: https://github.com/FelixGaebler/flutter_sharing_intent.git

Source: https://github.com/bhagat-techind/flutter_sharing_intent/issues/29#issuecomment-1741734830

change the build order like here https://github.com/bhagat-techind/flutter_sharing_intent/issues/36#issuecomment-1826251215 which redirects to https://github.com/flutter/flutter/issues/135739#issuecomment-1741814813

Package is working, but 1.1.0 isn't last version.
I use:
  flutter_sharing_intent:
    git:
      url: https://github.com/bhagat-techind/flutter_sharing_intent
      ref: 9c42247b85b42ba93e19d57558cb22d7ac2cbaab // last known commit

and everything works

Commenting here to also add: if you are receiving this error:
`Failed to build iOS app
Could not build the precompiled application for the device.
Error (Xcode): Undefined symbols:
Error (Xcode): Linker command failed with exit code 1 (use -v to see invocation)`
Go into your share extension, and then "Build Settings." Under there go to "Linking" -> then "Other linker flags" and remove everything related to cocoapods.
Source: https://github.com/KasemJaffer/receive_sharing_intent

Hi All. New version 1.1.1 is uploaded on pub get.


Is there not a JVM API call for predict_proba?

I'ma Java developer that's new to XGBoost. I tried to find an API in Java for predict_proba but couldn't find one. Does that not exist?

Predict proba is a wrapper for begin compatible with Python scikit learn library.  Maybe we can lower it down it C++.

This predict method (https://github.com/dmlc/xgboost/blob/master/jvm-packages/xgboost4j/src/main/java/ml/dmlc/xgboost4j/java/Booster.java#L357) gives the probabilities of each class in the batch that you pass in via the DMatrix. That's what I use to get the probability distributions and it works just fine.

Cool thanks -- I'll test that out! @Craigacp


⚠ Bofrost.at has degraded performance

In 5335dfd, Bofrost.at (https://www.bofrost.at) experienced degraded performance:

HTTP code: 200
Response time: 1656 ms

Resolved: Bofrost.at performance has improved in 503f397 after 6 minutes.