How gio_motion designed and built his own keyboard
original post:
- https://imgur.com/a/jq0plEy
- https://www.reddit.com/r/MechanicalKeyboards/comments/cdgdgz/how_i_designed_and_built_my_own_keyboard_costs/
How I designed and built my own keyboard [Costs and Resources]
by u/gio_motion
I recently built the keyboard I designed and I wanted to talk about the design process, which tools I used, which resources I found online and the problems I encountered.
I have a lot of useful links to share, but Imgur is putting spaces in the middle of all of them! I’m sorry about it, you’ll have to delete the extra spaces.
Design-wise, I’m a huge fan of Braun, but they never made keyboards, so I wanted to make mine as if it was part of a Braun product line-up from the 70s. Also one of my favorite keyboards of all time is the Data General Dasher, so I think my design tries to answer the question “what if the Dasher was made by Braun but with a modern layout?” Pinterest is great to gather references, I highly recommend the Pinterest Chrome Extension to quickly save the images you come across.
This is the moodboard I made:
https://pinterest.it/bocchigiovanni/keeb/
The design I chose is called a Tray Mount, you can learn more about keyboard design following these links:
Keyboard Construction Explained by Brian Lee:
https://brianlee.blog/2018/11/23/guide-keyboard-construction-explained/
Custom keyboard mounting styles by Thomas Baart:
https://thomasbaart.nl/2019/04/07/cheat-sheet-custom-keyboard-mounting-styles/
Basically the plate keeps together the switches, the switches are soldered to the PCB, and the PCB is screwed to the case.
Then I headed over at http://keyboard-layout-editor.com/ and found out which layout I actually needed. It’s a keyboard meant for office use and I’m a 3D animator, so I can’t really work without the numpad. Ths layout has all the keys I need for my work and nothing more.
Once you have your layout, just copy the data from the Raw Data tab and go to this awesome website to generate the DXF file of your plate: http://builder.swillkb.com/. Here you can choose which type of switch you are going to use and which type of stabilizers. For my build I chose Aliaz switches (they are MX mount), which are silent and tactile, and Cherry PCB-mount stabilizers. Here i also downloaded the CAD drawing of the plate.
It is at this point that I started to look for what keycap set to use. In the end I chose the Black DSA set from PMK:
https://pimpmykeyboard.com/dsa-black-white-keyset/
I’ll talk more about the shopping list later. I really like that the DSA profile has the same height for all the rows, it makes it easier to come up with unconventional layouts without worrying about different heights.
Before jumping into CAD, I made a quick concept render in Cinema 4D, one of the softwares I use in my work. It’s not free, but if you want to experiment with shapes, colours and materials without worrying about tolerances and other manufacturing holdups, Blender is a free open source software which will help you focus on the design side of your keyboard. If you are skilled in CAD modeling feel free to start your concept there, I just happen to be more familiar with 3D rendering softwares. Also, your final concept will look more convincing if done with a proper 3D rendering engine (I used Redshift, Blender has Cycles).
I imported the DXF file and I extruded it of 1,5mm, which is the thickness MX switches require to clip. I also used these DSA 3D models I found on Thingiverse:
https://thingiverse.com/thing:2172302
This was my final concept.
Once I was happy with the look, I started to learn about custom PCBs. I thought about hand-wiring it, but the idea of making my own PCB seemed way more fun. I still wasn’t feeling comfortable about my soldering skills, so I ended up with using the PCB only to wire the keys together and to provide a socket for the microcontroller, which is a Teensy 2. To wire together the columns and rows I recommend heading over at Keyboard Firmware Builder and pasting your keyboard layout from KLE, and the website will make you a visual guide for your wiring. We’ll get back to that website once we are ready to compile the firmware. Choosing a controller is all about the pins, you need one with at least as many pins as the sum of your keyboard’s columns and rows. For me it was 25, and the Teensy 2 has just that, 25 pins! You can fit more columns and rows if you get creative with the wiring, but I didn’t have to.
If designing a PCB scares you, fear not! I followed this awesome guide by u/ai03:
https://wiki.ai03.me/books/pcb-design/chapter/pcb-designer-guide
The guide is very easy to follow and uses a free software called KiCad. It explains how to implement the microcontroller directly in the board, but instead I just grabbed a Teensy 2 footprint from the library provided in the guide and slapped it on the board. With this design, you just have to solder the switches, the diodes, the the Teensy itself with some header pins (they are cheap on Aliexpress).
This is what my PCB schematics looks like
And this is what my PCB layout looks like
From KiCad you can export a 3D model of the PCB, which is going to be very useful for our CAD drawing.
Above is the USB Type-C pinout diagram.
The Teensy 2 is a mini-usb controller and I just couldn’t accept that. A device made in 2019 deserves to have a USB type-C connector and cable, so I made sure to implement that. My solution was to buy a USB-C daughter board and manually wire the pins to the mini-USB connector of the Teensy.
This is the board I got, it’s made by Pololu:
https://coolcomponents.co.uk/products/usb-2-0-type-c-connector-breakout-board
One thing that is very cool, is that before buying it you can download a 3D model of the connector, again, very useful for the CAD drawing.
You can also get a 3D model of the Teensy here:
https://grabcad.com/library/teensy-2-0-board-1
USB-C works a bit differently compared to an old school USB connector. What you need to know is that all the pins are doubled because the connector is reversible, and each pair that you want to use needs to be wired together (see picture above). Luckily this board does that for me and is ready to use, it also has a couple of resistors that connect the CC pins to ground. Some people online say that you need the resistors, some people say that you don’t, so here’s my take on it: if you want to connect your keyboard with a USB-C to USB-A cable, you don’t need any resistor. You can just wire the GND, D-, D+ and VCC pins respectively from one connector to the other and it will work (double pins still need to be paired). Instead, if you want to connect you keyboard with a USB-C to USB-C cable, it’s only going to work if you have those resistors in place that ground your CC pins. This basically tells your computer that the keyboard is a device, and not a source of power.
Now that we have every file we need, it is a good time to put everything together in a CAD software and design the actual shape of the case, to get it ready for 3D printing.  It is also much more intuitive than other CAD softwares, while also having specific tools for 3D printing. These are some useful videos about making an enclosure in Fusion360:
https://youtube.com/watch?v=E0bhdr84FNU
https://youtube.com/watch?v=g9mHhp_SHGE
https://youtube.com/watch?v=YxBamwc6s7U
I started by making the case, and then I imported the plate DXF and the PCB model, and I adjusted the case so that it would fit all the components. Then I made standoffs to support the PCB and holes in the plate to allow for the screws to go in. The distance between the top of the PCB and the top of the plate must be 5mm, to allow space for the MX switches.
The screws I’m using are M2 button-head hex drive screws, you can insert them in your project by going to Insert > McMasterCarr Component and choosing from the menu. I bought mine from eBay. Since the case is 3D printed, it is not possible to print a thread for such small screws, so what I did was making holes where a screw would go (like on the standoffs) with a 3,1mm diameter, so that I could then push inside a brass threaded insert using a soldering iron, to melt the plastic and glue it in place. The inserts I used are M2 Brass inserts I found on ebay, which have a 3,3mm diameter. Your hole needs to be 0,2mm smaller than the inserts, to make sure that it makes a tight fit.
Here’s a closeup of my USB port + daughter board.
I added some ridges at the bottom of the case to give it a bit more strength and to complete the design I made a top plate, 1,5mm thick, that closes the gap between the keys and the edge of the case. It was supposed to be held in place by magnets glued to the case (being made of mild steel), but in the end it turned out that the fit is so tight, that it just snaps into place. From then I exported the top plate sketch from Fusion into a DXF file, to be sent for laser cutting.
Since the case was going to be printed by an Ender 3 printer, I split it into 3 pieces (it’s a long keyboard), making sure to make some 2mm holes on the inner edge of every piece, to make it easier to glue it back together, like shown in this video (starting at 40:30) https://youtube.com/watch?v=PW35zmq8M5o
You can explore my CAD project in your browser:
CO$TS
Let’s talk money. Here’s how much I paid for each component, as well as the services I used. Note that I live in the UK, so your mileage may vary.
[Prices shown in British Pounds, all the prices include shipping]
Aliaz Switches x90 + Cherry stabs from KBDFans…………………..54£
Black DSA keycap set from PMK……………………………………………98£
Plate (aluminum) + Top plate (mild steel) at Laserboost………..97£
PCB x5 from JLCPCB……………………………………………………………..18£
Teensy 2 from Hobbytronics…………………………………………………18£
USB-C Breackout Board from Cool Components…………………….5£
Screws + Inserts + Diodes + mini usb connector from ebay…..13£
Tot……………………………………………………………………………………..303£
Luckily I didn’t have to spend money to print the case, because a friend of mine offered to help. If you don’t know anyone with a 3D printer, you may actually do, try asking around and if you are still unlucky you can head over to r/3Dprintmything and ask for help.
This shopping list doesn’t include the tools required, like the soldering iron, or the “consumables” like super glue or sand paper, which you may or may not already have. I’ll go over those shortly.
Electronic Assembly
I started with soldering the diodes. My design uses SMD diodes which are much faster to solder, and are not as difficult as many people think. I used 0,5 soldering wire from Mechanic and I followed these videos on YouTube:
https://youtube.com/watch?v=f9fbqks3BS8
https://youtube.com/watch?v=wEBrvfWwzuQ
The diodes need to be soldered in a specific direction: the arrow in your schematics indicates where the cathode is (the negative side) which is represented on the diode by a thin gray line, see picture above.
Once the diodes were in place, I soldered the pins of the Teensy on the PCB using some header pins with a 2,54mm pitch, I just bought some cheap ones from Aliexpress (100 for 0,90$). The reason I didn’t solder the Teensy in place is that its footprint is located on top of two switches to save space (see picture above) which means that if I solder the Teensy now I cannot solder the switches anymore. Next, I clipped, lubed and installed the stabilizers following this guide:
https://youtube.com/watch?v=u-HYNmtP1Hc
I then snapped the plate onto the PCB. This was tricky because it’s a long board (20 columns) and the PCB is prone to warping, so it required some brute force. With the plate in place on the PCB, I started to clip the switches onto it, making sure that the pins were straight (they get bent easily during shipping). I then soldered the switches, and than the Teensy. This was very dangerous because there was no way I could test the pcb before soldering all the swithces and the Teensy in place, but it was the only way to accomplish this design.
To connect the Teensy to the daughter board, I bought a USB mini connector on Ebay and I soldered 4 wires on it following the diagram above (you can ignore the ID pin), and then I soldered them to the USB-C board following the text on it.
Parts out of the 3D printer, an Ender 3.
The 3D printed parts (printed in PLA) had some under extrusion, which is a printing defect of some printers, basically some layers are the wrong thickness, and they leave lines like crevices on the print. To overcome this I sanded the prints with 220 grade sand paper to remove the outer imperfections and to prepare them to be primed with Rustoleum Primer, what will fill the crevices. Before doing that I glued them together using Loctite SuperGlue which works like a charm on PLA. I then used Polyfilla to seal the gaps, and then finally the primer (not before another round of sand paper). I then applied three coats of white matte paint.
Be sure to protect your thread holes with masking tape before priming and painting, so that they don’t get clogged.
The threads are very easy to insert, just heat up a soldering iron with a medium or large tip, and push them in. Be careful not to leave the iron there more than necessary or you risk melting the standoffs completely, follow this giude for more details:
https://matterhackers.com/articles/fasteners-for-3d-printing
Polyfilla applied after gluing
Rustoleum Primer applied
Matte white paint
After all that soldering, sanding, priming, and painting, it was finally time to put the whole thing together.
I secured the USB-C board with two M2 screws, and I attached the connector to the Teensy. Then I flipped the board over and I screwed it in place using a 1,3mm allen key.
The board wasn’t fitting all the way in, because of the header pins of the daughter board. So I had to chop them off, and they are still touching the PCB a bit, but it’s fine. I made sure to put a strip of electric tape on the pins to isolate them.
Finally the keycaps and the top plate, which initially wasn’t fitting at all! The bottom keys where jamming against it because the lower edge was too wide. So I had to use a file to file down the steel to be the right size.
Not fun.
After painting the top plate with Rustoleum Satin Black and snapping it on top, this is what it looks like.
FIRMWARE
I going to explain how to compile a firmware in the easiest way possible, which is using Keyboard Firmware Builder (https://kbfirmware.com/) to create a starting point. You could use that as your final firmware, but I recommend setting up a QMK environment on your computer to tweak it to suit your needs, in case you need more advanced functions like Unicode support or special keycodes.
KFB is very easy to use, just import your keyboard layout from Keyboard Layout Editor and a wiring diagram will appear. From then you just need to go through the tabs and give the website all the information it needs. In the Wiring tab you don’t need to do anything since your PCB should already be wired that way.
The Pins tab require you to specify which pins are your column and rows wired to. To do this I opened up KiCad and compared my schematics to the Teensy 2 pinout diagram, to find the name of the pins. For example I can see on the left that my ROW0 is wired to 21_A0, I look for pin 21 on the right and I find out that it is called F0, so in the website I link ROW0 to F0. I did this for all the pins.
The keymap tab is very straightforward, just click on each button and assign which key you want it to be. To create a momentary layer, assign M(1) to the key, so that when that key is held pressed, layer 1 will activate. I didn’t change any other setting and I downloaded the source code for later editing. if you are satisfied with the firmware as it is, you can hit the compile button and flash it on your keyboard. The Teensy 2 is very easy to flash, you only need a small software called Teensy Loader:
https://pjrc.com/teensy/loader.html
When the software is open, just push the button on the Teensy (or hit the soft reset shortcut on your keyboard), select your .hex file from the File menu, and hit the Program button followed by the Reboot button. The keyboard should now be perfectly functional! I won’t go into the manual programming of the keyboard because I’m not an expert, but you can learn more about it here:
The Complete Newbs Guide To QMK
https://docs.qmk.fm/#/newbs?id=the-complete-newbs-guide-to-qmk
ABOUT MY STLs
I learned a lot with this project, but i’d prefer not to share my STL and DXF files, because this is my first keyboard and they have a lot of defects, as I explained above. The case is super thin around the USB port, so it’s very fragile right now and there’s already a tiny crack. The steel top plate didn’t fit with my keycaps at first and I had to file it down, it’s still not 100% precise as of now, I’ll have to bend it in some way. The USB daughter board sits too high and grinds against the PCB, because of this the whole board sits in a warped position. The keys sit higher near the left and right edges, and are lower in the center and I’m not sure why.
You can have a look at the CAD project here: https://a360.co/2KE3Y0W if you want to make a similar design, but my STL files are not worth sharing in my opinion, since I have still much to learn. Feel free to message me at u/gio_motion or on Instagram at @gio_motion if you have any question! I hope this explanation is helpful to someone and I hope it will inspire more people to make their own design instead of buying a kit that doesn’t leave much space for customization.
Last thing, I still have 4 spare copies of my PCB, so if someone is interested just hit me up!
Gio


{% extends "base.html" %} {% block content %}
No one has registered.
{% else %}| Date | Name | Email Address | USD | mBTC | Received (mBTC) | BTC Price, $ | Payment Address |
|---|---|---|---|---|---|---|---|
| {{ registration_info.date_added|date:"m/d/Y" }} | {{ registration_info.full_name }} | {{ registration_info.email_address }} | {{ registration_info.get_payment_usd_str }} | {{ registration_info.get_payment_mbtc_str }} | {{ registration_info.get_received_mbtc_str }} | {{ registration_info.get_btc_price_str }} | {{ registration_info.btc_address }} |


Windows Tools VM¶
Overview¶
This Windows Server 2012 R2 image comes pre-installed with a number of tools, including:
- Microsoft Remote Server Administration Tools (RSAT)
- PuTTY, CyberDuck, WinSCP
- Sublime Text 3, Visual Studio Code
- OpenOffice
- Python
- pgAdmin
- Chocolatey Package Manager
Deploy this VM on your assigned cluster if directed to do so as part of Lab Setup.
Only deploy the VM once, it does not need to be cleaned up as part of any lab completion.Deploying Tools VM¶
In Prism Central > select > Virtual Infrastructure > VMs, and click Create VM.
Fill out the following fields:
- Name - Initials-Windows-ToolsVM
- Description - (Optional) Description for your VM.
- vCPU(s) - 1
- Number of Cores per vCPU - 2
- Memory - 4 GiB
- Select + Add New Disk
- Type - DISK
- Operation - Clone from Image Service
- Image - ToolsVM.qcow2
- Select Add
- Select Add New NIC
- VLAN Name - Primary
- Select Add
Click Save to create the VM.
Power on the VM.
Login to the VM via RDP or Console session, using the following credentials:
- Username - NTNXLAB\Administrator
- password - nutanix/4u


---
start: 2019-08-07 18:30
edition: 53
participate: "https://www.eventbrite.com/e/testing-conversational-ai-strategy-to-automation-tickets-65669544375"
talk: "https://goo.gl/forms/m9aPSXemMLPBj35k1"
subheader: "Testing Conversational AI - Strategy to Automation"
subnote: ""
agenda:
-
time: "6:30 pm - 7:30 pm"
title: "Testing Conversational AI - Strategy to Automation"
subtitle: "Last year was dominated by the smart devices and voice based home assistants. These use the conversational interfaces unlike other application to interact with. They are built using advanced algorithms, ranging from pattern and expression matching engines to natural language processing and AI/Machine learning techniques. These systems are constantly learning by themselves improving the intercations with the user bringing up the challenge in the testing world of non-deterministic output. To such interfaces, natural language is the input and we humans really love having alternatives and love our synonyms and our expressions using emojis gifs and pictures. Testing in this context moves to clouds of probabilities.
In this session I will cover the strategy for testing such interfaces, testing the NLP models and sharing experience on how to automate these tests and add it to the CI/CD build pipelines.
Key learnings:
* How What and why of a conversational interface?
* How can I build my testing approach for such an interface?
* What from my current toolset can I use for this new context?
* How do I automated and add it for my CI/CD pipeline for instant feedback?
* How do I measure the quality?"
speaker_profile: " By: Shama Ugale "
-
time: "7:30 pm - 7:45 pm"
title: "Break & Networking"
-
time: "7:45 pm - 8:30 pm"
title: "Continued..."
---


--- layout: post status: publish published: true title: '"Broody as all get-out" - Episode 8.22' author: display_name: Corey Fineran login: Corey email<EMAIL_ADDRESS>url: '' author_login: Corey author_email<EMAIL_ADDRESS>wordpress_id: 11867 wordpress_url: http://ivyenvy.com/?p=11867 date: '2016-05-19 22:45:27 +0000' date_gmt: '2016-05-20 03:45:27 +0000' categories: - Podcast tags: [] comments: [] ---
Thanks for downloading the 400th episode of The Ivy Envy Podcast.
On this episode, we start things off by reminiscing a little about the first 399 episodes of the podcast. We spend a little time on the series with the Brewers that we just wanted to be over with. Kurt previews the upcoming series with the Giants. We answer some listener questions...deciding who is the best pinch hitter in Cubs history. We finish off the episode with a Rube Waddell story.


Projects
ICTprojectmaster portal
I managed and led developing a web-based internal portal for LAMK BIT department, called ICTProjectAcademy (now ICTProjectMaster) which introduces student’s projects, and includes a number of different features for BIT teachers and students
Food ‘n’ stuff web application
I led developing and supported front-end team for creating a new web-based application, called Food ‘n’ Stuff which aims at creating shopping list according to the recipes, adding or removing foodstuff items and many different kinds of features for home cook and amateurs.
Playitaga.in
Playitaga.in is the small music tool that I created to fulfill the need of watching Youtube videos repeatedly.
Papersortingmood
Papersortingmood is the music web app for ESA Jakelut Sorting Paper Team, which is a collection of different genres of EDM songs that we usually listen while working.
TamCam
TamCam is a small project that I made to save every movies that I have watched with some of their quotes and soundtracks.
My Personal Website
This is the exact same site you’re currently viewing. So why is it listed anyway? For the sake of recursion, I guess!
LAMKRTC
The project that I and my thesis partner created while dealing with Continuous Delivery, Docker and WebRTC. It is pretty much like any other video conferencing applications that you’ve been using.


about+FAQs
hack
speak
team
sponsor
dAppcon
blog
A Department of Decentralization Hacker Extravaganza
//
Part of the
Berlin Blockchain Week
//
code of conduct
//
imprint
//
design inspired by Bauhaus
about+FAQs
hack
speak
team
sponsor
dAppcon
blog
A Department of Decentralization Hacker Extravaganza
//
Part of the
Berlin Blockchain Week
//
code of conduct
//
imprint
//
design inspired by Bauhaus
Hackathon:
23-25.08.19, Factory Görlitzer Park
Conference & Workshops:
21-22.08.19 at dAppcon (Technical University of Berlin)


PIZZA PIE!
Order now...
What's your name?:


Overview
VetterAppointments is a desktop application catered to vets to manage their employees, clients, pets and appointments. The vet interacts with the application mostly by a command line interface (CLI). The application, written in Java, has a graphical user interface (GUI) created with JavaFX.
This application was created by building upon an existing code base for an address book for the module CS2103T Software Engineering, and has around 20kLoC.
The purpose of this portfolio page is to demonstrate my software engineering experience and documentation skills gained from the above mentioned project.
Summary of contributions
-
Major enhancement: Added
listall
command-
What it does: The application will display all relevant details of the client that is queried, such as his/her pets and appointments, in a sidebar display
-
Justification: When dealing with a client, vets often require a quick overview of the client, so that the vet can easily check the client’s pets and upcoming appointments
-
Highlights: This command requires iterations through multiple lists, one time to find all pets that belong to the queried client, and another time to search for all appointments that belong to each pet. This command will update a separate sidebar display, instead of the individual lists. Hence much effort was also required to create the layout on the UI
-
-
Minor enhancement: Modified
list
command and created UI for list tabs and appointment display -
Code contributed: [Functional code] [Test code]
-
Other contributions:
-
Enhancements to existing features:
-
Documentation:
-
Community:
-
Contributions to the User Guide
Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Listing all information: listall
Since v1.5
Command format: listall INDEX
|
Index must be a positive integer. |
Description: Lists all the details of the client at the specified index, including all his/her pets and appointments.
Here is an example of using the command listall
:
-
listall 1
Figure 13 below shows the outcome upon executing listall 1
.
listall 1
.Listing all clients: list client
Since v1.2
Command format: list client
Description: Lists all clients in the program.
Here is an example of using the command:
-
list client
Figure 14 below shows the outcome of executing the list client
command.
list client
command.Listing all vet technicians: list vettech
Since v1.2
Command format: list vettech
Description: Lists all vet technicians in the program.
Here is an example of using the command:
-
list vettech
Figure 15 below shows the outcome of executing the list vettech
command.
list vettech
command.Listing all pets: list pet
Since v1.2
Command format: list pet
Description: Lists all pets in the program.
Figure 19 below shows the outcome upon executing list pet
.
list pet
command.Contributions to the Developer Guide
Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. |
List and display clients, pets and vet technicians
Current implementation
The side bar of the user interface implements a TabPane
with three tabs,
'Client', 'Pet' and 'Vet Tech' where clicking on each tab will show the
corresponding list. We will use the pet list to demonstrate the implementation.
The 'Pet' Tab
consists of a StackPane
called petListPanelPlaceholder
in the MainWindow.fxml
file.
In the MainWindow.java
file, the petListPanel
retrieves the updated list of pets from logic
, and the petListPanel
is added to petListPanelPlaceholder
to be displayed this way:
public class MainWindow extends UiPart<Stage> {
void fillInnerParts() {
petListPanel = new PetListPanel(logic.getFilteredPetList());
petListPanelPlaceholder.getChildren().add(petListPanel.getRoot());
// ...other placeholders...
}
}
The PetListPanel
is a ListView
which contains a list of PetCard
which is implemented this way:
public class PetListPanel extends UiPart<Region> {
@FXML
private ListView<PetCard> petListView;
private void setConnections(ObservableList<Pet> petList) {
ObservableList<PetCard> mappedList = EasyBind.map(
petList, (pet) -> new PetCard(pet, petList.indexOf(pet) + 1));
petListView.setItems(mappedList);
petListView.setCellFactory(listView -> new PetListViewCell());
}
}
The PetCard
contains a single pet and sets the pet’s details and the layout of the display of details.
Figure 4-10 below is a screenshot of the final displayed pet list, where each pet, for example 'Garfield',
is contained in a PetCard
, and the cards of all pets are presented in a list form by using PetListPanel
.
Aside from toggling the lists by clicking on the tabs, the list
command is implemented to take in a parameter
of either 'client', 'pet' or 'vettech' so that the list view updates appropriately when the list
command is used.
Depending on the parameter, the ListCommand
creates and adds ChangeListTabEvent
to EventCenter
, which is implemented this way:
public class ListCommand extends Command {
@Override
public CommandResult execute() throws CommandException {
switch (targetType) {
case "pet":
model.updateFilteredPetList(PREDICATE_SHOW_ALL_PET);
EventsCenter.getInstance().post(new ChangeListTabEvent(1));
break;
// ...other cases...
}
// ...return...
}
}
The MainWindow
then handles the ChangeListTabEvent
by changing to the corresponding list on the UI display,
and updates logic
with the index of the current list so that other commands like edit
and delete
can perform the command on the correct list, which is implemented this way:
public class MainWindow extends UiPart<Stage> {
@Subscribe
private void handleChangeListTabEvent(ChangeListTabEvent event) {
changeTo(event.targetList);
logic.setCurrentList(event.targetList);
}
private void changeTo(int list) {
Platform.runLater(() -> {
listPanel.getSelectionModel().select(list);
});
}
}
With this implementation, whether changing list by mouse-click or by command, the application always contains the index of the current list being viewed, so that the correct list will be displayed, and so that all other commands will be executed on the correct list.
Design considerations
Aspect: Implementation of toggling between lists
-
Alternative 1 (current choice): Client, Pet and Vet Tech lists are stored in three separate tabs, and an event is handled to toggle between the tabs to display the corresponding list
-
Pros: There are clickable tabs on the UI for easy toggling with both typing and mouse-click.
-
Cons: The
MainWindow
needs to handle the event to switch to the correct tab.
-
-
Alternative 2: Have a single display without tabs, and update it with either Client, Pet or Vet Tech list when the
list
command is executed-
Pros: There is no need to create a new event and handle it.
-
Cons: The displayed list needs to be updated every time
list
command is executed, reducing efficiency.
Choo Wen Xin
-
-
Major Enhancement: Support
listall
command and listing all appointments-
The UI will update and display all appointments in the main section of the application listed in date order, and in time order within each (date) section. This is for the vet to easily keep track of his/her appointments in chronological order.
-
The
listall
command will take in an index parameter specifying a client, and will then display all the pets and appointments of that particular client in a sidebar of the application. This is to easily see the relevant details when wanting to check a particular client. The appropriate display on the UI will also be created.
-
-
Minor Enhancement: Update
list
,edit
,delete
command and have display tabs for the lists-
The
list
command now takes in a parameter (either 'client', 'pet' or 'vettech') and theMainWindow
will handle the event created by thelist
command and toggle the tabs in the sidebar of the application and display the appropriate list for easy viewing and keeping track. The tabs can be toggled by mouse-click as well. -
The
edit
anddelete
commands will be updated so that it only affect the index of the currently viewed list.
-


This is a simple usage of mohsen1.schema-form
<form schema-form="{type: 'string', title: 'firstName' }" ng-model="simpleString"> <button class="btn btn-primary" type="submit">Submit</button> </form> <input ng-model="simpleString">
This demo demonstrate two way data binding and live ng-model
and schema-form
Attributes. Change model and the schema accordingly and click commit to see the changes.
In this example, schema is loaded via an XHR call.


- The context of the left table uses the "Soft-Delete" feature, and the right side does not.
- The "checking" field (the name in db is 'check') is the flag of deleting.
- You can delete any records in the left table, and it is going to disappear in the table. It's good to remember the "id" field's value that you delete.
- After deleting you should update this page. The checking field in the corresponding record of the right table is going to be set to "1".
Navigation Controls by INTER-Mediator
| id |
name |
mail |
category |
location |
checking |
|
|
|
|
|
|
|
|
| id |
name |
mail |
category |
location |
checking |
|
|
|
|
|
|
|


Twilio Verify iOS
Table of Contents
- About
- Dependencies
- Requirements
- Documentation
- Installation
- Usage
- Running the Sample app
- Running the sample backend
- Using the sample app
- Logging
- Errors
- Update factor’s push token
- Delete a factor
- Clear local storage
About
Twilio Verify Push SDK helps you verify users by adding a low-friction, secure, cost-effective, “push verification” factor into your own mobile application. This fully managed API service allows you to seamlessly verify users in-app via a secure channel, without the risks, hassles or costs of One-Time Passcodes (OTPs). This project provides an SDK to implement Verify Push for your iOS app.
Dependencies
None
Requirements
- iOS 10+
- Swift 5.2
- Xcode 11.x
Documentation
Installation
CocoaPods
CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate TwilioVerify into your Xcode project using CocoaPods, specify it in your Podfile
:
pod 'TwilioVerify', '~> 0.3.2'
Carthage
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate TwilioVerify into your Xcode project using Carthage, specify it in your Cartfile
:
github "twilio/twilio-verify-ios" -> 0.3.2
Swift Package Manager
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler. It is in early development, but TwilioVerify does support its use on iOS.
Once you have your Swift package set up, adding TwilioVerify as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/twilio/twilio-verify-ios.git", .upToNextMajor(from: "0.3.2"))
]
Register Your App with APNs
If you want to receive challenges as push notifications, you should register Your App with APNs. More info here
Usage
NOTE
The SDK should be used from a Swift class. See an example in the TwilioVerifyAdapter class
See Verify Push Quickstart for a step-by-step guide to using this SDK in a basic Verify Push implementation.
Running the Sample app
To run the Sample App:
- Clone the repo
- Change the Bundle Identifier to something unique so Apple’s push notification server can direct pushes to this app
- Enable push notifications
- Get the Access token generation URL from your backend (Running the Sample backend). You will use it for creating a factor
- Run the
TwilioVerifyDemo
project usingRelease
as build configuration
Running the Sample backend
- Clone this repo: https://github.com/twilio/verify-push-sample-backend
- Configure a Push Credential for the sample app, using the same APNs configuration
- Configure a Verify Service, using the Push Credential for the sample app
- Run the steps in the README file
Using the sample app
Adding a factor
- Press Create factor in the factor list (click on the +, top right)
- Enter the identity to use. This value should be an UUID that identifies the user to prevent PII information use
- Enter the Access token URL (Access token generation URL, including the path, e.g. https://yourapp.ngrok.io/accessTokens)
- Press Create factor
- Copy the factor Sid
Sending a challenge
- Go to Create Push Challenge page (/challenge path in your sample backend)
- Enter the
identity
you used in factor creation - Enter the
Factor Sid
you added - Enter a
message
. You will see the message in the push notification and in the challenge view - Enter details to the challenge. You will see them in the challenge view. You can add more details using the
Add more Details
button - Press
Create challenge
button - You will receive a push notification showing the challenge message in your device.
- The app will show the challenge info below the factor information, in a
Challenge
section - Approve or deny the challenge
- After the challenge is updated, you will see the challenge status in the backend’s
Create Push Challenge
view
Logging
By default, logging is disabled. To enable it you can either set your own logging services by implementing LoggerService and calling addLoggingService
(note that you can add as many logging services as you like) or enable the default logger service by calling enableDefaultLoggingService
. Your multiple implementations and the default one can work at the same time, but you may just want to have it enabled during the development process, it’s risky to have it turned on when releasing your app.
Setting Log Level
You may want to log only certain processes that are happening in the SDK, or you just want to log it all, for that the SDK allows you to set a log level.
- error: reports behaviors that shouldn’t be happening.
- info: warns specific information of what is being done.
- debug: detailed information.
- networking: specific data for the networking work, such as request body, headers, response code, response body.
- all: error, info, debug and networking are enabled.
### Usage
To start logging, enable the default logging service or/and pass your custom implementations
swift var builder = TwilioVerifyBuilder() #if DEBUG builder = builder.enableDefaultLoggingService(withLevel: .all) .addLoggingService(MyOwnLoggerService1()) .addLoggingService(MyOwnLoggerService2()) #endif twilioVerify = try builder.build()
Errors
| Types | Code | Description |
|---|---|---|
| Network | 68001 | Exception while calling the API |
| Mapping | 68002 | Exception while mapping an entity |
| Storage | 68003 | Exception while storing/loading an entity |
| Input | 68004 | Exception while loading input |
| Key Storage | 68005 | Exception while storing/loading key pairs |
| Initialization | 68006 | Exception while initializing an object |
| Authentication Token | 68007 | Exception while generating token |
Update factor’s push token
You can update the factor’s push token in case it changed, calling the TwilioVerify.updateFactor
method:
let updateFactorPayload = UpdatePushFactorPayload(sid: factorSid, pushToken: newPushToken)
twilioVerify.updateFactor(withPayload: payload, success: { factor in
// Success
}) { error in
// Error
}
See FactorListPresenter in the sample app. You should update the push token for all factors.
Delete a factor
You can delete a factor calling the TwilioVerify.deleteFactor
method:
twilioVerify.deleteFactor(withSid: factorSid, success: {
// Success
}) { error in
// Error
}
Clear local storage
You can clear the local storage calling the TwilioVerify.clearLocalStorage
method:
do {
try twilioVerify.clearLocalStorage()
} catch {
// Handle error
}
Important Notes
- Calling this method will not delete factors in Verify Push API, so you need to delete them from your backend to prevent invalid/deleted factors when getting factors for an identity.
Since
Since the Keychain is used for storage this method can fail if there is an error while doing the Keychain operation.


| fax2tiff - create a TIFF Class F fax file from raw fax data |
| fax2tiff [ options ] [ -o output.tif ] input.raw |
| Fax2tiff creates a TIFF file containing CCITT Group 3 or Group 4 encoded data from one or more files containing ``raw'' Group 3 or Group 4 encoded data (typically obtained directly from a fax modem). By default, each row of data in the resultant TIFF file is 1-dimensionally encoded and padded or truncated to 1728 pixels, as needed. The resultant image is a set of low resolution (98 lines/inch) or medium resolution (196 lines/inch) pages, each of which is a single strip of data. The generated file conforms to the TIFF Class F ( FAX ) specification for storing facsimile data. This means, in particular, that each page of the data does not include the trailing return to control ( RTC ) code; as required for transmission by the CCITT Group 3 specifications. The old, ``classic'', format is created if the -c option is used. (The Class F format can also be requested with the -f option.) |
| The default name of the output image is fax.tif; this can be changed with the -o option. Each input file is assumed to be a separate page of facsimile data from the same document. The order in which input files are specified on the command line is the order in which the resultant pages appear in the output file. |
| Options that affect the interpretation of input data are: |
| -3 |
| Assume input data is CCITT Group 3 encoded (default). |
| -4 |
| Assume input data is CCITT Group 4 encoded. |
| -U |
| Assume input data is uncompressed (Group 3 or Group 4). |
| -1 |
| Assume input data is encoded with the 1-dimensional version of the CCITT Group 3 Huffman encoding algorithm (default). |
| -2 |
| Assume input data is 2-dimensional version of the CCITT Group 3 Huffman encoding algorithm. |
| -P |
| Assume input data is not EOL-aligned (default). This option has effect with Group 3 encoded input only. |
| -A |
| Assume input data is EOL-aligned. This option has effect with Group 3 encoded input only. |
| -M |
| Treat input data as having bits filled from most significant bit ( MSB ) to most least bit ( LSB ). |
| -L |
| Treat input data as having bits filled from least significant bit ( LSB ) to most significant bit ( MSB ) (default). |
| -B |
| Assume input data was encoded with black as 0 and white as 1. |
| -W |
| Assume input data was encoded with black as 1 and white as 0 (default). |
| -R |
| Specify the vertical resolution, in lines/inch, of the input images. By default input are assumed to have a vertical resolution of 196 lines/inch. If images are low resolution facsimile, a value of 98 lines/inch should be specified. |
| -X |
| Specify the width, in pixels, of the input images. By default input are assumed to have a width of 1728 pixels. |
| Options that affect the output file format are: |
| -o |
| Specify the name of the output file. |
| -7 |
| Force output to be compressed with the CCITT Group 3 Huffman encoding algorithm (default). |
| -8 |
| Force output to be compressed with the CCITT Group 4 Huffman encoding. |
| -u |
| Force output to be uncompressed (Group 3 or Group 4). |
| -5 |
| Force output to be encoded with the 1-dimensional version of the CCITT Group 3 Huffman encoding algorithm. |
| -6 |
| Force output to be encoded with the 2-dimensional version of the CCITT Group 3 Huffman encoding algorithm (default). |
| -a |
| Force the last bit of each End Of Line ( EOL ) code to land on a byte boundary (default). This ``zero padding'' will be reflected in the contents of the Group3Options tag of the resultant TIFF file. This option has effect with Group 3 encoded output only. |
| -p |
| Do not EOL-align output. This option has effect with Group 3 encoded output only. |
| -c |
| Generate "classic" Group 3 TIFF format. |
| -f |
| Generate TIFF Class F (TIFF/F) format (default). |
| -m |
| Force output data to have bits filled from most significant bit ( MSB ) to most least bit ( LSB ). |
| -l |
| Force output data to have bits filled from least significant bit ( LSB ) to most significant bit ( MSB ) (default). |
| -s |
| Stretch the input image vertically by writing each input row of data twice to the output file. |
| -v |
| Force fax2tiff to print the number of rows of data it retrieved from the input file. |
| The following warnings and errors come from the decoding routines in the library. |
| Warning, %s: Premature EOL at scanline %d (x %d).n. The input data had a row that was shorter than the expected width. The row is padded with white. |
| %s: Premature EOF at scanline %d (x %d).n. The decoder ran out of data in the middle of a scanline. The resultant row is padded with white. |
| %s: Bad code word at row %d, x %dn. An invalid Group 3 code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white. |
| %s: Bad 2D code word at scanline %d.n. An invalid Group 4 or 2D Group 3 code was encountered while decoding the input file. The row number and horizontal position is given. The remainder of the input row is discarded, while the corresponding output row is padded with white. |
| Input data are assumed to have a a ``top left'' orientation; it should be possible to override this assumption from the command line. |
| CCITT Recommendation T.4 (Standardization of Group 3 Facsimile Apparatus for Document Transmission). |
| The Spirit of TIFF Class F, an appendix to the TIFF 5.0 specification prepared by Cygnet Technologies. |
| tiffinfo(1), tiffdither(1), tiffgt(1), libtiff(3). |


Tim Laing
Home
Projects
Blog
About
A reflection on the EDA experience so far
This is the blog template where all the content will go.


Responsive Table Generator
🚨 This app is no longer maintained or supported. It may not work. 🚨
If you experience problems using this application, such as an endless spinner, and you wish to provide a fix for those errors, please fork the repository and open a pull request with your fixes.
Alternatives to this application:
If you have used this application before February 17, 2018, please update your graphics to avoid a high-severity security vulnerability from Pym.js. If you use this product regularly and would like to contribute to its maintenance, please let us know.
This simple app generates a ready-for-deployment, embeddable, responsive version of a Google Spreadsheet from the spreadsheet key and some column formatting information.
It works best with tables that have 5-7 columns. Make sure you publish your spreadsheet to the web before using this generator.
Spreadsheet key or URL
Title
Google Analytics
Choose columns
Preview
Uploading
It's a simple as unzipping the contents of the .zip to a directory on your website.
Embedding the table
We're using pym.js to make our tables responsive when embedded via
.
To embed a table, you can use this snipped to get started:

Be sure to replace http://yourdomain.com/path/to/index.html
with the actual URL of your table.
Credits
This project built and maintained by the friendly nerds at the Institute for Nonprofit News.
Developers: Ryan Nagle and Ben Keith
This little project uses:
Check them out!


system mangler
`Prev `__
S
`Next `__
--------------
**system mangler**: n.
Humorous synonym for ‘system manager’, poss. from the fact that one
major IBM OS had a `*root* <../R/root.html>`__ account called SYSMANGR.
Refers specifically to a systems programmer in charge of administration,
software maintenance, and updates at some site. Unlike
`*admin* <../A/admin.html>`__, this term emphasizes the technical end of
the skills involved.
--------------
+---------------------------+----------------------------+---------------------------------+
| `Prev `__ | `Up <../S.html>`__ | `Next `__ |
+---------------------------+----------------------------+---------------------------------+
| system | `Home <../index.html>`__ | systems jock |
+---------------------------+----------------------------+---------------------------------+


---
title: 404 Page not found
body_class: page-error
---
{{page.title}}
{% include meta.html %}
{% include head-css.html %} {% include ghost_head.html %}
Whoops, looks like you're out of {{site.title}}... so 404 in yo' face!
The page you were looking for has either been moved, deleted, or doesn't exist. Click here or the button below to go back home.
{% include ghost_foot.html %}


Man arrested over attempted rape of teenage girl
TOKYO — Police in Tokyo have arrested a 22-year-old man on suspicion of attempting to rape a teenage girl in her apartment in Setagaya Ward.
According to police, Masaya Yoshida, a part-time worker living in Setagaya Ward, has admitted to the charge, Fuji TV reported. Yoshida is accused of entering a second-floor apartment at around 5 a.m. on Oct 16 and attempting to sexually assault the girl who lives alone. Police said he allegedly straddled his victim while covering her eyes and mouth. He fled after the woman fought him off.

Yoshida surfaced as a suspect after street surveillance camera footage showed him riding a bike away from the apartment building.
Later that same day, another woman living near the crime scene experienced a similar sexual assault. Police are questioning Yoshida about his involvement in that incident.
© Japan Today


November 2, 2020: I had a lot of fun appearing on the Underrated ML podcast discussing my choice for an underrated paper: Are all layers created equal? by Chiyuan Zhang and collaborators.
October 28, 2020: Our blog post on our recent line of papers evaluating the causal impact of selectivity is now out!
October 22, 2020: Check out our new position paper/perspective on falsifiable interpretability research.


Moflow
Fuzz Control
Toggle navigation
Overview
Crash Monitor
Job Management
Node Management
Configuration
Error Log


Decorated with butterflies, infant-sized coffins sent to measles-ravaged Samoa
SYDNEY: Volunteers in the New Zealand city of Rotorua are preparing two dozen white-lined coffins to be transported to Samoa at the end of the week as the measles-ravaged Pacific island nation languishes under a growing death toll that has now hit 70.
The smallest of the coffins, designed for the bodies of babies, are decorated with felt butterflies, daisies, stars and hearts. Volunteers have placed a teddy bear in each of the infant-sized caskets.
"It's not easy. No-one is prepared to lose that many children," said Tagaloa Tusani, a New Zealand-based volunteer who is organizing the coffin transport.
"No funeral home is prepared for that."
READ: WHO decries 'collective failure' as measles kills 140,000
The highly infectious disease has attacked Samoa's most vulnerable, with 61 out of the 70 casualties aged four and under, the government said on Monday (Dec 9).
After causing devastation in the Democratic Republic of the Congo, Madagascar and Ukraine, among others, measles cases started appearing en masse earlier this year in the New Zealand city of Auckland, a hub for travel to and from small Pacific islands.
The virus then took hold in Samoa which had the lowest vaccination rates in the region.
There are now almost 4,700 reported cases of measles in Samoa's island population of only 200,000.
The World Health Organization (WHO) last week described the global epidemic as "an outrage" given most deaths have been in children under five years old who had not been vaccinated.

Supported by foreign governments and international aid agencies, Samoa has been conducting a vaccination drive that the government said has now covered nearly 90 per cent of eligible people.
There are currently 16 critically ill children in intensive care in Samoa, and two pregnant women are also in hospital.
International groups have been sending medical supplies to Samoa, and providing doctors and nurses, to help combat the disease.
READ: UN says online anti-vaxxers fuelling Samoa measles deaths
The volunteers in Rotorua, located south-east of Auckland, usually make coffins for New Zealand families who can't afford them.
Volunteer coffin-maker Ron Wattam said he never imagined they'd be catering for an epidemic of this magnitude.
"The caskets are white, and white-lined inside, all made up to very suitable undertaker standards," said Wattam.
"It's the least we can do."


Dotted X
Pandemonium (in 1st cut of 2). Zamiel in council, seated on an illuminated
throne of skulls and flame, C; at back)
To R.+L. of centre lesser thrones, that on the right
occupied by Redglare the Recording Demon,
with flaming ink horn, pen of fire and open book, that
on the left by a secretary writing. At the foot of
the central throne two dwarf demon pages, with
wands, in attendance.
Music (95) at opening of scene. Fiends discovered
in a chorus of demoniacal yells and fiendish
laughter, dancing around a flaming chasm. After
the
warn flies for 7th scene
RTB (1) warning Ready Flash
Ready Gong
X Echo Laugh outside
After
(Music (96)
---be summoned
[dot] Gong strikes 12 times
Gong
(Music (97)
lightning +
thunder
Warning Bell for this trap
when Hertzog is on trap
[crossed circle] Ring TB (2) " descends
Flash fire through trap
Demons Dance Music (98)
R fly bell Closed in quick
Lights up
House lights down for
last scene
action is continued a brief time, Zamiel
waves his sceptre--Demons separate and form R. + L.
Zamiel
'Tis well! Let silence reign awhile, how stands the record
of the dying year? Has every seed brought sinful fruit--is
all the harvest gathered in--is every bond fulfilled?
Redglare
All, all, save one!
Zamiel
Who plays the laggard?
Redglare
One who sought to rival thy great power, Hertzog the Black
Crook!
All the Fiends
Ho! ho! ho!
(Echoed without and above, followed by a single, wild
blast of infernal music.
Zamiel
If when the brazen tongue of clamorous time, now trembling
on the midnights verge, proclaims the appointed hour, the
wail of no fresh soul, by him betrayed breaks on the air
of Hell, let him be summoned!
Music (96)
The demons utter a wild wail of delight and
dance around the chasm. The gong strikes twleve.
#
(97)
At the first
stroke the demons cease dancing and hold separate
pictures of exulatation. At the termination of each
stroke a single, brazen blast of demoniacal music. At the
twelfth stroke, loud
(98)
and continuous thunder. Demons utter a wild
cry. Zamiel rises, waves his
Ring fly Bell for 7th Scene
At chane (Music (
99 out
)
See all ready
for last (8th Scene
Exeunt Greppo + Carline
Ring fly Bell change slow
Warn slow curtain
sceptre,
the scene breaks away and discovers vistas of Pandemonium
teeming with Infernal life and wreaths of flame (in back cut
of 3) from which appear illuminated heads of demons, skeletons
and nondescript monsters.) Gong sounds. Hertzog is hurled through the air,
from L to R, and is dragged
on from R.H. by Fiends. Zamiel waves his sceptre. Hertzog is dashed into the
burning chasm. Demons howl and dance around till closed in.


Create a room or join an existing one
Create
OR
Join
Creation date
Room code
Participants
Capacity
Join
whites win
draw
blacks win
Raise bet
Connecting to the room...
Send


[PART III.] GENERAL PROVISIONS
Revision Note
This part, designated as part IV by L 2009, c 183, §5, is redesignated as part III pursuant to §23G-15.
[§339D-7] Regulatory authority. The department may adopt rules, pursuant to chapter 91, necessary to implement this chapter. [L Sp 2008, c 13, pt of §2]


...
apigee
Admin Portal
Loading...
Thanks for signing up for a spot on our private beta. We will send you an email as soon as we're ready for you!


This program will take the string entered into the box and upon button pressing will count the number of triples found in the string. This includes overlapping triples. Could be used for finding spelling mistakes or hunting out spooky ghosts woooooooooo!