たんでー のすべての投稿

btrfsでCentOS7のルートディレクトリにしていたUSBメモリが壊れた。。。。

以前から調子が悪く、だましだまし使っていたCentOS7のルートディレクトリを入れていたUSBメモリがついに壊れた。

昨日btrfsが急にreadonlyでのマウントになっていた。

ログを見たりしたが、原因がわかるはずもなく、とりあえずカーネルが新しければなんとかなるかもしれんと思って、fedora23のモノにさしてみて、btrfs checkしてみたら、3つのスナップショットのツリーが壊れているようだったので、そのスナップショットを削除してみようとしたところ、削除できず(正確には30分ほど待ってもなんとも反応がなかった)。

もうこれはUSBメモリが壊れたんだろうなあと踏んで、USBメモリのファイルシステムを消したうえでchkflshで確認してみたところ、最後まで読み込めずにエラーで終了。その後、USBメモリはどうやっても認識させられなくなってしまった。(あ~あ)

もうしょうがないので、別のUSBメモリを用意して、ファイルシステムを作成。バックアップから復旧して、grub2-install やら kernel の reinstall やら grub2-mkconfig やらをして、復旧させた。

この別のUSBメモリというのも、windows8でReadyBoost用に使っていたものなので、耐久性にはおそらく難があって、また近々似たようなことが起こるかもしれない。
続きを読む btrfsでCentOS7のルートディレクトリにしていたUSBメモリが壊れた。。。。

AliExpress で PRS-T3S の交換用スクリーンを購入した

壊れたSONY READER PRS-T3Sのスクリーンの代わりを探して、ALiExpressで購入した。

届くかどうか不安ではあったが、とりあえず2週間ほどで到着。

会員登録やクレジットカードでの購入手続きはさして難しいことはなく、まぁまぁ普通な感じ。
(日本語訳はいまいちなので、英語で読む方がよいかと。)

出品者によるのかもしれないが、支払いの際に通貨が選択でき、このとき米ドル以外の通貨でも特に手数料が上乗せされているようには見えなかったので、日本円でそのまま購入。

とりあえずは届いたので、お次はスクリーンの交換・修理だ。

SONY READER PRS-T3Sの画面が壊れた。。。

先日 sony reader を持ち歩いていたところ、画面が正常に更新されなくなってしまい、画像のようにスクリーン上側が切れてしまったようになってしまった。。。

これはたぶんスクリーンが壊れてしまったのだと判断して、いろいろ探してみると、iFixitの記事があった。

現在代替品を買うのも大変な状況で、仕方ないのでこれを真似してみるべくhttp://www.aliexpress.com/でスクリーンを注文した。送料込み3900円くらい。

中国の問屋か何かに直接発注できる楽天みたいな感じのサイトだったけど、今は到着するのを待っているところ。ちゃんと届くのだろうか、、、。

sony reader のスクリーンが正常に更新されない画像

有川浩「県庁おもてなし課」(角川文庫)を読んだ

有川浩といえば、図書館戦争は1巻だけ読んでいまいち合わなかったので、先は読んでいない。
塩の街も読んだはずだけど、もう中身は覚えてないなぁ。

「県庁おもてなし課」は、以前話題になったのと、なにより電子書籍の安売りがあった時に買っていたので読んだ。

全体的には、軽くて読みやすい感じ。あっさり読めるので、移動の暇つぶしくらいにはちょうどいいのかも。

話は嫌いじゃないけど、恋愛要素よりも観光や役所の部分をもっと膨らませてくれればさらに良かったかなぁ。

前半は、県庁勤めの主人公が「民間感覚」というカルチャーショックを受けながら成長していく、というくだりが中心だった。この辺りをもう少し読みたかったような気がする。役所の中で、おもてなし課で、新しいことをやるのは大変なんだっていうことを期待してこのタイトルの小説を買ったと思うんだけど、後半だんだんと恋愛話じみてきて、あれれ?となる。

後半の、特に作家先生のくだりはちょっと、、。
確かに物語的な必然を整えたあとではああなるのはわかるんだけど、話としてそれいるか?と、あとから考えるとそんな気もする。

でもまぁ、基本的には読みやすいので、読んでいる途中ではすらすらと流れる感じで、気にしなければ気にならない、ということかもしれない。

codeiq @riverplus さんの「コード・トライアスロン2」問題をrubyで解いた

作題者によるまとめはhttp://togetter.com/li/971415から。
問題解説はhttps://codeiq.jp/magazine/2016/05/40858/から。

問題の概要はこちら。

■ 1 ■
四角形ABCDについて、∠ABD=a,∠CBD=b,∠ACB=c,∠ACD=d とおきます。
∠ADB を求めることを考えましょう。
さて、a,b,c,d の値(単位は度)に対し、∠ADB の値(単位は度)を 10^6 倍したものの整数部分を F(a,b,c,d) と定義します。
F(a,b,c,d) を求めるプログラムを書いてください。

■ 2 ■
自然数 n に対し、次の性質をもつ自然数 d の総和を G(n) と定義します。
  n を d で割った余りが 1 に等しい。
G(n) を求めるプログラムを書いてください。

■ 3 ■
先頭にゼロを持たない自然数であって、逆から読んでも同じ数になる数を回文数と呼びます。
自然数 m に対し、m 以下の回文数の総和を H(m) と定義します。
例えば、H(20)=56 です。20 以下の自然数では 1~9 と 11 が回文数だからです。

H(m) を求めるプログラムを書いてください。

■ 問 ■
標準入力から、半角空白区切りで自然数 a,b,c,d(a+b+c < 180 かつ b+c+d < 180)が与えられます。
標準出力に H( G( F( a,b,c,d ) ) ) の値を出力してください。

rubyで書いて提出した回答は下記の通り。

最初に提出したものでは f の計算で数値誤差があって間違った。この手の話は久々。
下のコードでは、切り捨て前に十分小さい値として0.00001をたしている。
この手の問題は整角四角形問題というらしい。学生の頃、三角関数なしでどうやって解くんだと悩んだ記憶がある。

h の計算では、1ケタの数は別に足しておいてから、11 から順に、回文数をひたすら小さい方から生成して順にたしているだけ。数値を文字列にしてひっくり返して足して、、と、手抜きだけど通ったのでまぁいいや、という感じ。

# 正弦定理で等しい辺の長さを探してごにょごにょいじると計算できる。
def f(_a,_b,_c,_d)
  include Math
  a=_a*PI/180
  b=_b*PI/180
  c=_c*PI/180
  d=_d*PI/180
  s=sin(b)*sin(d)*sin(a+b+c)/sin(a)/sin(c)/sin(b+c+d)
  ret = atan(sin(b+c)/(s+cos(b+c)))/PI*180*(10**6) + 0.00001
  ret < 0 ? (180000000 + ret).to_i : ret.to_i
end
# ナイーブに全通り1からnまで探索すると時間切れなので、少し工夫。
# n=(n-1)/d * d + 1 なので、nをdで割った余りが1のときは、
# (n-1)/dで割った余りも1になる。
# これを使って、1 から sqrt(n)までしか探索しない。
# また、nをdで割った余りが1でないときは、d*i(i>1)で割った余りも
# 1でないということを利用して、判断する回数を減らす。
def g(n)
  res=n-1
  max=Math.sqrt(n).to_i
  arr=Array.new(1+max, false)
  (2..max).each{|d|
    next if arr[d]
    if n%d == 1
      res+=d+(n-1)/d
    else
      (1..(max/d)).each{|i| arr[d*i] = true }
    end
  }
  res
end
# 回文数を小さい方から全通り生成して、mより小さければ結果に足す。
def h(m)
  i=1
  tmp=-1
  len = m.to_s.length
  if len == 1 # 1桁のときは別処理。
    return (1..m).reduce(&:+)
  else
    res=45
  end
  while tmp != res
    tmp=res
    str=i.to_s
    if str.length * 2 == len
      wk=(str+str.reverse).to_i
      res+=wk if wk < = m
    else
      ([""] + %w(0 1 2 3 4 5 6 7 8 9)).each{|sp|
        wk=(str+sp+str.reverse).to_i
        res+=wk if wk <= m
      }
    end
    i+=1
  end
  res
end

a,b,c,d=gets.chomp.split.map(&:to_i)
puts h(g(f(a,b,c,d)))

CentOS7 で logwatch の出力を抑制

CentOS7 で logwatch を導入したが、毎日メールが送られてきてつらいので、メールの出力を抑制してみた。

毎日メールを送る原因になっているのは以下の二つ。

  • postfix
  • zz-disk_space

というわけで、それぞれ /etc 以下にファイルを作って対策した。
続きを読む CentOS7 で logwatch の出力を抑制

CentOS7 の btrfs 領域でチェックサムエラーが出始めたので、ファイルを復旧して暫定対策した話

https://ttandai.info/archives/1894に書いた通り、btrfsではfsckしなくていいよ、ということだが、1か月ほど使ってから btrfs scrub したら、checksum error が /var/log/messages の中にいくつも出てきたので、とりあえず不良ファイルをバックアップから戻したあと、 logwatch の導入と btrfs scrub の定期実行で対策した話。

続きを読む CentOS7 の btrfs 領域でチェックサムエラーが出始めたので、ファイルを復旧して暫定対策した話

codeiq @riverplus さんの「ディビジョン・ナイン問題」をrubyとschemeで解いた

回答まとめはこちら

問題は下記。

1 から 4 の数字を使って作る n 桁の整数のうち、9 の倍数となるものの個数を F(n) と定義します。例えば、F(1) = F(2) = 0、F(3) = 10、F(4) = 40 となることが確かめられます。

標準入力から、自然数 n(1 ≦ n ≦ 20)が与えられます。標準出力に F(n) の値を出力するプログラムを書いてください。

1111…から4444…まで全通り生成して数えていては終わらないので、9の剰余で分類します。すなわち、1から4の数字を使って作るn桁の数字のうち、9で割ったあまりがrになるものの個数をF(n,r) とすると、
 \displaystyle F(n+1,r) = \sum^4_{i=1}F(n,r-i)
の漸化式になります。

これをrubyで計算し、F(n,0)を出力するコードが下記。Hashの引数が9で割ったあまりになっています。

n=gets.to_i
h={}
h[1]=h[2]=h[3]=h[4]=1
(1...n).each{|m|
  tmp=Hash.new{|h,k| h[k]=0 }
  h.each{|k,v|
    (1..4).each{|i|
      tmp[(i+k)%9]+=v
    }
  }
  h=tmp
}
puts h[0]

最近始めたschemeで書いたのはこちら、末尾再帰といえば聞こえはいいけど、ループを再帰にして、状態を関数の引数で覚えている、というだけ。もっとスマートに書けると思うんだけど、引数10個くらいだしまぁいいよね、ということで。

(use-modules (ice-9 rdelim))
(define (solve i a0 a1 a2 a3 a4 a5 a6 a7 a8)
    (if (= i 1)
        a0
        (+ (solve (- i 1)
                  (+ a5 a6 a7 a8)
                  (+ a6 a7 a8 a0)
                  (+ a7 a8 a0 a1)
                  (+ a8 a0 a1 a2)
                  (+ a0 a1 a2 a3)
                  (+ a1 a2 a3 a4)
                  (+ a2 a3 a4 a5)
                  (+ a3 a4 a5 a6)
                  (+ a4 a5 a6 a7)))))
(display (solve (string->number (read-line)) 0 1 1 1 1 0 0 0 0))
(newline)

なんかふつふつとやる気がでてきたので、ドメインとってブログのアドレス変えた。

なんかうりゃーっとやる気が出てきたので、サーバ業者が提供していた今までのドメインをやめて、新しくドメインとってWordPressのアドレスを変えてみた。

WordPress内部のアドレスを変えるのは、基本は「設定→一般」の設定項目でアドレスを変えるだけで、WordPress的には全く問題なくできる。
今までのサイトの方からは、一応301で新しい方にリダイレクトするようにしておいて、検索エンジン対策をしておく。(.htaccess で Redirect permanent な感じ)
(同じファイルを見るようにすれば手間はかからないが、新しい方のサイトがなかなかインデックスされないというはめになってしまうと考えた。)

WordPress自体はポータブルにできているようで、ディレクトリごとmvしてしまってもそのまま動いてくれたので、ありがたい。
あとは、いろいろなところのアドレスを直せばおしまい。よそからリンクしてもらってくれていたところは、この機会に直してもらおうかなぁ。
いまだにgooブログの方にちょこちょこと飛んでくる分があるので、なかなかgooブログをたためない、、、

CentOS7 の mailx コマンドで、外部のSMTPサーバを経由してメール送信

以前、sheevaplug のeximを使って、外部のSMTPサーバ経由でsendmailコマンドでメール送信する方法を記事にしたが、(https://ttandai.info/archives/758
CentOS7で同じことを実現する方法を探っていたら、結構前から、普通のmailコマンド(heirloom mailx になっている)のオプションで、普通に外部のSMTPサーバ経由でメール送信できるようになっていたので、メモを残しておく。(まぁ、このことに気付いたのは1年以上前なのだけれども、わざわざ記事にはしていなかった。最近これを扱う機会があったので、まぁ一応残しておく。)

この方法は root 権限なしでも可能なので、設定変更できないサーバ上でメール送信する際にも便利です。

続きを読む CentOS7 の mailx コマンドで、外部のSMTPサーバを経由してメール送信

edXを始めた

最近ゲームやら漫画やらも飽きてきたので、edXを始めた。
とりあえず、schemeでプログラミングのやつ(How to Code: Systematic Program Design)と、Open government のやつ。

始めはcouseraとか見たけど、無料ではenrollできない感じだったのでパス。
gaccoは、self-pasedなやつがパッと見た感じではなさそうだからなんだか面倒。
edXは、東大とか京大でも何かコースを出していたりするみたいだね。ふーん。たぶんとらないけど。

始めてみると、いろいろと視野が広がる気がして割と楽しい、が、いまさら社会科学系の論文を英語で読むのはちとつらいかなぁ。あとは、英語の発音がアメリカ英語じゃない場合があって、字幕をみないと混乱する。

btrfs では fsck が何もしないし、定期的に実行しなくてもよいという話。

この記事この記事で最近触っているbtrfsでは、fsckが必要ないらしい。

実際、fsck.btrfs をしてみると、btrfs checkを使えと助言してくれるようだ。(man fsck.btrfs にもそのように書いてある)

実際、何もしなくてもごくごくたまーに、syslogの中でbtrfsのchecksumエラーの修正とかそういうのが出てくるので、少なくともCentOS7では割といろいろよきに計らってくれているのだろうと想像している。

本当に何もしなくていいのかなぁ、といろいろ見ていると、
http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html
というのにあたり、まぁとりあえず btrfs scrub はやっておいた方がいいらしいというのはあるが、これってRAID向けの機能のような気がするので、とりあえず使わない。(試しにやってみたら、チェックサムエラーの修正が起こってしまったのだけれども、、、このコマンド自体はデータを読むだけで何もしないはずだが、データを読んだときに何か起こったのかなぁ。定期的に全データさらうっていうのもありか、、? うーん。 今は、USBメモリな起動ドライブにあまり負荷をかけたくない。)

なので、
https://btrfs.wiki.kernel.org/index.php/FAQ#When_will_Btrfs_have_a_fsck_like_tool.3F
にも書いてある ”Note that in many cases, you don’t want to run fsck. Btrfs is fairly self healing, …” という文言を信じて、何もしないことにした。

なお、btrfs では、defrag をするコマンドも用意されているが、まぁ、これも負荷があるだろうから、定期的にはやらないことにした。

ついに!うちの!Lumia640にも!Windows10が!きたぞー!

https://blogs.windows.com/windowsexperience/2016/03/17/upgrading-existing-windows-phone-8-1-devices-to-windows-10-mobile/
というわけで、さっそく、Lumia640に upgrade advisor を入れてチェック、とっととアップグレードを始めた。

本体メモリが足らなかったので、適当にSDカードにデータを逃がして、アップグレード開始。
ちょっと時間がかかるが、今アップグレードが走っているところ。どうなるかな~。

で、30分くらいかかってアップグレード終了。

Microsoftアカウントのパスワードを入れ直す必要はなく、wifi設定も完全に引き継いだ状態で起動。

ちょっと試した感じだと、

  1. フォントがきれいになった
  2. タイルの見た目がかわった?
  3. 設定の階層が1段増えて、以前のようにフラットではなくなった
  4. タッチキーボードが変わった。矢印キーはなくなって、トラックポイントみたいなのを使うように変わったようだ。デフォルトだと日本語キーボードから英語キーボードへの変更にひと手間増えた感じがあるけど、ここは設定で変えられる。
  5. IEがEdgeに変わったけど、フォントが変わったくらいしか今のところ気になるところはないかな。
  6. 画面上からスワイプした時の通知バーの通知アイコン。以前は4つを厳選しないといけなかったけど、今はデフォルト表示の4つを選べるほか、「展開」すると、選ばなかったものもすぐに使える。特に、アプリがないとできなかった「懐中電灯」機能がついていること、これはでかい。

印象としては見た目が変わった感じは大きいけど、通知アイコンまわりの操作感が変わったのは地味に便利。たぶんこれはいいものだ。

あ、そういえば、Lumiaカメラをはじめ、いくつかのアプリは無くなってしまいましたな。まぁいいけど。

======

その後、しばらく使っていると、以前より電池の持ちが悪くなった感じがある。 以前 Android を使っていたときと同じような感触。
不要なアプリのバックグラウンド動作を片っ端から切ってみたら、まぁちょっとは持つようになったと思うが、ちょっとがっかり感があるかなぁ。

CentOS7 (1511) でbtrfsのスナップショットを定期的に保存するようにした。

前の記事で省いた、btrfsのスナップショットまわりについて。

btrfsのスナップショット便利だから、みんな使った方がいいよという話。

概要

前に記事に書いたように、システムのバックアップについては、別の外付けドライブを用意してある。このバックアップは、バックアップスクリプトの中で細工をして、grub設定ファイルやfstabなどは調整ずみであり、すぐに起動できるようになっている。

当然これは、起動ドライブが壊れるたらどうしよう、という意味でのバックアップにはなっているのだが、これとは別に、ファイルを誤って削除したらどうしよう、という意味でのバックアップも用意する必要がある。

幸い、btrfsにはスナップショット機能がついており、重複ファイル分の容量を気にせずスナップショットを作りまくれるので、今回はこれを利用することにした。

続きを読む CentOS7 (1511) でbtrfsのスナップショットを定期的に保存するようにした。

CentOS7 (1511) で、すぐに起動できるシステムバックアップの作成

NUC(DN2820FYKH)で、起動用のドライブとは別のドライブを用意して、すぐに起動できるシステムバックアップを作成した。USBドライブなどの外付けデバイスでシステムバックアップを作成するときにでもご参考に。

やりたいこと

NUC(DN2820FYKH)で、現在USB3.0なUSBメモリ(32GB)を起動ドライブとしている。USBメモリがいつ壊れるかと気にしながら使い続けるというのもさすがに心もとないので、すぐに起動できるバックアップを用意しておきたい。

続きを読む CentOS7 (1511) で、すぐに起動できるシステムバックアップの作成

pspgoのスライド部分が壊れたのでばらして直した。

pspgoを何度も落としたりしていた結果、ある時気づいたら画面と本体をつなぐスライド部分(右側)のねじが外れて浮いてしまっていた。

あ~あとしょげながらも、とりあえずは参考URLを参考にして、PSPgoをばらしてみた。細かい部品が多かったりしたけど、ばらすのはドライバ一本でなんとかなる。

スライド部分の本体側ねじは、まだ本体内部のねじ穴のところに残っていたので、それをつけてしめなおしておしまい。

接続部分が小さいフレキケーブルが硬くてなかなか抜けなかったのが、今回一番難しかったところ。これは、たまたまあったでかいクリップ(目玉クリップ?)を使って引っ張ったらなんとか抜けたが、これでなんとかなることに気付かなかったら詰んでた。

今回は完全に画面と本体をばらす必要はなかったので、バッテリ部分の封印シールについては、一応触らずに済ませることができたが、たぶん折り目がついてしまっているので、微妙なところではある。(本当は新しいバッテリとか、大容量互換バッテリに付け替えてしまいたいところだけども、、、。)

まぁ、治ったからよかった。

参考URL
http://imaginglabo.web.fc2.com/PSPgo-barabara.htm
http://mrepairshop.jp/blog-entry-59.html

パスワード管理ソフトの KeePass を導入した

KeePassを導入して、いろいろなパスワードを難しくして覚えさせ、自動入力でハッピーな暮らしになったかもしれない話。

今までは、一つのパスワード付きファイルを用意して、パスワードが必要なサイトごとに、

  1. ユーザID
  2. パスワードのヒント(当然、パスワードの使いまわしはないようになっている)

を、書いて保存していた。

これはこれでうまくいっていると思っていたが、以前から気になってはいたがなかなか手が出なかったパスワード管理ソフトを今回導入してみた。

続きを読む パスワード管理ソフトの KeePass を導入した

codeiq @riverplus さんの「ロング・ロング・ストリング問題」を解いた

https://codeiq.jp/q/2683

作者による解説は
https://codeiq.jp/magazine/2016/03/38398/ (Wayback Machine 経由)

回答は
http://togetter.com/li/947393
でまとめられている。

問題はだいたいこんな感じ

自然数 n に対して、関数 F(n) を、n**n(n の n 乗)を 10 進数で表したときの桁数と定義します。
さらに、2 以上の自然数 m に対して、F(n) = m となる n の値を G(m) と定義します。
もしそのような n が存在しない場合は、G(m) = -1 と定義します。

標準入力から、自然数 m(2 ≦ m ≦ 1010)が与えられます。
標準出力に G(m) の値を出力するプログラムを書いてください。

rubyで書いたニュートン法の提出コードはこちら。
四捨五入しているところはちょっと怪しいと思ったけど、
テストケースが全部通ったので、とりあえずは深く考えずにそのままにしている。
自然対数じゃない対数の微分とか、高校以来かもしれない。

 m=gets.chomp.to_i
# 入力mに対して、10**m=n**n、すなわち n*log10(n)-m = 0 を満たす 
# 実数nを、ニュートン法で求める。
i = m
tmp = (i*Math.log10(i) - m )/(Math.log10(i) + 1/ Math.log(10))
while tmp.abs > 0.01
  i-=tmp
  tmp = (i*Math.log10(i) - m )/(Math.log10(i) + 1/ Math.log(10))
end
i=i.round # ここは大丈夫かな? # -1 になる条件をチェックしつつ出力。
puts (i*Math.log10(i)).ceil == m ? i : -1