Text-to-Speech API

GCP の Text-to-Speech API を使って
テキストから音声を生成する

入力したテキストを
音声を男性か女性か選択して
生成する

音声の文字起こしなら
Speech toText
のほうになる

GCP へログインし
認証情報 > API とサービスの有効化

Cloud Text-toSpeech API
をクリック

これには無料枠があるようでhttps://cloud.google.com/text-to-speech/pricing/?hl=JA
に記載されている

1ヶ月あたり
0〜100 万文字

音声合成マークアップ言語(SSML)タグも文字数カウントに含まれる

有効化のときに課金設定があるので注意

有効化できたら
認証情報で
認証情報を作成

サービスアカウントを作成する

続行
で完了
をクリック

これでサービスアカウントが作成される

このアドレスをクリックし
キーをクリック

鍵を追加

新しい鍵を追加
でタイプをJSONにする

これでJSONファイルをダウンロードしたら
環境変数を設定する

GOOGLE_APPLICATION_CREDENTIALS
を設定する

これにパスを設定する
ダウンロードしたJSONファイルを
secret.json に名前を変えておく

ダウンロードしたファイルを新しい順にするなら

lsコマンドでファイルを新しい順番、古い順番にソートする方法

を参考に

ls -lt

で表示されるので

cp raspberryPi-b787a5abd4d5.json secret.json

でコピーし

mv secret.json ~/notebook/


jupyter notebook で扱えるようにしておく

次に
notebook でos ライブラリをインポートすることで使っていく

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'secret.json'

でOK

次にライブラリのインストール

Text-to-Speech クライアント ライブラリ

を参考に

pip install --upgrade google-cloud-texttospeech

をいれる

notebook でやるなら

!pip install --upgrade google-cloud-texttospeech

とする

これで準備できたので
音声の再生

from google.cloud import texttospeech

client = texttospeech.TextToSpeechClient()

synthesis_input = texttospeech.SynthesisInput(text="Hello, World!")

voice = texttospeech.VoiceSelectionParams(
    language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL
)

audio_config = texttospeech.AudioConfig(
    audio_encoding=texttospeech.AudioEncoding.MP3
)

response = client.synthesize_speech(
    input=synthesis_input, voice=voice, audio_config=audio_config
)

with open("output.mp3", "wb") as out:
    out.write(response.audio_content)
    print('Audio content written to file "output.mp3"')

クライアント ライブラリの使用

からコピペして
コメント部分を削除

client = texttospeech.TextToSpeechClient()

の部分で認証をしている

synthesis_input = texttospeech.SynthesisInput(text="Hello, World!")


出力する音声をセット
今回なら
Hello, World
となる

voice = texttospeech.VoiceSelectionParams(
    language_code="en-US", ssml_gender=texttospeech.SsmlVoiceGender.NEUTRAL
)

で声の設定
language_code で言語の指定
en-US なら英語

ssml_gender は性別の設定
NEUTRAL だとどっちでもないような音声になる

audio_config = texttospeech.AudioConfig(
    audio_encoding=texttospeech.AudioEncoding.MP3
)

で音声形式の指定
今回は MP3 にしている

これらのパラメータを

response = client.synthesize_speech(
    input=synthesis_input, voice=voice, audio_config=audio_config
)

でセットして音声を作成する

filename ="output.mp3"
with open(filename, "wb") as out:
    out.write(response.audio_content)
    print(f'Audio content written to file {filename}')

と最後を変えることで音声ファイル名を簡単に変更できる

wb なので
バイナリ形式で書き込み

しかし Cloud SDK がないと実行できないみたいなので
Google Cloud SDK のインストール

を参考に

echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list


Cloud SDK の配布 URI をパッケージ ソースとして追加

sudo apt-get install apt-transport-https ca-certificates gnupg


apt-transport-https がインストールされているのを確認

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -


公開鍵のインポート

sudo apt-get update
sudo apt-get install google-cloud-sdk


リポジトリ更新と
google-cloud-sdk のインストール

しかしマニュアルを読んでみたら
全機能は使えないので
Linux 用インストールでないとダメと気づいた
Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする

も参考に

一度

sudo apt-get remove google-cloud-sdk
sudo apt remove python3-crcmod 

で削除

curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-337.0.0-linux-x86_64.tar.gz

でファイルを取得

tar zxvf google-cloud-sdk-337.0.0-linux-x86_64.tar.gz 


圧縮ファイルを展開

/google-cloud-sdk/install.sh

を実行し
Google Cloud SDK のパスを通すことでコマンド補完ができるようになる

source .bashrc

を実行して設定反映を忘れずに

./google-cloud-sdk/bin/gcloud init


SDK初期化と認証開始

You must log in to continue. Would you like to log in (Y/n)?  

となるので
Y
とすると
ブラウザが立ち上がり
認証画面になる

認証成功なら
https://cloud.google.com/sdk/auth_success
の画面がでる

次にどのプロジェクトをデフォルトにするか聞かれる

Please enter numeric choice or text value (must exactly match list 
item):  
Please enter a value between 1 and 12, or a value present in the list: 

となるので
任意のプロジェクト No を入力すると終了

gcloud components update

でコンポーネントを更新

しかしこれでもダメ

GCPの Text-to-Speech で 文字読み上げ を作る

を参考に

pip install pydub


MP3再生に必要なパッケージをいれる

pip install google-cloud-storage

をしたけどダメ

もう一回APIの確認をしたら
Cloud Speech Text API が無効になっていたので
再度有効化してから
もう一度鍵ファイルを作成することで有効化された

これで再度実行したら無事に音声が作成された

ubuntu 16 へ streamlit インストール

ubuntu 16 へ streamlit インストール

【Streamlit】インストールしてみた

を参考に

pip install streamlit

でインストール

streamlit hello

でデモのサンプルを起動できる

  If you're one of our development partners or you're interested in getting
  personal technical support or Streamlit updates, please enter your email
  address below. Otherwise, you may leave the field blank.

とでるけど気にせずに
Enter

これでブラウザで webアプリが起動する

jupyter notebook の結果をHTMLにする

jupyter notebook の結果をHTMLにする

jupyter-notebook --generate-config

で設定ファイルを作成

すでに存在するなら

Overwrite /home/snowpool/.jupyter/jupyter_notebook_config.py with default config? [y/N]N

というように確認されるので
この場合はN で Enter すればOK

vim ~/.jupyter/jupyter_notebook_config.py 

でファイルを開き

最終行に

import os
from subprocess import check_call

c = get_config()

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py and .html files."""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)
    check_call(['ipython', 'nbconvert', '--to', 'html', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

を追記し保存

jupyter-notebook 

で起動し

保存アイコンをクリックすると
jupyter notebook の ipynb ファイル保存時に
HTMLが作成される

ubuntu VLC が落ちるときの対処

ubuntu VLC が落ちるときの対処

ubuntu16.04 で動画から静止画切り出し
で以前静止画の取り出しをしたので
今回も行おうとしたが
VLC を起動し動画を再生しようとしても
落ちてしまう

VLC で動画再生に問題

を参考に

ツール > 設定

ビデオの出力を自動から
X11ビデオ出力(XCB)
にすることで解決

Word2Vec

Word2Vec

テキスト解析して学習して
単語の意味をベクトル表現する方法

モデルは隠れ層と出力層の2層ニューラルネットワークになっている

Word2Vec を使うことで
ある単語や文章と似通った単語や文章を解析できる


コーパスにある単語の得微量ベクトルを学習し出力する

python で Word2Vec を使うには
gensim ライブラリをインストールする

pip3 install gensim

Mecab でコーパスを作成する

Word2Vec で類似語解析するには
テキストデータから
コーパス(基礎資料)を作成する必要がある

今回は明治以降の文学者15人のデータを wiki から取得し学習

まずはライブラリインストール

import MeCab
import requests

from bs4 import BeautifulSoup

次にターゲットURL指定

domain ="https://ja.wikipedia.org/wiki/"

次に対象人物をリストで宣言

names =["森鴎外","夏目漱石","島崎藤村","与謝野晶子","坪内逍遥","石川啄木",
        "谷崎潤一郎","芥川龍之介","萩原朔太郎","川端康成","志賀直哉","中原中也",
        "太宰治","大岡昇平","三島由紀夫"]

次に Mecab を分かち書きモードでインスタンス生成
コーパス(基礎資料)をいれるリストの宣言

m=MeCab.Tagger("-Owakati")
corpus =[]

ループ処理で
URL+キーワード
で項目のHTMLを取得

for name in names:               
    with requests.get(domain + name) as response:
        soup = BeautifulSoup(response.content, "html.parser")
        p_text = soup.find_all("p")
        for p in p_text:         
            corpus.append(m.parse(p.text).strip())

最後にコーパス(基礎資料)の結果を
data.txt に出力

with open("data.txt","w") as file:                      
    file.write("\n".join(corpus))

全体ソースは

import MeCab
import requests
from bs4 import BeautifulSoup

domain="https://ja.wikipedia.org/wiki/"

names =["森鴎外","夏目漱石","島崎藤村","与謝野晶子","坪内逍遥","石川啄木",
        "谷崎潤一郎","芥川龍之介","萩原朔太郎","川端康成","志賀直哉","中原中也",
        "太宰治","大岡昇平","三島由紀夫"]

m=MeCab.Tagger("-Owakati")
corpus =[]

for name in names:
    with requests.get(domain + name) as response:
        soup = BeautifulSoup(response.content, "html.parser")
        p_text = soup.find_all("p")
        for p in p_text:
            corpus.append(m.parse(p.text).strip())

with open("data.txt","w") as file:
    file.write("\n".join(corpus))

となり
実行すると
data.txt が作成される

次に
data.txt を解析し学習モデルを生成

gensim から Word2Vec をインポート

from gensim.models import word2vec

次にファイルからコーパス(基礎資料)の読み込み

corpus = file.read().splitlines()

splitlines() を使うと改行コードをリストにするときに入れなくなる
python でファイルを read してリストにする時に、改行コードを入れない
https://qiita.com/suzuki-hoge/items/8eac60f7b68044eea6c1
を参考に

次にコーパス(基礎資料)を元に学習モデルを生成

corpus =[sentence.split() for sentence in corpus]
model = word2vec.Word2Vec(corpus,size=200,min_count=20,window=10)

次にモデルを元に似通ったキーワードをsy筒力

今回は文学と似通ったキーワードを出力

similar_words = model.wv.most_similar(positive=["文学"], topn=9)
print(*[" ".join([v ,str("{:.2f}".format(s))]) for v, s in similar_words], sep="\n")

全体ソースは

from gensim.models import word2vec

file = open("data.txt")
corpus = file.read().splitlines()

corpus =[sentence.split() for sentence in corpus]
model = word2vec.Word2Vec(corpus,size=200,min_count=20,window=10)

similar_words = model.wv.most_similar(positive=["文学"], topn=9)
print(*[" ".join([v ,str("{:.2f}".format(s))]) for v, s in similar_words], sep="\n")

結果は

物語 0.99
作 0.98
題材 0.98
代表 0.98
時代 0.97
評論 0.97
世界 0.97
描い 0.97
歌 0.96

となった

参考書籍とは違ったけど
年数が立っているので誤差範囲

print(*[" ".join([v ,str("{:.2f}".format(s))]) for v, s in similar_words], sep="\n")

がわかりにくいので調べてみた

python {:.2f}
で検索したら
{インデックス番号:書式指定}
ということで

意味は下2桁で小数点タイプということ

これは format() の使い方であるということ

Pythonの文字列フォーマット(formatメソッドの使い方)

をみることで解決

なお今回のようにコーパス(基礎資料)作成
モデル構築
類似度の集計まで一気にやらず
モデル構築時点で一度ファイルに出力すれば
計算処理時間が縮小できる

model.save("data.model")

全体ソースは

from gensim.models import word2vec

file = open("data.txt")
corpus = file.read().splitlines()

corpus =[sentence.split() for sentence in corpus]
model = word2vec.Word2Vec(corpus,size=200,min_count=20,window=10)
model.save("data.model")

similar_words = model.wv.most_similar(positive=["文学"], topn=9)
print(*[" ".join([v ,str("{:.2f}".format(s))]) for v, s in similar_words], sep="\n")

として実行すると
data.model が作成される

あとは学習済みモデルを読み込むには

model.word2vec.Word2Vec.load("data.model")

でOKらしいので

word2vecmodel_data.py
を作成し

from gensim.models import word2vec

model =word2vec.Word2Vec.load("data.model")

similar_words = model.wv.most_similar(positive=["文学"], topn=9)
print(*[" ".join([v ,str("{:.2f}".format(s))]) for v, s in similar_words], sep="\n")

で実行したら

物語 0.99
歌 0.99
古典 0.99
海 0.98
時代 0.98
近代 0.98
作 0.98
世界 0.97
歴史 0.97

と同じ結果になった

Word2Vecの学習済み日本語モデルを読み込んで使う
を参考に

参考書籍は

なお kindle Fire でみるときには
拡大しなくても見れるので
10インチがおすすめ

カバーがほしい場合には
マグネット機能で閉じたらOFFにしてくれる純正がおすすめ

Mecab と Word2Vec

Mecab と Word2Vec

Mecab と Word2Vec で自然言語解析ができる

スクレイピング結果から類似語を学習させる

Mecab は
日本語の形態素解析システム

日本語テキスト分析で
辞書データを元に単語を分割し
自動的に品詞分類する

インストールは

sudo apt install mecab
sudo apt install libmecab-dev 
 sudo apt install mecab-ipadic-utf8 

でインストール

mecab


mecab を起動できる

これで
すもももももももものうち
と入力すると

すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

というように品詞分類できる

次に標準のIPA辞書だと固有名詞に弱いので
拡張辞書をインストール

git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd/
sudo ./bin/install-mecab-ipadic-neologd 

を実行し
yes を入力すればインストールできる

なお
–depth 1 をつかうことで
直近の履歴のみ clone できる

【GIT】非常に重たいrepositoryをcloneする方法

を参考に

次に python の mecab ライブラリーをインストール

cd -
pip3 install mecab-python3

cd –
とすると1つ前のディレクトリに戻ることができる

今回は cd で git clone したディレクトリに移動していたので使用

次に python でmecab による品詞分類コードの実装

import Mecab

でライブラリをインポート

Mecab.Target() でインスタンスを生成

m = Mecab.Target()

あとは解析

vim sumomo.py

でファイルを作成

import MeCab
m=MeCab.Tagger()

print(m.parse("すもももももももものうち"))

とすると

Failed initializing MeCab. Please see the README for possible solutions:

    https://github.com/SamuraiT/mecab-python3#common-issues

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:

    https://github.com/SamuraiT/mecab-python3/issues

issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments: 
error message: [ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------
Traceback (most recent call last):
  File "sumomo.py", line 2, in <module>
    m=MeCab.Tagger()
  File "/home/snowpool/anaconda3/lib/python3.6/site-packages/MeCab/__init__.py", line 124, in __init__
    super(Tagger, self).__init__(args)
RuntimeError
snowpool@snowpool-Prime-Series:~/scraping$ vim sumomo.py
snowpool@snowpool-Prime-Series:~/scraping$ python sumomo.py 

Failed initializing MeCab. Please see the README for possible solutions:

    https://github.com/SamuraiT/mecab-python3#common-issues

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:

    https://github.com/SamuraiT/mecab-python3/issues

issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments: 
error message: [ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------
Traceback (most recent call last):
  File "sumomo.py", line 3, in <module>
    m=MeCab.Tagger()
  File "/home/snowpool/anaconda3/lib/python3.6/site-packages/MeCab/__init__.py", line 124, in __init__
    super(Tagger, self).__init__(args)
RuntimeError

となってしまう

Failed initializing MeCab. Please see the README for possible solutions: https://github.com/SamuraiT/mecab-python3#common-issues
で検索し

MeCabをローカルにインストールして躓いた時に見て欲しい

を参考に

which mecab

でパスを確認

/usr/bin/mecab

になっているのを確認

vim ~/.bashrc 

でファイルを開き
最終行まで
shit+g で移動

export MECABRC=/etc/mecabrc

を追記し保存

source ~/.bashrc 

としたけどダメ

一度元にもどし

mecab-python3 1.0.3

を参考に

pip install unidic-lite

【Ubuntu】MeCabとNEologdをインストールしてPythonで形態素解析する

を参考に

echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

でディレクトリパスを確認すると

/usr/lib/mecab/dic/mecab-ipadic-neologd

となる

Ubuntu 16.04 LTS で MeCab を NEologd とともにインストールする

を参考に

sudo vim /etc/mecabrc 

でファイルを開き

6行目の

dicdir = /var/lib/mecab/dic/debian

の部分を

;dicdir = /var/lib/mecab/dic/debian
dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd

として保存

これで

echo "幽☆遊☆白書" | mecab

を実行すると

幽☆遊☆白書	名詞,固有名詞,一般,*,*,*,幽☆遊☆白書,ユウユウハクショ,ユウユウハクショ
EOS

となり分解できているのがわかる

なお辞書の設定をしないと

幽	形容詞,自立,*,*,形容詞・アウオ段,ガル接続,幽い,カソケ,カソケ
☆	記号,一般,*,*,*,*,☆,☆,☆
遊	名詞,固有名詞,組織,*,*,*,*
☆	記号,一般,*,*,*,*,☆,☆,☆
白書	名詞,一般,*,*,*,*,白書,ハクショ,ハクショ
EOS

というようになった

これで辞書が使えるようになったので

python sumomo.py 

を実行すると

すもも	スモモ	スモモ	李	名詞-普通名詞-一般			0
も	モ	モ	も	助詞-係助詞			
もも	モモ	モモ	桃	名詞-普通名詞-一般			0
も	モ	モ	も	助詞-係助詞			
もも	モモ	モモ	桃	名詞-普通名詞-一般			0
の	ノ	ノ	の	助詞-格助詞			
うち	ウチ	ウチ	内	名詞-普通名詞-副詞可能			0
EOS

というように分類できているのがわかる

参考書籍は

なお kindle Fire でみるときには
拡大しなくても見れるので
10インチがおすすめ

カバーがほしい場合には
マグネット機能で閉じたらOFFにしてくれる純正がおすすめ

scrapy

scrapy

scrapy は
スクレイピング
クローリングの
フレームワーク

インストールは

 pip3 install scrapy

これをつかってはてな匿名ダイアリーのプロジェクトを作成

通称は
増田
らしい

このURLである
https://anond.hatelabo.jp/
をクロールする

scrapy startproject anond

というように
scrapy startproject プロジェクト名

プロジェクトを作成

cd anond/

で移動

sudo apt install tree


treeコマンドをインストール

tree

で構成をみると

.
├── anond
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       └── __init__.py
└── scrapy.cfg

となっているのがわかる

次に
scrapy に
はてな匿名ダイアリーを設定

settings.py でクロール間隔の調整
デフォルトだと間隔0秒で最大16リクエストになるので
負荷がかかる

なので平均1秒あけるようにしてダウンロードするようにする

vim anond/settings.py 

でファイルを開き
28行目の

#DOWNLOAD_DELAY = 3

の部分を

DOWNLOAD_DELAY = 1

と変更し保存

次にitem.py を編集し
URLのみ取得するように
url = scrapy.Field() を追記するので

vim anond/items.py 

でファイルをひらき

class AnondItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

の部分を

class AnondItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url = scrapy.Field()
    pass

として保存

次に Spider の作成

コマンド実行時に
第1引数に スパイダーの名前
今回は abibd_spider

第2引数に ドメインを指定
今回なら anond.hatelabo.jp
となる

scrapy genspider anond_spider anond.hatelabo.jp

実行したあとに

tree

を実行すると

.
├── anond
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       ├── __pycache__
│       │   └── __init__.cpython-36.pyc
│       └── anond_spider.py
└── scrapy.cfg

という構造になっているのがわかる

次にはてな匿名ダイアリーのURL抽出処理の実装

vim anond/spiders/anond_spider.py 

でファイルをひらき

7行目のURLが http になっているので
https に変更する

start_urls = ['https://anond.hatelabo.jp/']

次にパースしたときの処理を追記
今回はパーマリンクURL をたどるように設定

9行目からの

    def parse(self, response):
        pass

    def parse(self, response):
        for url in response.css('p.sectionfooter a::attr("href")'):
            yield response.follow(url)
        pass

へ変更

これで準備できたので実行

scrapy crawl anond_spider

これでクローリングが実行され
URLの取得ができる

参考書籍は

なお kindle Fire でみるときには
拡大しなくても見れるので
10インチがおすすめ

カバーがほしい場合には
マグネット機能で閉じたらOFFにしてくれる純正がおすすめ

webdriver_manager

webdriver_manager

webdriver_manager ライブラリーを使うと
python 実行時に使用しているブラウザのバージョンにあった
WebDriver をインストールできるので
毎回バージョンを合わせなくてもよくなる

インストールは

pip3 install webdriver_manager

でインストールできる

あとは

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver=webdriver.Chrome(ChromeDriverManager().install())

とすれば
自動的にバージョンに応じた webdriver がインストールされる

ubuntu のアップデートで
Chrome のバージョンが更新されても
これで対応可能

これでスクレイピングで検索する例を書くと

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

url="https://www.google.com/"
keyword ="スクレイピング"

driver=webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)
time.sleep(3)

search = driver.find_element_by_name("q")
search.send_keys(keyword)
search.submit()

time.sleep(5)
driver.quit()

となる

参考書籍は

なお kindle Fire でみるときには
拡大しなくても見れるので
10インチがおすすめ

カバーがほしい場合には
マグネット機能で閉じたらOFFにしてくれる純正がおすすめ

ubuntu へ tor コマンドをいれる

ubuntu へ tor コマンドをいれる

tor コマンド ubuntu 16.04
で検索し

Ubuntu Server 16.04 LTS/CentOS 7にtorをインストールしてtor経由でcurlやwgetを使用する

を参考にインストール

sudo apt install tor

でインストール

次に
python から tor のSOCKSポートにアクセスするため
pysocks ライブラリーのインストール

pip3 install pysocks

次に
Squid プロキシ経由アクセスのように
ローカルの tor の SOCKS ポートをプロキシ接続するようにする

vim proxy.py

でファイル作成

import requests

proxy = {
        "http":"socks5://127.0.0.1:9050",
        "https":"socks5://127.0.0.1:9050"
        }

url = "http://httpbin.org/ip"

ip=requests.get(url).text
tor_ip=requests.get(url,proxies=proxy).text

print("current IP is " + ip)
print("tor IP is "+tor_ip)

これで

python  proxy.py

を実行すると
グローバルIP
tor を使ったときのIP
が表示される

Torを用いたスクレイピング [Python]

によれば
tor はプロキシとして
socks5://localhost:9050
を使っているとのこと

git reset 取り消し

git reset 取り消し

間違えて

git reset --hard 

したときの対処

いざという時のためのgit reflog

にあるように

git reflog 
[/shell:で過去のあらゆるコミット履歴をみれる

72e7d9c (HEAD -> master) HEAD@{0}: reset: moving to 72e7
861751a HEAD@{1}: commit: ver3
91c72a0 HEAD@{2}: commit: ver2(
72e7d9c (HEAD -> master) HEAD@{3}: commit (initial): ver1

なお、ubuntu で

git commit

を実行すると
vim ではなく nano エディタが起動