This is a quick-and-dirty guide to setting up a Raspberry Pi as a "router on a stick" to ExpressVPN.
This is adapted from SuperJamie's gist.
I used a Raspberry Pi 3 - seems like the extra speed may be useful for running VPN.
This is a quick-and-dirty guide to setting up a Raspberry Pi as a "router on a stick" to ExpressVPN.
This is adapted from SuperJamie's gist.
I used a Raspberry Pi 3 - seems like the extra speed may be useful for running VPN.
| //Finish a block of non-zero bytes by outputting the code to the current code pointer, | |
| //then setting the new code pointer to the current output destination, and incrementing | |
| //the output destination (essentially reserving a byte of output to be later set to the | |
| //code for the new run we are starting). Reset code to 0x01, for no bytes in the new run | |
| //we are starting. | |
| #define cobs_finish_block(X) (*code_ptr = (X), code_ptr = dst++, code = 0x01) | |
| void cobs_stuff_data(const uint8_t *ptr, size_t length, uint8_t *dst, size_t *stuffed_length) { | |
| const uint8_t *end = ptr + length; | |
| const uint8_t *dst_start = dst; |
| 195.3 ms13.41 % 195.3 ms13.41 % Chart.bundle.js:7736helpers.clone | |
| 194.0 ms13.32 % 194.0 ms13.32 % Chart.bundle.js:6333(anonymous function) | |
| 194.0 ms13.32 % 194.0 ms13.32 % Chart.bundle.js:6331Chart.controllers.line.Chart.DatasetController.extend.updateBezierControlPoints | |
| 192.8 ms13.24 % 192.8 ms13.24 % Chart.bundle.js:6148Chart.controllers.line.Chart.DatasetController.extend.addElementAndReset | |
| 192.8 ms13.24 % 192.8 ms13.24 % Chart.bundle.js:7577buildOrUpdateElements | |
| 192.8 ms13.24 % 192.8 ms13.24 % Chart.bundle.js:7218(anonymous function) | |
| 192.8 ms13.24 % 192.8 ms13.24 % Chart.bundle.js:7714helpers.each | |
| 192.8 ms13.24 % 192.8 ms13.24 % Chart.bundle.js:7203update | |
| 192.8 ms13.24 % 192.8 ms13.24 % :5000/elements/boxes-scatter/boxes-scatter.html:101(anonymous function) | |
| 192.8 ms13.24 % 192.8 ms13.24 % :5000/bower_components/polymer/polymer.html:1291(anonymous function) |
| { | |
| "_type_": "Person", | |
| "_id_": 0, | |
| "name": "name", | |
| "friend": { | |
| "_type_": "Option", | |
| "Some": { | |
| "_type_": "Person", | |
| "_id_": 1, | |
| "name": "q", |
| #include "ch.h" | |
| #include "hal.h" | |
| #include "stmdrivers/stm32f4xx_rcc.h" | |
| #include "stmdrivers/stm32f4xx_fsmc.h" | |
| void fsmc_early_init(void) { | |
| FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; | |
| FSMC_NORSRAMTimingInitTypeDef p; | |
| rccEnableAHB3(RCC_AHB3ENR_FSMCEN, FALSE); |
| public class ListBuilder { | |
| private final StringBuilder b = new StringBuilder(); | |
| public ListBuilder li(String s) { | |
| if (s!=null && !s.trim().isEmpty()) { | |
| b.append("<li>"); b.append(s); b.append(</li>); | |
| } | |
| return this; | |
| } | |
| public String toString() { |
| void mcu_generate_local_mac(uint8_t *mac) { | |
| uint32_t i = 0; | |
| uint32_t m_w = 0; | |
| uint32_t m_z = 0; | |
| for (i = 0; i < 4; i++) { | |
| m_w = (m_w << 8) + mcu_unique_device_id_byte(i*3); | |
| m_z = (m_z << 8) + mcu_unique_device_id_byte(i*3 + 2); | |
| } | |
| m_w += mcu_unique_device_id_byte(1) * 5 + mcu_unique_device_id_byte(7) * 7; |
| def plotSignal(c: Channel) = { | |
| def alternating(s: Boolean): Stream[Boolean] = s #:: alternating(!s) | |
| def y(s: Boolean) = if (s) 1 else 0 | |
| c.signal().changeTimes.zip(alternating(c.signal().initialState)).flatMap{case(time, state) => List(Vec2(time, y(state)), Vec2(time, y(!state)))} | |
| } |
| package boxes.util | |
| trait Op { | |
| def apply() | |
| } | |
| class OpDefault(action: => Unit) extends Op { | |
| def apply() { | |
| action | |
| } |