【Omeka S モジュール紹介】Advanced Search adapter for Solr

概要 「Advanced Search adapter for Solr」はOmeka Sのモジュールであり、Apache Solrの高度な検索アダプタを提供します。これにより、Omeka内で完全な検索エンジンの力を活用することができます。これは一般のユーザー向けや管理者向けに、関連性(スコア)による検索、インスタント検索、ファセット、オートコンプリート、提案などの機能を提供します。 https://github.com/Daniel-KM/Omeka-S-module-SearchSolr Apache Solrのセットアップ ! Apache Solrは、Omeka Sがインストールされたサーバとは異なるサーバにインストールしても構いません。 Javaをインストール可能な環境で、Apache Solrのセットアップを行います。Ubuntuの場合、以下のサイトなどが参考になりました。 https://tecadmin.net/how-to-install-apache-solr-on-ubuntu-22-04/ 以下のようなコマンドでApache Solrを起動できます。 # Javaのインストール sudo apt update && sudo apt install -y default-jdk # ダウンロード wget https://dlcdn.apache.org/solr/solr/9.3.0/solr-9.3.0.tgz # 展開 tar xzf solr-9.3.0.tgz solr-9.3.0/bin/install_solr_service.sh --strip-components=2 # インストール sudo bash ./install_solr_service.sh solr-9.3.0.tgz # 起動 sudo systemctl start solr また、mycol1というコアを作成しておきます。 sudo su - solr -c "/opt/solr/bin/solr create -c mycol1 -n data_driven_schema_configs" モジュールのインストール ! ここからは、Omeka Sがインストールされたサーバで作業します。 以下のページからモジュールをダウンロードおよびインストールします。 https://github.com/Daniel-KM/Omeka-S-module-SearchSolr/releases インストール時に、以下のように、AdvancedSearchが必要、というアラートが表示されることがあります。 ...

2023年8月17日 · 2 分 · Nakamura

macOS版のCyberduckを使って、AWS S3の特定のバケットにアクセスする

以下の記事を参考に、Cyberduckを使って、AWS S3の特定のバケットにアクセスする方法を試しました。 https://dev.classmethod.jp/articles/specify_s3_folder_iam_cyberduck/ しかしmacOS版のCyberduckを開き、画面上部の「新規接続」ボタンを押したところ、バケットの情報などを入力するフォームが表示されませんでした。 そこで調べてみたところ、以下のIssueが見つかりました。 https://github.com/iterate-ch/cyberduck/issues/11154 以下のように、ブックマークを開くように、とのことでした。 Please refer to Access third party buckets. To set a default path, create a new bookmark instead of choosing Open Connectoin. そこで、以下のように、画面左下の「+」ボタンをクリックしたところ、 以下のように、詳細設定のフォームも表示され、パス(バケット名)を指定できるようになりました。 同様のことでお困りの方の参考になりましたら幸いです。

2023年8月16日 · 1 分 · Nakamura

ブラウザの拡張機能を使って、GitHubの2FAに対応する

概要 GitHubの2要素認証(2FA)への対応にあたり、ブラウザの拡張機能である「Authenticator」を使用してみましたので、その備忘録です。 https://authenticator.cc/ QRコードの準備 まず、GitHub側でQRコードを準備します。詳細な手順は省きますが、以下のような画面にQRコードが表示されます。 ブラウザ拡張機能の追加 Chrome、Firefox、Edgeのいずれかのブラウザで以下にアクセスします。以下、Chromeの例です。 https://authenticator.cc/ 以下の画面の「Add to XXXX」ボタンを押します。 「Chromeに追加」ボタンを押します。 以下の画面が表示されれば成功です。 アカウントの追加 先ほど用意したQRコードをブラウザで表示します。以下は、Googleドライブに保存したQRコードの画像を表示している画面例です。 右上の「拡張機能」ボタンを押して、「Authenticator」をクリックします。 スキャンのアイコンをクリックします。 表示しているQRコードの範囲を選択すると、「<アカウント名> 追加されました。」と表示されます。 以後、2FAが求められた場合、拡張機能を選択して、「Authenticator」をクリックします。 以下のようにOne-Time Password (OTP)が表示されるので、パスワードをコピーして使用します。 バックアップファイルの利用 バックアップファイルを作成して、それを他の端末やブラウザでインポートして使用することもできるようです。 バックアップファイルの作成 拡張機能の設定画面から、「バックアップ」を選択します。 そして、「バックアップファイルのダウンロード」を押します。 「authenticator.txt」というファイルがダウンロードされますので、本ファイルまたは本ファイルの中の文字列を他者と共有します。 バックアップファイルのインポート インポートする際には、先の設定 > バックアップ の後に、「バックアップのインポート」を選択します。 そして、以下の画面において、「バックアップファイルのインポート」タブを選択して、txtファイルをアップロードするか、「テキストのバックアップのインポート」を選択して、txtファイルの中身のテキストを貼り付けてインポートします。 結果、アカウントが登録されます。 まとめ 参考になりましたら幸いです。

2023年8月15日 · 1 分 · Nakamura

npx nuxi typecheck実行時のエラー

Nuxt3でnpx nuxi typecheckを実行したところ、以下のエラーがでました。 nuxt.config.ts:16:3 - error TS2345: Argument of type '{ app: { baseURL: string; }; runtimeConfig: { public: { token: string; }; }; typescript: { strict: boolean; }; }' is not assignable to parameter of type 'InputConfig<NuxtConfig, ConfigLayerMeta>'. Object literal may only specify known properties, and '"app"' does not exist in type 'InputConfig<NuxtConfig, ConfigLayerMeta>'. この解決策として、以下に記載がある通り、2つもライブラリをインストールする必要がありました。 https://nuxt.com/docs/api/commands/typecheck npm i -D typescript npm i -D vue-tsc 以下が関連するissueかもしれません。 https://github.com/nuxt/nuxt/issues/20906 同様のことでお困りの方の参考になりましたら幸いです。

2023年8月9日 · 1 分 · Nakamura

Virtuosoが停止した際の再起動のためのコマンド

Virtuosoが停止した際の再起動のためのコマンドの備忘録です。誤りなどあるかもしれませんが、参考になりましたら幸いです。 virtuoso-tの確認 which virtuoso-t > /usr/local/bin/virtuoso-t virtuoso.iniの場所の確認 sudo find / -name virtuoso.ini > ... > /usr/local/var/lib/virtuoso/db/virtuoso.ini > ... lckファイルの削除と起動 sudo rm -rf /usr/local/var/lib/virtuoso/db/virtuoso.lck sudo /usr/local/bin/virtuoso-t +configfile /usr/local/var/lib/virtuoso/db/virtuoso.ini

2023年8月7日 · 1 分 · Nakamura

Cultural JapanのRDFストアに格納されている展覧会情報の活用

概要 Cultural JapanのRDFストアには、展覧会に関する情報が格納されています。rdf:typeにtype:展覧会を指定する以下のようなクエリを用いて、一覧を取得できます。 PREFIX type: <https://jpsearch.go.jp/term/type/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> select distinct * where { ?s rdf:type type:展覧会; rdfs:label ?label . } https://ld.cultural.jp/snorql/?query=select+distinct+*+where+{ %3Fs+rdf%3Atype+type%3A展覧会%3B +++++++rdfs%3Alabel+%3Flabel+.+ } ++ これらの展覧会の情報を活用するための一例について紹介します。 展覧会の一覧 各展覧会は、jps:temporalやjps:spatialといった値を持っています。(これらは複数の値を持つ場合があります。) https://ld.cultural.jp/data/apmoa-exhib-2021-soga そこで以下のようなクエリにより、展覧会のメタデータを含む、一覧の取得を行うことができます。 PREFIX type: <https://jpsearch.go.jp/term/type/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX schema: <http://schema.org/> PREFIX jps: <https://jpsearch.go.jp/term/property#> select distinct ?s ?label ?access ?image (GROUP_CONCAT(DISTINCT ?spatial_labels; separator="|") AS ?spacial_label) (GROUP_CONCAT(DISTINCT ?temporal_labels; separator="|") AS ?temporal_label) (GROUP_CONCAT(DISTINCT ?jps_temporals; separator="|") AS ?jps_temporal) (GROUP_CONCAT(DISTINCT IF(BOUND(?descriptions), CONCAT(str(?descriptions), IF(lang(?descriptions) != "", CONCAT("@", lang(?descriptions)), "")), ""); separator="|") AS ?description) (COUNT(DISTINCT ?workFeatured) AS ?countOfWorkFeatured) where { ?s rdf:type type:展覧会; rdfs:label ?label . optional { ?s jps:accessInfo/schema:provider/rdfs:label ?access . } optional { ?s schema:spatial/rdfs:label ?spatial_labels . } optional { ?s schema:temporal/rdfs:label ?temporal_labels . } optional { ?s jps:temporal/schema:description ?jps_temporals . } optional { ?s schema:description ?descriptions . } optional { ?s schema:image ?image . } optional {?s schema:workFeatured ?workFeatured } } group by ?s ?label ?spatial_label ?temporal_label ?description ?jps_temporal ?access ?image order by ?s https://ld.cultural.jp/snorql/?query=PREFIX+type%3A+<https%3A%2F%2Fjpsearch.go.jp%2Fterm%2Ftype%2F> PREFIX+rdfs%3A+<http%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23> PREFIX+schema%3A+<http%3A%2F%2Fschema.org%2F> PREFIX+jps%3A+<https%3A%2F%2Fjpsearch.go.jp%2Fterm%2Fproperty%23> select+distinct+ %3Fs+%3Flabel+%3Faccess+%3Fimage (GROUP_CONCAT(DISTINCT+%3Fspatial_labels%3B+separator%3D"|")+AS+%3Fspacial_label) (GROUP_CONCAT(DISTINCT+%3Ftemporal_labels%3B+separator%3D"|")+AS+%3Ftemporal_label) (GROUP_CONCAT(DISTINCT+%3Fjps_temporals%3B+separator%3D"|")+AS+%3Fjps_temporal) (GROUP_CONCAT(DISTINCT+IF(BOUND(%3Fdescriptions)%2C+CONCAT(str(%3Fdescriptions)%2C+IF(lang(%3Fdescriptions)+!%3D+""%2C+CONCAT("%40"%2C+lang(%3Fdescriptions))%2C+""))%2C+"")%3B+separator%3D"|")+AS+%3Fdescription) (COUNT(DISTINCT+%3FworkFeatured)+AS+%3FcountOfWorkFeatured) where+{ %3Fs+rdf%3Atype+type%3A展覧会%3B +++++++rdfs%3Alabel+%3Flabel+.+ ++ optional+{+%3Fs+jps%3AaccessInfo%2Fschema%3Aprovider%2Frdfs%3Alabel+%3Faccess+.++} ++optional+{+%3Fs+schema%3Aspatial%2Frdfs%3Alabel+%3Fspatial_labels+.+} ++++optional+{+%3Fs+schema%3Atemporal%2Frdfs%3Alabel+%3Ftemporal_labels+.+} ++++optional+{+%3Fs+jps%3Atemporal%2Fschema%3Adescription+%3Fjps_temporals+.+} ++++optional+{+%3Fs+schema%3Adescription+%3Fdescriptions+.+} ++++++optional+{+%3Fs+schema%3Aimage+%3Fimage+.+} ++optional+{%3Fs+schema%3AworkFeatured+%3FworkFeatured+} } group+by+%3Fs+%3Flabel+%3Fspatial_label+%3Ftemporal_label+%3Fdescription+%3Fjps_temporal+%3Faccess+%3Fimage order+by+%3Fs ...

2023年8月4日 · 1 分 · Nakamura

Nuxt3でURLクエリの変更をwatchで監視する

Nuxt3でURLクエリの変更をwatchで監視しようと思い、以下のように書いてみましたが、URLクエリが変更されても、watchは機能しませんでした。 <script lang="ts" setup> const route = useRoute() watch( route, () => { console.log(route['query']) } ) </script> そこで、以下の記事を参考にさせていただきました。 https://qiita.com/YumaInaura/items/9c86ed91d56402e816db 以下のような記述に変更することで、URLクエリに合わせて、watchが機能しました。 <script lang="ts" setup> const route = useRoute() watch( () => route.query, () => { console.log(route['query']) } ) </script> 色々とわかっていない点が多いですが、他の方の参考になりましたら幸いです。

2023年7月29日 · 1 分 · Nakamura

Apache Solrのフィールドがどのようにインデックスされているか確認する方法

Apache Solrのフィールドがどのようにインデックスされているか確認する方法のメモです。 Schema APIを使う SolrのSchema APIを使って、特定のフィールドがどのように定義されているかを確認できます。下記は特定のフィールドに対するリクエストの例です。 http://localhost:8983/solr/{core_name}/schema/fields/{field_name} このURLにブラウザからアクセスしたり、curlコマンドなどを使ってGETリクエストを送ると、特定のフィールドに関する情報がJSON形式で返されます。その中にはそのフィールドがどのようにインデックスされているかに関する情報も含まれます。 Solr管理UIを使う Solrが提供している管理UIからもフィールドがどのようにインデックスされているかを確認できます。 Solrの管理UI (http://localhost:8983/solr) をブラウザで開きます。 左側のメニューから「Core Selector」を選択し、該当のコアを選びます。 コアを選択したら、メニューから「Schema Browser」を選択します。 「Schema Browser」ページでフィールド名を選択すれば、そのフィールドがどのようにインデックスされているかに関する詳細情報が表示されます。 この2つの方法で、Solrに格納されているフィールドがどのようにインデックスされているかを確認できます。どちらの方法も、フィールドがどのような型で定義されているか、どのようなオプションが設定されているかなど、フィールドの定義に関する詳細な情報を提供します。

2023年7月23日 · 1 分 · Nakamura

Omeka Classic IIIF Toolkitにデータを一括登録する

概要 Omeka Classic IIIF Toolkitにデータを一括登録する方法を説明します。Omeka Classic IIIF Toolkitのセットアップについては、以下を参考にしてください。 また、以下の記事の内容を発展させ、excelデータを入力データとして、より簡便に使用できるようにしたものです。 excelファイルの準備 以下のようなexcelファイルを準備します。 https://github.com/nakamura196/000_tools/blob/main/data/sample.xlsx 「collection」「item」「annotation」の3つのシートを用意します。 collection manifest_uri https://d1fasenpql7fi9.cloudfront.net/v1/manifest/3437686.json item title canvas_uri width height image_url manifest_uri 校異源氏物語. 巻一 [4] https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 6890 4706 https://www.dl.ndl.go.jp/api/iiif/3437686/R0000004/full/full/0/default.jpg https://d1fasenpql7fi9.cloudfront.net/v1/manifest/3437686.json 校異源氏物語. 巻一 [4] https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 6890 4706 https://www.dl.ndl.go.jp/api/iiif/3437686/R0000005/full/full/0/default.jpg https://d1fasenpql7fi9.cloudfront.net/v1/manifest/3437686.json annotation chars x y w h canvas_uri tag 3125 4898 4008 241 79 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 序 2910 868 147 140 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 913.36 たH 2228 226 586 156 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 或は撮影して、 897 3517 83 434 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 一 810 3528 30 17 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/4 序 6018 1055 65 65 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 二 6025 3535 49 39 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 殆んどあらゆる現存貴重資料に及び、 5889 707 86 1090 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 一字をも忽にしない細緻な〓究は、 5889 1837 86 1012 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 フイルム等 5501 3614 76 323 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 大島雅太郞氏· 916 3491 89 436 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 序 807 1048 65 61 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 三 815 3517 61 57 https://www.dl.ndl.go.jp/api/iiif/3437686/canvas/5 python 以下のライブラリをインストールします。 ...

2023年7月20日 · 1 分 · Nakamura

Mirador3プラグイン開発: ウインドウをコピーする

概要 Mirador3のプラグインとして、ウインドウをコピーするプラグインを作成しました。 なお本機能は以下のプラグインですでに提供されているものです。 https://github.com/ProjectMirador/mirador-plugin-demos そのため、本プラグインはプラグインの開発手順を学ぶために作成しています。そのような観点で、本プラグインが参考になりましたら幸いです。 画面例は以下です。 ソースコードは以下です。 https://github.com/nakamura196/mirador-copy-window-plugin デモサイトは以下です。 https://nakamura196.github.io/mirador-copy-window-plugin/ 開発メモ 本プラグインの開発にあたり、まず以下のリポジトリをcloneし、変更を加えていきました。 https://github.com/ProjectMirador/mirador-dl-plugin src/index.js まず以下のファイルについて、miradorDownloadをMiradorCopyWindowに書き換えました。 https://github.com/nakamura196/mirador-copy-window-plugin/blob/main/src/index.js src/MiradorCopyWindow.js 以下のファイルが主に編集するファイルです。 https://github.com/nakamura196/mirador-copy-window-plugin/blob/main/src/MiradorCopyWindow.js 本ファイルは、まず以下のファイルの内容をコピーしました。 https://github.com/ProjectMirador/mirador-plugin-demos/blob/master/src/plugins/copy-window.js まず末尾の以下の記述から説明します。 export default { target: 'WindowTopMenu', mode: 'add', component: CopyWindowComponent, mapDispatchToProps: mapDispatchToProps, mapStateToProps: mapStateToProps, } targetとmode targetはコンポーネントを設置する場所を指定します。またmodeはコンポーネントの追加方法を指定します。modeについては、addやwrapという選択肢があるようでした。 以下、targetの値の例です。 WindowTopMenu 各ウインドウ上部のメニューの部分です。 WorkspaceControlPanelButtons ワークスペースのパネル部分です。 AnnotationSettings アノテーションの設定画面です。 最後のAnnotationSettingsおよびmodeにwrapが指定されているプラグインとして、以下のMiradorのアノテーション付与モジュールがありました。 https://github.com/ProjectMirador/mirador-annotations/blob/master/src/plugins/miradorAnnotationPlugin.js mapDispatchToPropsとmapStateToProps これがはじめ理解しづらかった(そしてまだ適切に説明できるほど理解できていない)のですが、propsに渡すdispathとstateを定めた変数を指定します。 dispatchについては、以下の変数を与えてます。 const mapDispatchToProps = (dispatch, { windowId }) => ({ copyWindow: () => dispatch(copyWindowAction(windowId)), }); copyWindowActionの具体的な内容は以下です。既存のwindowを取得して(1)、不要な変数を削除した上でwindowをコピーして(2)、それをaddWindow(3)しています。 const copyWindowAction = (windowId) => (dispatch, getState) => { const window = getState().windows[windowId]; // 1 const cleanedWindow = omit(window, [ 'id', 'companionWindowIds', 'thumbnailNavigationId', ]); // 2 dispatch(mirador.actions.addWindow(cleanedWindow)); // 3 }; stateについては、以下の変数を与えています。以下の例は少し特殊で、stateをすべてpropsに渡す設定となっています。他のプラグインでは、必要な値のみをstateから抽出して、propsに渡しているようでした。 const mapStateToProps = (state) => ({ state: state, }); 実際、本プラグインでは、mapStateToPropsでpropsに渡された値は使用されていないため、この記述はなくてもよいはずです。そのため、以下でもmapStateToPropsの記述は省略しています。 https://github.com/nakamura196/mirador-copy-window-plugin/blob/main/src/MiradorCopyWindow.js component 最後にcomponentです。以下のように、コンポーネントで表示する内容を記述しています。 ...

2023年7月19日 · 1 分 · Nakamura

wikibase.cloudでQuickStatementsを試す

概要 wikibase.cloudでQuickStatementsを試してみましたので、その備忘録です。 以下の記事を参考にさせていただきました。 https://qiita.com/higa4/items/10affb47215def42d8e0 追加 上記の記事の通り、csvファイルをインポートしています。 ところが、以下のようなエラーが発生しました。 原因は、独自に立てたwikibaseインスタンスに、必要なプロパティが未登録だったことが原因でした。 Property [[Property:P1814|P1814]] not found WikibaseSyncなどを使って、事前に(特にwikidataと同じIDの)プロパティを登録しておく必要があることがわかりました。 そのため、ラベルに関する情報のみを登録する以下のようなデータを登録してみました。 qid,Lja,Len,Dja,Den,qal1545 ,タイトル,title,""""説明,desc,1 結果、以下のようにデータの新規登録ができました。 更新 次のコマンドで、上記で登録したQ59の更新を試みました。 qid,Lja,Len,Dja,Den,qal1545 Q59,変更後のタイトル,updated title,""""変更後の説明,updated desc,1 結果、以下のように、いずれの値も更新することができました。 まとめ ほんの一例ですが、QuickStatementsを試してみました。APIでの登録例を以下の記事で紹介していますが、CSVによる登録はユーザフレンドリーな機能だと感じました。 他の方の参考になりましたら幸いです。

2023年7月19日 · 1 分 · Nakamura

WikibaseSyncを試す

概要 以下のWikibaseSyncを試す機会がありましたので、その備忘録です。 https://github.com/the-qa-company/WikibaseSync 以下の論文で、上記のツールを知りました。 https://doi.org/10.11517/jsaisigtwo.2022.SWO-056_04 インストール ソースコードや関連ライブラリをインストールします。 !get clone https://github.com/the-qa-company/WikibaseSync cd WikibaseSync !pip install -r requirements.txt Bot Accountの作成 事前に用意したWikibaseにアクセスし、「Special pages」から、「Bot passwords」をクリックします。 以下の画面で、「Bot name」を入力します。 次の画面で、以下の3つにチェックを入れます。 Give him the follwing rights: “High-volume editing”, “Edit existing pages” and “Create, edit, and move pages” 結果、以下のようなメッセージが表示され、パスワードを取得することができます。 The bot password for bot name "WikidataUpdater" of user "Nakamura" was created. The new password to log in with Nakamura@WikidataUpdater is xxxxxxxxxxxxxx. Please record this for future reference. (For old bots which require the login name to be the same as the eventual username, you can also use Nakamura as username and WikidataUpdater@xxxxxxxxxxxxxx as password.) Return to Special:BotPasswords. そして、以下の説明にしたがって、インストールしたソースコードの設定ファイルに、上記のBotに関する情報を入力します。 ...

2023年7月19日 · 1 分 · Nakamura

wikibaseのapiをつかってみる

概要 wikibaseのapiをpythonクライアントから使用する機会がありましたので、その備忘録です。 以下のライプラリを使用しました。 https://wikibase-api.readthedocs.io/en/latest/index.html インストール 以下でインストールします。 !pip install wikibase-api Read 今回は、以下のwikibaseインスタンスに対して処理を行います。 https://nakamura196.wikibase.cloud/ from wikibase_api import Wikibase api_url = "https://nakamura196.wikibase.cloud/w/api.php" wb = Wikibase(api_url=api_url) r = wb.entity.get("Q1") print(r) 上記により、Q1に関する情報を取得することができました。 Create 認証情報の取得 アイテムの作成などを行う際には、以下のどちらかの方法で認証を行う必要がありました。 Authentication using OAuth Authentication with a user account 後者はBot passwordsを作成する方法で、以下の記事でも作成方法を紹介しています。 今回は前者の方法を試します。 「Special pages」の「OAuth consumer registration」を選択します。 「Request a token for a new OAuth 1.0a consumer.」と「Request a token for a new OAuth 2.0 client.」の2つの作成方法がありますが、前者を選択します。 項目を埋めていきます。 今回はテストのため、すべての項目にチェックを入れました。 結果、以下のようなページが表示され、認証情報を取得できます。 実行 .envファイルを作成します。 consumer_key=xxx consumer_secret=yyy access_token=zzz access_secret=aaa load_dotenvを使って認証情報をロードして、設定します。 ...

2023年7月19日 · 2 分 · Nakamura

Dataverseを試す

概要 Dataverseを試す機会がありましたので、その備忘録です。以下のデモ環境を使用します。 https://demo.dataverse.org/ アカウント作成 Sign Upからアカウントを作成します。 Dataverseの作成 Dataverseを作成してみます。 以下のようなDataverseを作成しました。 https://demo.dataverse.org/dataverse/nakamura196 Datasetの作成 Add Dataから、データセットを作成します。 以下が登録画面です。 以下が登録結果の画面です。 URLは以下になっており、自動的に付与されるDOIをシステム内の識別子として利用しているようでした。 https://demo.dataverse.org/dataset.xhtml?persistentId=doi:10.70122/FK2/HBXQPZ Whole Tale Access Datasetボタンのオプションに、Whole Taleというものがありました。 アカウントを作成して、Compute EnvironmentをJupyter Notebookに設定してみます。 Acknowledge allボタンを押します。 結果、以下のようなJupyter Notebookの環境が作成されました。 Pythonを使って、ダウンロードした画像を表示してみます。 上記のように、データセットやソースコードに対する動作確認や検証もシームレスに実行できるようでした。 Widgets 以下の「Thumbnails + Widgets」を押してみます。 以下の「Widgets」タブを表示してみます。 上記のコードを埋め込んでみると、以下に示すように、データセットに関する情報を埋め込み表示することができました。 https://codepen.io/satoru196/pen/NWEMvEV?editors=1000 API Pythonのライブラリを使ってみます。 https://pydataverse.readthedocs.io/en/latest/ ライブラリをインストールします。 !pip install pyDataverse データのダウンロード 以下のページを参考にしました。 https://pydataverse.readthedocs.io/en/latest/user/basic-usage.html#download-and-save-a-dataset-to-disk from pyDataverse.api import NativeApi, DataAccessApi from pyDataverse.models import Dataverse base_url = 'https://demo.dataverse.org' api = NativeApi(base_url) data_api = DataAccessApi(base_url) DOI = "doi:10.70122/FK2/HBXQPZ" dataset = api.get_dataset(DOI) files_list = dataset.json()['data']['latestVersion']['files'] for file in files_list: filename = file["dataFile"]["filename"] file_id = file["dataFile"]["id"] print("File name {}, id {}".format(filename, file_id)) response = data_api.get_datafile(file_id) with open(filename, "wb") as f: f.write(response.content) データセットの作成(demo.dataverse.orgでは権限がありませんでした。) demo.dataverse.orgでは権限がありませんでしたが、実施した内容をメモします。 ...

2023年7月19日 · 1 分 · Nakamura

wikibase.cloudを使ってみる

概要 wikibase.cloudを使ってみる機会がありましたので、その備忘録です。 ドキュメント 以下にマニュアルがありました。 https://www.mediawiki.org/wiki/Wikibase/Wikibase.cloud インスタンスの作成 はじめに独自ドメインを設定してみましたが、うまくいきませんでした。以下、記録だけ残します。以後、独自ドメインを諦めて、nakamura196.wikibase.cloudを使用しています。 失敗 独自のドメインを割り当てられるようでしたので、wikibase.aws.ldas.jpを入力しました。 Route 53で以下のような設定を行いました。 テーマの変更 以下のSet Skinで見た目を変更することができました。 Vector Modern Timeless データを作成してみる デフォルトで作成されるユーザでログインすると、以下の画面に遷移しました。 Satoru Itemを作成してみました。 以下のように作成されました。 プロパティ プロパティnameを作成してみます。 アイテムへのStatementsの追加 作成したプロパティ(P1)を使って、アイテム(Q1)にStatementsを追加してみます。 Query Service クエリサービスも問題なく動作しました。 タイムラインを用いた可視化例です。 #defaultView:Timeline select * where { ?s wikibase:timestamp ?o . } 棒グラフの表示例です。 #defaultView:BarChart select ?name (count(?name) as ?count) where { ?s <https://nakamura196.wikibase.cloud/prop/direct/P1> ?name . } group by ?name ...

2023年7月14日 · 1 分 · Nakamura

onClose propを使用する

MUIのDialogコンポーネントにおいてonBackdropClickを使用したところ、以下の警告が発生しました。 Warning: Failed prop type: The prop `onBackdropClick` of `ForwardRef(Dialog)` is deprecated. Use the onClose prop with the `reason` argument to handle the `backdropClick` events. 警告メッセージは、Dialogコンポーネントの非推奨のprop onBackdropClickに関するものです。これは、このpropがあなたのコードのどこかで使用されているが、もはやサポートされていないか、使用が推奨されていないことを意味します。警告は代わりにonClose propを使用するように提案しています。 これを解決する方法は以下の通りです: 以前は、コードに以下のようなものがあったかもしれません: <Dialog open={isOpen} onBackdropClick={handleBackdropClick} > { /* ダイアログの内容 */ } </Dialog> 警告に従って、これをonClose propを使用するように更新する必要があります: <Dialog open={isOpen} onClose={(event, reason) => { if (reason === 'backdropClick') { handleBackdropClick(); } }} > { /* ダイアログの内容 */ } </Dialog> 上記のコードでは、onClose propは関数を取り、eventとreasonという2つの引数を受け取ります。reasonは’backdropClick’、’escapeKeyDown’、またはundefinedになる可能性があります。reasonが’backdropClick’かどうかをチェックすることで、ユーザーがダイアログボックスの外側をクリックしたときに関数handleBackdropClick()を実行できます。 以上のようにコードを更新すると、警告は表示されなくなりました。 ...

2023年7月11日 · 1 分 · Nakamura

Mirador 3でビューポートが設定した制約を満たすようにズームを行う

概要 Mirador 3で特定の領域にズームにするには、以下に記載があるような方法で行います。 https://github.com/ProjectMirador/mirador/wiki/M3---Mirador-3-Frequently-Asked-Questions#q-how-do-i-change-the-view-of-an-image-to-zoom-to-a-certain-area 具体的には以下です。 // Box to zoom to const boxToZoom = { x: 1420, y: 1831, width: 800, height: 1195 }; const zoomCenter = { x: boxToZoom.x + boxToZoom.width / 2, y: boxToZoom.y + boxToZoom.height / 2 }; var action = Mirador.actions.updateViewport(windowId, { x: zoomCenter.x, y: zoomCenter.y, zoom: 1 / boxToZoom.width }); miradorInstance.store.dispatch(action); 内部的にはOpenSeadragonのpanToとzoomToが使用されているようでした。 この時の課題として、zoomToは以下の記事にあるように、constraintsを無視して拡大するようでした。 https://github.com/openseadragon/openseadragon/issues/881 これに対して、以下の記事で示したように、viewer.viewport.applyConstraints();の処理を追加することで、constraintsを守った拡大ができるようになりました。 以下、強引ではありますが、npmでインストールしたMiradorに対して、上記の設定を行う方法を紹介します。 Miradorの編集 以下でMiradorをインストールします。 npm install mirador node_modules以下にmiradorフォルダが作成されます。 その中にある以下のファイルに対して、viewport.applyConstraints();を追加する例を示します。 ... { key: "componentDidUpdate", value: function componentDidUpdate(prevProps, prevState) { var _this$props2 = this.props, viewerConfig = _this$props2.viewerConfig, canvasWorld = _this$props2.canvasWorld; var viewer = this.state.viewer; this.apiRef.current = viewer; if (prevState.viewer === undefined) { if (viewerConfig) { viewer.viewport.panTo(viewerConfig, true); viewer.viewport.zoomTo(viewerConfig.zoom, viewerConfig, true); viewerConfig.degrees !== undefined && viewer.viewport.setRotation(viewerConfig.degrees); viewerConfig.flip !== undefined && viewer.viewport.setFlip(viewerConfig.flip); } this.addAllImageSources(!viewerConfig); return; } if (!this.infoResponsesMatch(prevProps.infoResponses) || !this.nonTiledImagedMatch(prevProps.nonTiledImages)) { viewer.close(); var canvasesChanged = !isEqual(canvasWorld.canvasIds, prevProps.canvasWorld.canvasIds); this.addAllImageSources(canvasesChanged || !viewerConfig); } else if (!isEqual(canvasWorld.layers, prevProps.canvasWorld.layers)) { this.refreshTileProperties(); } else if (viewerConfig && !this.osdUpdating) { var viewport = viewer.viewport; if (viewerConfig.x !== viewport.centerSpringX.target.value || viewerConfig.y !== viewport.centerSpringY.target.value) { viewport.panTo(viewerConfig, false); } if (viewerConfig.zoom !== viewport.zoomSpring.target.value) { viewport.zoomTo(viewerConfig.zoom, viewerConfig, false); viewport.applyConstraints(); // ここを追加 } if (viewerConfig.rotation !== viewport.getRotation()) { viewport.setRotation(viewerConfig.rotation); } if (viewerConfig.flip !== viewport.getFlip()) { viewport.setFlip(viewerConfig.flip); } } } ... 上記の設定により、Mirador.actions.updateViewportでズームした際に、constraintsを守った拡大ができるようになりました。 ...

2023年7月11日 · 1 分 · Nakamura

Monaco EditorでLaTeXをハイライトする

概要 Monaco EditorでLaTeXをハイライトする機会がありましたので、備忘録です。 Ace Editorを対象にした以下の記事の続編です。 参考になりましたら幸いです。 画面例 デモサイト https://nakamura196.github.io/ace_latex/monaco/ リポジトリ https://github.com/nakamura196/ace_latex/ ソースコード <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Monaco Editor Demo</title> <link href="https://cdn.jsdelivr.net/npm/monaco-editor@0.40.0/min/vs/editor/editor.main.min.css" rel="stylesheet" /> </head> <body> <h2>Monaco Editor LaTeX</h2> <div id="container" style="width: 100%; height: 600px; border: 1px solid lightgray" ></div> <script src="https://cdn.jsdelivr.net/npm/monaco-editor@0.40.0/min/vs/loader.min.js"></script> <script> require.config({ paths: { vs: "https://cdn.jsdelivr.net/npm/monaco-editor@0.40.0/min/vs", }, }); require(["vs/editor/editor.main"], function () { // Register a new language monaco.languages.register({ id: "latex" }); // Register a tokens provider for the language monaco.languages.setMonarchTokensProvider("latex", { tokenizer: { root: [ [/(\\[a-zA-Z]+)/, "command"], // LaTeX commands [/(\\[\w\u3000-\u9FFF]+)/, "note"], // LaTeX commands [/(\{)/, "brace"], [/(\})/, "brace"], [/(\[)/, "bracket"], [/(\])/, "bracket"], [/(document|dvips)/, "keyword"], // LaTeX keywords [/(%.*)/, "comment"], // Comments ], }, }); // Define a new theme that contains only rules that match this language monaco.editor.defineTheme("myTheme", { base: "vs", inherit: true, rules: [ { token: "command", foreground: "#F44336" }, // LaTeX commands in red { token: "note", foreground: "#2196F3" }, // Notes in blue { token: "brace", foreground: "FF00FF" }, // Braces in magenta { token: "bracket", foreground: "00FFFF" }, // Brackets in cyan { token: "keyword", foreground: "#4CAF50" }, // Keywords in green { token: "comment", foreground: "#9E9E9E" }, // Comments in gray ], colors: {}, }); monaco.editor.create(document.getElementById("container"), { value: getCode(), language: "latex", theme: "myTheme", wordWrap: true, }); }); function getCode() { return `\\documentclass{tbook} \\usepackage{hiragino,cid} \\usepackage[dvips]{graphics} \\usepackage{font} % \\見開き \\begin{document} テキスト \\書名{(サンプル)}テキスト 長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト長いテキスト\\右注{(あああ)}長いテキスト長いテキスト \\右注{(サンプル)}テキスト \\end{document}`; } </script> </body> </html> カスタム言語の設定方法については、以下のページが参考になりました。 ...

2023年7月10日 · 2 分 · Nakamura

Ace.jsでTeXをハイライトする

概要 Ace.jsでTeXをハイライトする機会がありましたので、備忘録です。 以下の記事を参考にしました。 https://banatech.net/blog/view/11 参考になりましたら幸いです。 画面例 デモサイト https://nakamura196.github.io/ace_latex/ リポジトリ https://github.com/nakamura196/ace_latex ソースコード <html lang="en"> <head> <title>ACE in Action</title> </head> <body> <div id="editor" style="width: 100%; height: 400px; border: 1px solid gray;"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.2/ace.js" integrity="sha512-oVyp48/610D5Jo577cvp2vX+Fc0kYaI6s2tZRqBRzjZh7+y/vOEHTzUefbXk/B8P0B76bOK3tL1zeF/QcXlyiA==" crossorigin="anonymous" referrerpolicy="no-referrer" ></script> <script> const text = `\\usepackage{hiragino,ryumin,cid} \\usepackage[dvips]{graphics} \\usepackage{multicol} \\begin{document} テキスト \\右注{(サンプル)}テキスト \\end{document}`; const editor = ace.edit("editor"); // editor.setTheme("ace/theme/monokai"); editor.setFontSize(14); editor.getSession().setMode("ace/mode/latex"); editor.getSession().setUseWrapMode(true); editor.getSession().setTabSize(4); editor.$blockScrolling = Infinity; editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: true, }); editor.setValue(text, 1); </script> </body> </html>

2023年7月9日 · 1 分 · Nakamura

Github Actionsを使ってGithubからEC2までのDjangoのCICD環境構築(2023版)

概要 Github Actionsを使ってGithubからEC2までのDjangoのCICD環境を構築する機会があり、その備忘録です。 以下の記事を参考にさせていただきました。 https://qiita.com/fffukken/items/27b0bfa712940914d3f6 上記の記事に対して、Github Actionsの設定を一部更新しました。 Github Actionsの設定 name: Test and Deploy on: push: branches: [ develop, main ] pull_request: branches: [ develop ] jobs: build: runs-on: ubuntu-latest strategy: max-parallel: 4 matrix: python-version: [3.9, "3.10"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run Tests run: | python manage.py makemigrations python manage.py migrate python manage.py test - name: deploy run: | echo "$SECRET_KEY" > secret_key chmod 600 secret_key ssh -oStrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST} -i secret_key "source <仮想環境名>/bin/activate \ && cd ~/<プロジェクト名>\ && git pull origin main \ && python manage.py makemigrations \ && python manage.py migrate \ && deactivate \ && sudo systemctl restart gunicorn" env: SECRET_KEY: ${{ secrets.SECRET_KEY }} EC2_USER: ${{ secrets.EC2_USER }} EC2_HOST: ${{ secrets.EC2_HOST }} 変更した点として、actions/checkoutとactions/setup-pythonのバージョンを変更しました。また、pip installの部分を変更し、pip install -r requirements.txtにしました。 ...

2023年7月9日 · 1 分 · Nakamura