List or kill running PiP tasks
| a|u|x | similar to the aux options of the Linux ps command |
| --root | List PiP root(s) |
| --task | List PiP task(s) |
| --family | List PiP root(s) and PiP task(s) in family order |
| --kill | Send SIGTERM to PiP root(s) and task(s) |
| --signal | Send a signal to PiP root(s) and task(s). This option must be followed by a signal number of name. |
| --ps | Run the ps Linux command. This option may have ps command option(s) separated by comma (,) |
| --top | Run the top Linux command. This option may have top command option(s) separated by comma (,) |
| - | Simply ignored. This option can be used to avoid the ambiguity of the options. |
pips
is a filter to target only PiP tasks (including PiP root) to show status like the way what the ps
commands does and send signals to the selected PiP tasks.Just like the ps
command, pips
can take the most familiar ps
options a
, u
, x
. Here is an example;
$ pips PID TID TT TIME PIP COMMAND 18741 18741 pts/0 00:00:00 RT pip-exec 18742 18742 pts/0 00:00:00 RG pip-exec 18743 18743 pts/0 00:00:00 RL pip-exec 18741 18744 pts/0 00:00:00 0T a 18745 18745 pts/0 00:00:00 0G b 18746 18746 pts/0 00:00:00 0L c 18747 18747 pts/0 00:00:00 1L c 18741 18748 pts/0 00:00:00 1T a 18749 18749 pts/0 00:00:00 1G b 18741 18750 pts/0 00:00:00 2T a 18751 18751 pts/0 00:00:00 2G b 18741 18752 pts/0 00:00:00 3T a
here, there are 3 pip-exec
root processes running. Four pip tasks running program 'a' with the ptherad mode, three PiP tasks running program 'b' with the process:got mode, and two PiP tasks running program 'c' with the process:preload mode.
Unlike the ps
command, two columns 'TID' and 'PIP' are added. The 'TID' field is to identify PiP tasks in pthread execution mode. three PiP tasks running in the pthread mode. As for the 'PiP' field, if the first letter is 'R' then that pip task is running as a PiP root. If this letter is a number from '0' to '9' then this is a PiP task (not root). The number is the least-significant digit of the PiP ID of that PiP task. The second letter represents the PiP execution mode which is common with PiP root and task. 'L' is 'process:preload,' 'C' is 'process:pipclone,', 'G' is 'process:got,' and 'T' is 'thread.'
The last 'COMMAND' column of the pips
output may be different from what the ps
command shows, although it looks the same. It represents the command, not the command line consisting of a command and its argument(s). More precisely speaking, it is the first 14 letters of the command. This comes from the PiP's specificity. PiP tasks are not created by using the normal exec
systemcall and the Linux assumes the same command line with the pip root process which creates the pip tasks.
If users want to have the other ps
command options other than 'aux', then refer to the --ps
option described below. But in this case, the command lines of PiP tasks (excepting PiP roots) are not correct.
--root
(-r
) Only the PiP root tasks will be shown. $ pips --root PID TID TT TIME PIP COMMAND 18741 18741 pts/0 00:00:00 RT pip-exec 18742 18742 pts/0 00:00:00 RG pip-exec 18743 18743 pts/0 00:00:00 RL pip-exec
--task
(-t
) Only the PiP tasks (excluding root) will be shown. If both of --root
and --task
are specified, then firstly PiP roots are shown and then PiP tasks will be shown. $ pips --tasks PID TID TT TIME PIP COMMAND 18741 18744 pts/0 00:00:00 0T a 18745 18745 pts/0 00:00:00 0G b 18746 18746 pts/0 00:00:00 0L c 18747 18747 pts/0 00:00:00 1L c 18741 18748 pts/0 00:00:00 1T a 18749 18749 pts/0 00:00:00 1G b 18741 18750 pts/0 00:00:00 2T a 18751 18751 pts/0 00:00:00 2G b 18741 18752 pts/0 00:00:00 3T a
--family
(-f
) All PiP roots and tasks of the selected PiP tasks by the PATTERN
optional argument of pips
. $ pips - a PID TID TT TIME PIP COMMAND 18741 18744 pts/0 00:00:00 0T a 18741 18748 pts/0 00:00:00 1T a 18741 18750 pts/0 00:00:00 2T a $ pips --family a PID TID TT TIME PIP COMMAND 18741 18741 pts/0 00:00:00 RT pip-exec 18741 18744 pts/0 00:00:00 0T a 18741 18748 pts/0 00:00:00 1T a 18741 18750 pts/0 00:00:00 2T aIn this example, "pips - a" (the - is needed not to confused the command name
a
as the pips
option) shows the PiP tasks which is derived from the program a
. The second run, "pips --family a," shows the PiP tasks of a
and their PiP root (pip-exec
, in this example).--kill
(-k
) Send SIGTERM signal to the selected PiP tasks. --signal
(-s
) SIGNAL
Send the specified signal to the selected PiP tasks. --ps
(-P
) This option may be followed by the ps
command options. When this option is specified, the PIDs of selected PiP tasks are passed to the ps
command with the specified ps
command options, if given. --top
(-T
) This option may be followed by the top
command options. When this option is specified, the PIDs of selected PiP tasks are passed to the top
command with the specified top
command options, if given. PATTERN
The last argument is the pattern(s) to select which PiP tasks to be selected and shown. This pattern can be a command name (only the first 14 characters are effective), PID, TID, or a Unix (Linux) filename matching pattern (if the fnmatch Python module is available). $ pips - *-* PID TID TT TIME PIP COMMAND 18741 18741 pts/0 00:00:00 RT pip-exec 18742 18742 pts/0 00:00:00 RG pip-exec 18743 18743 pts/0 00:00:00 RL pip-exec
pips
collects PiP tasks' status by using the Linux's ps
command. When the --ps
or --top
option is specified, the ps
or top
command is invoked after invoking the ps
command for information gathering. This, however, may result some PiP tasks may not appear in the invoked ps
or top
command when one or more PiP tasks finished after the first ps
command invocation. The same situation may also happen with the --kill
or --signal option.


The videos from JuliaCon 2020 are on YouTube, over 150 of them, and I’ve been watching quite a few. Have you been tempted to start skipping the first 17 seconds of some of them? Well, here are a few paragraphs that might make sitting through the JuliaCon2020 “station ident” a litle bit more interesting — for a while, at least.
At first, I wanted to use the beautiful skyline illustration showing lots of world-famous buildings. This is another in the series of city skyline stock images that Avik (one of the JuliaCon organizing team) manages to find each year, whatever the location.
I was tempted to animate it somehow, but I couldn’t think of a good way to do it without it looking like a terrible cartoon. Besides, the SVG file was an unstructured collection of 6000 polygons. And it was already getting a lot of usage.
It’s always a good idea to avoid graphical clichés, but it was difficult to resist using a world map or globe of some sort for a world-wide global event. I remembered I had some old shapefile-reading code, long since abandoned (because it was more complicated than I thought), so I loaded up Shapefile.jl and trusty old Luxor.jl, and threw some shapes onto the canvas.
using Shapefile, Luxor
include(joinpath(dirname(pathof(Luxor)), "readshapefiles.jl"))
countries = open(worldshapefile) do f
read(f, Shapefile.Handle)
end
...
for shape in countries.shapes
randomhue()
pgons, bbox = convert(Array{Luxor.Point, 1}, shape)
for pgon in pgons
poly(pgon, :fill)
end
end
...
There are problems here. First, it's the old Mercator projection; it’s probably the most familiar view of the world, despite being a not-very accurate way to view it with any sense of proportion. And Antarctica just looks wrong, spread across the bottom like that...
Second, it's a bit dull. I tried a few ways to make the map more interesting. To get the grid effect below I created a Tiler, then tested each cell to see whether it was inside a country polygon or not. And I added some wavy sine waves to avoid huge areas of empty ocean.
(The code for that circular logo itself is just:
...
cols = [Luxor.julia_green, Luxor.julia_red,Luxor.julia_purple, Luxor.julia_blue]
for (n, θ) in enumerate(range(0, stop=2π, length=36))
sethue(cols[mod1(n, end)])
arrow(O - polar(230, θ), O + polar(230, θ), [50, 50],
decoration = 0.0,
decorate = () -> circle(O, 5, :fill),
linewidth = 2)
end
drawjuliaconlogo(O, 0.5)
...
)
But it didn't click.
However, a bigger problem for me is that the Mercator world map is a geographic, geocentric, ‘landmass-oriented’ view, with some political boundaries added. But a worldwide virtual online conference such as JuliaCon 2020 is about people; people reaching out and communicating with each other, forming communities and partnerships, and this doesn’t come across in a simple map view.
I thought about plotting Julia contributors on a map, inspired by this nice post “Where are the Julians?” by Dr Júlio Hoffimann. But the distribution is still, to be honest, a little sparse, and I wasn’t sure about targetting individuals so precisely.
Browsing through some folders led me to a CSV file of about 3000 world airports, with latitude/longitude coordinates, and I tried plotting those instead of the countries’ outlines.
I thought this worked better (if not perfectly). The graphic was now a bit more about human beings, and where they lived, or at least where some of them and their supplies got on and off aircraft. The squares indicate the population centres better. The use of unscaled symbols emphasized the communication links of smaller islands and communities, which would be lost if I’d drawn shapes proportional to population numbers, say. For example, the small islands in the Pacific ocean are at least as visible as the densely packed squares in Europe and the coasts of the Americas.
There are still areas of emptiness — you can see the sparsely populated areas of Northern Africa, Russia, Namibia, the rain forests of South America, and the empty wilderness in the heart of Australia.
I’d converted the latitude and longitude values into rows and columns of 1s in a sparse matrix. I was intending to explore the idea of initially rendering the world as a coarse grid of large squares and then gradually refining it by taking smaller and smaller views. I didn't get round to it. (Perhaps I'll use the upcoming Javis.jl to try this out one day.)
One nice feature about the forthcoming Julia 1.6 release is the improved display of sparse matrices in the REPL. Instead of this:
You’ll see this:
This uses characters with Unicode values \U2800
to \U28FF
. Make sure you’re using a monospaced font that includes them. There are a few floating around.
But in the end I didn’t need to do much more to it, other than choose random Julia colors.
...
tiles = Tiler(1200, 800, size(matrix)...)
juliacolors = [Luxor.julia_purple, Luxor.julia_blue, Luxor.julia_red, Luxor.julia_green]
for (pos, n) in tiles
if matrix[n] == 1
sethue(juliacolors[rand(1:end)])
box(pos, 3, 3, :fill)
end
end
...
I got sidetracked researching some of these dots. For example, I wondered what this particular dot was — the airport that gets quickly covered by the incoming JuliaCon2020 logo, halfway between South America and Africa. It’s called Wideawake Airfield, named after a noisy colony of sooty terns nearby. This is Ascension Island, for historical reasons a strategically-placed military base for the UK and USA.
That cluster of dots in the Atlantic are the Azores, part of Portugal, due west of Lisbon... Perhaps we’ll all meet there next year.
Two of the most northerly lights are Alert, Canada (the northernmost permanently inhabited place in the world), and Svalbard (Norway). Svalbard is the location of the GitHub Arctic Code Vault, stored in a decommissioned coal mine. Lots of Julia code is stored there, frozen for posterity.
It was also a useful reminder that data sources are often imperfect. Even if all the locations have valid latitude and longitude values, it would be quite a task to check every entry. For some countries, such as China and Namibia (that empty area on the west coast of Southern Africa), I was puzzled and checked them out — there were fewer squares than I'd expected to see.  There are also some entries that specify airports that I can’t find any references to.
Which leads me to Mountweazels.
It was only when I saw the first video on the first day of JuliaCon that I realised I’d made a mistake. Technically, this was a deliberate mistake that I’d made a few years ago, but which had now become an accidental mistake, because I’d forgotten to remove it.
I’d been reading about Mountweazels. A Mountweazel is a fictitious or spurious entry in an otherwise trusty reference. A non-existent word in a dictionary, a fictitious place on a map. They’re not really “Easter eggs”, because I don’t think they’re supposed to be found. They might be inserted by someone with a sense of mischief, but, more usually, they’re put in deliberately by the creators as a way of preventing or proving unauthorized copying.
I had added a fictitious airport to the CSV file, “just for testing purposes”, and I’d forgotten to remove it.
If you want to find it: start at the right hand side of the swirly JuliaCon2020 logo, and travel due East, for about the width of the letter “n” in “juliacon”. That square isn’t Agatti Island or Diego Garcia Island. It’s the famous - or infamous - island that made its first appearance in 1977. I’ll leave the pleasure of (re-)discovering it to you!
[2020-08-13]


| 2.5 | Travel time for each aircraft, in hours |
| 26.0 | Fuel consumption for each aircraft, in kg per hour |
| 65.0 | Total fuel consumption for each aircraft, in kg |
| 10.0 | Total turnaround time this round, in hours |
| 12.5 | Total travel time this round, in hours |
| 22.5 | Total time consumed by operations this round, in hours |
| 650.00 | Operating cost for each aircraft, in pd |
| 6,500.00 | Total operating cost this round, in pd |
| 1,000.00 | Reminder: Fixed cost this round, in pd |
| 7,500.00 | Total cost this round, in pd |
| 50 | Available seats this round |
| 10,000.00 | Potential revenue if all seats sell |
| 2,500.00 | Potential profit if all seats sell |


A clone of the infamous GMod gamemode; one team plays as hunters whilst the other has to disguise and blend in with objects around the map.
Prop players are given a small amount of time to move away from the hunters, choose their prop and hide; afterwards the hunter team moves out and attempts to find and kill the prop players. At the end of each round the new round teams are randomized with roughly half hunters and half props, anyone joining or dead can spectate the map with a flying camera view.
Prop controls: WASD Space, E (Change prop), R (Rotate), Q (Zero velocity)
Hunter controls: WASD Space, R (Reload), Mouse1 (Fire)
Made in Unity3D with Unity networking (not Photon), models created using blender and animated within Unity.