SpamBlocker
SpamBlockerは、iPhone/iPadで動作します。
iPadにおける操作法は、ビュー操作を除いてiPhoneと同じです。
IMAP/POP3をサポートします。
アクセスできるメールボックスは、受信、迷惑、ゴミ箱メールボックスだけです。
機械学習によるスパムフィルタリングの他に差出人、件名、本文、またそれらの複合条件をルールに指定することでスパムフィルタリングできます。
iCloudをサポートしており、機械学習データ、ルールデータをiCloud上で共有、iOSデバイス間で同期されるので、どのデバイスでも同じスパムフィルタリング、ルールフィルタリングが可能になります。
英語および日本語のメールを対象にします。
迷惑メール(スパムメール)対策は、PCの世界ではメーラーに組み込まれたスパムフィルタによる対策(クライアント側の対策)とメールサーバ側の対策がある。
サーバ側ではメールアドレスをブラックリストまたはホワイトリストと照合しスパムを駆除、またはなんらかの機械学習アルゴリズムにより生成されたスパムフィルタを使用してスパムを駆除する。
両方の方式を組み合わせてスパムを駆除する場合もある。
しかし、メールが迷惑であるか否かは個人の主観に依るので、サーバ側のスパム対策が各ユーザーの要求に100%応えることはない。
ユーザーの事情に応じたスパム対策をするのであれば、クライアント側でのスパム対策が不可欠になる。
これまではサーバ側のスパム対策を利用するだけで、iPhone単体ではスパム対策はできなかった。iPhone以外にPCを利用できる人はIMAPメールに限りPCメーラーのスパムフィルタを利用することができたが、運用上の不便さがつきまとっていた。
SpamBlockerは学習型のスパムフィルタを搭載しており、PCメーラーと同等それ以上のスパム対策をiPhone単体で可能にする。
SpamBlockerは受信メールからユーザーが選択した正常、迷惑メールを入力データとして学習を行うことでスパムフィルタを生成する。
SpamBlockerは、学習データとして迷惑メールのみを指定しても、アドレス帳に登録されているメールアドレスを参照して、INBOX内から正常データを適当に選択するので、アドレス帳にメールアドレスが登録されている場合は特に正常データを指定する必要がない。
ただし、精度が高いスパムフィルタリングをしたいのであれば、その都度正常メールを学習データとして指定したほうが良い。
SpamBlockerは、学習データとして指定した迷惑メール数が16を超えてから、受信メールは正常、迷惑メールへ自動分類(スパムフィルタリング)できるようになる。
ユーザーの判断で学習データを選択するので、要望に応じたスパムフィルタを作成できる。
このスパムフィルタをメールサーバサイドで提供されるスパムフィルタと組み合わせて使用すると強力なスパムフィルタリングが可能になる。
メールサーバで提供されるスパムフィルタの強度
サーバサイドで提供されるスパムフィルタの強度は低もしくは普通に設定しておくのが良い。
強に設定すると必要なメールまでも迷惑メールと判断される可能性が高まる。
サーバサイドで一般的な迷惑メールをフィルタリングし、クライアントサイドでユーザー事情に応じた迷惑メールをフィルタリングする。
iPadにおけるビュー操作を除いて両方のデバイスで操作法は同じ。
iPadにおいては最大で3個のビューを表示する。
ビューの増減は、左右のスワイプ操作で行う。
図1において、右にスワイプすると図2になり、左にスワイプすると図3になる。
図3において、右にスワイプすると図1になる。
ただし、メッセージ一覧のビューをスワイプすると、テーブルセルのスワイプになってしまうので注意を要する。
|
|
|
監視モニタは学習データの設定、学習•分類結果を確認するために使用する。
監視モニタはSpamBlockerに登録されているすべてのアカウントの受信ボックスと同期しており、受信ボックスのメールが日付順にソートされて監視モニタに表示される。
インストール直後の設定では監視モニタがオンになっている。監視モニタがオフの場合は、統合受信ボックスが表示される。
統合受信ボックスでは学習•分類結果の確認はできず、受信メッセージの確認のみになる。
編集ボタンをタップすると下の図のように学習データを指定できる。
|
⇒ |
|
監視モニタ内のテーブルセルの左端に表示されるマークの意味は次の通り。
編集中と編集完了後ではマークの大きさとマークの周りに灰色の縁取りがあるか否かの違いがある。
メッセージ一覧のプル・ダウンまたはナビゲーションバーの長押しで新規メッセージのダウンロード、スパムフィルタリングを行う。
未学習データがある場合は、学習を行い、スパムフィルタを更新する。
プル・ダウンによる |
|
|
メッセージ一覧の最後尾でのプル・アップにより既存メッセージのダウンロード、スパムフィルタリングを行う。 一度にダウンロードするメッセージ数は、設定できる。
メールメッセージ一覧のナビゲーションバーをタップするとメールボックスが切替わる。 ナビゲーションバーの左スワイプは、タップと同じ動作をする。右スワイプは、直前のメールボックスに戻る。
|
⇒ |
|
“INBOX”、”迷惑メール”、”ゴミ箱”において編集ボタンをタップすると、ナビゲーションバー上に”マーク”,”削除”,”移動”ボタンが表示され、 メッセージの未読、削除、移動処理ができる。
下方向にスワイプすると次のメッセージが表示される。
上方向にスワイプすると前のメッセージが表示される。
スワイプダウン |
|
スワイプアップ |
Inbox、統合受信ボックス、監視モニタにおいてメール・セルを左から右にスワイプすると、セル内に背景が黒と赤のボタンが表示される。 黒の背景ボタンをタップするとメールをブラックリストへ登録でき、赤の背景ボタンをタップするとメールをスパムメールとして登録できる。
Inboxまたは統合受信ボックス内でスワイプ&タップ操作でスパムメールを指定できる。Inboxまたは統合受信ボックスメール一覧において、メール一覧のプル・ダウンを行うと学習が始まる。 学習するのに必要な正常メールが足りないか、無い場合には、次のエラーメッセージが表示されるので、監視モニタにおいて正常メールを指定する必要がある。
"正常メールが指定されていません"
"学習データがアンバランスです。正常メールが足りません"
ただし、アドレス帳にメールアドレスが登録されている場合には、受信済メールから合致するメールを探し、正常メールとするので、必ずしもエラーが表示されるとは限らない。
スワイプ操作で追加したスパムメールは迷惑メールボックスに移動する。
監視モニタでは、テーブルセルの左端に赤いマークが付き、確認することができる。
Inboxまたは統合受信ボックス内でスワイプ操作で差出人メールアドレスをスパムメールルールに追加できる。
ブラックリストに追加したメールアドレスは、設定において編集可能。
POP3アカウントのメールメッセージ一覧のテーブルセルを左から右にスワイプし、”→POP3”をタップするとメールがPOP3サーバ上にない場合に限り、POP3サーバへ移動する。
メールメッセージ一覧のテーブル・セルを長押しすると未読と既読が切り替わる。
送信者メールアドレス、件名、メッセージ本文の新規ルールを追加するには、テーブルリストを
プル・ダウンする。
新規のテーブル・セルが追加されるので、セルをタップして内容を編集する。
4種類のルール(送信者メールアドレス、件名、メッセージ本文、複合ルール)をそれぞれ別の画面で管理する。
ルール閲覧時に画面間を移動するには、ナビゲーションバーをタップ/スワイプする。
による画面移動 |
⇒ |
|
ルール編集時に画面間を移動するのにナビゲーションバーを使用できないので、代わりに画面を左右にスワイプして移動する。
複合ルール一覧のテーブル・セルを長押しすると、複合ルールのレベルが1つ解除される。
複合ルールの内容を直接編集することはできないので、複合ルールを構成する個々の条件を編集するには、複合ルールのレベルを解除する必要がある。
複合ルール一覧のテーブルセルをタップすると、複合ルールが視覚化される。
視覚化された画面では編集はできない。複合ルールを編集するには、複合ルールのレベルを解除して編集する。
監視モニタのオン・オフ、学習データ数の確認をする。
迷惑メールのルールの編集はここで行う。
スパムフィルタ・ルールフィルタのオン・オフ、迷惑メールの一括削除、アカウントの削除をする。
ユーザインファーフェースの設定、iCloudのオン・オフをする。
はじめてアプリを起動すると新規アカウント画面が表示される。
作成したいアカウントのメールアドレスとパスワードを入力すると、IMAP/POP3サーバに接続され、最新のメール32件がダウンロードされ、監視モニタ画面が表示される。
メールアドレスがログイン名でない場合は、アカウント詳細設定画面が表示されるので、ログイン名(ユーザー名)を入力して、再接続を試みる。
POP3の場合は、詳細設定が必要な場合がある。
|
⇒ |
|
メールサーバの接続に失敗した場合は、接続ボタンが手動ボタンになる。手動ボタンをタップすると詳細設定画面が表示されるので、必要な情報を入力して再度接続を試みる。
|
⇒ |
|
ログイン名、パスワードが分からない場合はメールサーバを管理している組織、あるいは担当者に問い合わせ、接続に必要な情報、ホスト名、ログイン名(ユーザー名)、パスワードを入手する。
SSL設定、ポート番号は再設定する必要はない。
SSL接続をしない場合はSSL接続をオフにする。
それに併せてポート番号も変わるが、期待するポート番号でない場合は設定し直す。
POP3を設定する場合は、サーバタイプでPOP3を選択する。
POP3の場合は、送信サーバを設定する必要がある。
SpamBlockerは、メールの送信機能はないが、POP3サーバから削除されたメールを再度、POP3サーバへ戻す場合に送信サーバ(SMTP)を使用する。
SpamBlockerに設定するアカウント情報はメールサーバに接続するために必要な情報であり、他のメーラーに設定するアカウント情報と同じになる。したがって、他のメーラーにおいて接続済みのアカウントをSpamBlockerに設定する場合、同じログイン名(ユーザー名)とパスワードを設定すれば良いことになる。
ソフトバンクの場合は、メールアドレスがユーザー名なので、新規アカウント画面で、メールアドレスとパスワードを入力すればIMAPサーバに接続できる。
パスワードはiPhone Mail.appにおいてi.softbank.jpについて設定しているパスワードと同じになる。
iPhoneのアプリ設定を起動して、
メール/連絡先/カレンダー →アカウント → Softbank Email → 受信メールサーバ
の受信メールサーバで設定したパスワードを設定する。
ezwebメールのリアルタイム受信設定をすると新しいメールサーバsync.ezweb.ne.jpに接続することになるが、サーバに接続するためのパスワードを含むアカウント情報が見られないため接続はできない。仮にアカウント情報を知り得たとしてもsync.ezweb.ne.jpはExchange Serverなので接続はできない。
現在、リアルタイム受信をしていないのであれば、Mail.appに設定しているimap.ezweb.ne.jpのユーザー名とパスワードを設定すればよい。
ユーザー名は、メールアドレスと異なるので、アカウント詳細設定画面で、ユーザー名を設定する必要がある。
このユーザー名とパスワードはiPhoneの『メッセージ』アプリの宛先に『#5000』と本文に『1234』を入力して送信し、Mailアカウントを手動設定した場合に入手できる情報になる。
リアルタイム受信をしているのであれば、リアルタイム受信をやめて、imap.ezweb.ne.jpへ接続し直す必要がある。以下はその方法。
アプリ設定→一般→インストールしたプロファイルを削除。
Wi-Fiをオフ。
先にSMSから#5000で1234を送信したメッセージを再度開く。
メール設定URLを開く。その他の設定→メールアカウント手動設定からユーザー名と新しいパスワードを取得。
SpamBlockerに上記で入手したユーザー名とパスワードを設定すればよい。
ユーザー名、またはパスワードが正しくないので、正しく入力されているかどうか確認後、再入力する必要がある。
ネットワーク(3G,Wi-Fi)の状況を確認する。
ネットワーク接続状況に難がある場合にはタイムアウトになる可能性がある。
ネットワーク接続状況が改善された状況で再接続を試みる。
一旦接続が完了し、特定のメールサーバ側の原因で"ネットワークエラー"が発生すると、次のようなアラートが発生する。
|
ここで、オフラインを選択した場合、オフラインから復帰するには、登録しているアカウントが1つの場合は、SpamBlockerを終了し、再度起動する必要がある。
複数のアカウントが登録されている場合は、アカウント一覧を表示すると、当該アカウントにオフラインマークが付くので、テーブルセルを長押し(2秒間)すると、(当該メールサーバのネットワーク状況が改善されていれば)オンラインに復帰する。
|
監視モニタ画面で次の手順で機械学習によりスパムフィルタを生成する。
フェーズ1 スパムフィルタを生成
SpamBlockerは、インストール時にスパムフィルタが無効になっている。迷惑メールを16個、正常メールを16個以上学習させると、受信メールメッセージを自動的に迷惑メールか正常メールを判断できるようになるが、スパムフィルタを有効にする必要がある。
以上を分類結果に誤りが無くなるまで繰り返す。
学習が終了すると学習の結果生成されるスパムフィルタが学習データに適用され、正しく分類されたかどうか評価され
、赤あるいは緑のマークが灰色に変化する。
正しく分類された場合はテーブルセルの上部に青字で分類結果が表示され、間違って分類された場合は、
正常>スパム
スパム>リジェクト
のように赤字で表示される。
最初の例では正常メールが間違って迷惑メールに分類されたことを示している。
2番目の例では迷惑メールが正常メール、迷惑メールとも判断がつきかねることを示している。
2番目の例のリジェクトは学習の初期段階で学習データが不足している場合によく見られるケースであり、学習データ
が増えるに従い解消される。
最初の例のような間違いは指定した学習データに矛盾がある場合によく見られるケースであり、似たような内容のメー
ルを一方は迷惑メール、もう一方は正常メールに指定するとこのような分類間違いが発生する。
監視モニタで閲覧できるメールは学習データとして適宜追加、削除できる。
一旦、正常としたメールを迷惑メールと指定し直したり学習結果を確認しながら、柔軟に学習データを指定、変更でき
る。
たとえば、編集画面で正常学習データのテーブルセルをタップするたびに緑のマーク、選択マーク、選択なしマーク、
選択マーク...と変化していく。
学習済みのデータの場合は灰色のマーク、選択マーク、選択なしマーク、選択マーク...と変化していく。
選択なしの状態で、スパムボタンあるいは正常ボタンをタップするとこのメールは学習データから削除される。
選択マークの状態でスパムボタンをタップすると迷惑学習データになる。
従って、分類エラーが発生しても修正して再学習ができる。
メッセージを表示している状態でも、学習データを指定できる。
ただし、監視モニタのメッセージ一覧から未学習のメッセージを選択、表示した場合に限る。
差出人欄に表示される2つのボタンのうち、左側のボタンを長押しすると、ボタンが
透明→赤→緑
と変化する。
赤は迷惑メール、緑は正常メール、透明は学習データでないことを表している。
と変化する。
右側のボタンを長押しすると未読状態のオン•オフを変更できる。
アカウント設定でスパムフィルタを有効にすると受信ボックス内のメールを対象にスパムフィルタリングを実行する。
スパムフィルタのスイッチをオンにしない限りスパムフィルタリングが実行されない。
スパムフィルタリングをするか否かはアカウント毎に指定できる。
スパムフィルタの対象となるのは受信ボックスのみ。
メールがスパムフィタリングされると迷惑メールボックスへ移動し、既存メールはPOP3サーバから削除されないが、新規受信メッセージは削除される。
従ってスパムフィルタを適用する前に、十分に学習を行いスパムフィルタを鍛えておく必要がある。
誤って正常メールが迷惑メールになって、迷惑メールボックスへ移動し、POP3サーバから削除された場合は、POP3サーバへ戻すことができる。
スパムの判定条件をルールで指定することで、スパムフィルタリングができる。
ルールによるスパムフィルタリングは、機械分類によるスパムフィルタリングより優先して行われる。
アカウント毎にスパムルール適用の有無を指定できる。
迷惑ルールは、差出人、件名、本文(ルールに本文を指定するとIMAP受信メールのフィルタリング速度が低下)、またそれらの複合条件において指定できる。
ルールを作成・編集するためには設定で迷惑メール ルールをタップする。
最初に差出人メールアドレス一覧が表示される。
ナビゲーションバーをタップ、もしくは左にスワイプする毎に件名、本文、複合条件一覧へと画面が変遷する。
ナビゲーションバーを右にスワイプすると直前の画面に戻る。
差出人メールアドレス、件名、本文のルールを追加する場合には、ルール一覧をプル・ダウンすると、空の条件がテーブル一覧に追加されるので、新規追加されたテーブルセルをタップして条件を編集する。
差出人メールアドレスの場合は、ナビゲーションバーの右端の+ボタンをタップすると、ナビゲーションバーにツールバーが表示され、既存の差出人メールアドレス一覧から選択が可能になる。
ルール一覧画面において、テーブルセルをスワイプすると削除ボタンが表示されるので、タップすればルールが削除される。
差出人、件名、本文で指定したルールをAND、OR、否定することで複雑なルールを指定できる。
複合条件編集では、画面を左右にスワイプすることで移動し、差出人、件名、本文でルールを2つ以上(NOTの場合は1つ以上)選択して、AND/OR/NOTボタンをタップすると選択したルールがAND/OR/NOT結合されて、複合条件画面に移動する。
複合条件のセルをタップすると複合条件が視覚化されて表示される。
複合条件のテーブル・セルには次の記号が使用される。
論理演算子
条件の種類を示す記号
複合条件は無限にネスト可能だが、常識的には、認知可能という意味で3か4レベルまでが妥当。
例を2つ示す。
最初の例は、3レベルのネストを持つルールで、比較的単純。
2番目の例は、表記の揺れを吸収するためのもので、これも単純な例となる。
単純なルールで検索条件を表現できない場合は、複合条件を使用すると良い。
アカウント設定で迷惑メールルールを有効にすると受信ボックス内のメールを対象にルールに合致するメールが迷惑メールボックスに移動する。
メールがルールによりフィタリングされると迷惑メールボックスへ移動し、POP3サーバから削除される。
iOSデバイス(iOS7.0以上)がiCloudにサイン・インしているのであれば、詳細設定でiCloudの利用を選択できる。
ルールデータまたは学習データを変更しても、iOSデバイスのホームボタンを押してアプリをバックグランド状態するか、メッセージ一覧でフィルタリングを開始しない限り、変更分はiCloudへアップロードされない。
iCloudデータ同期が非常に遅れることがある。
詳細設定の"iCloudストア再構築"をタップすると強制的に同期が行われる。
強制同期に数分かかることがあり、その間、学習データ、ルールデータが削除されている状態になる。
詳細設定の背景が青色のiCloudをタップすると、ローカルデータをiCloudに移行する際に
のいずれかの方法を選択できる。
上書きを選択するとiCloud上の既存のデータがが削除された後で、ローカルデータがiCloudへコピーされる。
マージを選択するとiCloud上の既存のデータとローカルデータの差分のみがiCloudへコピーされる。
スキップはデータ移行処理なしで、iCloudモードになる。
詳細設定の背景が赤色のiCloudをタップすると、iCloudデータをローカルデータへ移行できる。
何かの理由でiCloudデータが壊れ、自動復旧ができない場合は、次の手順でローカルデータからiCloudデータを復旧可能になる。
iOSデバイスがiCloudからサイン・アウトするとSpamBlockerではiCloudを利用できなくなる。
iCloud利用を選択するとルールと学習データがiCloud上に保存され、MailCat、MailKitで相互に利用できるようになる。
入力したパスワードは、iOSデバイスとユーザが契約しているメールサーバに保存されているので、安全性は保証されているので、漏洩などの 心配はない。
ログイン名、パスワードが分からない場合はメールサーバを管理している組織、あるいは担当者に問い合わせ、接続に必要な情報、 ホスト名、ログイン名(ユーザー名)、パスワードを入手する。
次のいずれかが原因。
次の確認•設定をする。
学習データ数が少ないのが原因。
より多くの学習データ数を指定することで解消される。
SpamBlockerでは、迷惑メールだけを学習データに指定した場合、アドレス帳に登録されているメールアドレスを使用し受信済メールから合致するメールを探し、正常メールデータとする。この場合、同じようなメールだけが正常メールデータになり、学習効果があがらない可能性がある。モニタ画面で正常メールを手動で選択することで学習効果をあげることができる。
モニタ画面で学習データを設定し直し、再学習すれば良い。
IMAPにおいて、ルールの本文の項目を指定すると、フィルタルング速度が低下する。
POP3は問題ない。
iCloudを参照
iCloudを参照
数回試しても、アプリが起動しない場合は、iOSデバイスの電源を落とし、再び電源を入れてアプリの再起動を試みる。
それでも起動しない場合は、アプリを削除して、再インストール。
それでも起動しない場合は、iCloudのストレージ管理においてMailCatを削除して、再起動を試みる。
アプケーションが適切に動作するのに必要なメモリがないか、ネットワーク環境に原因があると考えられる。
メモリ不足を解消するためには、SpamBlockerを一旦終了し、再度、起動する。
動作速度が改善されない場合は、使用していないアプリを終了してみる。それでも改善されない場合は、
iOSデバイス(iPhone/iPad)の電源を一旦切り、再度電源を入れる。
あるいは、改善されたネットワーク環境下での運用を試みる。
使用法のご質問、ご要望、あるいは不具合等のお問い合わせはメールにて承ります。
問い合わせメール support_seimitsu@jcom.home.ne.jp
本プログラムを作成するにあたり以下のリソースを活用いたしました。
Any rereleasing of this code is prohibited. Please attribute use of this code within your application Any Queries should be directed to hi@tmdvs.me | http://www.tmdvs.me Created by Tim on [Dec 30]. Copyright 2009 Tim Davies. All rights reserved.
Created by Devin Doty on 10/14/09October14. Copyright 2009 enormego. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Copyright (c) 2011 Sam Vermette Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
base64.cpp and base64.h
Copyright (C) 2004-2008 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
Created by Ian Baird on 10/28/08.
Copyright (c) 2008 Skorpiostech, Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Copyright (c) 2013 Ali Karagoz (http://alikaragoz.net/)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Landon Fuller
Copyright (c) 2008-2009 Plausible Labs Cooperative, Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Author: Johannes Weiß
Copyright (c) 2012, 2013, Johannes WeißAll rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALLBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Some of icons in this software are designed by Icons8
(http://icons8.com).