Skip to content

Instantly share code, notes, and snippets.

View duanebester's full-sized avatar

Duane Bester duanebester

View GitHub Profile
@duanebester
duanebester / productPageAdmin.html.md
Last active March 8, 2019 15:58
Angular template diff
-<div>
-  <ru-page-header class="admin">
-    <main-left>
-      <h1>Product Manager</h1>
-    </main-left>
-    <main-right>
-      <a href="#/product_pages/new">
-        <button class="primary">Create New Product</button>
- 
@duanebester
duanebester / ProducerApp.scala
Created December 2, 2018 17:05
Kafka Akka Producer
import akka.Done
import akka.actor.ActorSystem
import akka.kafka.ProducerSettings
import akka.kafka.scaladsl.Producer
import akka.stream.scaladsl.Source
import akka.stream.{ActorMaterializer, Materializer}
import com.typesafe.config.ConfigFactory
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.common.serialization.StringSerializer
@duanebester
duanebester / ConsumerApp.scala
Created December 2, 2018 17:04
Kafka Akka Consumer
import akka.actor.ActorSystem
import akka.kafka.{ConsumerSettings, Subscriptions}
import akka.kafka.scaladsl.Consumer
import akka.stream.scaladsl.Sink
import akka.stream.{ActorMaterializer, Materializer}
import com.typesafe.config.ConfigFactory
import org.apache.kafka.common.serialization.StringDeserializer
import scala.concurrent.ExecutionContextExecutor
import scala.util.{Failure, Success}
@duanebester
duanebester / application.conf
Created December 2, 2018 17:02
conf file for kafka akka
akka {
kafka {
producer {
parallelism = 10
close-timeout = 60s
use-dispatcher = "akka.kafka.default-dispatcher"
eos-commit-interval = 100ms
kafka-clients {
bootstrap.servers = "localhost:9092"
}
@duanebester
duanebester / build.sbt
Created December 2, 2018 16:50
kafka-build-sbt
name := "kafka-test"
version := "0.1"
scalaVersion := "2.12.7"
libraryDependencies += "com.typesafe" % "config" % "1.3.3"
libraryDependencies += "com.typesafe.akka" %% "akka-stream-kafka" % "1.0-M1"
// Add class wrapping String for JSON Streaming
case class OcrString(ocr:String)
def imageOcr = Flow[BufferedImage].map(bi => {
val ocr = tesseract.doOCR(bi)
OcrString(ocr)
})
// Update route
path("image" / "ocr") {
import org.bytedeco.javacpp.{opencv_photo => Photo}
def enhanceMat = Flow[Mat].map(mat => {
val src = mat.clone()
Photo.fastNlMeansDenoising(mat, src, 40, 10, 40)
val dst = src.clone()
Photo.detailEnhance(src,dst)
dst
})
def bufferedImageToMat = Flow[BufferedImage].map(bi => {
val mat = new Mat(bi.getHeight, bi.getWidth, CV_8UC(3))
val indexer:UByteRawIndexer = mat.createIndexer()
for (y <- 0 until bi.getHeight()) {
for (x <- 0 until bi.getWidth()) {
val rgb = bi.getRGB(x, y)
indexer.put(y, x, 0, (rgb >> 0) & 0xFF)
indexer.put(y, x, 1, (rgb >> 8) & 0xFF)
indexer.put(y, x, 2, (rgb >> 16) & 0xFF)
}
val route =
path("image" / "process") {
post {
fileUpload("fileUpload") {
case (_, fileStream) =>
val inputStream = fileStream.runWith(StreamConverters.asInputStream())
val image: BufferedImage = ImageIO.read(inputStream)
val preProcessed: Source[ByteString, NotUsed] = Source
.single(image)
def imageDeSkew(skewThreshold:Double = 0.05) = Flow[BufferedImage].map(bi => {
val deSkew = new ImageDeskew(bi)
val imageSkewAngle = deSkew.getSkewAngle
if (imageSkewAngle > skewThreshold || imageSkewAngle < -skewThreshold) {
ImageUtil.rotate(bi, -imageSkewAngle, bi.getWidth() / 2, bi.getHeight() / 2)
} else {
bi
}
})