2019/03/13
ブラック企業を地図にマッピングし、周辺にブラック企業があればプッシュ通知で知らせてくれるアプリをリリースしました!
位置情報を利用して周辺にブラック企業があればプッシュ通知で知らせてくれるアプリ「ブラックアラート」をリリースしました !https://t.co/eqSJpnmy9W#ブラック企業 #ブラックアラート pic.twitter.com/OkaFtH5zQU
— ブラック企業通知アプリ@ブラックアラート (@blackalert_app) January 14, 2019
個人でwebサービスやアプリを開発している人に少しでも何かタメになることがあればと思いサービスを作ろうと思った経緯や使用技術などをずらずらと書いていこうと思います!
iOS
ブラックアラート - 周辺ブラック企業プッシュ通知アプリ
Android
ブラックアラート - 周辺ブラック企業プッシュ通知アプリ
位置情報を利用して周辺にブラック企業があればプッシュ通知で知らせてくれるアプリです。
去年、ブラック企業をマッピングした某webサービス様が話題になっていたのがきっかけで自分もiOSアプリで出したいと思いました。(わたしが開発者ではありません。)
ただ、ブラック企業をマッピングして表示するだけではオリジナリティにかけてしまうので周辺にブラック企業があれば通知するのはどうかというアイデアから生まれました。
厚生労働省が公表している「労働基準関係法令違反に係る公表事案」に掲載されている労働基準法等違反で書類送検された企業を指しています。
下記のサイトの「労働基準関係法令違反に係る公表事案」PDFファイルよりダウンロードできます。
長時間労働削減に向けた取組
私の独断偏見で追加はしておりません
以下は技術周りについてです
当アプリはAmazon s3にブラック企業一覧csvを配置し、ダウンロードしてRealmに保存しています。
対象PDF(労働基準関係法令違反に係る公表事案)をExcelに変換します。
smallpdfというサイトでPDFからExcelに変換しました。(他に何か良い方法あれば教えてください・・・!)
変換したExcelをRuby, Railsでcsvに書き出します。
Excel化した各項目をcsvとして書き出します。
Maps SDK for iOS にて地図にピンを配置するには、緯度経度の情報が必要です。
そのため、Places API を使いました。
こんな感じで簡単に緯度経度を取得できます。
result = @client.spots_by_query('東京都港区...')
最終的に下記のようなcsvとしAmazonS3にアップロードします。
id | name | address | longitude | latitude | public_date | detail | etc |
---|---|---|---|---|---|---|---|
1 | hogeカンパニー | 東京都港区... | 142.357 | 43.2 | H29.6.15 | トラクター・ショベルの運転を無資格の労働者に行わせたもの | H30.2.5送検 |
2 | fugaコーポレーション | 東京都豊島区.. | 143.357 | 43.3 | H29.6.17 | フォークリフトに接触するおそれがある箇所に労働者を立ち入らせたもの | H30.2.5送検 |
... | ... | ... | ... | ... | ... | ... | ... |
アプリ起動時の初回のみcsvをダウンロードし、csvの各カラムをRealmに保存し、ブラック企業を配置します。
※1日に1度だけcsvを再度ダウンロードし、増減チェックしてあれば更新するようにしています。
// ブラック企業モデル
import RealmSwift
class Company: Object {
let id = RealmOptional<Int>()
@objc dynamic var name: String? = nil
@objc dynamic var address: String? = nil
let longitude = RealmOptional<Double>()
let latitude = RealmOptional<Double>()
@objc dynamic var public_date: String? = nil
@objc dynamic var law: String? = nil
@objc dynamic var detail: String? = nil
@objc dynamic var etc: String? = nil
@objc dynamic var notification: CompanyNotification?
}
// 取り込み
let importBycompanies = List<Company>()
// csvをparseしてeach
for csvCompany in csvCompanyRows {
let company = Company()
company.id.value = id
company.name = name
company.address = address
company.longitude.value = longitude
company.latitude.value = latitude
company.public_date = public_date
company.law = law
company.detail = detail
company.etc = etc
importBycompanies.append(company)
}
// 書き込み
let realm = try! Realm()
try! realm.write {
for company in importBycompanies {
realm.add(company)
}
}
現在地が更新されたタイミングで一番近いブラック企業が一定の圏内にあれば通知しています。
また、何度も同じブラック企業の通知を防ぐために一度通知したブラック企業は24時間再通知をしません。
追記:随時更新予定。
質問などここらへんもっと詳しく説明して欲しいなどあればお気軽にどうぞ!(長文書き慣れていないので端折ってた部分とかあるのでw)