JavaScriptでPDFファイルから画像を抽出する

JavaScriptでPDFファイルから画像を抽出するプログラムを書いた。

ソースコードはこちら。

PDFファイルの処理には、pdf.jsを使用した。

AndroidでZXingを使ってQRコードを読み取る

ZXing Android Embeddedを使って、QRコードを読み取るアプリを作る方法について。

読み取ったQRコードを方法

設定

build.gradleにライブラリを追加します。

repositories {
    jcenter()
}

dependencies {
    implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
    implementation 'com.android.support:appcompat-v7:25.3.1'   // Minimum 23+ is required
}

android {
    buildToolsVersion '27.0.3' // Older versions may give compile errors
}

AndroidManifest.xmlを編集し、ハードウェアアクセラレーションを有効にします。

<application android:hardwareAccelerated="true" ... >

QRコードを読み取る画面を開く

activity_main.xmlにButtonを追加します。
ボタンを押したらscanBarcode()を実行します。

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/scan_barcode"
    android:onClick="scanBarcode"/>

ボタンが押されたとき、QRコードを読み取るActivityを呼び出します。

public void scanBarcode(View view) {
    new IntentIntegrator(this).initiateScan();
}

オプションを指定することで、QRコード読み込み画面の細かい設定ができます。

public void scanBarcode(View view) {
    new IntentIntegrator(this)
            // 読み取ったときにビープ音を鳴らさない
            .setBeepEnabled(false)
            // 画面の向きを固定しない
            .setOrientationLocked(true)
            // 読み取るバーコードのフォーマットを指定する
            .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
            // アクティビティを設定する
            .setCaptureActivity(CustomScannerActivity.class)
            .initiateScan();
}

読み取ったQRコードを受け取る

読み取ったコードを受け取ります。

// Get the results:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(result != null) {
        if(result.getContents() == null) {
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

QRコード読み込み画面を自作する

QRコード読み込み画面を自作する方法を解説します。

画面デザイン

プレビューを表示するコンポーネントcom.journeyapps.barcodescanner.DecoratedBarcodeViewを配置します。

例)activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <com.journeyapps.barcodescanner.DecoratedBarcodeView
            android:id="@+id/barcodeView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:zxing_scanner_layout="@layout/custom_barcode_scanner"
    />

</androidx.constraintlayout.widget.ConstraintLayout>

DecoratedBarcodeView内部のデザインをカスタマイズする場合はapp:zxing_scanner_layoutにレイアウトを設定します。

例)custom_barcode_scanner.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <com.journeyapps.barcodescanner.BarcodeView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/zxing_barcode_surface"/>

    <com.journeyapps.barcodescanner.ViewfinderView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/zxing_viewfinder_view"/>

    <TextView android:id="@+id/zxing_status_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:background="@color/zxing_transparent"
            android:text="このテキストはbarcodeView.setStatusText()で設定できます"
            android:textColor="@color/zxing_status_text"/>
</merge>

ソースコード

DecoratedBarcodeViewを設定します。

読み込むコードの形式を設定します。

val formats = listOf(BarcodeFormat.QR_CODE)
barcodeView.barcodeView.decoderFactory = DefaultDecoderFactory(formats)

その他の設定はbarcodeView.cameraSettingsで設定できます。

    barcodeView.barcodeView.cameraSettings = CameraSettings()

コードを読み込んだときに実行するコールバックを設定します。

barcodeView.decodeContinuous(callback)

コードを読み込んだときの処理を作成します。

val callback = object : BarcodeCallback {
    override fun barcodeResult(result: BarcodeResult?) {
        if (result?.text == null || result.text == lastText) {
            return
        }
        lastText = result.text
        barcodeView.setStatusText(result.text)
    }
    override fun possibleResultPoints(resultPoints: MutableList<ResultPoint>?) {
    }
}

例)MainActivity.kt

class MainActivity : AppCompatActivity() {
    private var lastText: String = ""

    private val callback = object : BarcodeCallback {
        override fun barcodeResult(result: BarcodeResult?) {
            if (result?.text == null || result.text == lastText) {
                return
            }
            lastText = result.text
            barcodeView.setStatusText(result.text)
        }
        override fun possibleResultPoints(resultPoints: MutableList<ResultPoint>?) {
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val formats = listOf(BarcodeFormat.QR_CODE)
        barcodeView.barcodeView.decoderFactory = DefaultDecoderFactory(formats)
        barcodeView.decodeContinuous(callback)
    }

    override fun onResume() {
        super.onResume()
        barcodeView.resume()
    }

    override fun onPause() {
        super.onPause()
        barcodeView.pause()
    }
}

Ubuntu 18.04にdockerをインストールする

Ubuntu 18.04にdockerをインストールしたときの記録です。

インストールする

$ sudo apt-get install docker.io

インストールのテストをする

$ docker -v
$ sudo docker run hello-world

dockerグループにユーザーを登録する

dockerグループにユーザーを登録するとsudoが不要になる。

$ sudo groupadd docker
$ sudo gpasswd -a $USER docker

再起動後に、sudoが不要になったことを確認する。

$ docker run hello-world

Ruby技術者認定試験SilverとGoldに合格にしました。

Ruby技術者認定試験SilverとGoldに合格にしました。

これから受験する人のために、私が行った勉強方法をシェアします。

ちなみに、私は10年以上前、Rubyバージョン1.6から1.8の頃に、Rubyを使っていました。
Ruby on Railsも、バージョン2.1の頃まで使ったことがあります。

目次

  1. 注意点
    1. Rubyバージョン1.9の本やWebサイトに注意
    2. Rubyバージョン2.5に注意
  2. 試験対策用の教科書
  3. 試験対策用のWebサイト

1. 注意点

試験勉強を始める前に、気をつけること。

1-1. Rubyバージョン1.9の本やWebサイトに注意

現在のRuby技術者認定試験は、Rubyバージョン2.1が対象です。

その前には、Rubyバージョン1.9を対象とした試験がありました。

古い書籍やWebサイトでは、Rubyバージョン1.9を対象にしているものがあります。

書籍やWebサイトを利用するときは、対象としてるRubyのバージョンが2.1であることを確認してください。

1-2. Ruby2.5に注意

Rubyの最新バージョンは、バージョン2.5です。

試験の対象であるRubyバージョン2.1はかなり古いバージョンです。
現在では、アプリケーションを作成するときに、Rubyバージョン2.1を使うことはありません。

普段からRubyを使っている人は、使っているRubyと試験対象のRubyは動作の異なる点があることに気をつけてください。

2. 試験対策用の教科書

私は、『[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書』を使って学習し、Silver試験とGold試験の両方に合格しました。

この本は、バージョンによる違いが言及されている点が、特に良かったです。

バージョン1.9以降の変更点がわかる

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書』では、バージョン1.9以降の変更点が説明されています。
私は古いバージョン(バージョン1.8)の知識があるので、バージョン1.9からバージョン2.1までにあった変更がわかり、助かりました。

バージョン2.2以降の変更点がわかる

バージョン2.2以降の変更点も説明されています。

試験対象であるRubyバージョン2.1は、これから使うことはありません。
試験のためだけに実用性のない知識を身につけるのは無駄です。
この本なら、最新版のRubyでも使える知識を身につけることができます。

また、備考欄には、次のような他言語の経験者向けの注意もあって良かったです。

Rubyでは初期化メソッドは継承され、スーパークラスを暗黙的に呼び出すことはありません。(経験者が多いと思われる)Java言語とは異なるので注意してください。

3. 試験対策用のWebサイト

使ったWebサイト

試験対策に使ったサイトです。

使えそうなサイト

今回は使いませんでしたが、使えそうなサイトです。

使えないWebサイト

Rubyのバージョンが古いため、利用するときは注意してください。

追記

2018年12月17日追記

Ruby Certified Ruby Examination Goldの電子版の合格証書と合格者ロゴが届きました。

合格者ロゴ↓
合格者ロゴ