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 NexusLTE対応でないことで「ベストな選択肢」にはなりえません.あと半年もすればほとんどの端末がLTE対応になると思います.あるいは Galaxy NexusLTE対応版が出てくるかもしれません*1.といっても,Galaxy Nexus は魅力的な端末ではあるので,とりあえずはそれを使って,回線速度が遅いと感じてきたらLTEアクセスポイントを買うのがいいかと思っています.

まとめ

  • 現状の端末で処理速度は十分
  • 売上を伸ばすためには目玉となる機能を追加しなければならない
  • ネックになっているのは回線速度とバッテリー
  • 今後1-3年でLTEが普及してLTEを前提にしたサービスが出てくるだろう
  • LTEのアクセスポイントでとりあえずやり過ごそうか・・・

*1:これに関してはDocomo側は発売するかどうか未定らしいです

講義でノートとるときに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://...のところとe6...をつかって,送信先URIを生成します.

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://... : rtmpustreamに送信するよ!

おもむろに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

多分右の方に「なんかサーバにデータが届いてるよ!」的なボタンがあるので,そいつをクリックします.
あら不思議!自分のデスクトップが映っているじゃありませんか!
すてきですね!!

できないこと

デスクトップキャプチャとWebカメラのシームレスな切り替えはできません.
一旦ffmpegを切ったあとにもっかいエンコードせにゃなりません.たぶん.
あと,どれくらいのビットレートまで大丈夫なのかは未検証です.

結論

ffmpeg使って吐ける動画は,Ustreamで配信することができる!
デスクトップ一面をmikutterにして配信するとか,
一部だけ配信してコーディングするとかができます!うれしい!!

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プラグインつくった


気持よくえあふぁぼできるで

えあふぁぼとは:
ふぁぼマークは付くけど実際にはふぁぼってないふぁぼのこと.
公式ふぁぼはアイコンの上に★が付きますが,えあふぁぼではつきません.

ちなみに,えあふぁぼしてから通常ふぁぼもできます!