JUNのブログ

JUNのブログ

活動記録や技術メモ

チコノフ(Tikhonov)の正則化を試してみた

プログラミングのための線形代数 を読んでいるのですが, そこでチコノフ(Tikhonov)の正則化というのが紹介されていたので試してみました

チコノフの正則化とはどういうものかというと,

とある画像  \bf{x} があったとして,

f:id:JUN_NETWORKS:20190907215106p:plain
画像  \bf{x} 画像はこちらからお借りしました

画像をぼかす以下のような行列Aがあったとする.


A = \begin{bmatrix}
0.40 & 0.24 & 0.05 & 0.00 & 0.00 \\\ 
0.24 & 0.40 & 0.24 & 0.05 & 0.00 \\\
0.05 & 0.24 & 0.40 & 0.24 & 0.05 \\\
0.00 & 0.05 & 0.24 & 0.40 & 0.24 \\\
0.00 & 0.00 & 0.05 & 0.24 & 0.40
\end{bmatrix}

それらで  \bf{y} = A\bf{x} を行った場合, 画像はこのような形でボケた.

f:id:JUN_NETWORKS:20190907215201p:plain
 \bf{y} = A\bf{x} で得た  \bf{y}

このボケた画像  \bf{y} を元に戻すには逆行列  A^ {-1} を求めて,  \bf{x}=A^ {-1} \bf{y} とすれば元画像  \bf{x} が得られる

f:id:JUN_NETWORKS:20190907215517p:plain
 x=A^ {-1} \bf{y} で得た 画像 \bf{x}

綺麗に復元出来てますね.

しかし, ぼかした画像 \bf{y} に微小なノイズ \bf{\epsilon} が加わった 画像 \bf{y'} = \bf{y} + \bf{\epsilon} \bf{x}=A^ {-1} \bf{y} で復元しようとすると...

f:id:JUN_NETWORKS:20190907220221p:plain
微小なノイズ  \bf{\epsilon} が加わった  \bf{y'}

f:id:JUN_NETWORKS:20190907220404p:plain
 A^ {-1} \bf{y'} で復元した 画像 \bf{x'}

ありゃま...復元時にノイズが大きくなってしまいました...

チコノフ(Tikhonov)の正則化

方針

  •  A\boldsymbol{x} \boldsymbol{y} との食い違いを測る.
  •  \boldsymbol{x} 自体の もっともらしさ を測る. あるいは, 同じことだが,  \boldsymbol{x}不自然さ を測る.
  • 食い違い不自然さ の合計値が最小になるような  \boldsymbol{x} を答える

 \boldsymbol{x} = A^{-1}\boldsymbol{y} では食い違いは0だが, 得られた画像  \boldsymbol{x}不自然さがひどかった. 食い違い不自然さ のバランスを取ればもっと良い画像が手に入る

 A^{-1}\boldsymbol{y}長さ | A^{-1}\boldsymbol{y} | を用いて 食い違い を測る  \boldsymbol{x}長さ | \boldsymbol{x} | を用いて不自然さを測る

正の定数 \alphaを何か設定して | A\boldsymbol{x} - \boldsymbol{y} |^{2} + \alpha| \boldsymbol{x} |^{2} が最小になる  \boldsymbol{x} を求めると,  \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} になっています. これがチコノフ(TIkhonov)の正則化.

的なことがに書いてありました.

ではやってみましょう

f:id:JUN_NETWORKS:20190907222141p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

元画像よりはノイズが減りましたね.

 \alpha を変えると...

 \alpha = 0.1

f:id:JUN_NETWORKS:20190907222421p:plain
 \alpha=0.3 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

明るくなった(元の \bf{x}に近づいた)けど, ノイズが  alpha=0.3 の時より大きくなってしまった

 \alpha=0.5

f:id:JUN_NETWORKS:20190907223013p:plain
 \alpha=0.5 \boldsymbol{x} = (A^{T}A + \alpha\boldsymbol{I})^{-1}A^{T}\boldsymbol{y} で復元

 \alpha=0.3 のときよりノイズは減りましたが, ボケた画像( A^{-1}\bf{x})に近くなってしまいました.


とまぁこんな感じです. 本当はもっと上手にぼかしたり復元したりできるかもだけど, そこまで試してないというのと, はてなブログtex書くのがしんどくてそこまでする気力がありませんでした.

コードは全部Pythonで書いたんですけど, 別にそこまで見せる必要も無いですし, やみかさんの記事 にチコノフの正則化のコードと解説があるのでそっち見てください. 僕が書いたのと同じ感じです.

あと, 詳しい説明とか知りたい人はこれ見てください.

owatank.hatenablog.com

あと, 調べててわかったんですけど, チコノフの正則化って別名 L2正則化 っていうらしいですね. 一気に馴染みのある感じになりましたね. これが言いたかった.

そんで, wikipedia にこんなこと書いてありました.

1943年に Andrey Nikolayevich Tikhonov が、L2 正則化をより一般化した Tikhonov 正則化を逆問題に対する手法として発表した

正則化 - Wikipedia

逆問題に対するL2正則化がTikhonovの正則化なんすねぇ〜

と適当な感じで記事を書いてみたのですが, 間違ってるところとかあれば指摘してください. 結構喜びます.

それではまた. ばいばい.

Pythonの処理の時間測定

Pythonを書いていると, ある処理にどのくらいの時間がかかってるか知りたいことがよくあります. そこで自分がよく行っている時間測定について書いてみたいと思います.

1行ごとの実行時間を調べる line_profiler

blog.amedama.jp

あるまとまった部分の時間を調べたい

上記の line_profiler は大きなプログラムや, Djangoなどでは使いにくいかなぁって思ったので, そういうときには自作のTimerクラスを使っています.

import time

class Timer(object):
    def __init__(self, name):
        self.name = name
    def __enter__(self):
        self.start = time.time()
    def __exit__(self, *exc):
        print(f"{self.name}  time: {(time.time() - self.start):.2f}s")

print じゃなくて logger での出力とかにも変えれるので割と自由度高く好きにいじれると思います.

自分は機械学習系の時間のかかる処理をしているので小数2桁までしかしていませんが, 普通に使うなら *1000 して単位をmsにすればいいと思います.

使い方は with Timer("好きな文章"): の下に処理を書くだけです.

import requests

with Timer("Google からのレスポンス"):
    url = "https://google.com"
    res = requests.get(url)

result

$ python test_timer.py           
Google からのレスポンス  time: 0.53s

参考にしたサイト

2週間アメリカに行ってきた

内容はタイトルどおりです...と言いたいところですが, 実際は2週間(14日)ではなく13日です. なんでそんなことになったかは,まぁ読めばわかります.

1日目

日本から台湾へ行くはずでした.

台湾に台風が来ていて, 飛行機が飛びませんでした.

japan.cna.com.tw

1日目

日本から台湾, 台湾からシアトルへ

この日はちゃんと飛行機飛びました. ちなみに使った航空会社はエバー航空です.

日本から台湾まで4時間, 台湾からシアトルまで12時間の合計16時間のフライトでした.

エバー航空のいいところは機内食が美味しいのと, サービスがいいところですね. 16時間のフライトでしたが, さほど疲れなかったです. ご飯はエバー航空が台湾の航空会社ということで, 中華テイストでした. 美味しかったです. ご飯が美味しいのマジで大事.

f:id:JUN_NETWORKS:20190828083853j:plainf:id:JUN_NETWORKS:20190828083917j:plain
機内食 (左が日本-台湾, 右が台湾-シアトル)

台湾の桃園空港では, 台湾ドルを持っていなかったし, 着いたのが夜遅くて自販機でジュース買えなくて危なかったですが, Visaカード対応しているお店があったのでなんとかなりました.

f:id:JUN_NETWORKS:20190828085931j:plain
シアトル到着

宿は友人*1の家に泊まらせてもらっていました.

2日目

この日は, 午前中はシアトル在住の留学エージェントの人とお話させてもらいました.

留学ってなかなかにコストがかかりますね...

午後は家の周りを散策していました.

コワーキングスペースに行こうと思ったのですが, 日曜日で休みでした. というか日曜日全然店やってない...

f:id:JUN_NETWORKS:20190828090736j:plainf:id:JUN_NETWORKS:20190828090741j:plainf:id:JUN_NETWORKS:20190828090748j:plainf:id:JUN_NETWORKS:20190828090757j:plain
適当にぶらぶら〜と歩いてました. 最後は日本と変わらずスタバにいました.

f:id:JUN_NETWORKS:20190828092208j:plain
ハンバーガーも食べました. 美味しかったですが, 量がめっちゃ多いです.

3日目

シアトルの有名な観光地に行きました.

f:id:JUN_NETWORKS:20190828092258j:plain
pike place market

f:id:JUN_NETWORKS:20190828092335j:plain
amazon spheres Amazonで働いている知り合いがいれば良かったんですが, いなかったので中には入れませんでした.

f:id:JUN_NETWORKS:20190828092438j:plain
amazon go も試した. めっちゃ便利

f:id:JUN_NETWORKS:20190828092535j:plain
Space Needle 登るのに$44かかりました. 高い...

f:id:JUN_NETWORKS:20190828092630j:plainf:id:JUN_NETWORKS:20190828092635j:plainf:id:JUN_NETWORKS:20190828092640j:plainf:id:JUN_NETWORKS:20190828092706j:plain
Space Needle からの景色. 綺麗でした.

f:id:JUN_NETWORKS:20190828092745j:plain
Gas work park からのシアトルの夜景

あと, Interview Practice Night というイベントにも行きました.
Amazonのデータサイエンティストに対してインタビューするみたいな内容でした.

www.meetup.com

移動にはUberとLimeを使いまくってました

f:id:JUN_NETWORKS:20190828100302j:plain
Lime-E 自転車共有サービスみたいなやつ

4日目

University of Washington (UW) に行ってきました. 敷地は広いし, 建物はかっこいいし, 環境は充実しているしでいい場所でした.

f:id:JUN_NETWORKS:20190828100533j:plainf:id:JUN_NETWORKS:20190828100640j:plainf:id:JUN_NETWORKS:20190828100538j:plainf:id:JUN_NETWORKS:20190828100547j:plainf:id:JUN_NETWORKS:20190828100643j:plainf:id:JUN_NETWORKS:20190828100602j:plain
University of Washington 技術書も充実していました

夕方からは New Tech Seattle というイベントに行ってました.

www.meetup.com

めちゃくちゃ良いイベントでした. シアトルのIT企業でエンジニアの採用をしてる人と知り合ってResumeを見てもらったり, UWの学生数人と仲良くなったり, シアトルの生活やお金の話などを現地のエンジニアから聞いたりなど, 多くの出会いと学びを得ました. すごく楽しかったです.

f:id:JUN_NETWORKS:20190828102843j:plainf:id:JUN_NETWORKS:20190828102846j:plainf:id:JUN_NETWORKS:20190828102851j:plain
New Tech Seattle

1ヶ月に1回やっているらしいので, もし興味があれば行ってみると思います. きっと楽しいです.

5日目

この日はMicrosoft本社に行きました.

visitor centerで土産を買ったあと, MS本社で働いている日本人エンジニアの方とお話させてもらいました. いろいろと進路などについてのアドバイスを頂きました.

f:id:JUN_NETWORKS:20190828110046j:plainf:id:JUN_NETWORKS:20190828110038j:plainf:id:JUN_NETWORKS:20190828110051j:plain
Microsoft本社

夜は Google Seattle で働いているエンジニアの人と話しました. 開発環境やGoogleの入り方などいろいろ聞けて大変良かったです.

その後, スターバックリザーブスロータリーというところに行きました.

f:id:JUN_NETWORKS:20190828111234j:plain
The Seattle Roastery

6日目

この日はシアトルからサンノゼに向かいました. いわゆるシリコンバレーってやつですね.

その後Google本社などに行こうと思っていたのですが, まさかの飛行機が3時間遅れて行けませんでした.

宿はAirbnbでMountain Viewに取りました. 正直, イベント関係はSan Joseが多いので,San Joseにy宿取れば良かったなぁと思います.

夜は 日本語meetup に参加しました.

www.meetup.com

現地の駐在のエンジニアの方や, Facebookで働いている人, スタンフォード大学で働いている人など, 多くの方と知り合い, お話させてもらいました. とても楽しいイベントでした. あと, 夜遅いからと宿まで車で送ってもらってありがとうございました.

7日目

Intel Museum に行きました. CPUの歴史や構造, 製造過程などが展示, 紹介されていました. 面白かったです.

f:id:JUN_NETWORKS:20190828115110j:plain
Intel Museum

その後, Friday Algorithm Practice Group @ Coding Dojo というイベントに行きました. まさかの参加者僕1人だったので, 講師の人と1対1でコーディングインタビューの練習をしました. simple linked list をPythonで書きました. くっそ久しぶりに書いたわりにはまぁまぁ出来たと思います.

f:id:JUN_NETWORKS:20190828115332j:plain
Friday Algorithm Practice Group

その日の晩, なんとなくステーキが食べたいなぁと思ってレストランに行ったら, 結構高級なレストランで, ステーキとサラダで $80いきました. 意図せず人生で一番高いディナーになりました. 味の方は高級過ぎる感じで庶民の僕の舌には少し合いませんでした(勿論美味しいですよ). 庶民はいきなりステーキを食べているくらいがちょうど良い気がします.

f:id:JUN_NETWORKS:20190828115516j:plainf:id:JUN_NETWORKS:20190828115523j:plain
ステーキとサラダ

8日目

Apple Park Visitor Centerに行った. 一言で言うと, Apple本社が見えるでかいAppleストアみたいな感じでした. ただ, Apple ParkのARがあるので, それは体験してみると良いと思います.

f:id:JUN_NETWORKS:20190828120006j:plainf:id:JUN_NETWORKS:20190828120010j:plain
apple park visitor center

その後 How Computer Vision Is Used to Save Precious and Endangered Fish Species という講演みたいなやつに行きました. Computer Visionというよりバイオ系がメインの話で, 僕の聞きたかった話とは少し違うかなと言う感じでした.

f:id:JUN_NETWORKS:20190828120557j:plain
魚の周期(的な?)

www.eventbrite.com

その後は 友達に勧められた IN-N-OUT BURGER というハンバーガー屋に行きました. そこに行くまでにUberを使ったのですが, 車がTeslaだったのでTeslaの超加速を体験させてくれました. ジェットコースターと大差無いレベルの加速度で驚きました.

f:id:JUN_NETWORKS:20190828120952j:plain
Tesla Model 3

ハンバーガーはめっちゃ美味かったです. もしアメリカに行く機会があればぜひ行ってみてください.

f:id:JUN_NETWORKS:20190828121113j:plainf:id:JUN_NETWORKS:20190828121117j:plain
IN-N-OUT BURGER

9日目

日本語meetupで知り合ったスタンフォード大学で働いている人にスタンフォード大学を案内してもらいました. ランチにスタンフォード大学の学食を食べましたが, バイキング形式でめちゃくちゃ美味しかったです. しかも, スタンフォード大学の関係者は無料だそうで, スタンフォード大学入学してぇなぁ〜ってなりました(まぁその分学費も高いんでしょうけど).

f:id:JUN_NETWORKS:20190828134814j:plainf:id:JUN_NETWORKS:20190828134816j:plainf:id:JUN_NETWORKS:20190828134818j:plain
スタンフォード大学の学食

Hoover Towerにも登りました. これもスタンフォード大学の関係者なら無料で登れます. 一般の人は $2 くらいかかるらしいです.

f:id:JUN_NETWORKS:20190828135102j:plainf:id:JUN_NETWORKS:20190828135104j:plainf:id:JUN_NETWORKS:20190828135105j:plain
Hoover Towerからの景色

その人と別れたあと, GRU and LSTM というイベントに行きました.

www.meetup.com

正直マイクのエコーが強すぎてなんて言ってるのか全然聞き取れませんでした... 内容的には RNNから入って, LSTM, そしてGRU, またそれらの違いやブロックの内部の話とかそういう感じでした.

帰りに使ってたポケットWi-Fiが急に電波を受信しなくなって, それが原因でUberで少しトラブルがありました. ドライバーに対して必死こいて理由を説明したらなんとか解決しました. 人間ピンチになったときのほうが英語喋れますね.

10日目

Google本社に行きました. アンドロイドくんが可愛いです.

f:id:JUN_NETWORKS:20190828140405j:plainf:id:JUN_NETWORKS:20190828140406j:plain
アンドロイドくん

visitor center に行った後, Google本社のクラウド部門で働いている日本人の koheiさん(@koheiarai94)とお話させてもらいました. 主に進路やアメリカの大学のことについて教えていただきました. Googleの社食食べながらお話させてもらったのですが, Googleの社食もめっちゃ美味しかったです.

NASA in Silicon Valley にも少し立ち寄りました.

f:id:JUN_NETWORKS:20190828141452j:plain
NASA in Silicon Valley

11日目

この日はサンフランシスコに電車で行ってきました.

定番のゴールデンゲートブリッジを見ました. 海と空の青色と橋の赤色がマッチしてとても綺麗でした. 徒歩で橋を往復歩いてみたのですが, めっちゃ遠かったです.

f:id:JUN_NETWORKS:20190828142154j:plain
ゴールデンゲートブリッジ

その後, fisherman's wharf に行きました. パスタ美味しかったですけど, $20 くらいしました. 相変わらず高いです.

f:id:JUN_NETWORKS:20190828142358j:plainf:id:JUN_NETWORKS:20190828142414j:plain
fisherman's wharf

その後は, ケーブルカーに乗りました. 人間が動力源とケーブルカーを接続したり離したりして調整していて, 昔からのやり方が残っていました.

f:id:JUN_NETWORKS:20190828142654j:plainf:id:JUN_NETWORKS:20190828142655j:plain
ケーブルカーと操作部分

最後にチャイナタウンも行ったのですが, 夜遅かったのであまりお店がやってなかったですし, そもそもそんなにお腹が空いていなかったので写真だけ撮って帰りました.

f:id:JUN_NETWORKS:20190828142857j:plain
チャイナタウン

12日目

Computer History Museum に行きました.
古代計算機から始まり現代のコンピュータに至るまでの歴史が展示, 解説されていました. 最初の方は丁寧に解説等も全部読んでたんですけど, 気がついたら数時間経ってて, 閉館時間も差し迫ってきていたので後半は駆け足気味に展示を見ました. とても面白かったです.

f:id:JUN_NETWORKS:20190828143053j:plainf:id:JUN_NETWORKS:20190828143054j:plainf:id:JUN_NETWORKS:20190828143056j:plain
Computer History Museum

13日目

アメリカ滞在最終日です. ほとんど行きたいところも行ったし, イベントも何も入っていなかったので, 何か行く場所ないかなと探していたらシリコンバレー発祥の地にまだ行ってなかったので行ってきました.

f:id:JUN_NETWORKS:20190828143315j:plainf:id:JUN_NETWORKS:20190828143316j:plain
Hewlett Packard Garage

昼過ぎの飛行機でSeattleに戻るので見終わった後, ちゃちゃっとサンノゼ空港まで戻りました.

ギリギリでサンノゼ空港に着いたのですが, ここでまた飛行機が2時間遅れやがりました.

シアトルに着いてからは, 深夜2時のフライトまでぶらぶらしました.

その後, 台湾経由で日本に無事に帰れましたとさ.

感想

アメリカ楽しかったです(小並感). 写真見てもらえればわかると思うのですが, シアトル,サンフランシスコともにずっと晴れていました. 曇りがたまにあったくらいで基本的には快晴. 湿度も低くとても過ごしやすかったです. あと, アメリカは物価めっちゃ高いです. まぁ日本が貧乏なだけのような気もしますが. 特に外食は高く, 日本と同じ感覚で外食ばかり食べているとお金がすぐ吹っ飛びます. なので自炊スキルが必須です. あと, アメリカはめちゃくちゃ車社会なので車が無いと移動手段にとても困ります. 最近はUberがあるからまだマシですが, 無いとめちゃくちゃ大変です.

ご飯に関しては日本のほうが美味いと思います(ハンバーガー以外).

人間に関してはアメリカの方が圧倒的に好きです. どういうことかというと, 年上だからという高圧感や人種, 体格, 年齢などによる差別などや軽視などを話していて全く感じないです. あと, 基本みんなフレンドリーで適当に歩いていると話しかけてくるし, こちらが話しかけても笑顔で答えてくれるので話すのが楽しいです. 基本がコミュ障の僕でもアメリカでは何の抵抗感もなく話せました.

今回は シアトル, シリコンバレーと2箇所行ってきたわけですが, 個人的にはシアトルの方が好きです(もちろんシリコンバレーも好きですよ). シアトルの方が各所へのアクセスがしやすいのと家賃が安いです. シアトルはAmazon, Microsoft本社もあり, さらに近年では多くのIT企業がシアトルに拠点を新たに作っているということでなかなかホットな場所だと思います. まぁ住んでないのでこの感想があてになるとは思えませんが...

英語に関しては, 僕の英語力でなんとかなりました. ところどころ聞き取れないところもありましたが, 基本的にはみんな優しいのでゆっくり話してくれます. 正直中学の文法くらいで普通に話せます. ただ, 聞く分には語彙力がいるので, 文法より語彙を増やしたほうが良さげです.

飛行機に関しては, 遅れすぎとしか言えません. 6本乗った飛行機のうち3本遅れました (Delta 2, Eva 1). もう少しなんとかしてほしいです. 台湾からアメリカの12時間のフライトですが特に疲れたりはしませんでした. エバー航空機内食が美味しいのでそれだけで体力が回復します. ご飯大事です.

シリコンバレーはとてもIT関係が発達しているし, 気候も良いんだけど, なぜか「住みたい!」とは思わなかったです. 自分でもとても不思議だったのですが, 以下のツイートがよく自分に当てはまっていると思いました.

確かに, 自分は大阪生まれなので, カリフォルニアのどこに行くにも車な車社会は合わなかったのかもしれません.

これからアメリカに行く人へ

自炊スキルを身に着けてください. さもないとお金と健康がなくなります. あと, 旅行代理店で売っているようなポケットWi-Fiではなく, 現地でSIMカードを買って使ってください. 僕のように現地でWiFiが繋がらず痛い目に遭います.

もし, 現地でイベントに参加して人と知り合ったり, 交流したいなら以下のサイトを使うと良いです.

meetup.com

www.eventbrite.com

最後に

アメリカ13日間, 長かったような短かったような... アメリカは本当に Diversity という単語が本当に似合う国だと思います. アメリカにいると, 日本のタトゥーやピアス, 髪染めでごちゃごちゃ言ってるのがアホらしくなります. 日本にいると日本の悪いところばかりが見えますが, アメリカを始めとする海外に言ってみれば日本の良いところも見えてきます (飯が美味くて安い, 電車が発達している). 銃乱射事件など物騒な事件をちょくちょく聞くアメリカですが, 行く場所によって本当に治安が違うので, 治安がいいところに行けば大抵安全です(もちろん油断はしないほうがいいですが). ということで, もしお金と時間に余裕があれば一度アメリカに行ってみると良いと思います. いい場所ですよ.

番外編 (14日目 台湾)

シアトルから台湾, 台湾から日本. 台湾でのコネクティングフライトの待ち時間が12時間ほどあったので少しだけ台湾観光しました.

行く順番を間違えてお寺から行かなかったので結局 台北101 しかいけませんでした.

f:id:JUN_NETWORKS:20190828151329j:plain
台北

f:id:JUN_NETWORKS:20190828151347j:plainf:id:JUN_NETWORKS:20190828151353j:plain
鼎泰豊

f:id:JUN_NETWORKS:20190828151338j:plainf:id:JUN_NETWORKS:20190828151358j:plain
台北101と展望台からの景色

台風が接近していたためめっちゃ曇ってましたけど, 台湾とてもいい場所でした. ご飯美味しいし安いし, みんな英語話せるし, 日本語表記沢山ある. 来年は台湾に旅行に来ようかな.

とりあえず帰りの飛行機が飛んでくれてよかったです.

*1:友人というか, 正確には 弟のバスケットのコーチです. 説明すると長いのと少しややこしいので.

Ubuntu18.04 on Thinkpad のバッテリー寿命を伸ばす

ラップトップに搭載されているバッテリーは以下のようなことが原因で寿命が短くなる.

バッテリーの性能が低下する主な原因は使用年数、充電サイクルの回数、フル充電の合計時間、高温です。

How can I increase battery life? - ThinkPad and Lenovo V/B/K/E series notebooks - JP

Windows なら Lenovo Vantage を使えば充電開始および終了のしきい値が設定できるが, Ubuntuにはそのようなソフトは入っていないので自分で設定する.

この記事ではまず初めにバッテリー稼働時間を伸ばす方法を紹介し, 次に充電のしきい値の設定方法を紹介する.

また, タイトルではThinkpadと書いているが, Thinkpad以外のラップトップでも問題なく設定できます.

バッテリー稼働時間を伸ばす

ここではバッテリー稼働時間を伸ばす方法について説明する.

Linux用のバッテリー最適化ツールをインストールする

$ sudo apt install powertop

powertop内の設定項目を自動で最適化するTLPというソフトを入れる

$ sudo apt install tlp tlp-rdw

以下のコマンドを叩けば, 再起動後も自動で最適化してくれるようになる.

$ sudo tlp start

これでバッテリーの稼働時間が伸びました.

ここまで書いたことはかなり説明や詳細を省いているので, 詳しいことが知りたい方は以下のサイトを見ることを強くおすすめします.

lifeisbeatfull.com

充電のしきい値の設定方法

ここからはバッテリーの充電しきい値の設定方法について説明します.

TLPのコンフィグファイルを編集します.

$ sudo vim /etc/default/tlp

以下の項目の値を設定することでしきい値を設定できます

START_CHARGE_THRESH_BAT0=80
STOP_CHARGE_THRESH_BAT0=90

各項目の説明

  • START_CHARGE_THRESH_BAT0 : バッテリー残量がこの値以下になったら充電を始める
  • STOP_CHARGE_THRESH_BAT0 : バッテリー残量がこの値以上になったら充電を止める

私は Lenovo のサイトを参考に 80%以下で充電開始, 90%以上で充電停止 に設定にしました.

これで充電のしきい値の設定が完了しました.

おまけ

直接関係は無いけど, 知ってると便利かもしれないやつを紹介します.

バッテリーの状態を表示する
$ upower -i /org/freedesktop/UPower/devices/battery_BAT0

linux - How to adjust charging thresholds of laptop battery? - Unix & Linux Stack Exchange

参考にしたリンク

Rhythmboxのプレイリストを元に音楽をAndroidに転送する

どうも,最近アイマスにハマってるJUNです.

アイマスは沢山の素晴らしい曲があってとても良いですね.

ふと お気に入りのアイドル達の曲ばかりが入ったプレイリストを作ろうと思ったわけです.
そこでRhythmboxのオートプレイリストがプレイリストを作るのに便利だったので, 作成したプレイリストの情報を元にAndroidに送る曲を決めて, 自動でAndroidに曲を転送しようと思ったわけです.

環境

PC
  • Ubuntu 18.04 LTS
  • Rhythmbox 3.4.2
Android device
Other

やり方

手順は大きく分けて2つです.

  1. Rhythmboxでプレイリストを作って保存
  2. プレイリストを元にAndroidに転送

1. Rhythmboxでプレイリストを作って保存

ここではRhythmboxのオートプレイリストという機能を使ってプレイリストを作ります.

上部のメニューから ファイル > プレイリスト > 新しいオートプレイリスト でオートプレイリストを作ります.

f:id:JUN_NETWORKS:20190726220905p:plain
オートプレイリストの作成例

見たらわかるように, 条件は部分一致や全文一致など選べるのでかなり自由に条件を決めれます

めっちゃ便利〜〜!!

作成したらプレイリストを保存します.

上部のメニューから ファイル > プレイリスト > プレイリストの保存 で プレイリストを保存します. その際 場所は任意で構いませんが, 拡張子は .xspf にしてください.

2. プレイリストを元にAndroidに転送

このスクリプトをローカルの適当なところにダウンロードして実行します

python3  copy_music_from_rhythmbox_playlist_to_dir.py -i /home/jun/Music/765.xspf -o "/run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C011%5D/Internal storage/Music/765Pro"

後は待っていればコピー(転送)完了です.

参考にしたリンク

Djangoの Internal Server Error: /favicon.ico を直す

ローカル環境上のDjangopython manage.py runserver したら,ログにこんなメッセージが

[22/Jul/2019 02:44:16] "GET / HTTP/1.1" 200 5895
Internal Server Error: /favicon.ico
Traceback (most recent call last):
  File "/home/jun/.local/share/virtualenvs/TobaExPy-uha27gFP/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/jun/.local/share/virtualenvs/TobaExPy-uha27gFP/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/jun/.local/share/virtualenvs/TobaExPy-uha27gFP/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/jun/Desktop/work_space/TobaExPy/Toba/views.py", line 30, in detail
    place = Place.objects.get(place_id=place_id)
  File "/home/jun/.local/share/virtualenvs/TobaExPy-uha27gFP/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/jun/.local/share/virtualenvs/TobaExPy-uha27gFP/lib/python3.6/site-packages/django/db/models/query.py", line 408, in get
    self.model._meta.object_name
Toba.models.Place.DoesNotExist: Place matching query does not exist.
[22/Jul/2019 02:44:16] "GET /favicon.ico HTTP/1.1" 500 78881

大事なのは Internal Server Error: /favicon.icoGET /favicon.ico HTTP/1.1" 500 78881 の部分.

ようは favicon.ico が無いというだけなのだが,これを直すのが少し時間がかかったのでここに書いておく.

プロジェクトのディレクトリ構造(修正後)

├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apis.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── config
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── static
│   ├── css
│   │   └── index.css
│   └── img
│       └── favicon.ico
└── templates
    └── app
        ├── base.html
        └── index.html

直し方

/static/img/favicon.ico を設置.

/config/settings.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

を追記.

/templates/app/base.html の <head> 内に

<link rel="icon" href="{% static 'img/favicon.ico' %}">

を書き込む.

各種ファイル名等はプロジェクトの構成によって柔軟に対応してもらえればいいと思います.

Install pycocotools on Ubuntu

COCOデータセットを扱うためのパッケージpycocotoolsのインストール方法がめんどくさいし、ggってもあんまり出なかったのでこれから同じような悩みで困った人のために書いておく。

環境

  • Ubuntu18.04
  • Python3.6

やり方

# 必要なライブラリをインストール
$ sudo apt-get -y update && sudo apt-get install -y --no-install-recommends \
         python3.6 \
         python3-pip\
         python-dev \
         python3-dev \
         git \
         ca-certificates \
         libssl1.0.0 \
         libssl-dev \
         libglib2.0-0 \
         libsm6 \
         libxext6 \
         libxrender-dev \
         build-essential \
         libssl-dev \
         libffi-dev \
         libxml2-dev \
         libxslt1-dev \
         zlib1g-dev \
         libhdf5-serial-dev \
         hdf5-tools \
$ pip3 install --upgrade cython
$ pip3 install numpy
$ git clone https://github.com/philferriere/cocoapi.git \
    && cd cocoapi/PythonAPI \
    && python3 setup.py build_ext install

DockerfileのRUNコマンドに書いたやつをコピペしてきただけなので余計なライブラリも入ってるかも

おまけ: pipenv でのinstall方法

# aptでインストールするライブラリは全てインストール済みという前提です。
$ pip3 install pipenv
$ pipenv shell
$ pipenv install numpy
$ 
$ git clone https://github.com/philferriere/cocoapi.git \
    && cd cocoapi/PythonAPI \
    && python3 setup.py build_ext install

ただし、pipenv graphを叩いてもpycocotoolsは表示されない

参考にしたリンク