Tiny Tiny RSSのインストールと設定方法(サーバで動作するRSSリーダー)

スポンサーリンク

RSSとTiny Tiny RSSについて

RSSについて

「RSSフィード」はサイトやブログに新規投稿があると更新されるXML形式のデータで、お気に入りのブログなどを「RSSリーダー」へ登録しておけば、お気に入りサイトの新着記事だけがリストアップされて読めるため非常に便利です。

RSSに対応しているサイトはURLは以下のようなボタンが設置されている場合がありますが、実装されているのが当たり前のようになってきたのでボタンを設置していないサイトも多いです。

RSSフィードのボタン

基本的に「RSSリーダー」はサイト登録時にフィードのURLを自動検出してくれるので、登録する場合は対象サイトのURLを指定すればOKです。

RSSフィードのURLは「HTMLソース」内では「link」タグで記述されており、対応サイトのソースを見ると以下のような箇所が確認できます。

HTMLソースを確認

<link rel="alternate" type="application/rss+xml" title="ピロリロール &raquo; フィード" href="https://blog.aimix.jp/feed" />

RSSリーダーが自動検出に失敗した場合はHTMLソースを確認し、上記で指定されているURLをフィードのURLとして指定して登録すればOKです。

例えば上記の場合は以下のURLをフィードのURLとして指定します。

https://blog.aimix.jp/feed

Tiny Tiny RSSについて

Tiny Tiny RSSはサーバへインストールして利用するRSSフィードの管理ソフトウェアで、ブラウザ上でお気に入りの記事が読めるほか、スマホ向けアプリもあります。

Not Found

RSSリーダーとしてだけでなく、フィードの管理も行える「Feedly」や「Inoreader」、サービス終了してしまった「Google Reader」を自前で運用できるという感じのWebアプリケーションで非常に高機能です。

「Tiny Tiny RSS」は他のアプリケーションから利用できるようにAPIも提供しているため、公式アプリ以外にもサードパーティのアプリで対応しているものもあります。

「さくらインターネット」のスタンダード(月額524円)では自分が収容されていたサーバが重いのか、更新やスマホ向けアプリでの記事取得でエラー(503や500)が頻繁に出るなど不安定でしたが、「エックスサーバ」に移転したところ非常に快適に動作するようになりました。

さくらインターネットも大抵のWebアプリケーションは動作してくれるので、Tiny Tiny RSSが思った以上に重いのかもしれません。

Tiny Tiny RSSのインストール

ダウンロード

zipやtar.gzをダウンロードする場合

以下からダウンロードします。

Git repository browser

下矢印のダウンロードボタンをクリックします。

gitのダウンロードボタン

「ZIP」と「TAR.GZ」が選択できますが、解凍できるアーカイバがあるならどちらでも構いません。

FTPクライアントでサーバへ接続し「Tiny Tiny RSS」のディレクトリをWeb公開ディレクトリ以下に作成します。

作成したディレクトリへ解凍した中身をアップロードします。

ファイル数は3,000個ほどなので、解凍後にアップロードしてもさほど時間はかかりませんが、圧縮ファイルを転送後にSSH接続して解凍しても構いません。

gitコマンドでダウンロードする場合

SSHでサーバへ接続してWeb公開ディレクトリへ移動します。

以下のように実行するとカレントディレクトリ下に [TinyTiny-RSS用のディレクトリ] で指定したディレクトリが作成され、そこにダウンロードされます。

git clone https://git.tt-rss.org/fox/tt-rss.git [TinyTiny-RSS用のディレクトリ]

「tinytiny-rss」というディレクトリに落とす場合は以下のようにします。

git clone https://git.tt-rss.org/fox/tt-rss.git tinytiny-rss

以前までは以下のURLを指定していましたが、新しいURLは上記になりました。

2021年6月時点では以下の旧URLを指定してcloneすると、上記の新しいURLへ301でリダイレクトされるので、どちらでも構いませんが、今後もリダイレクトされ続けるのか不明なので、上記の新しいURLを指定した方が無難です。

git clone https://tt-rss.org/git/tt-rss.git [TinyTiny-RSS用のディレクトリ]

データベースの作成

レンタルサーバであれば用意されているコントロールパネルから作成するのが無難です。

Xserverの場合は「サーバーパネル」の「MySQL設定」からデータベースが作成できます。
さくらインターネットの場合は「サーバコントロールパネル」の「Webサイト/データ」の「データベース」です。

データベース名やユーザー名はコントロールパネルなどから確認できますが、パスワードは確認できないので必ず控えておきます。

自宅サーバや専用サーバの場合は以下のように作成します。

mysql -u root -p
create database [TinyTiny-RSSのデータベース名];
grant all on [TinyTiny-RSSのデータベース名].* to [ユーザー名]@localhost identified by '[パスワード]';

TinyTiny-RSSのデータベース名が「aimix_tinytinyrss」、ユーザー名が「aimix」、パスワードが「12345」の場合は以下のようにします。

mysql -u root -p
create database aimix_tinytinyrss;
grant all on aimix_tinytinyrss.* to aimix@localhost identified by '12345';

初期データベースのインポート

初期データベースが「schema」ディレクトリに用意されているので、これをインポートします。

MySQL(MariaDB)用と、PostgreSQL用があります。

ttrss_schema_mysql.sql
ttrss_schema_pgsql.sql

コントロールパネルから行う場合

zip版などの場合は手元にある「schema」ディレクトリの「.sql」をアップロード&インポートします。
gitの場合も一旦FTPクライアントでダウンロードしたものをインポートすればOKです。

エックスサーバーだと「phpMyAdmin」から行えます。

作成したTinyTiny-RSSのデータベースを選択してから、文字コードをUTF-8で行う以外はデフォルト設定のままでOKです。

phpMyAdminでのデータベースインポート

「参照」ボタンからPC内の.sqlを指定してインポートします。

シェルから行う場合

TinyTiny-RSSのデータベース名が「aimix_tinytinyrss」、ユーザー名が「aimix」、DBホスト名が「localhost」の場合は以下のようにインポートします。

mysql aimix_tinytinyrss -u aimix -h localhost -p < schema/ttrss_schema_mysql.sql

初期設定

以前はTinyTiny-RSSを配置したディレクトリに「install」というディレクトリがあり、そこへアクセスすると(例えば https://blog.aimix.jp/tt-rss/install)データベース指定などの初期設定がGUIで行えましたが、仕様が変わったのか「install」ディレクトリが無くなったので「config.php」で初期設定を行います。

今回の説明では「config.php」での初期設定方法を書きますが、「install」ディレクトリは今後の更新で再配置される可能性もあるため、gitのファイル一覧に「install」ディレクトリがある場合や、zip/tar.gz版なども以下のように「install」ディレクトリがある場合は https://[ドメイン]/[TinyTiny-RSSディレクトリ]/install へアクセスすればconfig.phpを触らずに初期設定が行えます。

TinyTiny-RSSのディレクトリ直下に以下のファイルがあるので、末尾の「-dist」を外して「config.php」へリネームします。

config.php-dist

デフォルトの設定ファイルは全てコメントアウトされたファイルなので以下のように設定を末尾あたりに追記します。

putenv('TTRSS_DB_HOST=[データベースホスト名]');
putenv('TTRSS_DB_NAME=[データベース名]');
putenv('TTRSS_DB_USER=[ユーザー]');
putenv('TTRSS_DB_PASS=[パスワード]');
putenv('TTRSS_SELF_URL_PATH=[TinyTiny-RSSのURL]');
putenv('TTRSS_DB_TYPE=mysql');
putenv('TTRSS_DB_PORT=3306');

以下の条件の場合の設定は、

項目 設定値
データベースホスト名 localhost
データベース名 aimix_tinytinyrss
データベース用ユーザー名 admin
データベース用ユーザーパスワード 12345
TinyTiny-RSSのURL https://blog.aimix.jp/tt-rss
データベースタイプ mysql
データベースポート 3306

以下のようにします。

putenv('TTRSS_DB_HOST=localhost');
putenv('TTRSS_DB_NAME=aimix_tinytinyrss');
putenv('TTRSS_DB_USER=admin');
putenv('TTRSS_DB_PASS=12345');
putenv('TTRSS_SELF_URL_PATH=https://blog.aimix.jp/tt-rss');
putenv('TTRSS_DB_TYPE=mysql');
putenv('TTRSS_DB_PORT=3306');

データベースタイプの「TTRSS_DB_TYPE」などは公式でも大文字で解説されていましたが、現行バージョンでは大文字だと、以下のエラーが出るので小文字で指定します。

Exception while creating PDO object:could not find driver

以下のようなエラーなどです。

Exception while creating PDO object:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

PHPはデフォルトだと「which php」で出てくるパスのPHPが使われますが、バージョンによっては正常に動作しないことがあります。

[aimix@sv12345 ~]$ which php
/usr/bin/php

レンタルサーバのほとんどは複数のPHPバージョンを用意しており、パスを指定することで該当するバージョンのPHPで動作させることができます。

TinyTiny-RSSの場合は「config.php」の末尾に以下のように指定します。

putenv('TTRSS_PHP_EXECUTABLE=[PHPのパス]');

エックスサーバーで「PHP 7.4」を指定する場合は以下のようにします。

putenv('TTRSS_PHP_EXECUTABLE=/usr/bin/php7.4');

上記のようにPHPバージョンによるトラブルが出る場合は「cron」でのフィード更新もバージョンまで指定して実行する必要があります。

設定

ログイン

ここまでの設定でログインできる状態になっていますが、初期ユーザーの「admin」はパスワードが「password」と好ましくない値が設定されているので変更します。

https://[ドメイン]/[TinyTiny-RSSのインストールディレクトリ]

ドメインが「blog.aimix.jp」、インストールディレクトリが「tt-rss」の場合は以下にアクセスします。

https://blog.aimix.jp/tt-rss

以下でログインできます。

ユーザー名 : admin
パスワード : password

ユーザーの作成

TinyTiny-RSSは「ユーザーごとに購読フィードを管理」しており、別のユーザーのフィードは見えません。

ビルトインユーザーの「admin」は削除できないため、パスワードを変更しておきます。

右上の三本線から「設定」に入ります。

TinyTiny-RSSの設定メニュー

「ユーザー」タブを開きます。

ユーザー名の「admin」をクリックするか、左のチェックボックスをONにして「編集」をクリックするとユーザーの編集画面になります。

オプションの「E-mail」はパスワードを忘れたときのリセット用URLが送信されるメールアドレスになるので、adminも新規追加ユーザーも必ず設定しておきます。

TT-RSSのユーザー編集画面

パスワードを忘れた場合、ログイン画面の「パスワードを忘れた場合」のリンクから進み、

TT-RSSログイン画面

以下のような復旧画面からパスワードをリセットすることができます。

TT-RSSパスワード忘れと復旧

ユーザーのパスワードはデータベースに保存されており、メールアドレス未設定で上記からも設定できない場合はデータベースを操作することで復旧は可能です。

公式Wikiに復旧方法があります。

https://git.tt-rss.org/fox/tt-rss/wiki/FAQ

新規ユーザーは上部の「ユーザーの作成」から行います。

TT-RSSのユーザー作成

フィードはユーザーごとに管理されているため、別のユーザーでログインした状態からフィードを追加すると、そのユーザーのフィードとして登録されてしまいます。

このため、ユーザーを作成したら一旦ログアウトし、作成したユーザーでログインしてからフィードの登録を行ってください。

TT-RSSからのログアウト

購読フィードの追加

お気に入りサイトを追加する場合は右上の「三本線」から「フィードを購読する」に進みます。

TT-RSSのフィード追加

サイトのURLか、フィードのURLをコピペして「購読」ボタンをクリックします。

カテゴリも予め作成して分類しておくと、数が増えてきたときに便利で、例えばスマホ用のリーダーでカテゴリをクリックすると、そのカテゴリに属するフィードだけリストアップできます。

追加時に「指定されたURLは無効のようです」と出る場合がありますが、おそらく不具合で、先頭の「X」が邪魔しているのが原因です。

下のようになったら、マウスでドラッグして「X」を含めて選択して「DEL」キーで削除するか、新たにURLをコピペして貼り付けると「X」が消えて正常に登録できます。

フィード追加時のエラー

購読画面に以下のようなメッセージが出る事がありますが、これは対象サイトに複数のフィードがあるためです。

サイトによってはカテゴリやタグごとにフィードを用意しているので、「利用可能なフィード」のプルダウンから希望のものを選択します。

TT-RSSのフィード追加設定画面

上記のメッセージは以下のものです。

Provided URL is a HTML page referencing multiple feeds, please select required feed from the dropdown menu below. 

プルダウンメニューをクリックすると、対象サイトに含まれるフィードのリストが表示されるのでクリックして選択します。

最後に「購読」ボタンをクリックすると追加されます。

追加直後はTinyTiny-RSSが記事を取ってきてないので何も表示されませんが、cronなどの更新処理が完了すると記事が表示されるようになります。

フィードのメンテナンス

設定の「フィード」タブからは「エラーのあったフィード」や、「活発でないフィード」が確認でき、同画面からフィードの登録解除が行えるため、メンテナンスが非常に楽です。

フィードのメンテナンスメニュー

「更新エラーのあるフィード」では、フィードの取得に失敗したサイトとエラーの一覧が確認できます。

「timed out」は取得しようとしても応答が返って来なかったフィードです。

「Could not resolve host」の場合は「名前解決ができない」エラーなのですでに閉鎖されたブログの場合が多いですが、DNSサーバの設定ミスなどの場合もあるため、お気に入りサイトの場合は様子を見てもいいと思います。

また、フィードのURLが変更されている可能性もあるので、いずれにしても実際のサイトを確認した方が良いかもしれません。

更新エラーのあるフィード一覧

「活発でないフィード」では、最近の更新がないフィードと最終更新日時の一覧が表示されます。

注意が必要なのは、サイト運営者側がRSSフィードの出力URLを変更したのに、古いフィードURLも残っている場合です。
この場合も「最近の更新がないフィード」として表示されるので、お気に入りサイトであれば本当に更新がないのか確認した方が良いかもしれません。

活発でないフィードの一覧

フィードURLが変更になってリダイレクトもされていない場合は「更新エラーのあるフィード」の方に表示されます。

フィードの自動更新(cron)

登録したサイトから最新情報を定期的に取ってくるように設定します。

TinyTiny-RSSのインストールディレクトリにある「update.php」がフィードの更新などを行うスクリプトで、「–feeds」オプションでフィードの更新、「–quiet」オプションは結果を画面表示しないという意味なので、これをcronに登録します。

update.php --feeds --quiet 

レンタルサーバの場合

エックスサーバーの指定例です。

エックスサーバーは「/home」から始まる「アカウント名/ドメイン名/public_html/」がウェブルートディレクトリです。

アカウント名が「aimix」、ドメイン名が「aimix.jp」、TinyTiny-RSSのディレクトリが「tinytiny-rss」の場合は以下のように指定します。

/usr/bin/php7.4 /home/aimix/aimix.jp/public_html/tinytiny-rss/update.php --feeds --quiet

PHPのバージョンによってはTinyTiny-RSSがエラーを出す事があるため、cronでエラーが出ている場合は別のバージョンのPHPのパスを指定してください。

PHPバージョン未指定の場合は以下のエラーが出ました。

PHP Parse error: syntax error, unexpected '?' in XXXXXXXXXXXXXXXXX

時刻は「分」だけ「*/30」とし、あとは「*」にします。
これで30分おきにフィードの更新処理が行われます。

エックスサーバーへのTT-RSS更新用cron設定

正常に更新されない場合はSSHでログインして「–quiet」オプションを外して以下のように実行してみると良いです。

/usr/bin/php7.4 /home/aimix/aimix.jp/public_html/tinytiny-rss/update.php --feeds

以下が実行結果ですが、更新対象が無いので「0」となっているものの、エラーなく正常終了しているのが確認できます。

[03:29:21/3066] Lock: update.lock
[03:29:21/3066] Scheduled 0 feeds to update...
[03:29:21/3066] Sending digests, batch of max 15 users, headline limit = 1000
[03:29:21/3066] All done.
[03:29:21/3066] Expired cache/export: removed 0 files.
[03:29:21/3066] Expired cache/feeds: removed 0 files.
[03:29:21/3066] Expired cache/images: removed 0 files.
[03:29:21/3066] Expired cache/upload: removed 0 files.
[03:29:21/3066] Removed 0 old lock files.
[03:29:21/3066] Removing old error log entries...
[03:29:21/3066] Purged 0 orphaned posts.

自宅サーバの場合(専用サーバなど)

crontabで指定する場合は以下のようにします。

*/30 * * * * apache php -f /var/www/html/web/tinytiny-rss/update.php --feeds --quiet

実行ユーザーがrootだと以下のエラーが出てしまうため、apacheで実行する必要があります。

Tiny Tiny RSS was unable to start properly. This usually means a misconfiguration or an incomplete upgrade.
Please fix errors indicated by the following messages:

* Please don't run this script as root.

You might want to check tt-rss wiki or the forums for more information.
Please search the forums before creating new topic for your question.

TinyTiny-RSSの設定

TinyTiny-RSSの設定は上部の「設定」タブから行えます。

基本的に設定が必要なのは、言語を日本語にし、タイムゾーンを「Asia/Tokyo」にするのと、「APIを有効にする」をONにする点くらいで、あとはお好みです。

「APIを有効にする」はスマホアプリからアクセスする場合に必要です。

TinyTiny-RSSの設定画面1

最後に「設定を保存する」ボタンで保存して終了です。

TinyTiny-RSSの設定画面2と保存ボタン

フィルタ

フィルタは条件に一致した記事に対して何か操作を行うものですが、基本的に使うのは不要な記事を「Delete article」で削除して表示しないようにする事です。

指定した文字を含む場合は非表示にするフィルタ例を紹介します。

フィルタ追加画面

「Match」で非表示にする条件を設定しますので、Matchタブの「追加ボタン」をクリックします。

ルールは正規表現が使えますので、例えば「TEST」で始まるという場合は「^TEST」と記述します。

否定も正規表現で書けますが、「正規表現の一致結果を反転する」というチェックを入れると否定の意味に変化します。

下部にフィード一覧がありますが、「すべてのフィード」は全ての登録フィードに対してフィルタが適用され、個々に選択するとそのフィードにだけ有効なフィルタになります。

どのフィールドを検査対象にするかを指定します。

一部日本語化されていませんが、「題名」はフィードの題名のみ、「Content」はフィードの記事部分、「Title or Content」はフィードの題名と記事部分の両方を意味します。

フィルタの適用項目の指定

次に「Apply actions」タブに切り替え、一致した記事をどうするかを指定します。

複数のアクションを追加できますが、一致した場合に記事を表示しないようにするには「Delete article」を指定します。

TT-RSSのフィルタのアクション

「Enabled 」にチェックを入れると設定中のフィルタが有効になります。
一時的に無効化したい場合はフィルタを削除してしまわず、このチェックをOFFにしておくと良いです。

「Match any rule」にチェックがあると「いずれかの条件に一致した場合」という意味になります。
チェックがOFFの場合は追加した「条件全てに一致した場合」になります。

「Inverse matching」は条件を反転するオプションです。

設定できたら下部の「テスト」ボタンで動作確認しておきます。

「テスト」を実行すると指定した条件で全記事を検索し、一致した記事が一覧表示されます。

一致する記事があるはずなのに以下のように「このフィルタに一致する最近の記事がありません」と出る場合は「Match」で指定したルールを見直す必要があります。

逆に一致してほしくない記事まで一致する場合もあるので、何度もテストして確認しておきます。

希望の動作になったら最後に下部の「作成」ボタンを押して完了です。

「テスト」での動作確認は現在ある記事でテストを行うため、しばらくして記事が一新されたら再確認しておくと良いです。

バックアップと復元

購読フィードと設定

右上の三本線から「設定」に入ります。

TinyTiny-RSSの設定メニュー

上部メニューから「フィード」タブをクリックします。

左から「OPML」をクリックするとインポートとエクスポートの画面になります。

TT-RSSの設定保存

以下からエクスポートが行えますが、ここからエクスポートできるのは購読フィードのリストやカテゴリと、TinyTiny-RSSのWebコンソールの設定です。

「Include tt-rss settings」のチェックがOFFだとフィードの情報のみを、チェックONするとTinyTiny-RSSの設定もエクスポートします。

エクスポートしたデータは以下からインポートできます。

インポートボタン

他のサービスとTinyTiny-RSSとの相互移行(OPML)

OPML形式でインポート/エクスポートできるため、OPMLに対応したサービス(例えばFeedlyやInoreaderなど)で相互に移行できます。

TinyTiny-RSSから他のサービスへフィードリストを移動する場合は「Include tt-rss settings」のチェックを外して「OPMLエクスポート」を実行して保存します。

他のサービスからTT-RSSへの移行は出力したOPMLを以下からインポートするだけでOKです。

インポートボタン

データベース

TinyTiny-RSSは設定も記事もデータベースに保存されており、例えばユーザーの情報は「ttrss_users」テーブルに保存されています。

このため、サーバーの移行時などはデータベースをまるごとバックアップして移動すると楽です。

データベースには取得済みの記事内容も含まれるため、数十MB~数百MBほどになりますが、記事の画像などは保存されないため圧縮すると1/10程度と非常に小さくなります。

ほぼまるごと移動できますが、「config.php」は必要に応じて別途バックアップと、移行先に合わせて修正が必要です。

復元はこのページにある初期データベースのインポートと同じ手順です。

phpMyAdminからバックアップ

phpMyAdminの場合は左メニューからTinyTiny-RSSのデータベースをクリックしたあと、上部メニューの「エクスポート」からバックアップできます。

「mysqldump」コマンドで取得できるデータと同じものが保存できます。

phpMyAdminでバックアップ

データベース未選択状態で「エクスポート」する場合は、ラジオボタンの「詳細」をクリックするとデータベース一覧が選択できますので、ここでTinyTiny-RSSのデータベースを選択してバックアップしても同じです。

データベースのバックアップ

mysqldumpコマンドでのバックアップ(シェル)

以下のようにすると「dump.sql」へ指定データベースが保存されます。

phpMyAdminなどで取得できるバックアップと同じなので、この方法でバックアップしたものをphpMyAdminで復元することも、その逆もできます。

mysqldump -u [ユーザー名] -p [TinyTiny-RSSのデータベース名] > dump.sql

データベースユーザーが「aimix」で、TinyTiny-RSSのデータベース名が「tinytinyrss」の場合

mysqldump -u aimix -p tinytinyrss > dump.sql

root権限でデータベースまるごとバックアップする場合

mysqldump -u root -x --all-databases > dump.sql

データベースサーバが別のサーバの場合は以下のように指定します。

エラーなくエクスポートできた場合は「dump_error.txt」は空で、エラーがある場合は何か出ます。

mysqldump -Q -h [DBホスト名] -u[ユーザー名] -p[パスワード] [データベース名] > dump.sql 2> dump_error.txt

ただし、同じネットワーク内からのみしか取得できないように制限がかかっている場合もあります。

TinyTiny-RSSの更新(アップデート)

gitの場合

TinyTiny-RSSのインストールディレクトリに移動して以下を実行すると最新版を持ってきてくれます。

git pull origin master

データベースの更新が必要な場合は以下のコマンドで更新します。

php ./update.php --update-schema

PHPのバージョン指定が必要な場合は以下のように指定して下さい。

/usr/bin/php7.4 ./update.php --update-schema

zip/tar.gz版の場合

zipやtar.gzの場合は再度ダウンロードしたもので上書きします。
「config.php」は上書きされませんが念のためバックアップしておいた方が良いです。

データベースの更新が必要な場合は、TinyTiny-RSSのディレクトリへ移動したあと、以下のコマンドで更新します。

php ./update.php --update-schema

PHPのバージョン指定が必要な場合は以下のように指定します。

/usr/bin/php7.4 ./update.php --update-schema

TinyTiny-RSSのアンインストール

以下を削除するだけでアンインストールできます。

  • TinyTiny-RSSディレクトリの削除
  • TinyTiny-RSSデータベースの削除
  • cron設定の削除

一時的にアンインストールするか、再び使う可能性がある場合は「TinyTiny-RSSデータベースのエクスポート」「config.phpのバックアップ」「OPML形式でフィードと設定をエクスポート」しておくと復元できます。

スマホ/タブレット向けアプリ

APIが利用できるため、サードパーティのアプリでもTinyTiny-RSSに対応したものがありますが、公式アプリを紹介しておきます。

有料アプリですがメンテナンスも継続して行われており、RSSリーダーの中でも使いやすいのでTinyTiny-RSS用としては最も良い感じでした。

Tiny Tiny RSS (TRIAL)

Not Found

無料の試用版で動作確認ができます。

Tiny Tiny RSS Unlocker

Not Found

450円の有料アプリでトライアル版の制限を解除します。

Comment

タイトルとURLをコピーしました