クローリングした画像を整備する
前回の続きでアニメ画像データセットを整備した際のメモ.
今回はゴミとして, 3次元画像・漫画画風画像を自動で除去した.
また, 顔でない画像などの微細なゴミは手動で除去した.
1キャラクタのディレクトリの中に複数のキャラクタが含まれる問題では,
今回は手動で1キャラにした.
今後の戦略としては, キャラクタごとのディレクトリに入っている各画像に対して,
髪色や目の色などを自動で分類し, ディレクトリに入っている半分以上の画像ファイルが同じ分類をされたらその半分を残すというアルゴリズムを用いれば, この問題を小さく抑えることができるという所感を持った.
取り合えず今の精度でも下のような感じのファイルが500ほど作れることが分かった.
【Python】Wikipediaの表の特定の項目のみを取得
アニメ一覧表から各アニメのタイトル、各アニメの記事へのリンクの2要素のみを取得しCSVとして保存する場合
ja.wikipedia.org
import requests from bs4 import BeautifulSoup import csv # スクレイピング対象の URL にリクエストを送り HTML を取得する res = requests.get('https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E3%83%86%E3%83%AC%E3%83%93%E3%82%A2%E3%83%8B%E3%83%A1%E4%BD%9C%E5%93%81%E4%B8%80%E8%A6%A7_(2010%E5%B9%B4%E4%BB%A3_%E5%BE%8C%E5%8D%8A)') # レスポンスの HTML から BeautifulSoup オブジェクトを作る soup = BeautifulSoup(res.text, 'html.parser') # ページに含まれるテーブルをすべて取得する tables = [table for table in soup.find_all("table", {"class":"wikitable"})] # 各テーブルから行を取得する rows = [] for table in tables: rows_each_table = [row for row in table.find_all("tr")] rows_each_table.pop(0) # 表の題目を除去 (deque推奨) rows += rows_each_table # ラインのリストからタイトルとURLを取得 animes = [] for row in rows: a_list = row.find_all("a") anime_object = a_list[0] anime_name, anime_link = anime_object.get("title"), anime_object.get("href") animes.append((anime_name, anime_link)) # CSV へ書き込み with open("./anime.csv", "w", encoding="utf-8") as f: writer = csv.writer(f, lineterminator="\n") for anime in animes: writer.writerow(anime)
【Python】google-images-download の使い方
公式でエラー出るのでパッチの方をダウンロード
100件までしかダウンロードできないらしいが, 私の用途だと20件程度で良かったので今のところ十分.
$ git clone https://github.com/Joeclinton1/google-images-download.git $ cd google-images-download $ sudo python setup.py install
使い方の例
JSONから引数取得
$ googleimagesdownload -cf example.json
検索キーワード, 検索上限
$ googleimagesdownload --keywords "Polar bears, baloons, Beaches" --limit 20
接頭辞検索
車について検索したい. 「赤い車」「青い車」「白い車」の順に検索したい場合
$ googleimagesdownload --k "car" -sk 'red,blue,white' -l 10
short hand command
\--limitを-l, --keywordを-kとしてもよい.
$ googleimagesdownload -k "Polar bears, baloons, Beaches" -l 20
画像ファイルではなく画像のリンクをダウンロードする
$ googleimagesdownload -k "sample" -u <google images page URL>
URL指定で一つの画像をダウンロードする
$ googleimagesdownload --keywords "baloons" --single_image <URL of the images>
【確率統計】よく使われるもの
Chebyshev不等式
を示す.
したがって,
これより,
大数の法則
Chebyshevの不等式から証明できる.
Chebyshevの不等式の証明は次のリンクへ.
http://umashika5555.hatenablog.com/entry/2020/02/27/213325umashika5555.hatenablog.com
確率変数の期待値と分散を計算する.
次にChebyshevの不等式より
のとき,
これはすなわち, を表している.
中心極限定理
中心極限定理
を示す.
中心極限定理は, 母平均とのズレがGauss分布に近づくという意味である.
左辺は母平均とのズレの分布関数, 右辺は, N(0,1)のGauss分布を表している.
証明は, 左辺の確率変数の積率母関数が右辺の分布関数の積率母関数と同じになることを示す.
まず右辺について,
の積率母関数は,
※Gauss分布の積率母関数は次のリンクへ.
http://umashika5555.hatenablog.com/entry/2020/02/22/030913umashika5555.hatenablog.com
次に, 左辺についてみていく.
より,
と置くと考えやすい. (と言うか, コレが本質)
の積率母関数は,
確率変数の積率母関数を考える.
互いに独立な確率変数について, の積率母関数は各々の積率母関数の積で表されることを証明する.
これはn個に拡張できることは自明なので,
の積率母関数はの積率母関数を用いて次のように表現できる.
ここで, と置くと, となる.
のとき, より,
【確率論】確率分布まとめ
Poisson分布
定義
導出
Poisson分布は二項分布の にして定義されている.
二項分布
期待値
分散
を利用する.
図
import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats from IPython.core.pylabtools import figsize figsize(12.5, 4) poi = stats.poisson # Poisson分布 lambda_ = [1.5, 5.5, 12] # Poisson分布のパラメタ(強度λ) colors = ["#348ABD", "#A60628", "#66FFB2"] a = np.arange(16) # [0, 1, 2, ..., 15] # poi.pmf(a, λ)でPoisson分布の値を得る plt.bar(a, poi.pmf(a, lambda_[0]), color=colors[0], label="$\lambda = %.1f$"%lambda_[0], alpha=0.6, edgecolor=colors[0], lw=1) plt.bar(a, poi.pmf(a, lambda_[1]), color=colors[1], label="$\lambda = %.1f$"%lambda_[1], alpha=0.6, edgecolor=colors[1], lw=1) plt.bar(a, poi.pmf(a, lambda_[2]), color=colors[2], label="$\lambda = %.1f$"%lambda_[2], alpha=0.6, edgecolor=colors[2], lw=1) plt.legend() plt.ylabel("Probability of $k$") #kの確率 plt.xlabel("$k$")
幾何分布
定義
意味
ベルヌーイ試行で初めて成功するまでの試行回数の確率
期待値
分散
図
scipy.stats.geomではで定義されているため, は定義なし.
成功確率が高いときは大きい試行回数の値で確率が小さくなり, 反対に成功確率が小さいときは大きい試行回数でも確率が比較的に小さくならない.
import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats from IPython.core.pylabtools import figsize figsize(12.5, 4) geo = stats.geom # Geometric分布 p = [0.1, 0.5, 0.9] # Geometric分布のパラメタ(確率p) colors = ["#348ABD", "#A60628", "#66FFB2"] k = np.arange(16) # [0, 1, 2, ..., 15] # geo.pmf(k,p)でGeometric分布の値を得る plt.bar(k, geo.pmf(k, p[0]), color=colors[0], label="$p = %.1f$"%p[0], alpha=0.6, edgecolor=colors[0], lw=1) plt.bar(k, geo.pmf(k, p[1]), color=colors[1], label="$p = %.1f$"%p[1], alpha=0.6, edgecolor=colors[1], lw=1) plt.bar(k, geo.pmf(k, p[2]), color=colors[2], label="$p = %.1f$"%p[2], alpha=0.6, edgecolor=colors[2], lw=1) plt.xticks(k, k) plt.legend() plt.ylabel("Probability of $k$") #kの確率 plt.xlabel("$k$")
Gauss分布
定義
積分
まずガウス積分の導出を行う.
と置き, ヤコビアンはと計算できる.
とおく.
次に, の導出を行う.
これはと置きガウス積分に代入できる.
その際, よりガウス積分の結果に係数が付き,
最終的な結果がとなる.
多次元Gauss分布
指数分布
定義
期待値
分散
図
import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats from IPython.core.pylabtools import figsize figsize(12.5, 4) expo = stats.expon lambda_ = [0.5, 1, 1.5] # 指数分布のパラメタλ colors = ["#348ABD", "#A60628", "#66FFB2"] a = np.linspace(0, 4, 100) # 本来は連続値だがグラフにする上で離散値をつくる for l, c in zip(lambda_, colors): # 指数分布は scale=1/λ を入力する plt.plot(a, expo.pdf(a, scale=1. / l), lw=3, color=c, label="$\lambda = %.2f$"%l) plt.fill_between(a, expo.pdf(a, scale=1. /l), color=c, alpha=.33) plt.legend() plt.ylabel("$f(k$)") #kの確率 plt.xlabel("$k$")
二項分布
定義
k: ベルヌーイ試行についてある事象が成功する回数
n: すべての試行回数
p: ベルヌーイ試行についてある事象が成功する確率
積分
二項定理より自明
期待値
分散
を用いる.
の計算では, 二項定理の係数を消すためと, 期待値の定義式に落とし込むため,
という処理を施す. 前半は, 期待値の計算のように二項定理の係数項が2つ分うち消える.
後半は, 期待値の定義の式と一致する.
図
n=10のとき, p=0.1だと1回成功する確率が38%くらい. p=0.5だと5回成功する確率が25%くらい., p=0.9だと9回成功する確率が38%くらいと読み取れる.
実際, 代入して計算すると,
import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats from IPython.core.pylabtools import figsize figsize(12.5, 4) binom = stats.binom # Binomial分布 n_ = [5, 10] p_ = [0.1, 0.5, 0.9] # Binomial分布のパラメタ(確率p) colors = ["#348ABD", "#A60628", "#66FFB2"] for n in n_: for i, p in enumerate(p_): k = np.arange(n+1) # [0, 1, 2, ..., 15] # binom.pmf(k, n ,p)でBinomial分布の値を得る plt.bar(k, binom.pmf(k, n, p), color=colors[i], label="$n= %d, p = %.1f$"%(n,p), alpha=0.6, edgecolor=colors[i], lw=1) plt.xticks(k, k) plt.legend() plt.ylabel("Probability of $k$") #kの確率 plt.xlabel("$k$") plt.show() plt.close()
【PyTorch】DataLoaderで(images, labels)だけでなく(images, labels, paths)をロードできるようにする
まずglob.glob()を用いて, すべての画像データのパスを保持したリストを作る.
def make_datapath_list(phase="train"): rootpath = "./data/" target_path = os.path.join(rootpath, phase, "**", "*.jpg") # 最初の**はクラスのディレクトリ path_list = [] # globを利用してサブディレクトリまでファイルパスを格納 for path in glob.glob(target_path): path_list.append(path) return path_list # 動作確認 train_list = make_datapath_list(phase="train")
次に前処理クラスを作っておく.
前処理クラスはImage.open("path")で読み込んだ1画像配列を受け取り, 変形などをしtorch.tensorを返すクラス
class ImageTransform(): def __init__(self, resize, mean, std): self.data_transform = transforms.Composee([transforms.ToTensor(), transforms.Normalize(mean, std)]) def __call__(self, img): return self.data_transform(img)
次にDatasetクラスを作成する. この際に, __getitem__()メソッドで返す値を3要素のタプルにする.
class Dataset(data.Dataset): def __init__(slef, file_list, transform=None): self.file_list = file_lsit self.file_transform = transform # 前処理クラスのインスタンス def __len__(self): return len(slef.file_list) def __getitem__(self, index): img_path = self.file_list[index] # index番目のpath img = Image.open(img_path) # index番目の画像ロード img_transformed = slef.transform(img) # 前処理クラスでtensorに変換 label = img_path.split("/")[2] # クラスを表すディレクトリの文字列 label = convert(label) # クラスを表すディレクトリ文字列から数値に変更 return img_transformed, label, img_path train_dataset = Dataset(file_list=train_list = make_datapath_list(phase="train"), transform=ImageTransform(size, mean, std))
データローダを作成
batch_size = 32 train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 動作確認: イテレータを作って初めのやつを表示する tmp = iter(train_dataloader) inputs, labels, paths = next(tmp) print(inputs.size()) # torch.Size([32, 3, h, w]) print(labels) # tensor([label0, ...., label31]) print(paths) # [file_path0, ..., file_path31]
尚、動作の保証なし
Datasetクラスの__getitem__を工夫すれば, 良いことがわかった.
例えば, 2つの画像の組をロードすることや, 1つの画像とそれをセグメンテーションモデルにかけたもう1つのマスク画像の対をロードすることなど出来そう
UbuntuでLoLをプレイ
【TeX】独立記号を自作してみた
LaTeXでグラフィカルモデルなどで用いる_||_という記号の定義
\newcommand{\indepe}{\mathop{\perp\!\!\!\perp}} \newcommand{\notindepe}{\mathop{\perp\!\!\!\!\!\!/\!\!\!\!\!\!\perp}}
物体認識を試す
ImageNetにおける物体認識をしたいとする.
通常ならイチからモデルを組み, データを入手し, 学習させ……という作業が必要なわけだが, ディープラーニングのフレームワークKearsならこれが簡単にできる.
さらに, VGGやResNet, Xception, MobileNetなど自宅の計算機スペックでは学習が難しそうなモデルでも予め用意されたパラメータを取得することで, 研究所並の精度の予測ができる.
import numpy as np from keras.applications.vgg16 import VGG16 from keras.applications.vgg16 import preprocess_input, decode_predictions import keras.preprocessing.image as Image # モデルの宣言 model = VGG16(weights="imagenet")
続いて予測を行う.
画像は次の画像を用いる.
# 予測 image_path = "angora.png" image = Image.load_img(image_path, target_size=(224, 224)) # ImageNetのサイズ x = Image.img_to_array(image) x = np.expand_dims(x, axis=0) # 次元を追加。(224, 224)->(1, 224, 224) x = preprocess_input(x) # ImageNetでやってる前処理を同じようにやる result = model.predict(x) result = decode_predictions(result, top=3)[0] print(result) # show description
結果は以下の通り「この画像がアンゴラである確率は99.99%以上」スゴイッ!!
[('n02328150', 'Angora', 0.9999628), ('n02123394', 'Persian_cat', 1.3111491e-05), ('n02111889', 'Samoyed', 1.070684e-05)]
k-NN法をフルスクラッチ実装
今日はk-NN法(k-NearestNeighbor)を実装する.
k-NN法の概念
k-NN法は教師データから未知データを予測する教師あり学習の一つで, また, 線形回帰などのようにパラメータを最適化するような手法を取らない.
すなわち, 「教師データから識別境界のようなものを学習してから未知データが境界のどちらにあるか」という手法をとらずに, 「それぞれの未知データに対して教師データとの関係を見てどちらのクラスかを予測する」という方法をとる. これを怠惰学習というらしい.
k-NN法に関しては, 名前の通り, 未知データに対して最も近い教師データk個のうち多い方のクラスラベルを予測クラスとする.
まず下図のようなデータがあるとする. 赤色がクラス1, 緑色がクラス0 とする. 星がクラスラベルのわかっていない未知データである.
この未知データがどちらのクラスに入れた方が良いのかを予測したい.
今k=3すると未知データから最も近い3つの教師データを抽出できる.赤色(クラス1)のデータが1つで緑色(クラス0)のデータが2つである.
よって多数決をとって, 緑(クラス0)データの方が多いので, 未知データは緑(クラス0)と予想する.
式で表すとこのようになるが, わざわざ式で表さなくてもよい.
データの生成
k-NN法を実装するために二次元のデータを生成する.
k-NN法は分布を仮定した方法ではないため, 分布から生成する必要は無いと思うが, ラベル付きのデータを生成したかったので取り敢えずガウス分布を使ってデータを生成した.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 乱数固定 np.random.seed(0) # 平均ベクトル Mu1, Mu2 = np.array([1, 10]), np.array([9,2]) # 分散共分散行列 sigma11, sigma12, sigma21, sigma22 = 4, 5, 6, 3 SIGMA1, SIGMA2 = np.array([[sigma11**2, np.sqrt(sigma11*sigma12)],[np.sqrt(sigma11*sigma12), sigma12**2]]), np.array([[sigma21**2, np.sqrt(sigma21*sigma22)],[np.sqrt(sigma21*sigma22), sigma22**2]]) # データ生成 values1 = np.random.multivariate_normal(Mu1, SIGMA1, 200) values2 = np.random.multivariate_normal(Mu2, SIGMA2, 200) # データ保存 np.save("./data/values1.npy", values1) np.save("./data/values2.npy", values2) # 散乱図の表示 plt.scatter(values1[:,0], values1[:,1], color="r") plt.scatter(values2[:,0], values2[:,1], color="g") plt.xlabel("x") plt.ylabel("y") plt.xlim(-10, 30) plt.ylim(-10, 25) plt.savefig("./img/data.png") plt.show()
k-NN法による未知データの分類
格子点を未知データとして考え領域分割を行う.
格子点から各データ点までの距離を計算し, 最も近いデータ点k個のラベルから多数決を行う.
閾値が0.5のとき, kが奇数の場合は多数決が成立するのだが, kが偶数の場合で各ラベルが同じ個数あるとき多数決が成立しない.
よってkは奇数にするほうが良いことが分かる.
またkが大きくなると, 汎用性が高くなることが分かる.
import numpy as np import matplotlib.pyplot as plt # k-NN法のパラメータkを設定 k = 200 # データのロード values1 = np.load("./data/values1.npy") values2 = np.load("./data/values2.npy") # データを # 統合, その際に教師情報もつける data = np.vstack((values1, values2)) labels = np.hstack((np.ones(len(values1)), np.zeros(len(values2)))) # 未知のデータとして格子点を作成 # 2つのデータから最小, 最大のx, yを探す x_min, x_max = min(np.min(values1[:,0]), np.min(values2[:,0])), max(np.max(values1[:,0]), np.max(values2[:,0])) y_min, y_max = min(np.min(values1[:,1]), np.min(values2[:,1])), max(np.max(values1[:,1]), np.max(values2[:,1])) # 格子点を作成 xx = np.linspace(x_min-1, x_max+1, 300) yy = np.linspace(y_min-1, y_max+1, 300) xxx, yyy = np.meshgrid(xx, yy)# 格子点(xxx, yyy)が生成された. これを未知データとみなしてk-NN法を適用する. class0 = [] class1 = [] thresholds = [] # k-NN法の適用 for i, (xx, yy) in enumerate(zip(xxx, yyy)): for j, (x, y) in enumerate(zip(xx, yy)): # 未知データ(x,y)から既知データdata各点への距離を計算する # 距離はユークリッド距離の二乗, すなわちl2ノルムの二乗を計算する tmp = data - (x, y) distances = np.linalg.norm(tmp, axis=1) # 最も小さいスコア上位k点のラベルを参照 supervisers_index = np.argsort(distances)[:k] # print(supervisers_index) supervisers = labels[supervisers_index] # print(supervisers) res = np.sum(supervisers)/ k # if res > 0.5 then x_res in class1 if res > 0.5: class1.append((x, y)) elif res == 0.5: thresholds.append((x, y)) else: class0.append((x, y)) class0, class1, thresholds = np.array(class0), np.array(class1), np.array(thresholds) plt.scatter(values1[:,0], values1[:,1], color="r", marker="x", s=20) plt.scatter(values2[:,0], values2[:,1], color="g", marker="x", s=20) plt.scatter(class1[:,0], class1[:,1], color="r", marker="o", s=1, alpha=0.1) plt.scatter(class0[:,0], class0[:,1], color="g", marker="o", s=1, alpha=0.1) try:# 奇数の場合, 必ず多数決が成立するので閾値(0.5)とイコールになるものがないためエラー処理しておく plt.scatter(thresholds[:,0], thresholds[:,1], color="b", s=1, alpha=0.1) except: pass plt.title("./img/{}-NN methods".format(k)) plt.xlabel("x") plt.ylabel("y") plt.xlim(-9, 23) plt.ylim(-7, 23) plt.savefig("./img/{}-NN.png".format(k)) plt.show()
最小二乗法を実装する
予測モデルをつくるときに最も簡単な方法としては「最小二乗法による線形モデル」と「k近傍モデル」である.
この2つは統計学や機械学習を学んでいない人でも割と思いつきそうな方法である.
線形モデルとはパラメータに対して線形なモデルという意味である.
例えば, y = ax + b という1次関数を中学で学んだ.
今, データxが観測されたときに, yを予測するというタスクを行う.
このときa(傾き), b(切片)の値によって予想するべき値yが異なってくる.
すなわちa, bが決定されれば全てのxの入力に対してyという出力ができるようになる.
このようなa, b をパラメータという.
これを多次元に拡張すると
これは
と見て
とベクトル表記で書くことができる.
これは, p+1 次元の一つのデータに対する予測の式なので, n個のデータを同時に扱う場合には
とする. は(p+1, n)行列であり転置すると(n, p+1)行列, パラメータベクトルは(p+1)ベクトルである. ((p+1, 1)行列という表現もできる)
この線形モデルを, 最小二乗法によりフィットする. (予測と実際の誤差を最小にする)
この式はパラメータに関して二次式であるので最小値が存在する.
パラメータで微分してになるパラメータを求める.
ベクトルに対する微分の以下の式は覚えておいたほうが良い.
線形モデルの最小二乗法について, パラメータの解が
で得られることが分かった.
これをPythonによって実装してみる. 今回は一次関数のパラメータa,b を求め直線フィッティングを行う.
まずデータを生成する. データ生成のアルゴリズムは以下の通りに行った.
- a, b, σを決定する
- [-10, 10]の範囲でデータxをランダムに生成する
- 決定したa, bからt=ax+bを計算する
- t=ax+b+εを計算する. ただしε~N(0, σ^2)
### 単純な線形モデルy = ax + b についてのパラメータa,b を求める問題におけるデータを生成する ### ### a, b, σの値を決定する ### [-x_min, x_max]のデータxをランダムにN個用意 ### 各データに対して, N(ax+b, σ^2)に従うガウス分布からtを生成 ### import numpy as np from numpy.random import seed import matplotlib.pyplot as plt seed(0) a, b, sigma = 2, 3, 3 N = 100 x_min, x_max = -10, 10 # データ生成 X = (x_max-x_min) * np.random.rand(N) + x_min Epsiron = np.random.normal(0, sigma**2, N)# N(0, sigma^2)のN個の正規乱数 T = (a*X + b) + Epsiron # データをファイルに出力 f = open("data00.csv", "w") for (x, t) in zip(X, T): f.write("{}, {}\n".format(x,t)) f.close() # データをプロット plt.scatter(X, T) plt.show()
以下の図のようになった. このデータから,
に従ってパラメータを決定する.
import numpy as np import matplotlib.pyplot as plt # データの読み込み name_data = "data00" path_data = name_data + ".csv" data = np.loadtxt(path_data,delimiter=",") x, t = data[:,0], data[:,1] p = x.shape[0] ones = np.ones(p) x_ = np.c_[ones, x] # パラメータベクトルの計算 A = np.dot(x_.T, x_) w = np.dot(np.dot(np.linalg.inv(A), x_.T), t) print(w) # データのプロット plt.scatter(x, t) # 回帰曲線の描画 b, a = w xx = np.linspace(np.min(x)-2, np.max(x)+2, 100) yy = a * xx + b plt.plot(xx, yy, color="red") plt.xlabel("x") plt.ylabel("y") plt.title("a=2, b=3, σ=2") plt.savefig(name_data.format(a,b)) plt.show()
上図のように実際に目で観ても綺麗にフィットできていることがわかる.
次回はこの線形モデルを更に発展させ, 基底関数, 正則化あたりをやっていきたい.
convert コマンド よく使う操作
画像のリサイズ
a.pngを指定した高さ/幅に同一比のまま縮尺拡大したb.pngを出力する.
# 幅に合わせる convert -resize 640x a.png b.png # 高さに合わせる convert -resize x640 a.png b.png
a.pngという画像を640px * 640pxのb.pngに変換する.
convert -resize 640x640! a.png b.png
ディレクトリ内にある全ての画像に適応するならば
for filename in *.JPG; do convert -resize 640x640! ${filename} ${filename%.JPG}_640x640.jpg; done; # ファイル名を変えずに実行したい場合 mogrify -resize 640x640! *.png;
ディレクトリresize_dirに変換後の画像を格納する場合
mkdir resize_dir for filename in *.JPG; do convert -resize 640x640 $filename reseize_dir/${filename%.JPG}_640x640.JPG; done;
【環境設定】ubuntu 18.04 LTSにslackを入れる
slackのデスクトップアプリケーションを, dpkgでインストールする方法
単純にslackのwebサイトからダウンロードして
$ sudo dpkg -i xxx.deb
とやったらlibappindicator1が無いみたいなエラーがなされたので,
$ sudo apt --fix-broken install $ sudo apt install libindicator1 $ sudo dpkg -i xxx.deb
と行う.
【環境設定】ubuntu18.04のproxy関連設定
aptの設定
自宅でインストールしたubuntuをプロキシ環境下にあるネットワーク環境に持っていったとき, システム全体のプロキシ設定でブラウジングなどできたので, apt installなどできると思っていたが別に設定しないといけないらしい.
参考にしたのはこれ
usado.jp
$ sudo emacs /etc/environment http_proxy="http://proxy-server:port/" https_proxy="http://proxy-server:port/"
gitの設定
$git config --global http.proxy http://proxy.example.com:8080 $git config --global https.proxy http://proxy.example.com:8080
設定場所は.gitconfig
BitBucketの設定
22ポートが閉じられているので443ポートで通信を行う.
$ touch ~/.ssh/config $ emacs ~/.ssh/config
Host bitbucket.org User git IdentityFile ~/.ssh/id_rsa HostName altssh.bitbucket.org Port 443 ProxyCommand connect.exe -H hoge.proxy.jp:1080 %h %p