GalaxyNexus(SC-04D)をdocomo標準ROMに書き戻すバッチファイル書いた
root化しちゃった端末が文鎮になりかけているときに標準ROMに書き戻すときに役に立つかもしれません.たとえば再起動を繰り返しちゃってる状態から復旧できる可能性があります.
基本的にここのステップをバッチファイルにしただけです.書き込むイメージファイルは自分で用意してください.ちなみに,手元に端末がないためテストされていませんので文鎮になる可能性があります.僕は文鎮になっても知りません.文鎮になった場合は僕が文鎮として使いますので送ってください.無料で引き取ります.文鎮になるのが嫌な人は自分でコマンドを打ち込んだ方がいいかもしれません.文鎮になる可能性は否定できませんが.
必須事項
- 使っているOSがWindowsであること(バッチファイルの実行に必須)
- 端末本体のブートローダのバージョンが PRIMEKJ10 であること
- 端末用のドライバが既に導入されていること
- バッチファイルと同じフォルダに書き込むファイルが存在していること
- boot.img
- system-ITL41D-SC04D0MKKD.img
- 問題にぶつかったらググる気力と体力と時間
- 失敗したら文鎮になる覚悟
- 失敗しても僕に責任がないことに同意すること
@echo off cls rem 今回書き込むイメージファイル set BOOTIMG=boot.img set SYSTEMIMG=system-ITL41D-SC04D0MKKD.img echo このプログラムはあなたのGalaxyNexusをDocomo標準のROMに戻します。 echo キャンセルする場合はCtrl+Cを入力するかコマンドプロンプトを閉じてください。 echo. pause rem 書き込むファイルがあるかどうかの確認 echo 必要なファイルを確認しています... echo. if exist "%BOOTIMG%" ( echo [OK] "%BOOTIMG%" found. ) else ( echo [Error] "%BOOTIMG%" が見つかりません。 pause exit ) if exist "%SYSTEMIMG%" ( echo [OK] "%SYSTEMIMG%" found. ) else ( echo [Error] "%SYSTEMIMG%" が見つかりません。 pause exit ) rem 接続待ち echo. echo GalaxyNexusのボリュームUpとボリュームDownを押しながら端末を起動してFastbootモードにしてください。Fastbootモードで起動したら端末をUSBケーブルでパソコンに接続してください。 echo. echo 接続が完了したら何かキーを押してください... pause > nul echo. rem 書き込み開始 echo 作業を開始します。USBケーブルを抜かないでください。 echo. fastboot erase system -w fastboot erase boot fastboot flash system %SYSTEMIMG% fastboot flash boot %BOOTIMG% fastboot reboot echo. echo 復元作業を終了します。 echo. pause
Nexus Prime (Galaxy Nexus) 欲しいけど,Docomoから買うとLTE対応じゃないので少し考えた
※以下の記事は個人的な考えと推測で満たされています.
スマートフォン市場の現状
現在のスマートフォン市場は,端末スペックを上げて機能を追加することで売上を伸ばしているように見えます.しかし,端末スペックをいくら上げたところで売行きは必ず途絶えます.というのも,現状の端末で既に十分な処理速度を実現できており,一般の人が使う用途でスペック不足になるようなサービスはあまりないからです.むしろ,ネックになっているのは回線速度です.どれだけクラウド化とか言ってても,結局は回線に依存しています.携帯電話という性質上,処理能力が限られている携帯端末側でするのはナンセンスでしょう.そういう意味でのクラウド化がもてはやされるのは分かりますが,クラウドサービスを利用するにはインターネット回線が必要です.こいつが遅いのです.
スマートフォンで行う処理について
これは個人的な推測ですが,携帯端末で何かを制作・加工・発信している人はあまりいないと思います.文章を書く,絵を描く,動画を編集する,といったことは,本来携帯端末で行うべきではありません.これらの作業を携帯でできるのは確かに便利で,ちょっとだけやりたい人にとっては十分便利だと思います.その点では,これらの機能は消費者にとって便利であり,端末の売上を伸ばす重要な要素でしょう.でも,こいつらは電池食うんですよ.
現在のスマートフォンの課題点
現在,スマートフォンで重要になっているのは処理速度ではありません.回線速度とバッテリーです.おそらく各企業もこんなことには数年あるいは数十年前から気づいていたと思います.CPUの速度が上がってもHDDやSSDが遅すぎて十分な性能を発揮できていないようなものです.携帯電話は基本的に無線通信デバイスです.電池を食うのは当たり前です.回線使うのも当たり前です.でも,その2つの点がネックになりすぎています.どんなサービスが出てきてもこの2点がネックになって十分に使えません.
今後の予想
現在,各キャリアはこの回線速度をなんとかしようと頑張っています(たぶん).携帯電話メーカーは電池の持ちをなんとかしようと頑張っています(たぶん).各大学でもこういう技術の研究がされています(たぶん).
おそらく今から2-5年くらいすればまともに使えるスマートフォンが出てくると思います.現状ではそういう技術が普及していないのでしょうがないのですが,現状でLTE対応ではないということはかなり致命的だと思います.今から1-3年以内にLTEが広く普及すると思います.LTEが普及すれば,高速通信ができることを前提にしたサービスが必ず出てきます.現状では素晴らしい端末かもしれませんが,そういうサービスが普及したら最後,「このサービスがまともに使えない端末」になってしまうのです.
端末購入について
個人的に,2-4年程度使える端末は,その時点でベストな選択肢である必要があると思います.Docomoから発売される Galaxy Nexus はLTE対応でないことで「ベストな選択肢」にはなりえません.あと半年もすればほとんどの端末がLTE対応になると思います.あるいは Galaxy Nexus のLTE対応版が出てくるかもしれません*1.といっても,Galaxy Nexus は魅力的な端末ではあるので,とりあえずはそれを使って,回線速度が遅いと感じてきたらLTEアクセスポイントを買うのがいいかと思っています.
まとめ
講義でノートとるときにTeXで書きたいけどめんどくさいからTeXに書き換えるスクリプト書いた
インデント使いましょう!
手書きでノートとるのちょっと気が引ける科目とかありますよね.
あとで追記したりするときもどうしてもキーボードでカチャカチャやったほうが・・・
TeXで書いたら綺麗になるし,でもタグ書くのもめんどくさいし・・・
・・・!!
インデントで項目分ければいいじゃない!!
つまり,
Gentooについて 可愛い 熱心なファンが存在する 愛でたくなる おしゃれ 女子力アップ! どう考えてもオムライス女子よりGentoo女子の方がいいでしょ すばらしい スバラシス!!! 女子力について 合コンで役立つ能力 合コン:合同コンパイル %begin{texmode} \[ 女子力 = \int_{0}^{コア数} 女装力^{x} dx \] %end{texmode} Gentooのインストールできないんですぅ・・・ これで相手もメロメロやで
みたいにノートとると,
\documentclass{jsarticle} \begin{document} \section*{Gentooについて} \begin{itemize} \item 可愛い \begin{itemize} \item 熱心なファンが存在する \item 愛でたくなる \end{itemize} \item おしゃれ \begin{itemize} \item 女子力アップ! \item どう考えてもオムライス女子よりGentoo女子の方がいいでしょ \end{itemize} \item すばらしい \begin{itemize} \item スバラシス!!! \end{itemize} \end{itemize} \section*{女子力について} \begin{itemize} \item 合コンで役立つ能力 \begin{itemize} \item 合コン:合同コンパイル %begin{texmode} \[ 女子力 = \int_{0}^{コア数} 女装力^{x} dx \] %end{texmode} \end{itemize} \item Gentooのインストールできないんですぅ・・・ \begin{itemize} \item これで相手もメロメロやで \end{itemize} \end{itemize} \end{document}
こんな感じに出力されます.
そして,こんな感じに仕上がるのです・・・!!
すばらしいじゃないですか!
記法とか
- タブインデントで項目を分けます
- タブなしだと\section*{}になります
- %begin{texmode}, %end{texmode} でそのまま出力するかどうかを切り替えます
- 数式とか書く時はモード切り替えましょう
個人的には当面は多分これで事足りると思いますが,個人的にはPerlのコードとか埋め込めれば便利かなぁとか思ってます.
Pythonで書いてみた
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys, re CurrentDepth = 0 texmode = False START = 0 END = 1 newDepthTag = [['', ''], ['\\begin{itemize}', '\\end{itemize}']] depthTag = [['\\section*{', '}'], ['\\item ', '']] isWhiteSpace = re.compile(r'^[ \t\r\n]*$') isComment = re.compile(r'^[ \t\r\n]*%.*') def sign(num) : if num == 0 : return 0 elif num > 0 : return 1 else : return -1 def countTab(line) : tabs = 0 while line[tabs] == '\t': tabs += 1 return tabs def simplify(line) : while line[0] == '\t' : line = line[1::] return re.sub('\n', '', line) def changeTexMode(line) : if plainline == '%begin{texmode}' : return True elif plainline == '%end{texmode}' : return False # begin document print '\\documentclass{jsarticle}' print '\\begin{document}' # input lines from stdin for line in sys.stdin: if isWhiteSpace.match(line) != None : continue depth = countTab(line) plainline = simplify(line) m = changeTexMode(plainline) if m != None : texmode = m print line, continue if texmode == True : print line, continue if isComment.match(line) != None : print line, continue if depth > CurrentDepth : CurrentDepth = depth print "%s%s" % ('\t'*CurrentDepth, newDepthTag[sign(CurrentDepth)][START]) elif depth < CurrentDepth : for i in range(CurrentDepth - depth) : print "%s%s" % ('\t'*(CurrentDepth-i), newDepthTag[sign(CurrentDepth-i)][END]) CurrentDepth = depth print "%s%s%s%s" % ('\t' * CurrentDepth, depthTag[sign(CurrentDepth)][START], plainline, depthTag[sign(CurrentDepth)][END]) # close blocks for i in range(CurrentDepth) : print "%s%s" % ('\t'*(CurrentDepth-i), newDepthTag[sign(CurrentDepth-i)][END]) CurrentDepth = 0 # end document print '\\end{document}'
使い方とか
標準入力から読んで標準出力に吐くようになってるので,適当にtxt2tex.pyとか名前つけて
./txt2tex.py < input.txt > output.tex && platex output.tex && dvipdfmx output.dvi
とかすると,PDFになってうれしいね!
よしよし,これで煩わしいノート取る作業もちょっと楽になりそう.
Gentoo/Linuxで高品質Ustream配信するよ!
どのくらい高品質なのか
下のコマンドでデスクトップをキャプチャした程度の画質になります
ffmpeg -r 20 -s 768x480 -f x11grab -i :0.0 -f alsa -i default \ -acodec libmp3lame -vcodec libx264 -b 300k -ar 22050 -ab 48k \ -threads 4 -vsync 1 -y -f flv out.flv
Linuxで高品質配信したっていいじゃない!
そもそもデフォルトの配信はFlash Playerでごにょごにょやってるようですが,
そいつがうまく動いてくれてない(高画質配信に対応してない?)んだと思います.
Windows/Mac用にはのFlash Media Live Encoderっていうのがあるらしいんですが,
Linux用は用意されていません.
そこで,Flash Playerで配信しようとするのを,やめます!!
Ustreamにはrtmpというプロトコル(ストリーミング配信用のやつ?)が用意されています.
Real Time Messaging Protocol (RTMP) とは、Adobe が開発している、 Adobe Flash プレーヤーとサーバーの間で、音声・動画・データを やりとりするストリーミングのプロトコル。元々は Macromedia が開発 していて、Adobe に買収された。プロトコルの仕様は公開されている。 (Wikipediaより)
なるほど.こいつを使えばいいのですな.
幸いなことに,ffmpegはこのrtmpを使ってエンコードしたデータを送信することができるらしいです.
方法
そこで,とりあえずrtmpで送信できるようにffmpegをコンパイルします.
Ubuntuとかの人は多分デフォルトのままで大丈夫らしいです.
USE="rtmp network" emerge -av ffmpeg
おもむろにEnterをッタターンッっとたたいたら,
- Ustreamのサイトにアクセスします.
- 自分のアカウントのダッシュボードにいく
- 番組設定→詳細設定→「Flash Media Live Encoder のXMLファイルをダウンロード」をクリック
- DLしたxmlファイルの中身をみる
<output> <rtmp> <url>rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567</url> <backup_url></backup_url> <stream>e6a578cf852511312f8792408dd433a5offair</stream> </rtmp> </output>
みたいなところがありますね!
この
rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567/e6a578cf852511312f8792408dd433a5offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)
とりあえず,Ustreamのライブ配信ページにアクセスしましょう!
Webカメラとかにアクセスしてもいい?とか聞かれますが,
めんどくさいので全部「お断りしますっ(キリッ」と答えます.
ここで配信ページにアクセスしないとデータが送れない可能性があったりなかったりするみたいです.
さぁ,ffmpegでエンコードしたデータをここに送りますよ!さっき作ったURI使うよ.
ffmpeg -r 20 -s 768x480 -f x11grab -i :0.0+100,200 -f alsa -i default -acodec libmp3lame \ -vcodec libx264 -b 300k -ar 22050 -ab 48k -threads 4 -vsync 1 -y \ -f flv 'rtmp://1.8765432.fme.ustream.tv/ustreamVideo/1234567/e6a578cf852511312f8792408dd433a5offair flashver=FME/3.0\20(compatible;\20FMSc/1.0)'
ffmpegのオプションはなんかてけとーに調整してくだしあ
ちょっとだけ解説します.
- -r 20 : フレームレートです.今回は20fpsだよ!
- -s 768x480 : サイズです.でっかくできるよ!
- -f x11grab -i :0.0+100,200 : デスクトップをキャプチャするよ!
- +100,200 は,画面の左上からx=100px,y=200pxのとこがキャプチャの左上になるよ!
- -f video4linux2 -i /dev/video0 とかにするとWebカメラからとるよ!
- -f alsa -i default : デフォルトのオーディオソースつかうよ!
- -threads 4 : 4スレッドでエンコードするよ!
- -f flv 'rtmp://... : rtmpでustreamに送信するよ!
おもむろにEnterをッタターンッと叩いたら,たぶんエンコードとかはじまると思います.
Stream mapping: Stream #0.0 -> #0.0 Stream #1.0 -> #0.1 Press [q] to stop, [?] for help frame=79187 fps= 20 q=12.0 size= 139953kB time=01:05:56.82 bitrate= 289.8kbits/s dup=106 drop=12
多分右の方に「なんかサーバにデータが届いてるよ!」的なボタンがあるので,そいつをクリックします.
あら不思議!自分のデスクトップが映っているじゃありませんか!
すてきですね!!
emerge ruby-gtk2 でコケる
gentooinstallbattleしてたんですが,ruby19に向けてgtk2が入らない.
*** /var/tmp/portage/dev-ruby/ruby-gtk2-1.0.3/work/ruby19/ruby-gnome2-all-1.0.0/gtk2/ext/gtk2/extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options
みたいのが出て,よく見ると
/var/tmp/portage/dev-ruby/ruby-gtk2-1.0.3/work/ruby19/ruby-gnome2-all-1.0.0/gtk2/ext/gtk2/extconf.rb:121: in `block (2 levels) in run': invalid byte sequence in US-ASCII (ArgumentError)
とか出てる.
なんやこれはとぐぐってみたがあんまり情報がない.
なにかヒントはないかと探していると,こんなページが・・・
http://manqod.sourceforge.net/index.php/Install
export LC_ALL=en_US.UTF8
ですと・・・!?
おもむろにlocaleしてみるとみんなPOSIXになってるじゃありませんか!
export LC_ALL=en_US.UTF8 emerge -av ruby-gtk2
とかしてみるとちゃんとコンパイル通ったというおはなし.
ちゃんと/etc/env.d/02localeとか設定しときましょう.
Gentoo Linux Localization Guide
(なんでruby18にはgtk2入ったんだろう・・・)
開発版ふぁぼDB
まだ開発版ですよ
※この記事とコード部分は予告なく変更される可能性があります.
# -*- coding: utf-8 -*- require 'sqlite3' $dbfile = '../plugin/tweets.db' existsFile = File.exists?($dbfile) db = SQLite3::Database.new($dbfile) existsTable = db.execute('select * from sqlite_master').size == 1 if !existsFile or !existsTable then db.execute('create table tweets (idname, tweetid, tweet, faved)') end db.close() Plugin.create(:tweetdb) do onupdate do |service, messages| messages.each{ |m| if !m.system? then db = SQLite3::Database.new($dbfile) if db.execute("select * from tweets where tweetid = #{m.id.to_s}").size == 0 then sql = "insert into tweets values (\'#{m.idname}\',#{m.id.to_s},\'\',\'#{m.favorite?}\')" db.execute(sql) end db.close() end } end on_favorite do |service, by, to| db = SQLite3::Database.new($dbfile) db.execute("update tweets set faved = \'true\' where tweetid = #{to.id}") db.close() end onmention do |post, raw_messages| messages = Plugin.filtering(:show_filter, raw_messages.select{ |m| not(m[:retweet]) and m[:created] > DEFINED_TIME }).first username = Post.primary_service.user.to_s messages.each{ |m| if (/@#{username} favall [a-zA-Z0-9_]+ [0-9]+/ =~ m.to_s) != nil then arg = m.to_s['@#{username} favall '.size..-1] pos = / / =~ arg target = arg[0..pos-1] num = arg[pos+1..-1].to_i if num > 50 then num = 50 end if target != username then favall(target, num) end end } end def self.createSystemMessage(message) Plugin.call(:update, nil, [Message.new(:message => "#{message}", :system => true)]) end def self.count(idname, faved = false) Thread.new{ db = SQLite3::Database.new($dbfile) list = db.execute("select count(tweetid) from tweets where idname = \'#{idname}\' and faved = \'#{faved}\'") db.close() if faved == false then createSystemMessage("favable count of @#{idname}: #{list[0][0]}") else createSystemMessage("unfavable count of @#{idname}: #{list[0][0]}") end } end def self.favsingle(tweetid) Post.primary_service.twitter.favorite(tweetid).code == '200' end def self.favall(idname, limit, unofficial = false, delay = 700) Thread.new{ db = SQLite3::Database.new($dbfile) list = db.execute("select tweetid from tweets where idname = \'#{idname}\' and faved = \'false\' order by tweetid desc limit #{limit}") if unofficial == false then Post.primary_service.update(:message => "fav targets of @#{idname}: #{list.size}") list.each{ |t| if Post.primary_service.twitter.favorite(t[0]).code == '200' then db.execute("update tweets set faved = \'true\' where tweetid = #{t[0]}") end sleep((delay + rand(1500)) / 1000.0) } db.close() else Post.primary_service.update(:message => "unofficial fav targets of @#{idname}: #{list.size}") list.each{ |t| Post.primary_service.update(:message => "@#{idname} ★ #{" " * (t[0] % 15)}") } end } end def self.unfavall(idname, limit) Thread.new{ db = SQLite3::Database.new($dbfile) list = db.execute("select tweetid from tweets where idname = \'#{idname}\' and faved = \'true\' order by tweetid desc limit #{limit}") Post.primary_service.update(:message => "unfav targets of @#{idname}: #{list.size}") list.each{ |t| if Post.primary_service.twitter.unfavorite(t[0]).code == '200' then db.execute("update tweets set faved = \'false\' where tweetid = #{t[0]}") end } db.close() } end def self.unfavfavall(idname, limit) Thread.new{ unfavall(idname, limit) favall(idname, limit) } end def self.callSQL(state, function) Thread.new{ db = SQLite3::Database.new($dbfile) result = db.execute(state) db.close createSystemMessage("#{state} => #{result}") if function != nil then result.each{ |res| function.call(res) } end } end def self.ranking(limit = 10) Thread.new{ db = SQLite3::Database.new($dbfile) result = db.execute("select idname, count(tweetid) from tweets where faved = 'false' group by idname order by count(tweetid) desc limit #{limit}") db.close msg = "favable ranking top #{limit}" result.each{ |r| msg += "@#{r[0]}\t#{r[1]}\n" } createSystemMessage(msg) } end add_event_filter(:command){ |menu| menu[:favable_count] = { :slug => :favable_count, :name => 'ふぁぼって登録', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| count(Gtk::TimeLine.get_active_mumbles[0][:user].to_s, false) }, :visible => true, :role => :message } [menu] } add_event_filter(:command){ |menu| menu[:favable_count] = { :slug => :favable_count, :name => 'いくつふぁぼれるか数える', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| count(Gtk::TimeLine.get_active_mumbles[0][:user].to_s, false) }, :visible => true, :role => :message } [menu] } add_event_filter(:command){ |menu| menu[:unfavable_count] = { :slug => :unfavable_count, :name => 'いくつunfavできるか数える', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| count(Gtk::TimeLine.get_active_mumbles[0][:user].to_s, true) }, :visible => true, :role => :message } [menu] } add_event_filter(:command){ |menu| menu[:favorite_all] = { :slug => :favorite_all, :name => '愛のふぁぼを贈る', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| favall(Gtk::TimeLine.get_active_mumbles[0][:user].to_s, 100) }, :visible => true, :role => :message } [menu] } add_event_filter(:command){ |menu| menu[:unfavorite_all] = { :slug => :unfavorite_all, :name => '愛の鞭でふぁぼを取り消す', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| unfavall(Gtk::TimeLine.get_active_mumbles[0][:user].to_s, 100) }, :visible => true, :role => :message } [menu] } add_event_filter(:command){ |menu| menu[:show_ranking] = { :slug => :show_ranking, :name => 'ふぁぼれるランキングを表示', :condition => lambda{ |m| m.message.repliable? }, :exec => lambda{ |m| ranking(10) }, :visible => true, :role => :message } [menu] } end
えあふぁぼするmikutterプラグインつくった
気持よくえあふぁぼできるで
えあふぁぼとは:
ふぁぼマークは付くけど実際にはふぁぼってないふぁぼのこと.
公式ふぁぼはアイコンの上に★が付きますが,えあふぁぼではつきません.
ちなみに,えあふぁぼしてから通常ふぁぼもできます!