(by @andrestaltz)
If you prefer to watch video tutorials with live-coding, then check out this series I recorded with the same contents as in this article: Egghead.io - Introduction to Reactive Programming.
from subprocess import Popen,PIPE, check_output | |
import os, sys | |
import tempfile | |
import uuid | |
import cv2 | |
import pytesseract as pt | |
from PIL import Image | |
def convert_dpi(input_image): | |
path = tempfile.gettempdir() |
#Optimally resize `img` according to the bounding boxes specified in `boxes` (which is simply the (pruned) results from `pytesseract.image_to_data()`). | |
#Tesseract performs optimally when capital letters are ~32px tall (https://groups.google.com/g/tesseract-ocr/c/Wdh_JJwnw94/m/24JHDYQbBQAJ). Smaller text obviously can't be OCR'd as accurately, but weirdly enough, larger text causes problems as well. So, this function uses the bounding boxes we've found and resizes the image so that the median line height should be ~32px. | |
def optimal_resize(img, boxes): | |
median_height = np.median(boxes["height"]) | |
target_height = 32 #See https://groups.google.com/g/tesseract-ocr/c/Wdh_JJwnw94/m/24JHDYQbBQAJ | |
scale_factor = target_height / median_height | |
print("Scale factor: " + str(scale_factor)) | |
#If the image is already within `skip_percentage` percent of the target size, just return the original image (it's better to skip resizing if we can) | |
skip_percentage = 0.07 |
/** | |
* Date Format | |
* Copyright (c) 2011, marlun78 | |
* MIT License, https://gist.github.com/marlun78/bd0800cf5e8053ba9f83 | |
* | |
* Format options inspired by the .NET framework's format. | |
* http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx | |
* | |
* Non-formatting characters within the format string must be | |
* quoted (single (') or double (") quotes)! The same is true |
#!/bin/bash | |
COMMAND='puppet parser validate' | |
TEMPDIR=`mktemp -d` | |
echo "### Attempting to validate puppet files... ####" | |
# See https://www.kernel.org/pub/software/scm/git/docs/githooks.html#pre-receive | |
oldrev=$1 | |
newrev=$2 |
// ==UserScript== | |
// @name SaveFrom.net helper | |
// @namespace http://savefrom.net/ | |
// @version 2.70 | |
// @date 2014-07-12 | |
// @author Magicbit, Inc | |
// @description Youtube Downloader: all in one script to get Vimeo, Facebook, Dailymotion videos for free | |
// @homepage http://savefrom.net/user.php?helper=userjs | |
// @icon http://savefrom.net/img/extension/icon_16.png | |
// @icon64 http://savefrom.net/img/extension/icon_64.png |
{ | |
"presets": ["es2015"], | |
"plugins": [ | |
"add-module-exports" | |
], | |
} |
{ | |
// http://eslint.org/docs/rules/ | |
"ecmaFeatures": { | |
"binaryLiterals": false, // enable binary literals | |
"blockBindings": false, // enable let and const (aka block bindings) | |
"defaultParams": false, // enable default function parameters | |
"forOf": false, // enable for-of loops | |
"generators": false, // enable generators | |
"objectLiteralComputedProperties": false, // enable computed object literal property names |
(by @andrestaltz)
If you prefer to watch video tutorials with live-coding, then check out this series I recorded with the same contents as in this article: Egghead.io - Introduction to Reactive Programming.
#!/bin/sh | |
# Run the vagrant command for a particular project from anywhere. | |
# | |
# To use: | |
# 1. Put this file in ~/bin/ or some other executable path (also make sure the | |
# file is executable). | |
# 2. Insert the path to the directory containing your project's Vagrantfile | |
# where indicated below. | |
# 3. Rename this file to match the project you're using it for. |
echo "This is our provisioning script" | |
apt-get update | |
apt-get install -y python-software-properties python g++ make | |
add-apt-repository ppa:chris-lea/node.js | |
apt-get update | |
apt-get install -y nodejs | |
npm install -g grunt-cli |