東方の海

サブカル考察など。

タイトルの通り。スマホのカメラレンズガラス内部に水滴(結露)が入ったときの対処法。
買い替えが脳裏をよぎって震えたけど、結論としてはなんとかなります。

まず、12時間ぐらい側面のカバーを開けて米櫃に突っ込んでおきました。しかし、ほとんど効果なし。怖くなってネットで対処法を調べました。すると、以下のサイトを発見。

携帯(スマホ)が水没気味になってカメラのレンズ内に水が入った時の裏技 ITメモ

これを見て、指でレンズガラスをこすりまくりました。すると、ちょっとずつ水滴が消えていきましたが、遅い。そして、冷えると、水滴の量は若干減るものの、また曇ってしまいました。
そこで、ドライヤーを使ってスマホ本体全体を温め、特にレンズガラスを温めることにしました。触感で約65℃を保ちました。すると、効果あり。ゆびでこするより早い。しかし、冷やすとやはり曇り、根気強く何度もやる必要がありました。効率を上げるため、本体側面のSDカードやUSB端子などのカバー扉は全て開け、ときどき口をつけて逆側のカバー穴からドライヤーの温風を送り込んで口をつけた側から内部の空気を吸う、を繰り返しました。すると、1時間ほどでかなり回復。しかし、やはり曇るので、しばらく乾燥した部屋で放置していたところ、なぜか水滴がかなり減っていました。さらに1時間放置すると、水滴は完全消失し、カメラは完全回復していました!!大成功です!!

さて、一旦は回復したものの、内部の基盤などにはまだ大量の水滴が残っているはず。このままでは内部湿度はほぼ100%で、冷やしたらまた結露しかねないですし、なにより基盤の結露は回路のショートや基盤の腐食、本体の破損につながります。そのため、一刻も早く内部の水滴を除去する必要があります。そのためには、乾燥した部屋で、ドライヤーで約65℃に保ってさらに2時間ほど保温乾燥が必要になるでしょう。米櫃は冷たいのであまり効果がありません。タッパーに乾燥剤を入れてドライヤーの温風で温めるが一番効果がありそうですが、ちょっと用意が大変なのでとりあえずはドライヤーのみで試してみたいです。

ちなみに、基盤に印刷された部分は金や銀でできているのですが、SDカードスロットなどとの接続部分はステンレスやニッケルやハンダが使われており、異種金属接合となっているので、ここが優先的に腐食します。また、カメラ素子などに水滴がつくと、表面の高電圧によるショートで素子が破壊される可能性があります。また、金メッキされた配線でも、電圧にもよりますが、電気が流れているとたとえ金でも錆びて腐食する可能性があります。一旦結露してしまったら最後まで気を抜かないように。ゴキブリやカビの蔓延と同じで、根気強い対処が必要になります。
また、素人の技量では乾燥が不完全になったり、スマホの材質が熱変性を起こして表面が溶ける・故障するなどの逆効果になったりする可能性が高いです。プロに任せたほうが無難です。なお、水没だと携帯電話ショップの保証範囲外になる会社がほとんどなので注意してください。水没以外の結露でも取り扱いの過失として保証範囲外になる可能性はゼロではありません。

以上、対処法でした。自己責任になりますが、買い替えるしかないかもと思っている人はちょっと待ってください。まだ見込みはあります。
スポンサーサイト
2016.03.23 17:07 | コンピューター | トラックバック(-) | コメント(0) |

最近Twitterで話題になった数学の未解決問題で筆者が取り組んでいる問題に、プリクラ問題というのがあります。

という問題提起から始まったものです。Togetterまとめは以下。

プリクラ問題 - Togetterまとめ

プリクラ問題2

プリクラ問題まとめのまとめ - Togetterまとめ


---以上、2016年5月31日追記。---


プリクラ問題の総探索プログラムのRubyコードをおいておきます。

def solve(n,m) #プリクラ問題。n人がm人まで入れるプリクラで全員自分以外の人と1回以上撮るためのプリクラ撮影回数の最小値を求める。
mincount = C(n,m)
card = card(n,m)
order = order(C(n,m))
order.each{|elem| mincount=min(mincount,count(card,elem))}
return mincount
end
def count(card,order) #cardをorder順にparseしてcard使用回数を数えて返す関数
flag = make2d(order.length(),order.length())
counter = 0
for i in 0..(order.length()-1)
counter = counter + 1
parse(card[order[i]-1]).each{|elem| flag[elem[0]-1][elem[1]-1]=1}
if (sumElem(sumElem(flag)) == C(order.length(),2))
break
end
end
return counter
end
def parse(a) #[3,1,2]を代入すると[[3,1],[3,2],[1,2]]を返すような関数
deck = make1d(C(a.length(),2))
count = 0
for i in 0..(a.length()-1)
for j in (i+1)..(a.length()-1)
deck[count] = [a[i]] + [a[j]]
count = count + 1
end
end
return deck
end
def order(n) #[[1,2,3],..,[3,2,1]]を返すような関数
deck = make1d(P(n,n))
line = make1d(n)
for i in 0..(n-1)
line[i] = i + 1
end
counter = [0]
def shuffle(orig,count,a,b=[]) #配列の要素を順番に抜き出す再帰的関数
if a.length() == 0
orig[count[0]] = b
count[0] = count[0] + 1
else
a.each{|i| shuffle(orig,count,a-[i],b+[i])}
end
end
shuffle(deck,counter,line)
return deck
end
def card(n,m) #[[1,2,3],..,[3,4,5]]を返すような関数
deck = make1d(C(n,m))
temp = deck.clone
temp[0] = make1d(m)
for i in 0..(m-1)
temp[0][i] = i+1
end
deck[0] = temp[0].clone
def pointer(n,m,narray,num) #[1,4,5]を代入すると[2,3,4]を返すような関数
if num > -1
if narray[num] < n+num+1-m
narray[num] = narray[num]+1
if num < m-1
for i in 1..(m-1-num)
narray[num+i] = narray[num]+i
end
end
return narray
else
pointer(n,m,narray,num-1)
end
else
return 'error: the last elem [n-m+1,..,n] was put in pointer().'
end
end
for i in 1..C(n,m)-1
temp[i] = pointer(n,m,temp[i-1],m-1)
deck[i] = temp[i].clone
end
return deck
end
def max(x,y) #x,yのうち大きい方を返す
if x >= y
x
else
y
end
end
def min(x,y) #x,yのうち小さい方を返す
if x <= y
x
else
y
end
end
def maxElem(a,i=a.length()-1) #0..iの配列aのうち最大の要素を返す
if i==0
a[0]
else
if maxElem(a,i-1) > a[i]
maxElem(a,i-1)
else
a[i]
end
end
end
def minElem(a,i=a.length()-1) #0..iの配列aのうち最小の要素を返す
if i==0
a[0]
else
if minElem(a,i-1) > a[i]
a[i]
else
minElem(a,i-1)
end
end
end
def sumElem(a,i=a.length()-1) #配列の要素の合計を返す
if i==0
a[0]
else
a[i] + sumElem(a,i-1)
end
end
def make1d(n) #長さnの零列ベクトルを返す
a = Array.new(n)
for i in 0..(n-1)
a[i] = 0
end
a
end
def make2d(height,width) #height行witdth列の行列を返す
a = Array.new(height)
for i in 0..(height-1)
a[i] = make1d(width)
end
a
end
def C(n,k) #nCkを返す
if k > n
0
else
if k == 0
1
else
C(n-1,k-1)+C(n-1,k)
end
end
end
2016.03.08 01:40 | 数学 | トラックバック(-) | コメント(0) |
先日、立川シネマシティで『ガールズ&パンツァー 劇場版』(水島努,2015)の極上爆音上映を観てきました。

ガルパンについてはそんなに知識がなかったのですが、ストーリーは単純でわかりやすく、登場人物はほぼ型が完成されており、疎外感はありませんでした。この映画の特長である迫力のある戦車戦の描写と音響は素晴らしかったです。

ガルパンの世界は搭乗員がけがをせず、破壊された街並みもすぐ復興できるという理想の世界であるだけでなく、戦車が飛んだり線路の上を走ったりと、物理法則はわりとねじまげられており、そこまでして面白おかしい戦車戦が追求されています。このような描写はプラモデルにはまる小学生が一度は絶対考えるようなもので、中二病を通り越して夢のある戦車戦となっていました。
指揮についても、主人公の西住みほさんが指揮をしていますが、指揮に従う他の生徒たちもわりと好き勝手やっていて、小学生並みの平和さであると感じます(戦車に興味がある人なら誰しも自分が隊を指揮する想像に耽ってみると思いますが、指示される側は指揮官と比べたらつまらないと感じるでしょうし、そのつまらなさ大規模指揮官の命令が絶対であればあるほど増加するでしょう)。対して、敵チームは最初から統率が取れていて指揮官以外が指揮官に完全に従っています。敵チームの指揮官だけはキャラが立っていますが、主人公たちと敵チームの対比はこの点で特徴的でした。

主人公の西住みほさんについては、西住みほ自閉症スペクトラム障害説 - Togetterまとめで言われているのもありますが、映画を通して違和感がある描写がいくつかありました。もちろん優しさはありますが、例えば、話し方や情動の変化がかなり少ないこと、作戦を実行するときは非常に冷静で冴えていること、人の呼びかけに直接応答しないことがあること、ボコにだけ手放しに反応することなど。深くは考えませんが、優しく人望があり冷静で頭が冴える人なので指揮官としてやってこれているのかなとやや思いました。

後ろの端の席だったので最高の席というわけではなかったのですが、音響は普通の劇場よりかなり良かったような気がします。中央や最前列で見たらもっと楽しそうです。戦車視点の描写がしばしば挟まれますが、スクリーンからだいぶ離れていたからか安心して観ることができました。最前列や4DXだったらかなり激しいことになっていて、もしかしたら酔うかもしれません。

まとめると、「ガルパンはいいぞ」の一言に尽きます。ガルパン本編を知らない人でも気軽に観て楽しめると思います。
2016.03.06 00:53 | 未分類 | トラックバック(-) | コメント(0) |
AtCoder Regular Contest 048に参加しました。
A問題はそこそこな時間でできましたが、B問題で関数のスコープでてこずりかつTime Limit Exceededになってしまいだめでした。どこがそんなに処理に時間がかかるんでしょう……(>_<)

順位は330位でした。A:100 (2) 37:47で、残りは-で、合計100 (2) 47:47でした。 前回よりも善戦したんじゃないかな、かな?

さて、解説で専用ライブラリを書いているような話がありましたが、やはりコンテストで使えるようにライブラリを書いておくのはとてもアドバンテージがあるようですね。科学計算で使うときには便利なライブラリを自作していましたが、コンテスト用にも書いておこうかな……。

あと、C++って型が異様に厳しく、関数を作るときも型明示が必要(オーバーロードが可能になっている)なんですね。あと、配列の操作などでよく使う操作が一発で書けないことが多く回りくどいように感じます。C++11以降かC#に移りたい気がします。C++が人気になった頃はCが古い言語と言われることもありましたが、今はC#やC++11に対してC++が古い言語、といった感じでしょうか。最近話題のC#もそろそろC++11に対して古い言語に感じるようになるのでしょうか?

ともかく、解説でちょくだいさんがC#を使っていたのが印象的でした。

A問題
#include 
#include
#include
using namespace std;
long abs(long a)
{
if(a<0){
return -a;
}
else{
return a;
}
}
int main(){
long a,b;
cin >> a >> b;
long d = abs(a-b);
long D = a*b;
if(D<0){
cout << d-1 << endl;
}
if(D>=0){
cout << d << endl;
}
return 0;
}


B問題
#include 
using namespace std;

int rate(int a, int b){
if(a>b){
return 1;
}
if(a return 2;
}
else{
return 3;
}
}

int janken(int a, int b){
if(a==b-1 || a==b+2){
return 1;
}
if(b==a-1 || b==a+2){
return 2;
}
else{
return 3;
}
}

int main(){
int N;
cin >> N;
int R[N],H[N];
for(int i = 0; i < N; i++){
cin >> R[i] >> H[i];
}
int a[N],b[N],c[N] = {0};
for(int i = 0; i < N; i++){
for(int j = 0; j < N; i++){
if(rate(R[i],R[j])==1){
a[i] += 1;
}
if(rate(R[i],R[j])==2){
b[i] += 1;
}
if(rate(R[i],R[j])==3){
c[i] += 1;
;
}
}
cout << a[i] << " " << b[i] << " " << c[i] << endl;
}
}
2016.03.05 23:46 | プログラミング | トラックバック(-) | コメント(0) |