ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Raspberry Pi 4でVNCサーバの設定

(2021-06-24 初稿 - 2021-07-13 追記)

Raspberry Pi 3の時に設定したのに、忘れてしまったのでメモ。

Raspberry PiVNCを利用するには、メニューから「設定」、「Raspberry Piの設定」で「インターフェース」タブを選択し、「VNC:」が「有効」にチェックを入れる。

f:id:hymd3a:20210713141256p:plain

Raspberry Pi 4でも、VNCサーバに接続するためには、認証設定をUNIXパスワードからVNCパスワードに設定変更する。

f:id:hymd3a:20210623143215p:plain

VNCサーバの設定画面

f:id:hymd3a:20210623143231p:plain

UNIXパスワードからVNCパスワードへ変更

関連ページ

Recollで全文検索

(2021-06-22 初稿 - )

LinuxでPDF等の全文検索をするコマンドは、namazu、beagle等が有名だが、今は開発が停滞中とか…

探してみると、筆者の使っているDebianにはrecollというコマンドがあった。

Recollは、テキスト、HTML、OpenOffice.orgドキュメント、メールメッセージ、PDFファイル、Word、PowerPointExcel等のファイルが検索できる。

f:id:hymd3a:20210622190440p:plain

Recollで全文検索

さっそく、以下のとおりインストール。

sudo apt install recoll

なんと、python-recollやpython3-recollも同時にインストールしてくれた。
pythonからの使い方は、わかれば後日追記する。)

メニューから「アクセサリ」、「Recoll」を選択するか、ターミナル上で「 recoll &」で起動。

起動すると、以下の画面が出てindexの作成方法について聞かれる(後でも変更できるのでお気楽に)。

f:id:hymd3a:20210622190204p:plain

最初の起動直後の設定画面

筆者は、デスクトップやノートPCではリアルタイム、サーバではCronでスケジューリングすることにした。

f:id:hymd3a:20210622190405p:plain

リアルタイムでindex作成をする

冒頭にrecollが検索可能なファイル一覧を示したが、現状で検索できないファイルの一覧が ~/.recoll/missing の中に書かれている。
筆者の手元では、以下のとおり。

$ cat .recoll/missing
Perl::Image::ExifTool (image/jpeg)
python:mutagen (audio/mpeg)
python:rarfile (application/x-rar)

それぞれ、以下のパッケージをインストール(sudo apt install xxxx)すれば検索できるようになる。

libimage-exiftool-perl
python3-mutagen (python-mutagen)
python3-rarfile (python-rarfile)

少しだけ使ってみたが、そこそこ速いと思った。これなら、モバイルPCでも十分に使えそう。

Tips

どうも英語力が乏しくて、なかなかmanコマンドで読みきれない。(滝汗)
なので、Webサイトに行って、少しだけ読んでみた。
特に注目したのは、「3.1.1. Simple search」と「3.6. The query language」の部分ね。

なんとなくわかったことだけメモ。^^;

  • Query language  普段の検索は、これを使うといい。言葉で検索するくらいの意味
  • Any term              OR検索
  • All terms               AND検索
  • File name             ファイル名検索

Query lanuageだけ、少し詳しく。

  1. 日本語  英語   ⇒  日本語と英語のAND検索  スペースはAND検索
  2. 日本語 OR 英語 ⇒ 日本語 または 英語 ORは大文字でちゃんと書く
  3. 日本語 英語 -スペイン語 ⇒ 日本語と英語が含まれており、スペイン語は含まれない
  4. "John Lennon"  ⇒ JohnとLennonが順番に一つの単語として検索する

あとCUI大好きな筆者としては、「-t」オプションを付けるとCUIで検索できる点もポイントが高い。

recoll -t -q [SearchWord]

皆さんも、便利だから使ってみてね。

関連ページ

Vimのスクリプトをpythonで作る

(2021-06-18 初稿 - 2021-06-19 追記)

最近、pythonに触る機会が多い。頭の容量が少ない筆者は、Vimスクリプトpythonで書けたら、覚えることが少なくていいかなと思った。

調べてみると、Debian Busterのvimは、python3が使えるようだ。

vimのコマンド領域で、以下のとおり入力して"1"が返ってくれば、python3が使える。

:echo has('python3')    # 1

ちなみに、Debian BusterのVimでは、python2系は使えない。

vim --version で調べて、"+"が付いていると使えて、"-"だと使えないとのこと。

このページは、以下のサイトを参考に記述した。とても感謝。m(__)m

なお、ネットを検索して嫌なページを見てしまった。自分が同じことをrubyで考えて作ったページ。進歩がなくて、ほんとに情けない。(T_T)

さて、気を取り直して、まずはワンライナー

:python3 print("Hello Python3")    # Hello Python3
:py3 print("Hello Python3")        # Hello Python3

 python3はpy3と省略できる。

ワンライナーでは、できることが限られるので、pythonを使ったVim関数を作る。ここでは、簡単に日付と時間をvimのbufferに追加する関数。

なお、VimPythonの橋渡しとして、vimモジュールを読み込むと便利らしい。

function! GetDateTime()
py3 <<< EOC
import vim
import datetime

dt_now = datetime.datetime.now()
print(dt_now)
vim.current.buffer.append(str(dt_now))
EOC
endfunction

Vimの関数の中に、「py3 <<< EOC」と「EOC」との間にpythonのコードを書く。

実行方法は以下のとおり。

:source %                   # スクリプトファイルの読み込み
:tabe                       # 新たなバッファを準備
:call GetDateTime()         # GetDateTime()を実行
2021-06-18 20:36:22.859609  # 実行したBufferの最後に追加

なお、vimモジュールを読み込むことによって利用できるコマンドは、以下のサイトを参照してね。

現在のバッファの最後に追加するのは、上記スクリプトのとおりだが、カーソルがある行に追加するのはどうするのだろう… (・・?

で、調べてみると、以下のサイトに答えがあった。多謝。m(__)m

line('.')というVimのコマンドを実行して、evalで評価するようだ。

line = int(vim.eval("line('.')"))

なるほど、vimモジュールに無いコマンドは、vimで実行してからvimモジュールで評価すれば良いのね。目からウロコ。なんか、無限にコマンドが広がった感じ。

それで、現在のカーソル行に日付を挿入するスクリプトは以下のとおり。

なお、line('.')で得られる行番号は1からで、appendは0からなので、-1することと、strftimeで日付の出力を整形したこととに注意。

function! GetDateTime()
py3 <<< EOC
import vim
import datetime

dt_now = datetime.datetime.now()
line = int(vim.eval("line('.')")) - 1 
vim.current.buffer.append(dt_now.strftime("[%Y-%m-%d %H:%M:%S]"), line)
EOC
endfunction

実行すると、以下のように実行時の日付と時刻がカーソル行に挿入されればOK。

[2021-06-18 21:45:04]

この他、変数の受け渡し等、記述することはいっぱいあるのだが、最初に紹介したサイトに例があるので参考に。(超手抜き ^^;)

ちなみに、このページで作成したスクリプトは以下のコマンドと同じ。(^^ゞ

ちなみに、%はvimでは編集中ファイルの意味だから、エスケープしてるよ。

r! date +"[\%Y-\%M-\%D \%H-\%m-\%s]"

dateコマンドのように独立しても使えると、やはり便利だよね。だから、編集中のbufferの行や単語単位の細かい修正等、よ〜く考えてスクリプト作った方がいいかもね。 > 自分。^^;

関連ページ

pythonでtwitterの投稿に「いいね」してくれたユーザの一覧(API Ver2)を出力する

(2021-06-10 初稿 - )

はじめに

TwitterAPI Ver2が公開されて、投稿に「いいね」(like)してくれた人の一覧を得ることができるようになった。ただし、1 tweetあたり100個までとのこと。筆者の場合は、超余裕の仕様。(笑)

せっかくなので、API Ver2で自分の投稿に「いいね」してくれた奇特な方の一覧を取得してみた。

ちなみに、筆者の環境は以下のとおり。

検索の仕方が悪く、良いサイトが見つからなかったので、変なスクリプトを自作。^^;

スクリプト自体は、上記サイトの主にcurlの部分を参考に作成した。

f:id:hymd3a:20210610175911p:plain

Twitter画面

準備

スクリプトの作成よりも、準備の方が数倍大変。(-_-;)

アプリケーションの登録と各種tokenキーなどの取得

以下のdeveloperのサイトにログインして、なんとかしてアプケーションを登録。

その際、V1.1 ACCESSとV2 ACCESSができるようにプロジェクトを作成し、スタンドアロンにはしないこと。なお、登録等の詳細は他のサイトを検索してね(手抜き)

必要なキーは、consumer_key、consumer_secret、access_token_key、access_token_secretとbearer_tokenで、全てメモをしておくこと。

ただし、このページのスクリプトでは、bearer_tokenしか使わない

ユーザーIDの確認

スクリプトでは、user_idが必要になる。普段見る機会が少ないが、以下のサイト等を参照して、自分のuser_idを確認する。

要約すると、Twitterのホームページをブラウザで開き、ソースコードを表示して、「user_id」を検索する。

スクリプトの作成

Bearer_tokenとuser_idを手元に準備できたら、スクリプトを作成を開始する。

なお、筆者は、pythonも素人なので、いろいろ指摘してね。

自分の直近のtweet idを取得する

「いいね」してくれたユーザ一覧を取得するためには、まずtweet idを取得する必要がある。

tweet idも普段見ないが、自分のtweet一つだけをブラウザで開いてみると、アドレスバーに並んでいる数字列がtweet id。

さて、tweet id取得の参考になるのは、上記サイトの以下のcurlスクリプト

curl -H "Authorization: Bearer $BEARER_TOKEN" "https://api.twitter.com/2/users/{use_id}/tweets?max_results=5"

ヘッダーにbearer_tokenを指定、user_idを記入して、twitterapiにアクセスすれば良いよう…

curlが使える環境ならば、自分のtweetが5件取得できるか実際に試してみて。

この部分を、pythonにすると以下のよう。

url = "https://api.twitter.com/2/users/{}/tweets?max_results={}".format(user_id,MAX_COUNT)
head = {"Authorization": "Bearer {}".format(bearer_token)}
req = urllib.request.Request(url, headers=head)
res = urllib.request.urlopen(req).read()

ちなみに、MAX_COUNTは最大100個までだそうだが、あまりに多いのは負荷がかかるのでやめようね。

{
  "data": [
    {
      "id": "1338971066773905408",
      "text": "💡 Using Twitter data for academic research? Join our next livestream this Friday @ 9am PT on https://t.co/GrtBOXh5Y1!n n@SuhemParack will show how to get started with recent search &amp; filtered stream endpoints on the #TwitterAPI v2, the new Tweet payload, annotations, &amp; more. https://t.co/IraD2Z7wEg"
    },
    (中略)
    {
      "id": "1334564488884862976",
      "text": "Before we release new #TwitterAPI endpoints, we let developers test drive a prototype of our intended design. @i_am_daniele takes you behind the scenes of an endpoint in the making. https://t.co/NNTDnciwNq"
    }
  ],
  "meta": {
    "oldest_id": "1334564488884862976",
    "newest_id": "1338971066773905408",
    "result_count": 5,
    "next_token": "7140dibdnow9c7btw3w29grvxfcgvpb9n9coehpk7xz5i"
  }
}

取得データは、jsonの形式で、'meta'の'result_count'が5であることに注目。

返ってきたjsonを辞書型にコンバートすると配列のように扱えてとても便利。

td_dic = json.loads(res.decode('utf-8'))

例えば、最初のtweet_idとresult_countを表示するには、以下のとおり。

print(tid_dic['data'][0]['id'])          #  1338971066773905408
print(tid_dic['meta']['result_count'])   # 5

Tweet IDごとの「いいね」(liking_users)の一覧を取得

Tweet idが取得できるようになったので、各tweet idごとのいいねユーザ(liking_users)の一覧を取得する。

curl -H "Authorization: Bearer $BEARER_TOKEN" https://api.twitter.com/2/tweets/{tweet_id}/liking_users

上記をpythonにすると以下のとおり。

url = "https://api.twitter.com/2/tweets/{}/liking_users".format(str(post_id))
head = {"Authorization": "Bearer {}".format(bearer_token)}
req = urllib.request.Request(url, headers=head)
res = urllib.request.urlopen(req).read()

やはり、これも辞書型に変換して、以下のとおりダラダラと出力。

for i in range(uids['meta']['result_count']):
    print(uids['data'][i]['id'], uids['data'][i]['name'], uids['data'][i]['username'])

作成したスクリプトの実行

作成したスクリプトの全体は、以下のとおり(p-tw-likes.py)。

#!/usr/bin/env python3
#coding: UTF-8

import json
import time
import urllib.request
import urllib.parse
import urllib.error

#  Constant
NAME = 'hymd3a'
USERID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'        # たくさんの数字列
MAX_COUNT = 5

def getMyTweetId(user_id):
    try:
        url = "https://api.twitter.com/2/users/{}/tweets?max_results={}".format(user_id,MAX_COUNT)
        head = {"Authorization": "Bearer {}".format(bearer_token)}
        req = urllib.request.Request(url, headers=head)
        res = urllib.request.urlopen(req).read()
        td = json.loads(res.decode('utf-8'))
        #print(json.dumps(td, indent=4, sort_keys=True, ensure_ascii=False))
        return td
    except urllib.error.HTTPError as err:
        print(err.reason, err.code)
        return False

def getUserIDsPostLikes(post_id):
    time.sleep(1)
    try:
        url = "https://api.twitter.com/2/tweets/{}/liking_users".format(str(post_id))
        head = {"Authorization": "Bearer {}".format(bearer_token)}
        req = urllib.request.Request(url, headers=head)
        res = urllib.request.urlopen(req).read()
        jd = json.loads(res.decode('utf-8'))
        #print(json.dumps(jd, indent=4, sort_keys=True, ensure_ascii=False))
        return jd
    except urllib.error.HTTPError as err:
        print(err.reason, err.code)
        return False

# Bearer Token
bearer_token="xxxxxxTakusanxnoxMojixgaxNarandexIruyoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

tid_dic = getMyTweetId(USERID)

for i in range(tid_dic['meta']['result_count']):
    uids = getUserIDsPostLikes(tid_dic['data'][i]['id'])
    for i in range(uids['meta']['result_count']):
        print(uids['data'][i]['id'], uids['data'][i]['name'], uids['data'][i]['username'])

実行は、以下のようにすると、たくさんいいねしてくれたユーザがわかり、感謝しないとね。

./p-tw-likes.py | sort | uniq -c | sort -n
      User ID           Name     Username  
  1 917984000000000000 ユーザ1    lemon
  2 000000000000092305 ユーザ2    orange
  2 935800000000000231 ユーザ3    apple
  3 000000000087439106 ユーザ4    pine
  4 891467010000000000 ユーザ5    grape

sort、特にuniq -cがカウントしてくれて、とてもいい働きをしてくれて感謝。

Debianでgpxファイルを見る

(2021-06-07 初稿 - 2022-12-19 修正 )

先日、yamap に登録して活動を記録したところ、活動記録はgpxファイルでダウンロードできた。

Debianでもgpxファイルが見られるように、以下のとおりgpxviewerをインストール。

(gpxファイルは、テキストファイルなので、エディタでも開くことができる。)

sudo apt install gpxviewer

 使い方は簡単で、gpxviewerを起動後、「ファイル」、「開く」で目的のgpxファイルを選択する。

f:id:hymd3a:20210607184947p:plain

先日行った阿知ケ谷アルプスの軌跡(gpxファイル)を表示

ちなみに、Google Mapでもgpxファイルは少し面倒だけど読める。

Google Mapを開いて、「マイプレイス」、「マイマップ」、「地図を作成」、「インポート」で目的のgpxファイルを貼り付ける。

詳しくは、以下のページを参照のこと。多謝

筆者は、山登りもハイキングも初心者だけど、興味があったら覗いてみてね。

関連ページ

動画ファイルからmp3を抜き出す

(初稿 2019-12-29 - 転記・修正 2021-06-01 )

はじめに

動画ファイル(*.webm、*.mkv、*.mp4を想定)から、音声ファイル(mp3)を抜き出す方法。複数のファイルがある場合に、面倒なのでbashスクリプトを作成した。

なお、筆者の環境は、Debian Buster。

動画ファイルからmp3を抜き出す

ffmpegを利用して、動画からmp3を抜き出す。

ffmpegのインストールは以下のとおり。

sudo apt install ffmpeg

実際に音声ファイルを抜き出す方法は、以下のとおり。なお、詳細については、ffmpegのヘルプを参照のこと。

ffmpeg -i input.webm -acodec libmp3lame -aq 4 output.mp3

上記コマンドでできることを確認したら、以下のbashスクリプトを適当なエディタで作成し、フォルダ内の動画ファイルから一括して音声ファイルを取り出す。
ここでは、v2mp3というファイル名にした。

#!/bin/bash
# Written by Hyamada 2019-12-29
# 動画ファイルからmp3を抜き出す

for f in *.mkv *.mp4 *.webm ; do 
  [ -f "$f" ] || continue
  /usr/bin/ffmpeg -i "$f" -acodec libmp3lame -aq 4 "${f%.*}.mp3" ; 
done

エディタで作成したら、以下のとおり実行権を与えてね。

$ chmod +x v2mp3

ここでは、mkv、mp4、webmの拡張子のファイルを動画ファイルとしたが、不足する場合は、追加をしてね。

また、指定する拡張子のファイルがないと、エラーで終了してしまうので、ファイルがない場合はスキップ(continue)するようにした。

おわりに

bashに限らず、for in doが正常に動くとうれしくなるね(自己満足 ^^;)。

関連ページ

Chromecastの設定変更

(2021-05-31 初稿 - )

2021年2月4日に購入したChromecastがわが家に届いた。

f:id:hymd3a:20210531103427j:plain

購入したChromecast

さっそくわが家のテレビに接続し、Android端末にGoogleホームをインストール後、便利に使っていた。設定方法については、特に難しいこともなかったので省略。^^;

で、問題となったのは、Chromecastをつなげる部屋とを変更したため、接続するWifiアクセスポイントも変更になり、うまく接続できなくなってしまった。

いろいろと試行錯誤したが、たどり着いた結論としては、設定をリセット(工場出荷時に)した方が簡単だということ。

リセットは、円筒形の側面に細長いボタンがあるので、長押しで簡単にできる。

結局、ここで言いたいのは、ChromecastでWifi等設定を変更する場合は、リセットした方が早いということだけ。^^;

Chromecastが無くても、Raspberry Piがあれば、モニタにキャストすることができる。

下にリンクを貼っておくので、ご興味のある方はどうぞ。

関連ページ