月別アーカイブ 9月 2019

asaba 著者:asaba

【androidアプリ】写真情報確認アプリでexifを楽に操作する

今回のお題は、自分にとってはもう少し前に知っておきたかったなという感じの内容になります。

画像加工アプリにおいてexifの内容の取得は必須スキルですが、万一に備えてちゃんとほしい

exifが取れているか確かめたい時がありますよね。

自分は、「写真情報確認」というアプリを使っていたのですが、

どのexifが取れているかいい感じに判別してくれたので、これは良いと思い

さっそくお気に入りアプリの一つとして使っております。

アイコンはスクショにある信号機みたいなものです。

 

 

開いてみると、今まで自分が撮ってきた写真一覧が表示されます。

その中で赤・黄・青とシグナルがあるのですが、何を意味しているかというと

赤は「位置情報まで取れていますよ」、黄は「位置情報以外の情報が撮れていますよ」で、

青は「exif情報は存在しません」。の意味になります。

 

このシグナルに合わせてこのアプリでは様々なアクションを使うことができます。

画像を参照↓

 

 

 

例えば赤の状態だと、位置情報が付いたままなのでこのまま位置情報を悪用されない

ためにもexif削除機能を使うことが出来ます。

他にも、やっぱりアプリ内でexif情報を使いたいという時のためにもexif情報復旧機能も

備わっており、実際にexifを操作することもワンタッチでこなせます。

uiもわかりやすく、かなり自由の利く機能を備えていますね。

 

総合的に見てめちゃめちゃ使いやすいですが、android5.0だとちょっと重いかなと感じました。

android7.0以上だったらさくさく動けてストレスフリーでexif操作ができるので

おすすめです!

  • この記事いいね! (0)
著者:杉浦

【Laravel】public static function hogehoge()とpublic function scopeHogehoge()の使い分け

 LaravelのEloquentにはクエリビルダでチェーンを組むための命名規則に従ったメソッド作成方法があります。scopeHogehoge()とするとModel::hogehoge()とするとクエリビルダが走ります。この状態のまま次のようにチェーンを組めるのが利点です。

User::hogehoge()->orderBy('fuga')->limit(30);

 検索などでクエリの一部を使いまわしたい時などとても助かります。助かるのですが、この手法はモデルにも継承元であるEloquentにも記述されていないメソッドを呼び出しており、IDEのヘルパが効かず、警告も出力されます。次のようにコメントを記述することで対策できますが、コメントを経由して改めてscopeHogehoge()を検索する必要があります。

/**
 * @method static Builder|User newModelQuery()
 * @method static Builder|User newQuery()
 * @method static Builder|User query()
 * @mixin Eloquent
 *
 * @method static Builder|User Hogehoge()
 */
class User extends Model
{
    public function scopeHogehoge($query)
    {
        return $query->where('なんやかんや');
    }
}

 クエリが増えるにつれどんどんコメント→実際の記述と追うのが面倒になりだします。自分の知る使えそうな小技は二つです。一つはコメントの長大化の弊害がありますが次のようにコメントすることです。@seeはによってIDEはジャンプができる様になります。PhpStormならCtrl+Bです。

/**
 * @method static Builder|User newModelQuery()
 * @method static Builder|User newQuery()
 * @method static Builder|User query()
 * @mixin Eloquent
 *
 * @method static Builder|User Hogehoge()
 * @see   \App\Models\Eloquents\User::scopeHogehoge
 */
class User extends Model
{
    public function scopeHogehoge($query)
    {
        return $query->where('なんやかんや');
    }
}

 もう一つはstaticなクエリビルドメソッドを作ることです。Model::からクエリビルドする時はEloquentクラス中の次のメソッドが呼ばれています。これを使うことで任意のクエリをグローバルスコープ等欠けさせることなく使えます。staticなのでクエリビルド用の別クラスを用意することも簡単です。

class Eloquent
{
...
    /**
     * Begin querying the model.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public static function query()
    {
        return (new static)->newQuery();
    }
    /**
     * Get a new query builder for the model's table.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function newQuery()
    {
        return $this->registerGlobalScopes($this->newQueryWithoutScopes());
    }
...
}

 次が例です。再利用するあてのないメソッドならあと腐れなくstaticにできます。またこのstaticメソッドでビルダーを返せば、後にクエリビルド用のメソッドチェーンを続けることもできます。

public static function hogehoge($name)
{
    return self::query()->whereName($name)->first();
}
  • この記事いいね! (1)
takahashi 著者:takahashi

CentOS7に最新のMariaDB(10.4)をインストールする方法

MySQL互換のDBサーバーであるMariaDBは、 CentOS 7 リポジトリでも入手することができますが、リポジトリで利用できる最新パッケージがバージョン5.5となっていて、現時点で最新版の10.x系は入手することができません。

しかし、MariaDBの開発を主導するMariaDB Foundation が公式のリポジトリを公開しており、このリポジトリを使用すればCentOS 7 でもyumで最新版のmariaDBをインストールすることができます。

今回は、最新のMaridDBのインストール方法をご紹介します。

まず、MariaDB Foundationのダウンロードページへ移動します。

画像のように使用中のOS(CentOS 7)とそのバージョン(intel/AMDのCPUであればx86_64でokです。)を選択し、入手したいMariaDBのバージョンを指定します。(おすすめは[Stable]となっているバージョンです。)

すると下部にリポジトリの情報とインストールコマンドが表示されますので、CentOSに入れ込んでいきます。

まず、MariaDB 10.4のリポジトリをCent OSに登録します。

“/etc/yum.repos.d/” に、”MariaDB.repo” という名前で次の内容のファイルを作成します。

# MariaDB 10.4 CentOS repository list - created 2019-09-24 05:39 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ここまで出来たら、次のコマンドでMariaDBをインストールします。

sudo yum install --enablerepo=MariaDB,epel MariaDB-server MariaDB-client

インストールが完了したら、次のコマンドでバージョンを確認します。

mariadb --version

ちゃんと10系のMariaDBがインストールできました。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】「cordova-plugin-firebase-crashlytics」でFirebaseのCrashlyticsを導入

タイトル通り、Cordova で開発しているアプリに Google Firebase の Crashlytics を導入する方法です。
最初、Fabric がいいかな?と思ったのですが、こちらのサービスは Firebase と統合されるとのことでしたので、Firebase を使うことにしました。

GitHub のページはこちらから。

GitHub – ReallySmallSoftware/cordova-plugin-firebase-crashlytics: Google Firebase Crashlytics Cordova plugin
https://github.com/ReallySmallSoftware/cordova-plugin-firebase-crashlytics

 

インストールのコマンドは下記のとおり。

cordova plugin add cordova-plugin-firebase-crashlytics

GitHub に載っていたコマンドは cordova plugin add cordova-plugin-firebase-crashlytics --variable ANDROID_FIREBASE_CORE_VERSION=16.0.0 だったのですが、バージョンを指定しないとデフォルト値が指定されるとのことだったので省略しました。
特にインストール時にエラー等は発生しなかったので問題ないかと。

あとは、導入手順にそって下記のコードを追加すれば OK です。
下記のサンプルコードでは、キャッチされた例外をログに記録することができます。

var crashlytics = FirebaseCrashlytics.initialise();
crashlytics.logException("my caught exception");

なお、Firebase の導入には google-services.jsonGoogleService-Info.plist を設置する必要があります。
こちらについては、下記の Firebase 公式ドキュメントにリンクがありますので、そちらをご参考ください。

Firebase Crashlytics を使ってみる|Firebase
https://firebase.google.com/docs/crashlytics/get-started

また、iOS については Podfile に use_frameworks! を手動で追加する必要があるとのことでしたので、対応ください。
が、それだけでは連携できなかったので、上記の Firebase のドキュメントについても参考にしました。
でもなんか正しくない気がするので、要調整でしょうか。
一度設定をリセットしてからもう一度やり直そうかと思っています。

Android については、エラーは発生しないものの、アプリを実行しても Firebase と連携できず…。
一体何が悪いのか…判明したらまたまとめたいと思います。

 

以上、Cordova アプリに Firebase の Crashlytics を導入する方法でした。
とりあえず、現時点でのまとめなので、進捗あればまたご紹介します。
ご参考になれば幸いです。

  • この記事いいね! (0)
著者:杉浦

【Git】package.json上でコマンドとGitを連携させるためのhusky, lint-staged

 husky – npm
 lint-staged – npm
 huskyはGitのフックのほぼ全てをpackage.json上で定義できるパッケージです。フックできない部分はいずれもGitリポジトリを管理するサーバサイド用フックのみです。huskyのインストールと使い方は次の引用の通りです。

Install

npm install husky --save-dev
// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "npm test",
      "pre-push": "npm test",
      "...": "..."
    }
  }
}

typicode/husky: 🐶 Git hooks made easy#multiple-commands

 複数コマンドを実行するときはtypicode/husky: 🐶 Git hooks made easy#multiple-commandsにある様に、コマンド間を&&で区切るcmd && cmdかhusky個別の設定ファイルを用意します。すべてをpackage.jsonで完結させつつも、コマンドを&&で無理やり繋げない小技にnpm-run-all – npmを用いるやり方があります。次の様にあらかじめ小さいスクリプトを定義してnpm-run-allを介してまとめてhuskyで呼び出します。

{
    "scripts": {
        "php-cs-fix": "./vendor/bin/php-cs-fixer fix -vvv",
        "eslint": "./node_modules/.bin/eslint resources/**/*.{ts,js,vue} --fix",
        "php-unit-test": "php ./vendor/phpunit/phpunit/phpunit --configuration phpunit.xml tests/Unit --teamcity",
        "pre-commit": "npm-run-all eslint php-cs-fix",
        "pre-push": "npm-run-all php-unit-test"
    },
    "husky": {
        "hooks": {
            "pre-commit": "npm run pre-commit",
            "pre-push": "npm run pre-push"
        }
    }
}

 huskyだけでもコミット前のスクリプト起動漏れを防げて楽ですが、コミットのたびにフルでlintが走る上にlintで修正された分はコミット内容に含まれません。lint-stagedでこの問題を解決できます。
 lint-staged – npm
 lint-stagedはコミット用にステージングされたファイルの内、globで特定した対象のファイルについてのみ特定のコマンドを実行するパッケージです。対象ファイルはglob形式で指定します。大体*.{拡張子A,拡張子B}の様に指定するだけです。test絡みで通常のlintの対象にしたくない場合は!(*test).jsの様に!()を使います。!(*test).jsならばhogehoge.jsはlint, hogehoge.test.jsはnot lint。
 lint-staged実例として次のような設定をし、Hoge.jsとFoo.phpファイルをコミットしようとするとします。

{
    "lint-staged": {
        "*.{js,ts,vue}": [
            "eslint --fix",
            "git add"
        ],
        "*.php": [
            "php ./vendor/bin/php-cs-fixer fix -vvv --config .php_cs",
            "git add"
        ],
        "*.{json,css,scss}": [
            "prettier --write",
            "git add"
        ]
    }
}

 その様な場合、まず”*.{js,ts,vue}”の表現にマッチしたHoge.jsを引数として”eslint –fix Hoge.js”, “git add Hoge.js”が実行されます。Hoge.jsがESLintの自動修正によって修正され、Hoge.js全体がコミット対象になるわけです。これでコミット前に自動でlintが走り、lintの修正結果もコミット内に反映されます。Foo.phpでもphp-cs-fixerで同様にlintによる修正がかけられ、両方が終わった後に改めてコミットされます。
 husky, lint-staged, 各Linterを導入してpackage.jsonに次の様な記述を加えるとコミットのたびにLintが便利な形で走ってくれます。

{
    "husky": {
        "hooks": {
            "pre-commit": "lint-staged"
        }
    },
    "lint-staged": {
        "*.{js,ts,vue}": [
            "eslint --fix",
            "git add"
        ],
        "*.php": [
            "php ./vendor/bin/php-cs-fixer fix -vvv --config .php_cs",
            "git add"
        ],
        "*.{json,css,scss}": [
            "prettier --write",
            "git add"
        ]
    }
}
  • この記事いいね! (0)
著者:ym

ドローンを使った兵器

既に現場でドローンを使った攻撃も確認できているのですね。サウジへの攻撃の記事をいくつか見ました。

どこまでがAI化というか自動化されているかはわかりませんが、センサーやGPSによる追尾は昔からある技術なので、今更というところなのだろうか。ドローンという事で、小型化されたことが脅威と思いますが、 この様な小型の兵器が追いかけてくるとは恐ろしい。 今後世界はどうなるのだろうか。

  • この記事いいね! (0)
著者:ym

いまさらnsupdate

今日は BIND 9.11.11 が出たので、冗長構成の半分を更新。ついでに nsupdate 設定です。

SSL 証明書の更新作業が増えてきたので、DV認証をどうするか悩んだ結果、やはり DNS + メールを自動処理するしかないとなりました。当初は PowerDNS でデータベース化して更新を行うことも検討しましたが、既存のシステムとの連動もあり難しそうです。

Web 認証については、.htaccess の書き方やコンテンツによっては失敗する可能性が大きい為使えません。

DNS で SSL の DV 認証する場合は、手動で記述するか、または allow-update で受け入れるかとなるわけですが、nsupdateで受け入れると BIND の jnl ファイルからの反映が嫌いなんだよね。

さていつ完成するのやら。

  • この記事いいね! (0)
asaba 著者:asaba

【android】撮影した画像を即時にフォトアルバムに載せる

もうずいぶん前に作ったのですが、androidで写真を撮った時に速攻でフォト

アルバムに載せる関数について説明します。

androidの写真は、普通に撮影してもすぐには反映されず、撮った写真を

すぐに利用したいときはその弊害をもろに受けます。

こうなればandroidのデータベースに動的に登録してしまおうということで

データベースにアクセスしbitmapからファイルパスを生成して

そのまま保存してしまうことにしました。

<pre>// アンドロイドのデータベースへ登録する
private void registerDatabase(Bitmap bitmap) {
    ContentValues contentValues = new ContentValues();
    ContentResolver contentResolver = GetPictureActivity.this.getContentResolver();
    contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    File path = new File(MediaStore.Images.Media.insertImage(this.getContentResolver(), bitmap, "Title", null));
    contentValues.put("_data", String.valueOf(path));
    contentResolver.insert(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
}</pre>

これで、後はどこかのタイミングでbitmapを設定して写真が保存されていれば

成功です。

  • この記事いいね! (0)
著者:杉浦

オブジェクトのライフサイクルから見たモデルの分割

 プログラミングにおいてモデルを作る時は、大体何か一つのモノを表すモデルを作ります。何か一つというのが曲者でして、含意の広い一つのモノを対象にモデルを作るとコードが肥大することがあります(含意すべてを入れても小さい場合や共通処理から外れない場合があって、そういう時は問題が起きなかったり)。この分割の仕方にライフサイクルの観点から分割する方法があります。 モデルはある範囲のモノを抽象化して表現します。これを具象化してオブジェクトを作成する際、オブジェクトの操作を実行した後に保存する際にそれぞれ処理が入ります。ファイルシステムやデータベースに保存されている情報を表すモデルの場合は特にこれが顕著です。下図はEric Evans. エリック・エヴァンスのドメイン駆動設計 (Kindle の位置No.3058). 翔泳社. Kindle 版. からの引用図です。

 正直、図の完成度が高いです。モデルが肥大する兆候が見えたら図の矢印ごとに分割するだけでかなり整理できます。
 記事が短いので以下例の様なものを書きます。例ではDB(データベース)には既に値があり、保存はDBに行うと考えます。上図の再構成、格納、修正の部分を取り扱います。DBの一語だけであるモデルに関することを全てモデルの一クラスに記述すると破綻しそうなのが想像できます。少なくとも、再構成の際にDBへの問い合わせ方法(FROM table、PDOなど)が必要になり、柔軟な検索条件の取り扱いも高頻度で必要になります。格納の際にもDBで行えないバリデーション、複数の関係するデータについての同期が必要になります。これらの上でモデル自体の振る舞いについても必要になります。分割が必要です。
 DBの例では問い合わせ、格納、振る舞いの三分割ができます。フレームワークが備えていることの多いORM(オブジェクト関係マッピング)においては大体、問い合わせが隠蔽されています。データベース定義とコード内容を分離させたい際にのみ生成に関する追記が必要になるでしょう。格納もDB命令部は隠蔽されがちで関係設定が定義されいれば勝手に同期してくれます。バリデーションのみが必須です。ルールが複雑化する場合、あるルール一つを表すモデルを作るのもいいでしょう。残ったのは振る舞いです。これはアクティブ状態で直に参照できない方が問題の部分であり、インスタンス化されたモデルの本質といっていい部分です。

  • この記事いいね! (1)
村上 著者:村上

【Cordova】画像をリサイズできるプラグイン「cordova-plugin-image-resizer」

カメラプラグインで取得した画像をリサイズするときに使ったプラグイン「cordova-plugin-image-resizer」のご紹介です。
以前は違う方法でリサイズ処理を行っていたのですが、プラグインを探したらこちらの方が簡単!ということで乗り換えました。

今回使用したプラグインの GitHub はこちらから。

GitHub – JoschkaSchulz/cordova-plugin-image-resizer
https://github.com/JoschkaSchulz/cordova-plugin-image-resizer

 

インストールは下記のコマンドを使います。
が、こちらのプラグインはカメラプラグインの導入が必要とのことでしたので、インストールする前に、先にカメラプラグインをインストールしてください。

// カメラプラグイン
cordova plugin add cordova-plugin-camera
// 画像リサイズプラグイン
cordova plugin add https://github.com/protonet/cordova-plugin-image-resizer.git

あとは、下記のコードを追加すればOKです。
なお、サンプルコードはカメラプラグインで画像を取得するところから記述しています。

// カメラプラグインでアルバムから画像取得
var cameraoptions = {
  sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
  quality: 50,
  encodingType: Camera.EncodingType.JPEG,
  destinationType: Camera.DestinationType.FILE_URI
}
navigator.camera.getPicture(function(imageURI) {
  // 画像リサイズ
  let resizeoptions = {
    uri: imageURI,
    folderName: "[任意のフォルダ名]",
    quality: 70,
    width: 1000,
    height: 1000,
    base64: true,
    fit: false
  };
  window.ImageResizer.resize(resizeoptions,
    function(image) {
       // 画像リサイズ成功時の処理
    }, function() {
      // 画像リサイズ失敗時の処理 
    });
}, function(error) {
  // 画像取得失敗時の処理
}, cameraoptions);

10行目からのリサイズオプションで、画像 URI やリサイズ後の高さや幅、画質などを決定しています。
リサイズ後の画像パスは 20行目のファンクションの引数 image で取得できます。

また、環境の都合上、上記のコードでは リサイズ後の画像は base64 形式になっています。
こちらは 16行目で指定しています。

17行目の fit は、リサイズ後の画像を指定した幅・高さに合わせるかどうかを指定します。
こちらは Android のみに反映される設定です。

 

以上、画像のリサイズを行えるプラグイン「cordova-plugin-image-resizer」のご紹介でした。
ご参考になれば幸いです。

  • この記事いいね! (0)