A variable behavior for KinematicBody move

Feat. request:
Since most new features will be added on 3.0 and that may include move_and_slide, I was thinking on the possibility to have more types of move, mostly for prototyping (fine tuning will always fall on pure move).
These are:
-A move that push: something basic to push other colliders, common use on puzzle and some platformers.
-A relative move: use transform to apply the movement, useful for FPS, third person (3D) and topdown (2D) games.
Then I also thought that combinations of slide, push and local moves could be needed and got this final idea:
Have a single move and some flags on the KinematicBody that affects the way move behave.

If no flag is on: move just works like normal move.
If relative, the movement vector will be rotated according to the body transform.
If slide is checked, move will also uses extra parameters for sliding (floor normal, slope speed, like move_and_slide).
If push is checked, it will affect the collider (could filter if rigid or kinematic too, like raycast).

I have made a simple project with a basic controller and these options exposed on the inspector to show the idea:
kinemoves.zip

The most important thing to add is a feature to allow KinematicBody2D to detect collisions using move function, without moving the kinematicbody to a non colliding position after having a collision. Seriously, pushing a box in a grid like game with fixed grid movements like Sokoban (pushing boxes in exact pixel amounts) , can't be done using kinematicbody or any physics body in Godot. I for one, had to write my own collision detection and use the direct space state just to get results (or I did an AABB collision checking before that, bit the code was over complicated) There are several closed issues about two colliding kinematic bodies affecting each other (despite the fact that KinematicBody2D is not affected by forces, it really is affected by other moving objects).

@RebelliousX well, with a move+push, the collider should be pushed the same too, then to fix in a grid you will need to store the collider and "stepify" the positions when main motion ends (easy to try with that sample project).
For test, maybe an extra parameter to test_move to allow set the internal colliding variable like move does.

@eon-s well, the thing is, move() returns the difference of movement as a vector, whic could contain a fraction of pixels (float numbers). If you try to use vector snapped() function, it could put the object in a colliding position again. Leading to a never ending shaking (1 pixel back and forth) movement of the object.
Using set_pos() and testing for collisions using direct space state solves all issues. But you you have to write a custom collision detection functions.

About move_and_push -- isn't it too much game-specific? Here are some considerations:

@bojidar-bg move_and_push, like _and_slide, is too game-specific, that is why I like the general behavior options more than just a method.
About 1, kinematic bodies are something of infinite mass, they should push anything with the limit of their movement.
On 2, that should be managed by the programmer when is_colliding, movement can be modified according to the collider data.
3, the rigid body should not be able to be crushed, if can't move, the "pusher" can't push.
And I guess there are lot of more specific situations...

Kinematic bodies by their definition in Godot should not interact with physics. Current behavior of kinematic bodies is that if 2 kinematic bodies collide with each other (with enough velocity), one can move the other from its place, that shouldn't happen.

For Sokoban, It is the player object that is responsible for moving crates, once the player is about to collide with a crate, he should test if the collided object is push-able or not (there is another crate or wall blocking its path). If it is blocked, the player stops before colliding with the crate. That is how I do it for my current never ending project which is similar to sokoban but infinitely better :) But again, for the weird behavior of kinematic bodies, I opted not to use them and check for collisions myself.
For collisions in puzzle games, Colliding objects should stop before colliding not after, at least from the perspective of puzzle games like Sokoban. And that can be achieved by testing for a collision before moving. Which again test_move() doesn't return which objs it will be colliding with if the motion continues. For that I use raycasts, point/line intersections from direct space state.

As @eon-s said.

Refer to answer in point 1

Maybe others?

Like trying to push two stacked object. Say the player can push 1 and only 1 object at a time. If the player is positioned between 2 aligned objects, he shouldn't be able to push nor move (he stops).
What about a friction-less collision? Say if the player pushes the bottom object of 2 stacked objs. But the top object remains stationary until there is no object under it, so it falls due to gravity. :)

I know all of the above are game specific stuff. But what would be great is if there is something general that makes creation of such games easy. That is, by stopping the movement just before colliding, not after. Since not all games require physics for movement. Heck, The first test game ever in Godot was 2D shoot em up, all objs are kinematic, and bullets stop the falling spaceships and meteors and render them suspended as long as I was shooting (some required more than one hit to be destroyed). Despite that being cool in a way (if it is about physics), but it is a disaster.

I too would like to see this feature Implemented!
I wrote a function that does it, however it has a problem - the object pauses between each Grid step - and is very noticeable with a low speed:
extends KinematicBody2D
#extends Node2D

var direction = Vector2(0,0)
var startPos = Vector2(0,0)
var moving = false
const SPEED = 3

var world
func _ready():
	world = get_world_2d().get_direct_space_state()
	set_fixed_process(true)
	startPos = get_pos()

func _fixed_process(delta):
#	print(get_pos(),"start--",startPos)

	var resultUp = world.intersect_point(get_pos()+Vector2(0,-GRID))
	var resultDown = world.intersect_point(get_pos()+Vector2(0,GRID))
	var resultLeft = world.intersect_point(get_pos()+Vector2(-GRID,0))
	var resultRight = world.intersect_point(get_pos()+Vector2(GRID,0))

	# should not be able to change direction during moving
	if Input.is_action_pressed("ui_up") and resultUp.empty():
		direction = Vector2(0,-1)
	elif Input.is_action_pressed("ui_down") and resultDown.empty():
		direction = Vector2(0,1)
	elif Input.is_action_pressed("ui_left") and resultLeft.empty():
		direction = Vector2(-1,0)
	elif Input.is_action_pressed("ui_right") and resultRight.empty():
		direction = Vector2(1,0)
	else:
		direction = Vector2(0,0)
	gridMovement(delta,SPEED,direction)

########## GRID MOVEMENT FUNCTION ##############
const GRID = 64
var curDir = null
var curMoveTarget = null
var movProgress = 0
var gridMoveKineticState = null
func gridMovement(delta,speed,direction):
	## figure out if player is moving to target,arrived(once) or stopped idle

	if moving:
		## approach 1 - limited to speed 2,4,8,etc
		##move_to(get_pos()+direction*speed)
		## approach 2 - not limited but has a bug of slowing down on steps
		speed = 2
		if movProgress < 1 or get_pos() != curMoveTarget:
			movProgress += speed * delta
			print ("delta:",delta," target:",curMoveTarget," progress:",movProgress)
			## movProgress-0.15 would go back before going forward (interesting anticipation mechanic can be achieved)
			set_pos(get_pos().linear_interpolate(curMoveTarget,movProgress))
		else:
			print("---reached target:",curMoveTarget," movProgress:",movProgress)
			moving = false

	if !moving:  #<----- runs only once when the player reaches next cell
		movProgress = 0
		if direction != Vector2(0,0): #the body must be moving in a direction to start the next step
			startPos = get_pos()
			curDir = direction
			curMoveTarget = startPos +Vector2(GRID * curDir.x,GRID*curDir.y)
			moving = true

Ideally grid movement should be built into the kinematicbody2d node class imo, but any help with this function will be highly appreciated.
Why is it pausing between each grid cell?

@blurymind grid movements are complicated and I don't think there will be a generic solution (depends a lot on the design), also could depend on input on each frame making it harder to control.
I have tried lot of approaches, now I think of it as a process of idle->start motion->continue motion->stop, where "continue motion" needs to check inputs all the time and decide if stepify position and stop or continue until next cell.
For your code, in the Q&A you will get more answers than here.

I could polish my function and simply put it out as a plugin I guess :)
I know it's not perfect, some stuff could be improved

I have a pretty elegant solution, no need for collision shapes, physics bodies or anything. Just sprites
and it is very cheap to check for collisions and yet powerful and scalable (objects can have different sizes as long as they are multiple of GRID size), you decide which objects you can collide with according to their type.
All of that in around 140 lines of code, I might upload that as plugin in asset store.
My work is based on GDquest video for Construct 2 and 08bitWarrior video for Game Maker Studio.
GDquest: https://www.youtube.com/watch?v=K6zAECdwDP8
08bitWarrior: https://www.youtube.com/watch?v=7YsrHrCBd94 and https://www.youtube.com/watch?v=kxXu6iQY0yw&t=394s
I m really amazed at the results I got. For my needs, it resembles exactly the old game I am trying to remake. :)

My method function works on any node that has set-pos and is also very
clean. For colision it simply checks if an object exists, but i do like to
use it with the tilemap node. Can you please share your code, i want to try
it out. The function i shared has some problems still
On 12 Apr 2017 08:06, "Thaer Razeq"<EMAIL_ADDRESS>wrote:

I have a pretty elegant solution, no need for collision shapes, physics
bodies or anything. Just sprites
and it is very cheap to check for collisions and yet powerful and scalable
(objects can have different sizes as long as they are multiple of GRID
size), you decide which objects you can collide with according to their
type.
All of that in around 140 lines of code, I might upload that as plugin in
asset store.
My work is based on GDquest video for Construct 2 and 08bitWarrior video
for Game Maker Studio.
GDquest: https://www.youtube.com/watch?v=K6zAECdwDP8
08bitWarrior: https://www.youtube.com/watch?v=7YsrHrCBd94 and
https://www.youtube.com/watch?v=kxXu6iQY0yw&t=394s
I m really amazed at the results I got. For my needs, it resembles exactly
the old game I am trying to remake. :)
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/godotengine/godot/issues/7130#issuecomment-293492573,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AGMbVeLlR9AHG743OENG0YoC8j8IdNXKks5rvHgDgaJpZM4K0CS3
.

@blurymind Gladly,
Note 1: Any cell in grid can contain more than one object. :)
Note 2: In constants file, I mentioned game object types which are constant integers or enums
if you are using Godot v3. You replace those with the objects of your game.
Note 3: The most important thing, You have to provide the following for each node that should have
grid movement and should have collisions:
1: In the _ready() of any node (even static ones like ground that will interact with collisions) we do:
Grid_Translator = Utilities.Grid_Mover.new(self)
Collision_Detector = Utilities.Collision_Detector.new(self, Utilities.COMMON_BLOCKING_TYPES)

2: Also provide 2 functions:
for example:
func get_object_type():
       return Constants.SOLID
       pass

and another function:
func get_object_size():
      return Vector2(width, height) # width and height are multiples of Constants.GRID
      pass

These are crucial to get collision results such as objects and their types, whether you want to block movement or not is your choice depending on the collision results, for example, in my case, for my hero, Laser OFF barrier should not block the hero from passing but should block pushable objects like crates or kill enemies..etc! This kind of behavior is different for each node, but easy to check using utility classes that all moving objects instantiate from and all share the same grid Cells[][] data.
Tabs for code here are screwed, but in editor are fine.
Constants.gd file:
extends Node

const NUM_COLUMNS = 32	# 2048 room width / 64 gird size
const NUM_ROWS = 24		# 1536 room height / 64 grid size
const GRID = 64			# 64 pixels grid size

# general directions
const CENTER			= 0
const UP				= -1
const RIGHT				= 1
const DOWN				= 1
const LEFT				= -1
# commonly used vectors
const vGRID				= Vector2(64, 64)	# replace 64 with GRID when fixed by Godot
const vCENTER			= Vector2(0, 0)
const vUP				= Vector2(0, -1)
const vRIGHT			= Vector2(1, 0)
const vDOWN				= Vector2(0, 1)
const vLEFT				= Vector2(-1, 0)
const vUP_RIGHT			= Vector2(1, -1)
const vDOWN_RIGHT		= Vector2(1, 1)
const vDOWN_LEFT		= Vector2(-1, 1)
const vUP_LEFT			= Vector2(-1, -1)
# game objects' types on collision grid "Cells[][] matrix in Utilities.gd"
const RAPHAEL			= 1
const SOLID	 			= 2
const PLATFORM			= 3
const LASER_ON			= 4
const LASER_OFF			= 5
const PUSHABLE			= 6
const CONVEYOR			= 7
const ROPE				= 8
const LIFT				= 9
const ELEVATOR			= 10
const ENEMY				= 11
const TREASURE			= 12
const KEY				= 13
const DOOR				= 14
const ELIXIR			= 15
const OXYGEN			= 16
const INVINCIBILITY		= 17

Utilities.gd file:
extends Node

# Used for collision detection
var Cells = []

class GameObject:
	var obj = null
	var type = null
	var size = Vector2()

var COMMON_BLOCKING_TYPES = [
			Constants.SOLID, Constants.PUSHABLE, Constants.LIFT, Constants.ELEVATOR,
			Constants.LASER_ON, Constants.CONVEYOR, Constants.PLATFORM
			]

# --------------------------------------------------
func _ready():
	# initialize Cells matrix with empty GameObject array
	for c in range(Constants.NUM_COLUMNS):
		Cells.append([])
		for r in range(Constants.NUM_ROWS):
			Cells[c].append([])
	pass

# -----------------------------------------------------
# ---------------- Grid Movement Class ----------------
# -----------------------------------------------------

class Grid_Mover:
	var obj 		= null				# object we want moving between grid cells
	var is_moving	= false				# are we currently moving between cells?
	var curDir		= Vector2()			# current direction we are moving
	var prevDir		= Vector2()			# previous direction
	var current_speed = 0				# current speed while moving between cells
	var obj_grid_location = Vector2()	# location of object in grid for collision detection
	var obj_size	= Vector2()			# object size (width and height) divided by GRID
	var game_object_type = null			# type of object or node, e.g, SOLID, ENEMY...etc!
	var game_obj = null					# structure to hold object information: object, type, size
	var distance_left = 0				# it starts with GRID distance, it decreases until it reaches 0.
	# --------------------------------------------------
	func _init(var objectToMove):
		obj = objectToMove
		obj_size = obj.get_object_size() / Constants.GRID
		game_object_type = obj.get_object_type()
		obj_grid_location = obj.get_pos().snapped(Constants.vGRID) / Constants.GRID
		add_object_to_cells()
		pass
	# --------------------------------------------------
	func move(var direction):
		# Grid Movement
		if (not is_moving):
			if (direction != Constants.vCENTER):
				is_moving = true
				curDir = direction
				distance_left = Constants.GRID
				current_speed = Game_Globals.SPEED * Game_Globals.global_speed
				remove_object_from_cells()
				obj_grid_location += curDir
				add_object_to_cells()

		if (is_moving):
			var pos = obj.get_pos()
			pos = pos + (curDir * current_speed)
			obj.set_pos(pos)
			distance_left -= current_speed
			if (distance_left <= 0):
				is_moving = false
				prevDir = curDir
				curDir = Constants.vCENTER
				current_speed = 0
		pass
	# --------------------------------------------------
	func get_prev_dir():
		return prevDir
		pass

	# --------------------------------------------------
	func get_cur_dir():
		return curDir
		pass
	# --------------------------------------------------
	func add_object_to_cells():
		var x_from = obj_grid_location.x
		var x_to = obj_grid_location.x + obj_size.width
		var y_from = obj_grid_location.y
		var y_to = obj_grid_location.y + obj_size.height
		# add obj to grid
		for c in range(x_from, x_to):
			for r in range(y_from, y_to):
				if (c < Constants.NUM_COLUMNS and c >= 0 and r < Constants.NUM_ROWS and r >= 0):
					var game_obj = Utilities.GameObject.new()
					game_obj.obj = obj
					game_obj.type = game_object_type
					game_obj.size = obj_size
					Utilities.Cells[c][r].push_back(game_obj)
		pass
	# --------------------------------------------------
	func remove_object_from_cells():
		var x_from = obj_grid_location.x
		var x_to = obj_grid_location.x + obj_size.width
		var y_from = obj_grid_location.y
		var y_to = obj_grid_location.y + obj_size.height
		# check part of grid for obj, and remove it from there
		for c in range(x_from, x_to):
			for r in range(y_from, y_to):
				if (c < Constants.NUM_COLUMNS and c >= 0 and r < Constants.NUM_ROWS and r >= 0):
					for obj_in_cell in Utilities.Cells[c][r]:
						if (obj == obj_in_cell.obj):
							Utilities.Cells[c][r].erase(obj_in_cell)
		pass

# -----------------------------------------------------
# ------------- Collision Detection Class -------------
# -----------------------------------------------------

class Collision_Detector:
	var obj = null						# object to check its surroundings
	var OBJ_Location = Vector2()		# object's location on grid
	var OBJ_Size = Vector2()			# objects size in grid units (pixels divided by grid size)
	var offset = Vector2()				# offset of object's original location for collision calculations
	var end_location = Vector2()		# we check collisions in the outline of this location
	var results = []					# list of found objects lying in collision cells
	var blocking_objects_types = []		# list of object types that blocks movement
	# ---------------------------
	func _init(var object, var list):
		obj = object
		update_object_size()
		for item in list:
			blocking_objects_types.push_back(item)
		update_location()
		pass
	# ---------------------------
	func update_location():
		OBJ_Location = obj.get_pos().snapped(Constants.vGRID) / Constants.GRID
		pass
	# ---------------------------
	func update_object_size():
		OBJ_Size = obj.get_object_size() / Constants.GRID
		pass
	# ---------------------------
	# evaluate if should obj stop
	func should_stop(var dir):
		var results = check_direction(dir)
		# These are all objects that are solid and any moving object should
		# be blocked when trying to move through them.
		for result in results:
			if (blocking_objects_types.has(result.type) and result.obj != obj):
				return true
		pass
	# ---------------------------
	func check_direction(var dir):
		update_location()
		results.clear()

		offset = dir * OBJ_Size
		if (offset.x < -1):
			offset.x = -1
		if (offset.y < -1):
			offset.y = -1
		end_location = OBJ_Location + offset

		if (dir.x != Constants.CENTER and dir.y != Constants.CENTER):
			if (end_location.x >= 0 and end_location.x < Constants.NUM_COLUMNS and
				end_location.y >= 0 and end_location.y < Constants.NUM_ROWS):
					for obj_in_cell in Utilities.Cells[end_location.x][end_location.y]:
						results.push_back(obj_in_cell)
		elif (dir.x != Constants.CENTER):
			if (end_location.x >= 0 and end_location.x < Constants.NUM_COLUMNS):
				for y in range(OBJ_Size.height):
					if (OBJ_Location.y + y >= 0 and OBJ_Location.y + y < Constants.NUM_ROWS):
						for obj_in_cell in Utilities.Cells[end_location.x][OBJ_Location.y + y]:
							results.push_back(obj_in_cell)
		elif (dir.y != Constants.CENTER):
			if (end_location.y >= 0 and end_location.y < Constants.NUM_ROWS):
				for x in range(OBJ_Size.width):
					if (OBJ_Location.x + x >= 0 and OBJ_Location.x + x < Constants.NUM_COLUMNS):
						for obj_in_cell in Utilities.Cells[OBJ_Location.x + x][end_location.y]:
							results.push_back(obj_in_cell)
		return results
		pass

Here is how it looks like in actual example. I created a node that draws semi transparent white rectangle for any cell in collision grid that has the player object or a moving platformer. :) You can see the hero can't pass when laser is on, but can when it is off. I decided to allow him to go over a moving platformer, but he should die if he was hit horizontally. All these checks are not part of collision detection, but the node of the hero himself.
Please don't mind the low framerate, it was hard enough to get it under 10MB for github to allow me to upload this :p

Ah i see.. your example is for platformer. My function only works for top
down movement
On 12 Apr 2017 12:41, "Thaer Razeq"<EMAIL_ADDRESS>wrote:

Here is how it looks like in actual example. I created a node that draws
semi transparent white rectangle for any cell in collision grid that has
the player object or a moving platformer. :) You can see the hero can't
pass when laser is on, but can when it is off. I decided to allow him to go
over a moving platformer, but he should die if he was hit horizontally. All
these checks are not part of collision detection, but the node of the hero
himself.
Please don't mind the low framerate, it was hard enough to get it under
10MB for github to allow me to upload this :p
[image: castle 3]
https://cloud.githubusercontent.com/assets/1888186/24955839/b7cb23ca-1f4a-11e7-91b5-23be646196fa.gif
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/godotengine/godot/issues/7130#issuecomment-293551538,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AGMbVQTdL5Re4LfM9MZrST6TeXnqsz70ks5rvLiHgaJpZM4K0CS3
.

@RebelliousX is ok :smile: ,  shows the complexity and dynamism of grid based movements (something I always try to do on every engine), I think it escapes of what a single body can do.

@blurymind You are mistaken if you think the code above is only for a platformer. It can be used for any
grid movement even RPG or 3D Chess board if you ignore the Z-Dimension. :) But if your code works for you, it certainly shorter and that is great, you wrote it and you understand it better than anyone. 👍
@eon-s You see, It is not really complicated once you know the design principle behind it. For me, I thought
of this long, long time ago (many years ago), but the idea faded because I didn't think about it twice and thought it was silly and never tried to write single line of code. But after seeing The aforementioned youtube videos (especially the first one by GDquest, about the design analysis) I didn't have to look for code, since it was really trivial to implement. 🙂

Now I don't think that adding more things to kinematic body will be a good idea, is already too bloated, maybe one day on a character controller node but not on the poor kinematic body.
And relative movement may be added by #11071
Closing this now because I will forget later.


[Fix] Add Developers to Poms

Description
This adds developers to the pom configuration.
Review checklist

[x] PR is split into meaningful commits for the ease of reviewing
[ ] Tests have been written
[ ] Screenshots added (where applicable)
[x] Appropriate labels have been applied

Codecov Report

Merging #111 (65416a2) into main (edf6568) will not change coverage.
The diff coverage is n/a.

@@          Coverage Diff          @@
##            main    #111   +/-   ##
=====================================
  Coverage   76.3%   76.3%
=====================================
  Files         45      45
  Lines       1344    1344
  Branches     386     386
=====================================
  Hits        1026    1026
  Misses       118     118
  Partials     200     200


Allow loaders to be re-used so they can cache loads.

@cjoudrey & @xuorig please review
cc @Mange since you opened #21
This allows a loader to be re-used so that it can be used to cache previous loads.
Currently this will require keeping a reference to the loader to re-use it.  A follow-up will be needed to have the executor keep references to the old loaders during a GraphQL request.

Thanks for the CC. Looks like a great addition!


Revert port change

I don't know if it was intentional but the port the server is running on was changed in the 2.0 update. This reverts that change so that the port (5001) in the capacitor config and in the README is used.

Merged.


Use PDS Validate tool with manifest support in Nucleus DAGs for referential integrity validation

🗒 Summary
Nucleus DAGs use a manifest of product labels to process a batch of products. However, the earlier versions of PDS Validate tool did not have a feature to do referential integrity validation for a batch of products. The current latest version of validate supports this and it is required to use this PDS Validate tool with manifest support in Nucleus DAGs for referential integrity validation.
This pull request will:
ADD validate-refs task to the pds-basic-registry-usecase
ADD ECS container definition for validate-refs docker container
ADD ECS task definition in Terraform
♻ Related Issues
Use PDS Validate tool with manifest support in Nucleus DAGs for referential integrity validation (https://github.com/NASA-PDS/nucleus/issues/81)

Nothing egregious stands out, so 👍

Thanks @nutjob4life !

You're welcome @ramesh-maddegoda 🎉


Questions on trace generator

Hi, I have a few questions of using the trace generator:

Do we assume the inference engine links with the trace generator, or the engine can be a stand-alone process
The trace generator runs on the same machine as the model inference, is it a concern that this may skew the result?
The query library is saved in memory, with a huge dataset and huge model, is it a concern that this may skew the results? Is it better to load the queries on demand? https://github.com/mlperf/inference/blob/master/trace_generator/trace_generator.h#L75-L76
Initial target_qps of 512 seems too small. Better specify it as an argument https://github.com/mlperf/inference/blob/master/trace_generator/trace_generator.h#L164
startup time and warmup time are important. https://github.com/mlperf/inference/blob/master/trace_generator/trace_generator.h#L117-L118
Accuracy mode is nice to have. https://github.com/mlperf/inference/blob/master/trace_generator/trace_generator.h#L78

Would be good to get some sense on the run-to-run variations. Usually how much is it?

@sf-wind  please update your questions again with the latest LoadGen + reference code again. I think most of the issues you raised have been addressed in the code.
please read the rules doc regarding where LoadGen should be:

close this issue due to lack of activity. please reopen if needed.


leaderelection: use proto client

Use protobuf client for leader election. Should decrease the CPU usage when querying for the configmap (but it really is just cosmetic).

cc @deads2k or @sttts for approval

small potatoes, but ok
/approve


[DO NOT MERGE] Testing Serve Updates

Summary
Testing the serve mvb from terra-toolkit.
This is successful if tests pass.
Additional Details
Do Not Merge

Thanks for contributing to Terra.
@cerner/terra

Closing. This has been merged to toolkit v5 branch. new validation PR is coming to test all recent toolkit & dev-site changes.


app.diagrams.net will stop working for embed mode. Please use embed.diagrams.net.

to fix   in ext.drawioeditor.js
search and replace www.draw.io with embed.diagrams.net

Fixed by #23

#23 has been merged to fix this.


Feature Request - Create file from Explorer right click

I have tried all the similar extensions and this is the best one. I like the way it detects the correct namespace and adds a strict_types declaration at the top.
It would be very helpful for me, and I think others too, if you could initiate this plugins features from VS Code's Explorer side panel. What I want to be able to do is, right click a directory and then select this extension. It helps me to be able to visually look through the files and directories before deciding where to create a new file.

I found this documentation for adding a feature like this: https://code.visualstudio.com/api/references/contribution-points#contributes.menus

Hi. Thank you for your comment! I am very happy to read this.
As for the feature you propose, it's true that it would be really useful. I will try to implement this feature in the next few days. Also, pull request are welcome ;)

Great. I tried experimenting with making the feature myself. I have note done VS Code extension development before. I wasn't able to get the typescript to compile correctly. Maybe I will try again if I become more familiar with extension development.


Type of record element is written as number' instead of number

If a record has two elements, both of type number, the type displayed for the second number element is number' instead of number. Note the ' after the type string number in the second type element.
> point = { x = 3, y = 4 }
{ x = 3, y = 4 } : { x : number, y : number' }

Here a more complex example testing a few permutations. Only in the case where more than one element is a number does this seem to happen.
rb@u:~/github/agent_online/web/elm$ elm-repl
---- elm repl 0.17.0 -----------------------------------------------------------
 :help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> point = { x = 1, y = 2 }
{ x = 1, y = 2 } : { x : number, y : number' }
> point = { x = 1, y = 2, a = 3, b = 4 }
{ x = 1, y = 2, a = 3, b = 4 }
    : { a : number, b : number', x : number'', y : number''' }
> point = { x = 1, y = 2, a = 3, b = 4, i = 5, j = 6 }
{ x = 1, y = 2, a = 3, b = 4, i = 5, j = 6 }
    : { a : number
      , b : number'
      , i : number''
      , j : number'''
      , x : number''''
      , y : number'''''
      }
> test = { x = "a", y = 2, a = 3, b = 4, i = 5, j = 6 }
{ x = "a", y = 2, a = 3, b = 4, i = 5, j = 6 }
    : { a : number
      , b : number'
      , i : number''
      , j : number'''
      , x : String
      , y : number''''
      }
> test = { x = "a", y = 2, a = 3, b = 4 }
{ x = "a", y = 2, a = 3, b = 4 }
    : { a : number, b : number', x : String, y : number'' }
> test = { x = "a", y = 2, a = "b", b = 4 }
{ x = "a", y = 2, a = "b", b = 4 }
    : { a : String, b : number, x : String, y : number' }

It seems as if this then propogates the error the more elements of type number are added to the record.

This is not an error at all. It's how types in Elm work. The type of {x = 3, y = 4} is {x : number, y : number'}, which is a generalization of the four possible types {x : Int, y : Int}, {x : Int, y : Float}, {x : Float, y : Int}, {x : Float, y : Float}. The fact that the two concrete types of x and y could be different (Int vs. Float) is why there needs to be a distinction made between number and number'.

@jvoigtlaender Thanks for the explantion. It has taken a while, but I think I understand now. It does look strange tough :-)


Relaunching as Administrator is not working

Describe the bug
When you run winutil.ps1 as non-administrator, it will say Winutil needs to be run as Administrator. Attempting to relaunch..
It reopens winutil as Administrator, but with this error:
[error<PHONE_NUMBER> (0x80070002) when launching `pwsh -ExecutionPolicy Bypass -NoProfile -Command & { & 'C:\Users\filip\scoop\apps\winutil\current\winutil.ps1' }']

Steps to reproduce

Download latest release
Run it as normal user
When password dialog will popup, enter admin password
See the error.

Expected behavior
It should just open winutil as admin.
Screenshots

Additional context

Issue validation

[x] I checked for duplicate issues.
[x] I checked for already existing discussions.
[x] I checked for an already existing pull request addressing the issue.

what happens if you launch winutil using recommended oneliner method?

PS C:\Users\filip> irm "https://christitus.com/win" | iex
Winutil needs to be run as Administrator. Attempting to relaunch.
Start-Process:
Line |
  68 |      Start-Process $processCmd -ArgumentList "$powershellcmd -Executio …
     |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | This command cannot be run due to the error: An error occurred trying to start process 'C:\Users\filip\AppData\Local\Microsoft\WindowsApps\wt.exe' with working directory 'C:\Users\filip'. Parameter is incorrect.

By the way, it works normally when I launch it from powershell as administrator (both recomended and offline method), so there is something wrong with that Attempting to relaunch. thing.


[Documentation Request] Best Practices for supporting multiple B2C environments with CI/CD

Could documentation be added to this page surrounding best practices for automating multiple environments?
Basically, something similar to the VS Code Extension tool for updating tokenized settings: https://github.com/azure-ad-b2c/vscode-extension#policy-settings but as part of a CI/CD pipeline rather than run locally.
Or is the recommended approach to keep the various environments in Source Control and perform the updates locally using the B2C Policy Build tool?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 29d87f59-029e-b25f-862c-755cfadbfc08
Version Independent ID: 6d283cd7-96a3-c41e-7325-8e43741a5d65
Content: Deploy custom policies with Azure Pipelines - Azure AD B2C
Content Source: articles/active-directory-b2c/deploy-custom-policies-devops.md
Service: active-directory
Sub-service: b2c
GitHub Login: @msmimart
Microsoft Alias: mimart

@dave22000
Thanks for your feedback! I've assigned this issue to the author who will investigate and update as appropriate.

Dear dave22000, thanks for the feedback.
The vscode extension uses a find and replace. You can use this approach in the PS script. For example,
$graphuri = 'https://graph.microsoft.com/beta/trustframework/policies/' + $PolicyId + '/$value'
$policycontent = Get-Content $PathToFile

# Optional: Change the content of the policy. For example, replace the tenant-name with your tenant name.
# $policycontent = $policycontent.Replace("your-tenant.b2clogin.com", "contoso.b2clogin.com")

$response = Invoke-RestMethod -Uri $graphuri -Method Put -Body $policycontent -Headers $headers

I'm updating the article with the relevant information. A new version will publish soon, and this GitHub issue will be closed automatically (before the doc is published). If you have any questions or need further information, please open new GitHub issue.


Maintained?

Is this library still maintained? I think this would be a great project but for now it does not work properly:

[ ] Generates routes with required body and no parameter specification
[ ]  There is no way and no documentation on how to customize each endpoint configuration
[ ] Not working well with gateway aliases

yep，this does not work for the latest moleculer，i will refactor it in the near future

When to refactor the latest version

Looking forward to the latest version


feat(footer): add footer components and directives

add md-footer component and other components/directives based off of https://getmdl.io/

add md-social-button directive to buttons for social buttons in footer

add example footer for demo-app

As outlined in our contributing guide, the first step in working on a large feature like this is to open an issue for discussion. Going from there, we always start with a design document and design review with the team. We go through these steps to ensure that everything in the library meets our standards for accessibility, i18n, and consistency with the rest of the code-base.
Feel free to open a new issue (or start a discussion on the existing one) to start discussion on your proposed feature.


arguments with leading dash

pacaur can't handle arguments with a leading dash. It seems that the double dash option is not implemented.
I understand:

$ pacman -Ss -nox
error: invalid option '-n'

Using double dash:

$ pacman -Ss -- -nox
community/boinc-nox 7.6.32-1
Berkeley Open Infrastructure for Network Computing for desktop without Xorg dependencies
community/emacs-nox 24.5-4 [installed]
The extensible, customizable, self-documenting real-time display editor, without X11 support
community/erlang 18.3.3-1
General-purpose concurrent functional programming language developed by Ericsson
community/erlang-nox 18.3.3-1
General-purpose concurrent functional programming language developed by Ericsson (headless version)
community/qbittorrent-nox 3.3.3-2
An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar, w/o gui
community/virtualbox-guest-utils-nox 5.0.20-1
VirtualBox Guest userspace utilities without X support

Hmm, what?

$ pacaur -Ss -nox
:: no targets specified (use -h for help)

Oops :p

$ pacaur -Ss -- -nox
error: invalid option '-n'
cower: invalid option -- 'n'

Hallelujah!

$ cower -s -- -nox
aur/coq-nox 8.5pl1-1 (3, 0.00)
Formal proof management system. Headless version, without CoqIDE.
aur/cppcheck-nox 1.72-1 <!> (3, 0.76)
A tool for static C/C++ code analysis without the GUI
aur/erlang-nox-r17 17.5-1 (1, 0.01)
General-purpose concurrent functional programming language developed by Ericsson (headless version)
aur/gst-plugins-bad-rpi-nox 1.6.2-1 (0, 0.00)
GStreamer Multimedia Framework Bad Plugins with compilation options optimized for RaspberryPi so that
glimagesink works without Xorg
aur/proofgeneral-nox 4.2-2 (2, 0.01)
Generic interface for proof assistants, built for emacs-nox
aur/vim-nox master-0 (0, 0.00)
Vi Improved, console-only build with python2 support. Latest version from git.
aur/vlc-nox 2.2.3-1 (2, 0.73)
A multi-platform MPEG, VCD/DVD, and DivX player (without X support)

Patches welcome.

Done in 659b6dbad657aabba48f863318523c2d43a2d7dd.


improper placement or test setup of storage.Base58Wrapper

Currently in the same package of the other stores
It's a decorator... an argument could be made that it should be placed in a "helper" sub package
Or, if we treat it as a first class store then its tests should be hooked into the parent package store tests and all the duplicate code be removed

cc @Baha-sk


Capacitor Banks resetting output and input to 0 RF/t

Issue Description:
Capacitor banks in EnderIO are resetting their input and output values to 0 RF/t.
What happens:
When I start up the world in singleplayer the capacitor banks (setup in multiblock) reset the input and output to 0 RF/t.
What you expected to happen:
For the input and output to stay at the same values as set by the user, not to reset to 0 RF/t.
Steps to reproduce:

In singleplayer, setup several capacitor banks together to form a capacitor bank structure.
Supply power to them and change the input and/or output values.
Restart the client and load up the world.
Check the input and output.

Affected Versions (Do not use "latest"):

EnderIO: 1.10.2-<IP_ADDRESS>_beta
EnderCore: 1.10.2-<IP_ADDRESS>-beta
Minecraft: 1.10.2
Forge: <IP_ADDRESS>4

Your most recent log file where the issue was present:
http://pastebin.com/kmBzMHF9
NOTE: It happens when I restart the client, NOT the world.

I can not confirm this. Tried it on exactly the same versions multiple times, working just fine.   If yes, pleas tell me which and the version, so I can try under those circumstances.

I actually had this happen to me a couple of times in multiplayer.

Happened to players on my server as well.  We think it might be when the server goes down, but not sure.

Hi, I also can confirm this. It happens each time I start the client. I have a client server configuration running on my computer. The server runs on forge-1.10.2-<IP_ADDRESS>2-universal.jar, while the client is 1.10.2.
You can find the latest logs here:
fml-server-latest
latest
You will see a kind of mess in the log because this is a test world where I added and removed mods,
This is a screenshot of the setup:
batteries setup
and this the list of the mods I have installed on server:
batteries setup
I also think that input and output values resetted while playing, without restarting client, I just checked the battery after a while and it was again to 0 rf/t. But I can not confirm this 100%. If I get some evidence of this I will post here.

@markozar which was fixed in build 121 on Oct 11.

Wonderful, thank you!
I did not find it on curseforge but searching on google I found it on http://maven.tterrag.com/com/enderio/EnderIO. I hope it's correct.

I use http://ci.tterrag.com/job/EnderIO-1.10/ and http://ci.tterrag.com/job/EnderCore-1.10/

Nice to know, thank you!


Some of demo-scripts don't work

There are demos in  loadgen/demos. Some of the demos don't work:
$ python demos/py_demo_multi_stream_free.py
Traceback (most recent call last):
  File "demos/py_demo_multi_stream_free.py", line 86, in <module>
    app.run(main)
  File "/home/ivan/.local/lib/python3.6/site-packages/absl/app.py", line 300, in run
    _run_main(main, args)
  File "/home/ivan/.local/lib/python3.6/site-packages/absl/app.py", line 251, in _run_main
    sys.exit(main(argv))
  File "demos/py_demo_multi_stream_free.py", line 72, in main
    settings.target_latency_ns = 100000000
AttributeError: 'mlperf_loadgen.TestSettings' object has no attribute 'target_latency_ns'

and
$ python demos/py_demo_multi_stream.py
Traceback (most recent call last):
  File "demos/py_demo_multi_stream.py", line 86, in <module>
    app.run(main)
  File "/home/ivan/.local/lib/python3.6/site-packages/absl/app.py", line 300, in run
    _run_main(main, args)
  File "/home/ivan/.local/lib/python3.6/site-packages/absl/app.py", line 251, in _run_main
    sys.exit(main(argv))
  File "demos/py_demo_multi_stream.py", line 71, in main
    settings.target_latency_ns = 100000000
AttributeError: 'mlperf_loadgen.TestSettings' object has no attribute 'target_latency_ns'

Should it be multi_stream_target_latency_ns?
@bellycat77 Can you please manually change to see if this resolves the issue?

If I change target_latency_ns -> multi_stream_target_latency_ns then mentioned scripts work

Will be fixed by PR #252

PR #252 landed, so we should be able to close this one. @bellycat77 , can you confirm?

Yes, It works. Thank you


CLI Argument Addition

How to run

Build jar on terminal / command prompt
(Linux)
./startClassifai.sh
(Windows)
startClassifai.bat

Changes

CLI Argument simplify and add on for creation of new project when starting project.

How to use the cli
go to where classifai-uberjar-dev.jar is created
Normally at classifai-uberjar/target/
Run
unlockdb
java -jar classifai.jar --unlockdb
Create empty project with project name when starting classifai (no data path)
java -jar classifai.jar --newproject=helloworld --projecttype=segmentation
Create empty project with randomly assigned project name when starting classifai
java -jar classifai.jar --projecttype=segmentation
Create a project with data path
java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image

license header 2020-2021 added

docker file for sonar build improve

docker mode (still work in progress, for now only cli part is done)
for now, if run with --docker, Welcome Launcher and Selector for files and folder will not show up.
This is due to in docker environment, its not possible to select data point from gui.
Welcome Launcher is not supported due to awt packages. Initiating it will result in error.

@devenyantis @YCCertifai
Appreciate if you guys can run through it, highlight if any issue,
else the last one who approve the PR merge it. Thanks.
Type of change
Please delete options that are not relevant.

[ ] Bug fix (non-breaking change which fixes an issue)
[x] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[x] This change requires a documentation update

Tested on?

[x] Windows
[ ] Linux Ubuntu
[ ] Centos
[x] Mac
[ ] Others  (State here -> xxx )

Checklist:

[x] My code follows the style guidelines of this project
[x] I have performed a self-review of my own code
[x] I have commented my code, particularly in hard-to-understand areas
[ ] I have made corresponding changes to the documentation
[ ] My changes generate no new warnings
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] New and existing unit tests pass locally with my changes
[ ] Any dependent changes have been merged

everything is fine in for new CLI feature..
Just --newproject should be --projectname
**tested on linux

everything is fine in for new CLI feature..
Just --newproject should be --projectname
**tested on linux

another minor issue is I can create multiple project (same annotation type) with same name in CLI
But not able to do so in the GUI
Good about it is it does not overwrite previous data (with the same name).

another minor issue is I can create multiple project (same annotation type) with same name in CLI
But not able to do so in the GUI
Good about it is it does not overwrite previous data (with the same name).

hmmm by right same name should appear just once...ill check about that
thanks for highlighting @YCCertifai

hmmm by right same name should appear just once...ill check about that
thanks for highlighting @YCCertifai

I am able to run the first 3 commands.
Just want to ask for the last one
java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image
What should be the behavior for this? The image data are loaded directly when we open the project?

I am able to run the first 3 commands.
Just want to ask for the last one
java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image
What should be the behavior for this? The image data are loaded directly when we open the project?

I am able to run the first 3 commands.
Just want to ask for the last one
java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image
What should be the behavior for this? The image data are loaded directly when we open the project?

yes , cause in docker the building jar and project opening need to happen once the docker is up
@devenyantis i've found a complication and still fixing it,
ill ping you again to review the pr again next week

I am able to run the first 3 commands.
Just want to ask for the last one
java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image
What should be the behavior for this? The image data are loaded directly when we open the project?

yes , cause in docker the building jar and project opening need to happen once the docker is up
@devenyantis i've found a complication and still fixing it,
ill ping you again to review the pr again next week

@devenyantis @YCCertifai im done with the modification
`java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image`
What should be the behavior for this? The image data are loaded directly when we open the project?

for the comment above.
it would be two scenarioss

if project not exist, generate a random project name in the realm of segmentation and load the data path
if project exist, load the project and add on the data path

@devenyantis @YCCertifai im done with the modification
`java -jar classifai.jar --projecttype=segmentation --datapath=/Users/john/Desktop/sample-image`
What should be the behavior for this? The image data are loaded directly when we open the project?

for the comment above.
it would be two scenarioss

if project not exist, generate a random project name in the realm of segmentation and load the data path
if project exist, load the project and add on the data path

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

ah..missed this message as no pings. will check into this tomorrow

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

ah..missed this message as no pings. will check into this tomorrow

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

Hi @devenyantis ,
for windows,
i have to do something like this, can you check if it works?
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=boundingbox --datapath="C:\\Users\\chiaw\\Desktop\\sampleImages\\chip"
for ubuntu,
can you check again, i pushed some codes after the last time you tried..
if you faced it again, give me a more thorough walkthrough on how to reproduce the problem so i can solve it.

First 3 are okay. Tested on Windows and Ubuntu 18.04 (VM)
However, for the --datapath argument...

on Windows, I couldn't load the images
on Ubuntu, the data load sometimes. like 2 out of 5 times

And there is one time I accidentally load a valid path but empty and it loads some images.

This behavior doesn't happen all the time.

Hi @devenyantis ,
for windows,
i have to do something like this, can you check if it works?
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=boundingbox --datapath="C:\\Users\\chiaw\\Desktop\\sampleImages\\chip"
for ubuntu,
can you check again, i pushed some codes after the last time you tried..
if you faced it again, give me a more thorough walkthrough on how to reproduce the problem so i can solve it.

Hi @codenamewei
I've tested the latest one.

datapath arg works for both Windows and Ubuntu18 only if I choose --projecttype=boundingbox.
for --projecttype=segmentation, the program stuck at loading screen

Also, the problem where the program loads images given empty valid folder is gone.

Hi @codenamewei
I've tested the latest one.

datapath arg works for both Windows and Ubuntu18 only if I choose --projecttype=boundingbox.
for --projecttype=segmentation, the program stuck at loading screen

Also, the problem where the program loads images given empty valid folder is gone.

@devenyantis thanks...ill recheck this.....

@devenyantis thanks...ill recheck this.....

@devenyantis kindly check if the latest update solve the problem, thanks

@devenyantis kindly check if the latest update solve the problem, thanks

@codenamewei

Stuck at loading screen is solved, but the data is not loaded for --projecttype=segmentation
All good for --projecttype=boundingbox

@codenamewei

Stuck at loading screen is solved, but the data is not loaded for --projecttype=segmentation
All good for --projecttype=boundingbox

@codenamewei
I have pulled the latest version and rerun startClassifai.bat. But still not working for the segmentation arg.
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=segmentation --datapath="C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images"
Images used
https://drive.google.com/drive/folders/1qV9EukLtEW-rCqiLpgL6yuNhPVLZSs17?usp=sharing
java version, output from java -version
openjdk version "14.0.2" 2020-07-14 OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12) OpenJDK Client VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)
I also try delete .classifai so that the program rebuild new database but no luck.
For bounding box, only change --projecttype=boundingbox and it work.
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=boundingbox --datapath="C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images"

@codenamewei
I have pulled the latest version and rerun startClassifai.bat. But still not working for the segmentation arg.
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=segmentation --datapath="C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images"
Images used
https://drive.google.com/drive/folders/1qV9EukLtEW-rCqiLpgL6yuNhPVLZSs17?usp=sharing
java version, output from java -version
openjdk version "14.0.2" 2020-07-14 OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12) OpenJDK Client VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)
I also try delete .classifai so that the program rebuild new database but no luck.
For bounding box, only change --projecttype=boundingbox and it work.
java -jar classifai-uberjar-dev.jar --unlockdb --projecttype=boundingbox --datapath="C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images"

@devenyantis mind to attach the classifai.log here?
in windows is in the path of C:\Users\Deven.Yantis\.classifai\logs\classifai.log

@devenyantis mind to attach the classifai.log here?
in windows is in the path of C:\Users\Deven.Yantis\.classifai\logs\classifai.log

@codenamewei
classifai.log

@codenamewei
classifai.log

@YCCertifai need your help to see if you can reproduce deven issue
i can see it can detect the folder image , and its working on my mac and windows, see if you can reproduce the issue
Jan 27, 2021 10:44:44 am INFO  ai.classifai.config.CLIArgument - Data path imported through cli: C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images
Jan 27, 2021 10:44:45 am INFO  ai.classifai.MainVerticle - Existing database of classifai on C:\Users\Deven.Yantis\.classifai
Jan 27, 2021 10:44:46 am INFO  a.c.d.portfolio.PortfolioVerticle - Create project (from cli) with name: amazing_spiderman in SEGMENTATION project.

@YCCertifai need your help to see if you can reproduce deven issue
i can see it can detect the folder image , and its working on my mac and windows, see if you can reproduce the issue
Jan 27, 2021 10:44:44 am INFO  ai.classifai.config.CLIArgument - Data path imported through cli: C:\\Users\\Deven.Yantis\\Documents\\classifai-test-images
Jan 27, 2021 10:44:45 am INFO  ai.classifai.MainVerticle - Existing database of classifai on C:\Users\Deven.Yantis\.classifai
Jan 27, 2021 10:44:46 am INFO  a.c.d.portfolio.PortfolioVerticle - Create project (from cli) with name: amazing_spiderman in SEGMENTATION project.

@codenamewei will try on linux and windows.

@codenamewei will try on linux and windows.

@devenyantis @codenamewei  it's working in my windows and ubuntu too

@devenyantis @codenamewei  it's working in my windows and ubuntu too

@codenamewei  I will help @devenyantis to find out the problem...

@codenamewei  I will help @devenyantis to find out the problem...

@codenamewei I will help @devenyantis to find out the problem...

thanks , let me know if need my input

@codenamewei I will help @devenyantis to find out the problem...

thanks , let me know if need my input

@codenamewei @YCCertifai
I found out that this line cause the problem on my computer. Most of the time SegVerticle.getJdbcClient() is returning null which it suppose not to.
I've added few logs to help me see the process. Denoted by DEVEN === some log ===
Failure case.

The CHECKING JDBC CLIENT printed null.
Success case

The CHECKING JDBC CLIENT printed a value. The program works as expected when this happen.
I try some simple workaround to solve the problem.
JDBCClient jdbcValue = null;
while(jdbcValue == null) {
    log.info("== jdbcValue still null ===");
    jdbcValue = SegVerticle.getJdbcClient();
}
log.info("DEVEN === CHECKING JDBC CLIENT ===" + " " + jdbcValue);
SegVerticle.updateUUID(jdbcValue, SegDbQuery.createData(), projectID, filesCollection.get(i), uuid, i + 1);

The program works consistently this time.
The log. The jdbc client is null for sometimes.

Another success run log. Seems like the null result is random.

Hope that helps.

@codenamewei @YCCertifai
I found out that this line cause the problem on my computer. Most of the time SegVerticle.getJdbcClient() is returning null which it suppose not to.
I've added few logs to help me see the process. Denoted by DEVEN === some log ===
Failure case.

The CHECKING JDBC CLIENT printed null.
Success case

The CHECKING JDBC CLIENT printed a value. The program works as expected when this happen.
I try some simple workaround to solve the problem.
JDBCClient jdbcValue = null;
while(jdbcValue == null) {
    log.info("== jdbcValue still null ===");
    jdbcValue = SegVerticle.getJdbcClient();
}
log.info("DEVEN === CHECKING JDBC CLIENT ===" + " " + jdbcValue);
SegVerticle.updateUUID(jdbcValue, SegDbQuery.createData(), projectID, filesCollection.get(i), uuid, i + 1);

The program works consistently this time.
The log. The jdbc client is null for sometimes.

Another success run log. Seems like the null result is random.

Hope that helps.

sweet , i like how this is an issue we never seen before..
@YCCertifai do try to look into this.
after migration to h2, we should also see if this problem reoccurs....
alternatively, if it cant be solved, migration to h2 can be happens first and see if this problem still persist

sweet , i like how this is an issue we never seen before..
@YCCertifai do try to look into this.
after migration to h2, we should also see if this problem reoccurs....
alternatively, if it cant be solved, migration to h2 can be happens first and see if this problem still persist

Ok.. will look into this and try to solve it...
If unable to solve on this week, then I'll proceed to database migration first.

Ok.. will look into this and try to solve it...
If unable to solve on this week, then I'll proceed to database migration first.


Does the SDK respect DNS TTL?

2020-11-10T16:14:13Z [DEBUG] Error occurred while refreshing sampling rules. RequestError: send request failed
caused by: Post "http://<IP_ADDRESS>:443/GetSamplingRules": dial tcp <IP_ADDRESS>:443: i/o timeout

I have a container that's been logging this error for the last hour or so. <IP_ADDRESS> is a stale IP address for the DNS name of my daemon service, which was used in the xray.Configure() step when the container launched. That DNS record has a low TTL (60s). Does the SDK respect and re-resolve DNS when TTL periods expire?

Hi @rclark ,
Do you think SDK is using <IP_ADDRESS> to send data to X-Ray Daemon? I don't think SDK respects DNS TTL in the scenario you mentioned. Why this ip <IP_ADDRESS> becomes stale? Would you be able to explain how you're using X-Ray SDK with X-Ray daemon setup?

I'm running the xray daemon on a set of ECS tasks, using AWS CloudMap as the discovery layer. Those ECS containers can stop for any number of reasons. It looks like the daemon resolves DNS once on bootstrap, but doesn't refresh after the DNS-defined TTL.

Yes, @rclark I think the part of the reason you're seeing such logs could be because when new ECS containers spins up SDK still used the stale IP address that you had. As far as I know SDK doesn't support anything like this. This can be added to SDK as an enhancement. I will add this task in our backlog but meanwhile we do appreciate PRs :)

Thanks for the info.
If my application runs xray.Configure() more than once, would that re-resolve the DNS name to a new IP address each time I run it?


How to access IOT central dashboard in Teams app personal tab

I am looking for some documentation to know how to add/access IOT central dashboard in teams app personal tab.
https://docs.microsoft.com/en-us/azure/iot-central/core/quick-deploy-iot-central
I followed the steps in the above link to create an IOT central application, adding device and creating some visual charts for the device data. I would like to display these charts within the Teams APP Personal tab. I have a teams application with the combination of bot and couple of personal tabs, I would like to add one more personal tab where I want to show the charts created within the IOT Central dashboard.
Could you provide/guide/route me where I can find this information or is it even possible to do that?
Any inputs are highly appreciated.
Thank you

@amansani15 - We are looking into this I will get back to you soon.

Please have look into this-1.https://docs.microsoft.com/en-us/azure/iot-central/core/howto-manage-dashboards
2.https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/create-personal-tab?pivots=mvc-csharp

Please have look into this-1.https://docs.microsoft.com/en-us/azure/iot-central/core/howto-manage-dashboards 2.https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/create-personal-tab?pivots=mvc-csharp

@sayali-MSFT is there a tutorial showing how we can display IotCentral charts in a teams tab ?

You can integrate webapp as personal tab.
here is tutorial for personal Tab-
https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-personal/mvc-csharp

Okay, will look into it and get back to you. We may need some time to look into this.
So is IOTCentralCharts is a web app?

Please have look into this- https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-live-data-visualization-in-web-apps

@sayali-MSFT We have already implemented it. The charts within the provided link are developed using one of the charts library. But in IOT central, we have an option to build the charts using drag and drops. All we are trying to know is, how to display the charts created within the IOT central dashboard into teams static tab - personal.

IOT central is an application that reduces the burden and cost of developing, managing, and maintaining enterprise-grade IoT solutions.
https://docs.microsoft.com/en-us/azure/iot-central/core/overview-iot-central


ViewComponent can't find template for nested slot component

Steps to reproduce
We're using ViewComponent to build a Breadcrumb component in our Rails app:
class BreadcrumbComponent < ViewComponent::Base
  renders_many :breadcrumb_items, 'BreadcrumbItemComponent'
  attr_reader :label

  def initialize(label: 'Breadcrumb')
    @label = label
  end

  class BreadcrumbItemComponent < ViewComponent::Base
    attr_reader :label, :href

    def initialize(label: nil, href: nil)
      @label = label
      @href = href
    end
  end
end

And for the templates we have the following structure:

But when rendering the component like so:
render BreadcrumbComponent.new do |component|
  component.with_breadcrumb_item(label: 'Label', href: '#')
  component.with_breadcrumb_item(label: 'Label', href: '#')
end

We're getting an error that it can't find the BreadcrumbItemComponent template.
Couldn't find a template file or inline render method for BreadcrumbComponent::BreadcrumbItemComponent.
I've moved the template file around into different folders (top-level, the parent component, etc.) but the same error happens... the only way to remove the error is by adding the template with def call; end into the BreadcrumbItemComponent component so it sees an inline render... but we want to use the template. Does ViewComponent support templates for nested slots?
System configuration
Rails version: <IP_ADDRESS>
Ruby version: 3.2.2
Gem version: 3.10.0

This is working now after moving the template under the parent folder (however I did try this before and it didn't work), so not sure what was wrong before... so looks like it's working as expected.

I think it's a good opportunity to improve the docs to mention what's the expected file path for nested slot component templates.
Would you like to prepare a PR?


Improve Accessibility Features

This is a (multiple allowed):

[ ] bug

[x] enhancement

[ ] feature-discussion (RFC)

Swiper Version: v4.5.0

Platform/Target and Browser Versions: EVERY PLATFORM

Expected Behavior
The slider should implement some of the features and html structure of the w3c slider example: https://www.w3.org/TR/wai-aria-practices/examples/carousel/carousel-1/carousel-1.html
The w3c example also has a list of reasons why the features and html structure they used is accessible.
This would make SwiperJS a lot more accessible. Some of the accessibility enhancements can be set with options, but this as the default would help users who don't know how to make it more accessible. It would also be a good reason to use this library instead of other slider libraries, because SwiperJS would be a good option for everyone who wants to apply wcag 2.1 standards. https://www.w3.org/TR/WCAG21/
Some of the features could only be implemented in the accessibility module, for users who don't want to use them.
Actual Behavior
SwiperJS is only partially accessible.
Features to implement:

[x] <section> as the outer container, instead of an <div> element
[x] outer container has aria-roledescription="carousel"
[x] outer container has aria-label="Example Content" (Label can be set like the next/prev slider buttons text)
[x] next and previous buttons are <a>-tags
[x] next and previous buttons haverole="button"
[x] next and previous buttons has aria-controls="swiperID" (this connects with the id of the content)
[x] content container has id="swiperID" (this connects with the aria-attribute of the next and previous buttons)
[x] content container has aria-live="off" when autoplay is on and aria-live="polite" when autoplay is off
[x] content item has role="group"
[x] content item has aria-roledescription="slide"
[x] content item has the slide number as aria-label. Example:aria-label="1 of 6"
[ ] Prevent tabbing to focusable items within out-of-view slides
[ ] Make sure disabled controls/buttons are not focusable

Related Issues
The w3c example doesn't use clones, but this issue is also important to improve accessibility: https://github.com/nolimits4web/swiper/issues/2929
Maybe the improved keyboard accessiblity would also fix issues like this: https://github.com/nolimits4web/swiper/issues/2945

The specification for the carousel design pattern says:

The rotation control, next slide control, and previous slide control are either native button elements (recommended) or implement the button pattern.

So I believe there is no need to turn them into <a> tags.
In addition to these features, I would also suggest to use the tabs pattern for pagination as described in the "Tabbed Carousel Elements" section of the aforementioned specification. It seems more friendly for keyboard users than sequentually tabbing through all of the bullets.

Next and previous should be buttons as they don't take the user to a new page. They also don't need role="button" as the button element has an implied role.
I'm using SiteImprove (an automated a11y review tool) and it's actually penalising me at the moment for the role="button" added by Swiper.

A WAI-ARIA attribute that has the exact same features as the HTML element it has been applied to has been used. The WAI-ARIA attribute is redundant since is doesn't provide the user with any additional information.

For landmarks it has previously been a recommendation to use HTML5 and WAI-ARIA landmark roles together (e.g. WAI-ARIA role="navigation" on HTML5 'nav' elements) to maximize support, but with the widespread adoption of HTML5 this is no longer needed.

The WAI-ARIA attribute can be removed without any impact for end users. The result will be cleaner, easier to maintain code.

I disagree with the above slightly because of this IE11 bug but I think for all modern browsers the role isn't required.

Having tabindex="-1" on duplicated slides would be very helpful when using loop.

Actually having tabindex="-1" on all focusable elements in invisible slides would be helpful. Currently I use custom code to manage the tabindex myself. I had assumed that a carousel that claims to be accessible would deal with plain links in slides.
For those who are wondering why this is an issue: if you tab through the slides you'll reach at one point a hidden slide. Then they will scroll into view. This breaks the layout and the state managment of Swiper, ie the wrong slides are "active".

BTW aria-roledescription="carousel" is a plain text so it must be translatable if implemented. But aria-roledescription is not welcomed by all a11y advocates.

Speaking of tabindex="-1", it would be nice if disabled navigation buttons would not be focusable.

Sadly SwiperJS is yet another library that has a well-meant a11y-code, but no real interest or knowledge to make it actually work without barriers.

Actually having tabindex="-1" on all focusable elements in invisible slides would be helpful. Currently I use custom code to manage the tabindex myself. I had assumed that a carousel that claims to be accessible would deal with plain links in slides.
For those who are wondering why this is an issue: if you tab through the slides you'll reach at one point a hidden slide. Then they will scroll into view. This breaks the layout and the state managment of Swiper, ie the wrong slides are "active".

Hi masi, would you mind sharing your solution? I also have links in slides and when I tab trough them it breaks the layout. I'm trying to use their API to slideTo the current focused slide but it's not working.

Actually having tabindex="-1" on all focusable elements in invisible slides would be helpful. Currently I use custom code to manage the tabindex myself. I had assumed that a carousel that claims to be accessible would deal with plain links in slides.
For those who are wondering why this is an issue: if you tab through the slides you'll reach at one point a hidden slide. Then they will scroll into view. This breaks the layout and the state managment of Swiper, ie the wrong slides are "active".

Hi masi, would you mind sharing your solution? I also have links in slides and when I tab trough them it breaks the layout. I'm trying to use their API to slideTo the current focused slide but it's not working.

Update: I was able to fix this by changing the scrollLeft property of the swiper container to 0

Actually having tabindex="-1" on all focusable elements in invisible slides would be helpful. Currently I use custom code to manage the tabindex myself. I had assumed that a carousel that claims to be accessible would deal with plain links in slides.
For those who are wondering why this is an issue: if you tab through the slides you'll reach at one point a hidden slide. Then they will scroll into view. This breaks the layout and the state managment of Swiper, ie the wrong slides are "active".

Came to the same solution with tabindex="-1" for invisible slides, which logically make sense as well, since if element is not visible it should not be focusable.

Here's what I use to add tabindex="-1" to inactive slides:
First I use a polyfill for the inert HTML property:
<script src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.inert"></script>
Then I have this function:
const makeAllButCurrentSlideInert = function makeAllButCurrentSlideInert() {
  const currentSlideEl = this.slides[this.realIndex];

  this.slides.each((index, slide) => {
    if (slide !== currentSlideEl) {
      slide.setAttribute("inert", "");
    } else {
      slide.removeAttribute("inert");
    }
  });
};

And I call it every time the carousel updates or is initiated:
const swiperOptions = {
  // …
  on: {
    init() {
      makeAllButCurrentSlideInert.call(this);
    },
    slideChange() {
      makeAllButCurrentSlideInert.call(this);
    },
    slideChangeTransitionEnd() {
      const currentSlideEl = this.slides[this.realIndex];
      currentSlideEl.setAttribute("tabindex", "-1");
      currentSlideEl.focus();
    },
  },
};

The slideChangeTransitionEnd function is a little bonus to set focus to the active slide whenever a transition takes place.

Here's what I use to add tabindex="-1" to inactive slides:
First I use a polyfill for the inert HTML property:
<script src="https://polyfill.io/v3/polyfill.min.js?features=Element.prototype.inert"></script>
Then I have this function:
const makeAllButCurrentSlideInert = function makeAllButCurrentSlideInert() {
  const currentSlideEl = this.slides[this.realIndex];

  this.slides.each((index, slide) => {
    if (slide !== currentSlideEl) {
      slide.setAttribute("inert", "");
    } else {
      slide.removeAttribute("inert");
    }
  });
};

And I call it every time the carousel updates or is initiated:
const swiperOptions = {
  // …
  on: {
    init() {
      makeAllButCurrentSlideInert.call(this);
    },
    slideChange() {
      makeAllButCurrentSlideInert.call(this);
    },
    slideChangeTransitionEnd() {
      const currentSlideEl = this.slides[this.realIndex];
      currentSlideEl.setAttribute("tabindex", "-1");
      currentSlideEl.focus();
    },
  },
};

The slideChangeTransitionEnd function is a little bonus to set focus to the active slide whenever a transition takes place.

I also used transitionEnd event, but also listened for keyboard navigation ('keydown'), since I was able to reproduce that issue when using keyboard navigation (arrows) and then moving focus quickly with tab/shift+tab

According to the start post by @fregiese in this issue, the implemented list of new features is part of release 6.3.0.
Please check also the documentation with the new parameters for accessibility in the documentation (https://swiperjs.com/api/#a11y)

[x]  <section> as the outer container, instead of an <div> element
--> changed in playground/index.html
[x]  outer container has aria-roledescription="carousel"
--> aria-roledescription for outer container can be set by a11y option
[x]  outer container has aria-label="Example Content" (Label can be set like the next/prev slider buttons text)
--> aria-label for outer container can be set by a11y option
[x]  next and previous buttons are <a>-tags
--> next and previous buttons are <button>-tags in playground/index.html
[x]  next and previous buttons have role="button"
--> next and previous buttons get role="button" if no <button>-tags are used
[x]  next and previous buttons has aria-controls="swiperID" (this connects with the id of the content)
--> next and previous buttons has aria-controls="[id given for swiper]", see next point
[x]  content container has id="swiperID" (this connects with the aria-attribute of the next and previous buttons)
--> content container gets random id if it hasn't an id yet. id corresponds to the aria-attribute of the next and previous buttons
[x]  content container has aria-live="off" when autoplay is on and aria-live="polite" when autoplay is off
--> done
[x]  content item has role="group"
--> role="group" for content item is set
[x]  content item has aria-roledescription="slide"
--> aria-roledescription for content item can be set by a11y option
[x]  content item has the slide number as aria-label. Example:aria-label="1 of 6"
--> done (to avoid language problems: 1/6, 2/6 ...)

#3834 is the relevant PR for anyone who would like to take a look at the changes

@philwolstenholme @fregiese are there things left to do? or the issue can be closed?

@philwolstenholme @fregiese are there things left to do? or the issue can be closed?

I think there are a few extra tasks:

[ ] Prevent tabbing to focusable items within out-of-view slides. I described one way to do that here.
[ ] Make sure disabled controls/buttons are not focusable (I'm not sure if this is still an issue, but it was mentioned here: https://github.com/nolimits4web/swiper/issues/3149#issuecomment-650787747)

I think there are a few extra tasks:

[ ] Prevent tabbing to focusable items within out-of-view slides. I described one way to do that here.
[ ] Make sure disabled controls/buttons are not focusable (I'm not sure if this is still an issue, but it was mentioned here: https://github.com/nolimits4web/swiper/issues/3149#issuecomment-650787747)

I updated the inital comment to show the current status

I just noticed that Swiper is adding aria-role-description instead of aria-roledescription. Note the former isn't valid.

Thanks. This has been commented here:
https://github.com/nolimits4web/swiper/issues/4371
and fixed here:
https://github.com/nolimits4web/swiper/commit/1b73c3b82dfd0b789650474bc5e13fd200115b28
in 6.5.1.

I send related PR: https://github.com/nolimits4web/swiper/pull/4884

Going through this now, when using slidesPerView and the slides have focusable elements, the results of tabbing to the next group are less than desirable. What would be good is if the slider were to simply toggle the next page, or assign the target slide on keypress as the active slide.
I got it working half way with the keypress event, but this seems to not trigger on a shift+tab key press.
const swiperOptions = {
  // …
  on: {
    keyPress: function (swiper, code) {
      if ( 9 == code ) {
        var focusEl = document.activeElement.closest('.swiper-slide');
        if ( null != focusEl && !focusEl.classList.contains('swiper-slide-active') ) {
          var slideIndex = Array.prototype.indexOf.call(focusEl.parentNode.children, focusEl);
          swiper.slideTo(slideIndex);
        }
      }
    },
  },
};

Would be great to get it working the opposite direction, right? Why isn't keyPress fired on shift+tab?
Anyways, plan B, let's use an event listener.
const slideFocus = function slideFocus(e) {
    if (e.key === 'Tab') {
        var focusEl = document.activeElement.closest('.swiper-slide');
        if (null != focusEl && !focusEl.classList.contains('swiper-slide-active')) {
            var slideIndex = Array.prototype.indexOf.call(focusEl.parentNode.children, focusEl);
            swiper.slideTo(slideIndex);
        }
    }
};

const swiperOptions = {
    // …
    on: {
        init: function (swiper) {
            swiper.el.addEventListener('keydown', slideFocus);
        }
    }
};

There we go, that seems to work. I can tab back and forth between items, I can tab in and out of my slider, and it all seems to work.

Prevent tabbing to focusable items within out-of-view slides
Make sure disabled controls/buttons are not focusable

The trick is to make sure all slides that are visible have tabindex="-1" on all focusable elements. Once they are visible restore the former value.
It is a bit more difficult than one expect in handlers because of the issues with the index in loop mode. There is no realIndex for the previous element. If you show more than one slide it becomes even more difficult as Swiper does not tell you how many and which elements are or have been visible.

I know that the React/Vue/Other framework ports aren't really fully supported, but it would be helpful to make a note the docs that most (if not all) of this a11y work isn't reflected in the DOM elements created by those ports. e.g. https://github.com/nolimits4web/swiper/blob/26340c4280790c509de499714c60009e35949c3d/src/react/swiper.js#L23

Hey guys, thanks for the update, but you forgot to mention in the docs, that "watchSlidesProgress" is now required when you have slidesPerView > 1. Otherwise any focus on slides other than the first one will immediately slideTo() this slide.

@Gr0m Thanks for catching this! 🙏🏻
Saved us hours of head-scratching. Linked to two other issues which are likely related to this as well!

Quick questions:
1. why current slide doesn't have `aria-current="true"`? (I only saw this for the pagination bullets)

Because it won't tell the user something knew. If only one slide is visible the one will of course be the current one.
In the pagination things are different. A screen reader will read out all bullets and then it makes sense to say which one is the current one.

2. why "we" kept "div" instead of using `<ul>` for the slider container and `<li>` for slides?

IMHO it makes no sense. A list is announced with the number of items it contains. When only one slide is shown you will always stay on a lsit with a single item that changes with each next-slide action. It does not get much better if more than one slide is shown.
Sidenote: I found an example by W3C/WAI that does not agree with me on that. But my codes without LI has passed professionaly a11y audits. So using LI is at least not a must-have.

3. the slider container is not `<section>` as checked in the TODO list of this thread, is there something special to do? It should have by default `role="region"` then I guess?

I don't know why it is checked. At least for the VanillaJS version the other element is in the developers control. You can make it a  or add a role="region". But note that you need an accessible name as well to create a section/region.
The main point IMHO in using section/role is to hadd a hint that the user is about to enter a carousel widget.
But the same as for 2. applies.

4. the slider container has no "role" (whereas slides have `role="group"`), any reason for this? (maybe not necessary at the end if `swiper` was using `<ul> + <li>`?

Yes, with the group role you emphasise that the content within belongs together. This is nice with a DIV though without an acessible name it is pointless. With LI as you point out the grouping is already there.
For the slider containser see my anser to 3.

Is there a follow-up ticket for these to issues?

Prevent tabbing to focusable items within out-of-view slides
Make sure disabled controls/buttons are not focusable

My customers love slides with interactive elements and tabbing into out-of-view slides is highly undiserably. Only FF does not support the inert attribute. Using it by default would improve the experience for many users without much extra code. I assume that you have to enable visbility tracking to make it work, but that's ok.
Disabled elements should not only be not focusable, but really disabled. There is an attribute/state for it. If it were used there wouldn't even be the need for a CSS classed to fake a disabled state.

Is there a follow-up ticket for these to issues?

Prevent tabbing to focusable items within out-of-view slides
Make sure disabled controls/buttons are not focusable

My customers love slides with interactive elements and tabbing into out-of-view slides is highly undiserably. Only FF does not support the inert attribute. Using it by default would improve the experience for many users without much extra code. I assume that you have to enable visbility tracking to make it work, but that's ok.
Disabled elements should not only be not focusable, but really disabled. There is an attribute/state for it. If it were used there wouldn't even be the need for a CSS classed to fake a disabled state.

Seconding this. Focusable elements in out-of-view slides should NOT be able to be focused on, nor should they toggle a slide transition.
That this happens seems to have been deliberate?

I found a fairly easy solution for hiding the non-visible slides for screen readers:
new Swiper(ele, {
      // This option adds the `swiper-slide-visible` class to the slides once they are visible
      watchSlidesProgress: true,
});

.swiper-slide {
  visibility: visible;
  transition: visibility 1s linear;

  &:not(.swiper-slide-visible) {
    // Hide non-visible slide from screen reader
    visibility: hidden;
    // Add transition to avoid flickering
    transition: visibility 1s linear;
  }
}

I can tab back and forth between items, I can tab in and out of my slider, and it all seems to work.

Thanks a mill, it does the job for a barrier-free ux. 💪


Add Hot/Cold FlameGraph generator to converter.jar

I've added a Hot/Cold FlameGraph generator to the converter.jar.
The result of wall clock profiling recorded in jfr format by async-profiler contains thread state information.
The Hot/Cold FrameGraph generated by async-profiler is very effective because it can visualize a stack trace with the same context on-CPU and off-CPU.
Example:

The darker colors indicate on-CPU and lighter colors indicate off-CPU.
The color fill of the parent stack is determined by the ratio of the number of on-CPU samples in the child stacks.
I created this in https://github.com/tetsuzawa/async-profiler-hot-cold-flamegraph-example.

While this is an interesting feature, I can't really accept it in its current form, as the implementation involves much copy-pasted code, thus doubling maintenance costs.
Thank you anyways.

Please also note that async-profiler accepts only those contributions that transfer all IP rights to the project owner, i.e. all new files need to retain the following copyright header:
 * Copyright 2021 Andrei Pangin

Hi @apangin
Thank you for your comment, I have refactored FlameGraph to be able to generate a Hot/Cold FlameGraph by passing the --hotcold flag to FlameGraph.
The Hot/Cold FlameGraph does not support collapsed format, so it is currently only valid when running jfr2flame.
If there are any problems with this changes, please let me know.

I've added a Hot/Cold FlameGraph generator to the converter.jar.
The result of wall clock profiling recorded in jfr format by async-profiler contains thread state information. The Hot/Cold FrameGraph generated by async-profiler is very effective because it can visualize a stack trace with the same context on-CPU and off-CPU.
Example:
The darker colors indicate on-CPU and lighter colors indicate off-CPU. The color fill of the parent stack is determined by the ratio of the number of on-CPU samples in the child stacks.
I created this in https://github.com/tetsuzawa/async-profiler-hot-cold-flamegraph-example.

@tetsuzawa  can you give your compile convert.jar for test.


logging dynamo endpoint from appsync emulator startup script

cc @aheissenberger

cc @aheissenberger

thank you :-) but I found a better way to add a fixed port to the command line cli and created a pull request


Health Check reported as Unhealthy in Azure Functions when using AutoStart

Is this a bug report?
Yes
Can you also reproduce the problem with the latest version?
Yes
Environment

Dotnet version: .NET 6
Operating system: Windows
IDE (Rider, VS Code, Visual Studio): Visual Studio

Steps to Reproduce

Add a health check endpoint as an HttpTrigger to the MassTransit/Sample.AzureFunction project
Set AutoStart = true in the AddMassTransitForAzureFunctions configuration
Hit the health check url: http://localhost:7071/api/health

Expected Behavior
Because I'm specifying AutoStart = true I was expecting that bus should be started and the health check should report healthy.
When deploying new code to our Azure Functions, we use a "staging" slot and only swap into production after the function app reports a successful health check. So, ultimately, I'm looking for a way to ensure all the connectivity is ready to go in MassTransit before pushing the code live.

Actual Behavior
When hitting the health endpoint, the health status is reported as Unhealthy with a description of Not ready: not started
After an event flows through a function trigger, the health is then reported as Healthy
Reproducible Demo

https://github.com/sreagleeye/Sample-AzureFunction

Since Azure Functions has NO way to start any hosted services, you'd need to add the IAsyncBusHandle handle dependency to your health check HttpTrigger, so that it actually starts the bus. Otherwise, it will always be unhealthy.

Thanks for the quick response! That makes a lot of sense. I didn't realize it was a hosted service that was used with AutoStart.
Adding the IAsyncBusHandle dependency, does indeed solve my issue. One caveat is that the first health check comes back Unhealthy, but waiting and trying again comes back Healthy. I'm guessing that's due to the dependency being async in its initialization. I will ensure I have a retry in my deployment process.

It would be great if Microsoft allowed registration of IHostedService's in Azure Functions, but they don't :(


Possible to avoid WebGL?

Using WebGL is a method of tracking, as websites get fingerprintable informations about your GPU.
This will not be an issue of the sites using this tool, but it is a preset of Tor-Browser, Librewolf, Arkenfox and other hardened Browsers.
So websites using your Tiles will display a WebGL warning (NoScript) or not display at all when the Browser blocks WebGL itself (Tor I guess, Arkenfox)
What do you think, could this be possible, with a performance loss but better compatible?
Awesome project!

There are some vector tiles plugins for Leaflet like Leaflet.VectorGrid or Leaflet.VectorTileLayer. These plugins render vector tiles directly onto 2D canvases, eliminating the need for WebGL.
You could also prerender all tiles by using Mapnik and this Shortbread Mapnik style.
But I think in the case of hardened browsers, not only WebGL is a problem, but JavaScript as well. So the only real alternative would be to "abandon interactivity" and simply use a screenshot of a map.
Of course, it would be great if a versatile server could generate a screenshot defined by url parameters. But that would be a more complex feature for the future.

thanks for the response!
I will just take Torbrowser default as standard. Yes a static image would of course also work, but having it run with only Javascript will be also fine.
Thanks for your toolkit! Just replacing the frontend will be enough


Fixed a couple breaking issues

This is a fantastic library, but I had some issues after installing it:

The response interceptor returns just a Resource, which does not contain all of the properties from the response. This is a problem because another plugin that I am using looks for the config property, and throws an error. I haven't fully tested my change, but it looks like adding the properties to the resource as non-enumerable fixes the problem with no side effects. I wanted to keep this change backwards-compatible, otherwise I would have returned the response and made response.data the Resource.
This might have been caused by our Webpack config, but we were getting build errors when importing. I think it is because I am excluding anything under node_modules from Babel. I just changed package.json to point to the dev bundle.

Thank you for creating and maintaining this! Saved me so much time!

Hey @maennchen, thank you for reviewing so quickly. I agree, I don't like the approach, I would be happy to change it so that the response is in tact but the data is the resource. I changed the file path because the dev file is more than just a source map file (no functional reason though).
I'll revert these changes and just submit the change to the interceptor. As you mentioned, I can get around the Webpack issue on my end, so that change is not really necessary (nor the filename change).

Hello,
Just to understand: @benmarch you did this change because another plugin setup another http interceptor  that requires config ?

Hey @agouriou, yes, that is exactly right. I'll have the changes in later today for your review.

What I did in a similar case was to register the interceptors in an order so that angular-hal's intercepter is the last one to operate.
By doing so, all interceptors worked as expected since the initial Response object was only transformed to a Resource in the last step of interception.
Maybe this could suit your needs...

That was my first approach but since I don't have control over when either interceptor is registered, I couldn't figure out how to ensure the order. Did you have to manually order $httpProvider.interceptors in your config block?
I would rather not use this solution since it is still a bit of a hack. I think it is reasonable for a library to assume that a response object will be passed into a response interceptor, so I think it is best for angular-hal to uphold that assumption. I am setting up my changes in a way where if you use $http to request a resource then you will get the response object, but if you use halClient then you will get the resource as you do now. It should require very minimal changes to consumer code.

I think it would be a reasonable decision to move the resource into the response data and return the whole response object. This should suit both needs.
The reason I didn't implement it this way, is that I want the same interface for links and embeds. With embeds there would be no normal response since it requires no HTTP request.
If you can come up with a good solution to that problem, I'd be happy to accept a PR.

@agouriou @maennchen ready for your review. You can see from the changes to the test cases that consuming code will only have to make changes when using $http to request a resource. If developers followed your examples then it is likely that they only need to make a single change when requesting the API root resource. The halResourceClient and halClient APIs are unchanged, so there is still consistency between getting links and embedded resources.

I'm currently on vacation. I'll have a thoroughly look at it when I'm back home.
It looks good on first glance, thank you verry much.

Thank you, @maennchen! Please let me know when I can update my app with the new version.

Could you create a migration guide and include it in the readme?

Sure, will this be a major release (3.0.0)?

Yes

Created #70 with updates to README.


Package: vtk:x64-windows   Vcpkg version: 0.0.110-2018-05-10-9a19dae13a0fa594245db2df45ec54a504bc82f3

$ ./vcpkg.exe install vtk:x64-windows
The following packages will be built and installed:
vtk[core]:x64-windows
Starting package 1/1: vtk:x64-windows
Building package vtk[core]:x64-windows...
-- CURRENT_INSTALLED_DIR=F:/git/vcpkg/installed/x64-windows
-- DOWNLOADS=F:/git/vcpkg/downloads
-- CURRENT_PACKAGES_DIR=F:/git/vcpkg/packages/vtk_x64-windows
-- CURRENT_BUILDTREES_DIR=F:/git/vcpkg/buildtrees/vtk
-- CURRENT_PORT_DIR=F:/git/vcpkg/ports/vtk
-- Using cached F:/git/vcpkg/downloads/Kitware-VTK-v8.1.0.tar.gz
-- Testing integrity of cached file...
-- Testing integrity of cached file... OK
-- Applying patch F:/git/vcpkg/ports/vtk/dont-define-ssize_t.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/dont-define-ssize_t.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/use-fixed-find-hdf5.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/use-fixed-find-hdf5.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/disable-workaround-findhdf5.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/disable-workaround-findhdf5.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-libproj4.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-libproj4.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-libharu.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-libharu.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-mysql.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-mysql.patch done
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-odbc.patch
-- Applying patch failed. This is expected if this patch was previously applied.
-- Applying patch F:/git/vcpkg/ports/vtk/fix-find-odbc.patch done
-- Configuring x64-windows
-- Configuring x64-windows done
-- Build x64-windows-dbg
CMake Error at F:/git/vcpkg/scripts/cmake/vcpkg_build_cmake.cmake:170 (message):
Command failed: F:/git/vcpkg/downloads/tools/cmake-3.10.2-windows/cmake-3.10.2-win32-x86/bin/cmake.exe;--build;.;--config;Debug;--target;install;--;-v;-j1
Working Directory: F:/git/vcpkg/buildtrees/vtk/x64-windows-dbg
See logs for more information:
F:\git\vcpkg\buildtrees\vtk\install-x64-windows-dbg-out.log
Call Stack (most recent call first):
F:/git/vcpkg/scripts/cmake/vcpkg_install_cmake.cmake:24 (vcpkg_build_cmake)
F:/git/vcpkg/ports/vtk/portfile.cmake:172 (vcpkg_install_cmake)
F:/git/vcpkg/scripts/ports.cmake:72 (include)
Error: Building package vtk:x64-windows failed with: BUILD_FAILED
Please ensure you're using the latest portfiles with .\vcpkg update, then
submit an issue at https://github.com/Microsoft/vcpkg/issues including:
Package: vtk:x64-windows
Vcpkg version: 0.0.110-2018-05-10-9a19dae13a0fa594245db2df45ec54a504bc82f3

See logs for more information:
F:\git\vcpkg\buildtrees\vtk\install-x64-windows-dbg-out.log

install-x64-windows-dbg-out.log

there are no errors, the last line
-- Installing: F:/git/vcpkg/packages/vtk_x64-windows/debug/include/vtkViewsGeovisModule.h
It is necessary to look other logs

Please open a new issue if this is still a problem for you.
Thanks.


npm test error

@chrisvfritz I've got a fork installed locally, and after some troubleshooting*, I can use npm run dev to see it in my browser. So far so good.
npm test gives me the following output:
> lansingcodes-welcome-slide@ test C:\wamp64\www\slide
> karma start build/karma.conf.js --single-run

15 09 2017 11:46:34.213:ERROR [config]: File C:\wamp64\www\slide\build\karma.conf.js does not exist!
npm ERR! Test failed.  See above for more details.

Not sure what karma.conf.js is, but I don't see it in the repo anywhere. Should something be generating it?
*I rebuilt node-sass because I was getting an error with the latest version of node, and I changed http-proxy-middleware to http-proxy in dev-server.js because that's what the package is called in node_modules.

It looks like tests weren't generated for the project, but the script to run the tests was still added. PR welcome to remove it. 😄

Closing. We need to rewrite the slide project from the ground up and we'll make sure the redesign is mobile-friendly.


I have problem in compiling my own caffe windows

I downloaded the caffe-windows codes, installed the cuda6.0, copied the 3rdparty and VS2012, still I failed to open the project. When I open the MainBuilder.sln,  it says

Can anyone help me?

Have the same problem, no idea how to handle it?

same here

you can try installing CUDA toolkit 6.5.

The original solution was created with CUDA 6.5. Try open "MainBuilder.vcxproj" with any text editor, and find "cuda" while replace every "6.5" after that with your version of CUDA, which in my case, is "7.5". Hopefully it'll get it work.