2015年4月29日水曜日

[日本旅遊]2014-12-29 c87 day2/池袋

二日目。今天比較沒事,排完玲平(又是90分鐘)之後可以慢慢逛。


黑子籃球的廣告。很會投...

每次都要拍的角度。

葉子的倉庫。

 跟夏天的不太一樣,不知道是不是重做?

 孤独のコミケwww

C姐這次也要排個40分左右。結果我剛好是卡在玲平的最後一波。排完C姐之後發現玲平變成免排了啊~~~

郵便局的痛箱。


早早離開會場(約下午3點)之後跑去吃東池袋大勝軒。(又是因為無敵家排超長懶得等)
吃完的感想是復活之後的味道變淡了... 成為靠份量取勝的店。

在池袋東側往南的地方地下街想找coin locker, 結果沒有一個是空的... Orz
只好問雪哪裡有空的coin locker...
答えは雪に聞け。

 聽說哈密瓜池袋店開幕了,順便來去看看。剛好這台官方痛車就停在店門口www

本來以為池袋的男性向即將消失,在虎穴池袋B店跟哈密瓜的加持下,又讓人重新燃起希望。
意外的還不小間。面積大約是秋葉原店的1.5倍大,逛起來相當輕鬆。
18x有遊戲,成漫,薄本三大神器加持,佔了全店約一半的區域。

當然也不能忘記Bic Camera Outlet.
現在才注意到原來sofmap有代言角色。

suntory果實酒系列的新作。似乎是金桔味。沒有小瓶的可以踩地雷不敢貿然買。

這廣告根本就是在向二郎討戰...

晚上的料理是旅館旁的福しん的麻婆豆腐飯。還可以。

2015年4月22日水曜日

[WEB]第一次寫GreaseMonkey / TamperMonkey script(自動點選網頁按鈕)就上手

某天,點ガールフレンド(仮)的登校按鍵按到手酸,產生強烈的想要自動跑網頁遊戲的慾望。也一直想要研究這個東西很久了。(鍵人是javascript白痴)

GreaseMonkey / TamperMonkey 是FireFox/Chrome所提供的在網頁裡面嵌入script的套件。
藉由讀取網頁的時候嵌入使用者準備好的script,達到執行想要的功能的效果。

以下就用TamperMonkey為例,介紹如何寫一個自動按鍵的script。
前置作業:有程式設計的概念。知道javascript的基本語法,知道html的基本語法。
若是本篇的內容看不懂的話就請多多惡補了。

首先,到chrome市場的安裝TamperMonkey,安裝之後出現一個黑底,下方有兩個白色圈圈的icon。點擊一下會出現選單,選擇「DashBoard」,會出現TamperMonkey的主畫面。

此時按下最左邊那個比較小的icon,代表「增加新的script。」
畫面會變成這樣:

這樣就可以開始寫script了。
假如是要匯入準備好的script檔的話,有兩個方法。第一個就是開一個新的script,然後剪貼script的內容。第二個是把script放在TamperMonkey所指定的script放置目錄。
目錄位置請參考TemperMonkey的FAQ


接著要了解script的使用環境。
建議可以看看這篇介紹GreaseMonkey的文章,來補齊本篇所遺漏的地方。

先從系統自動填好的一些資料開始。
// ==UserScript==
// @name        test
// @namespace    http://your.homepage/
// @version      0.1
// @description  test.
// @author       You
// @include      /www.google.com*
// @grant        none
// ==/UserScript==

每一個script的區域前面都會有一塊這樣的註解區。 紀錄著script的名字,該作用在哪些網頁的資訊。
(以//開頭的都是註解,裡面寫的文字不會被當成是script),這部份紀錄了script的資訊。

一行行來看:
// ==UserScript==
代表script資訊區的開頭。為固定文字請勿修改。

// @name         My Fancy New Userscript
script的名稱。修改之後存檔,你會發現TemperMonkey的「Installed script」的列表裡面的script name會被更改。

// @namespace    http://your.homepage/
會影響「Installed script」的列表裡面的「HomePage」按鈕的超連結目標。跟script關係不大。



// @version      0.1
script的版本。自行定義。



// @description  enter something useful
script的解釋。詳細的描述這個scipt的動作會對之後的管理有幫助。要是這個script要提供給大家使用的話,更要寫清楚,使用者才知道該怎麼用。



// @author       You
script的創作者。寫上你想給其他人知道的名字吧。



// @match        https://www.google.com
// @include      /www.google.com
script該作用在哪些連結的網頁。有兩個條件可用。

  • 「@match」代表該網頁的url必須完全符合。
  • 「@include」會比對網址,只要符合部份的文字就會套用。還可以加上*號來比對中間文字不拘的url。星號在本文裡面用不到所以簡單帶過。不過假如要比對domain name的話,前方要加個「/」才比對得到。不知原因...
@match跟@include可以多行定義。
本文使用google的首頁當範例,所以填上「// @include      /www.google.com」



// @grant        none
這個值用不到所以不動。


// ==/UserScript==
代表script資訊區的結束。為固定文字請勿修改。


以上的資料都設定好之後,準備開始寫script內文。
script的執行順序是一行行的往下跑。也因此,變數宣告要放在程式碼前面,要不然變數會抓不到。(函式的話倒是沒有前後順序問題。javascript在被解讀的時候,系統會把一個個的function給預儲起來,方便其他script有呼叫的時候執行)

在前面寫的url 比對條件符合的時候,網頁下載load完之後,網頁開始正常運作之前就會被執行。接著網頁本身的script開始運作。(只顯示一半的狀態下,不會運作。)


一開始,完全不知道該怎麼寫javascript。雖然語法跟其他的程式語言接近,但是要怎麼得到想要的資料跟結果,還是不清楚。
得先找找有哪些javascript有提供的工具可用。經過漫長的資料蒐集時間(google,前面提到的「深入淺出GreaseMonkey」,stack overflow等等),找到了以下的武器:


  • 在網頁的指定區塊上面按滑鼠右鍵,選擇「Inspect Elements」就可以看到該區塊所描述的html tag,可以快速鎖定要操作的目標。在本文拿來尋找「I'm Feeling Lucky」按鈕。這時跳出來的視窗就是拿來觀察html tag變化的最好的除錯工具。接下來會一直用到script完成。
  • 續前點,上方的tab裡面有一個「Console」,會拿來觀察script執行的狀況。若是不知道script有沒有執行,
    在想要觀察的地方加上「console.log("想要顯示的文字" + 參數1 + ... )」就可以在Console裡面看到「想要顯示的文字」。要觀察參數內容的話就後面一直加下去。
  • Console也會顯示要是script有寫錯的時候,系統提示的錯誤。
    畢竟GreaseMonkey / TamperMonkey這類在網頁上面加上javascript的工具,在語法錯誤的時候所顯示的行數,是整個html文件裡面的行數。看不出來是自己寫的script的那一行有錯誤。
  • document.evaluate(),可以使用xpath表示法,過濾符合條件的html tag。沒有這工具的話要過濾特殊條件的tag會很複雜... 像是「下一層的tag的屬性為xxx的上層tag」
  • window.location.href 參數: 可以取得現在網頁連結的url,作為觀察url變化的工具。
  • setInterval(function(), 時間單位(千分之一秒)); 以一個固定的時間間隔執行指定的函式。
  • setTimeOut(function(), 時間單位(千分之一秒)); 可以在指定的時間後執行指定的函式一次。
  • MutationObserver:可以觀察指定html tag內容,有改變的時候觸發函式。
  • Node.attributes:取得該html tag的attributes,為一個列表,取用的時候需要使用迴圈一個個找。
  • location.reload():重新讀取網頁。更新資料的時候使用。
  • 觸發指定tag的滑鼠左鍵動作的函式。寫在下面的程式碼內。它可以通用在<a href=...><div><input type=submit>等等常用的tag上面。把這段程式碼直接貼在script的註解區的下方。

function anchorclick(node)
{
    var evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent("click", true, true, window, 
                       0, 0, 0, 0, 0, false, false, false, false, 0, null);
    var allowDefault = node.dispatchEvent(evt);
}


首先從最簡單的開始。來寫個固定時間觸發按鈕的動作吧。
第一個問題就是,觸發的按鈕要怎尋找?
把滑鼠游標移動到「I'm Feeling Lucky」按鈕,按滑鼠右鍵,選擇「Inspect Elements」。
會發現圖中那一行被標記起來。所以傳送按鈕動作的目標就是這個<input name="btnI">。

知道了目標之後,接下來要在script內取得這個目標。
在這裡使用document.evaluate()來取得。它可以幫忙尋找指定條件的tag。
因為動作是固定的,一樣做成函式方便之後套用。
把下面程式碼一樣貼在script的註解區的下方。

function xpath(query) {
    return document.evaluate(query, document, null,
                             XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

接著就開始來找吧。其實就只要下面幾行,只是裡面已經包含不少需要具備程式概念才能理解的語法了。

var btnITags =xpath("//input[@name='btnI']");
if ( btnITags.snapshotLength > 0)
{
    var thisDiv =  btnITags.snapshotItem(0);
    setInterval(function(){
            anchorclick(thisDiv);
    }, 5000);
}

第一行:取得所有<input name="btnI">的tags。 xpath是一種描述html/xml tag的搜尋條件的語法。
請參考此文件: http://zvon.org/xxl/XPathTutorial/General/examples.html
在這邊只解釋上面的這一行的意義:
開頭的「//」:尋找所有符合條件的tag。
加上「input」,成為「//input」的解釋:尋找所有的<input>tag。
加上「[@name='btnI']」,成為「//input[@name='btnI']」的解釋:尋找所有的<input name="btnI">tag。
@代表指定的條件為xml tag的屬性(attributes)。中括號是同時指定tag name跟屬性的時候,必須使用的格式。因為一定要先寫tag再寫屬性。

document.evaluate()尋找的回傳結果會是一個陣列。因為依據搜尋條件的不同,可能會有多個tag符合條件。
在此例,這樣的搜尋條件只會找到一個符合的。這當然也是思考如何決定搜尋條件的目標。
只有一個的話就直接使用它,不須再做其他判斷。

第二行是測試回傳的結果是不是至少一個。是的話才執行裡面的動作。
第四行,用一個變數thisDiv取出回傳陣列的第0個資料(陣列從0開始),也就是「I'm Feeling Lucky」按鈕的tag所在。
第五行,setTimeout()的參數是函式。裡面放了第六行「對此tag傳送滑鼠點擊動作」。
第七行的「5000」代表執行的時間點為5秒後(單位為ms)。

存檔,打開google的首頁,看看五秒之後按鈕會不會被觸發吧。會的話,恭喜你成功了。
下面是完整的script。

// ==UserScript==
// @name        test
// @namespace    http://your.homepage/
// @version      0.1
// @description  test.
// @author       You
// @include      /www.google.com*
// @grant        none
// ==/UserScript==



function xpath(query) {
    return document.evaluate(query, document, null,
                             XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
}

function anchorclick(node)
{
    var evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent("click", true, true, window, 
                       0, 0, 0, 0, 0, false, false, false, false, 0, null);
    var allowDefault = node.dispatchEvent(evt);
}

var btnITags =xpath("//input[@name='btnI']");
if ( btnITags.snapshotLength > 0)
{
    var thisDiv =  btnITags.snapshotItem(0);
    setTimeout(function(){
            anchorclick(thisDiv);
    }, 5000);
}

2015年4月11日土曜日

[司馬風]小米手機2 4g系統容量重新分割

小米2一直困擾著我的問題就是只裝了三到五套遊戲,系統就一直提示「系統容量已達95%,無法更新app」。使用google play更新也一直因為容量不足而時常失敗,然後就是無盡的清垃圾,更新...

就在一週前,突然需要更新手機系統版本,開始尋找升級新版的韌體的同時,也想順便解決容量不足的問題,所以順便找找有沒有解決方案。

找了很多資訊都提到小米2的系統資料區只有4g,其他的空間都留給使用者資料了。
其實android的app通常只能裝在系統區裡面,雖然號稱可以搬到sd卡上面,不過常常會有相容性的問題,一般不建議這樣做...
後來的司馬風似乎是沒有做這樣的分割,比較沒有容量的問題。但是會導致系統更新的安裝包的製作比較麻煩,不像小米號稱可以隨便刷(因為系統跟使用者資料分開不同的分割區存放)。個人是比較喜歡分割的做法,不過對於一般使用者來說,這個閒著沒事就塞滿的問題可能就是個大麻煩。

後來有找到可以修改分割表的方法。照著實做並做一些測試之後確認可行,
這一篇文就誕生了。
小米的資訊又多又亂,光是找到適合的訊息就是一個課題。事實上執行刷機的動作花了約8小時,光是找資料確認方法就花了4小時...
在這裡寫下執行重分割的整個流程裡面所遇到的狀況。


名詞定義:
卡刷:在手機正常運作的狀態下使用miui的「系統更新」。
或是在關機的狀態下,按住音量大的按鍵開機,進入recovery模式之後,
操作recovery模式的介面來刷入手機內建flash的根目錄裡面的update.zip的方式都叫做卡刷。

線刷:使用cpu的debug模式,以pc與手機的usb連線,使用miflash軟體執行刷機動作。
miflash會經由usb連線,放入操作手機的內部flash的軟體,然後對手機的內部flash執行byte-to-byte寫入。因此線刷會破壞原有的全部資料(含boot區以外的分割表)。
若是系統資料區的容量有依本文的流程調大,容量也會被回復為出廠設定的4GB。
總之分割調整失敗的話就是再次線刷,不用擔心手機亂玩到得送修。


事前準備:

  • 看完連結裡面的步進教學文章,確定會使用文中裡面提到的軟體。 http://bbs.xiaomi.cn/thread-10596792-1-1.html
  • 因為做系統重分割,會導致手機的資料全部消失不見。
    請使用miui備份你的所有軟體/簡訊/聯絡人/note。備份完之後的資料會放在/MIUI/backup/Allbackup裡面。把整個MIUI目錄跟著DCIM(照片目錄)一起備份到pc裡面。沒提到的app的資料就請自行備份了。/Music跟/Movie資料夾裡面有資料的話也別忘了。總之請確認所有的資料都有備份到。遊戲的引繼碼抄下來並確認有效期限。
  • 本流程會用到儲存碟的分割表操作軟體,擔心會手殘毀了自己硬碟的話,建議使用VM(虛擬機)操作此流程。
  • 下載線刷使用的軟體:Miflash並安裝 (本文所使用的軟體版本日期:2014/11/07)
    http://tw.miui.com/thread-13881-1-1.html
  • MiFlash內建的qualcomm usb cpu driver是給32bit windows用的。
    假如所使用的pc的os是64bit的windows的話,需要找到64bit版的 qhsusb drivers。 請用google尋找 「qhsusb drivers x64」,找個信賴的來源吧。
    使用vista以上的windows的話,因為該驅動程式未經微軟認證,請重新開機按F8,在windows的開機選單裡面選擇「停用數位簽章安裝驅動」。
  • 下載DiskGenius最新版。設定分割區使用。它可以正確辨認小米手機的分割區。
    試過其他的分割軟體,如Minitool partition manager,似乎無法正確辨識小米手機上面的所有分割區。(最後3個partition,分割25/cache/分割26的先後順序會錯誤。)
    另一套EASEUS,完全無法辨認小米的複雜分割區...
  • 下載線刷韌體包最新版。http://www.miui.com/shuaji-305.html,並把壓縮包解開。因為MiFlash只能接受壓縮包解開之後的所在目錄。


開始進行操作:
以下步驟參照此教學進行。
https://flzen.wordpress.com/2014/04/26/set-miui-storage-4gb-size/

另一個版本的教學文:http://www.miui.com/thread-1211984-1-5.html

  1. 關機。
  2. 按住「降音量」鍵之後再按住開機鍵,螢幕上出現小米的logo之後放開。之後會進入fastboot模式(螢幕上面會寫fastboot)。然後手機跟pc使用usb線連接。
  3. 注意:執行此步驟之後就無法回頭了。執行前請確認完成所有必要的資料備份。
    在windows使用命令提示字元(在開始功能表的執行欄裡面輸入「cmd」),進入MiFlash的安裝目錄(通常在c://Program Files (x86)/Xiaomi/MiPhone/Google/Android/),
  4. 輸入「fastboot erase aboot」,大約一兩秒就會執行完畢。
  5. 拔掉usb線,之後再拔掉手機電池,再裝回電池,再插上usb線,放著。此時請勿按開機鍵。
  6. 這時會在windows發現正在自動安裝qualcomm的usb驅動程式。
    x64版的windows的話會發現安裝失敗。
    請拿出之前下載的x64版更新驅動(vista以上的windows可能會需要重開機才能裝x64版qualcomm驅動),然後重複步驟5,等待驅動安裝完成。
  7. 啟動MiFlash,點選「刷新」,就會看到手機被辨認成功(MiFlash會出現裝置)。然後點選MiFlash視窗的上方的橫條,選擇線刷韌體包解開的目錄,點選「刷機」。刷機流程約會進行600秒左右。
  8. MiFlash顯示「操作成功完成」之後代表刷機完成。這時還是不要動手機跟線。
  9. 啟動DiskGenius, 除了pc硬碟的分割區之外,還可以看到手機的磁碟分割區。
    手機的分割區會有26個。(因為分割數跟pc的儲存碟差很多,應該不會操作錯誤。)
    「分割25」代表的是系統資料區的容量,這時候看到的應該會是約4GB。
    「分割26」代表的是使用者資料區(所謂的/sdcard/sdcard0等等稱呼)的容量,這時候看到的大小依手機本身flash總容量而變。
  10. 刪除「分割25」跟「分割26」。(假如先刪除「分割25」的話,在刪除「分割25」之後,會發現「分割26」變成「分割25」。這是因為「分割xx」是代表該分割區沒有被命名,不需在意。)
  11. 在DiskGenius上面的磁碟分割區的顯示條的灰色的部分點擊滑鼠右鍵,選擇「新增分割區」。此時所設定的容量將會是系統資料區的容量。請依需要增加。建議調整為8GB, app裝比較多的話就加到12G...
    點選完成之後,出現提示框「」
  12. 文件系統類型選擇「Linux data Partition」,點選「詳細參數」,把「分區名字」裡面的文字清空(如參考文所寫的填入userdata也可以,基本上無影響),把「隱藏」跟「無盤符」打勾。因為沒打勾的話,儲存分割表的設定之後,DiskGenius會很聰明地幫你掛載成Windows的磁碟,
    被windows操作過的話可能會產生不好的影響。
  13. 重複步驟11/12,剩下的容量全給。
  14. 這時看到分割表裡面,分割26的資料格式可能會不是ext2或是3,而是MS partition,勿驚慌。我覺得是DiskGenius的Bug... 
  15. 點選DiskGenius視窗左上方的「儲存更改」按鈕。出現要求格式化的話,點選「不要」,出現「是否刪除引導記錄」的話,點選「刪除」。
  16. 手機拔線,拔電池,按住音量+鍵開機,進入小米的恢復模式,執行「清除所有資料」。此步驟會幫你執行剛剛沒有在DiskGenius裡面做的格式化的動作,比讓DiskGenius幫你格式化要安全。
  17. 重開機,離開恢復模式。開機鈕開機。所有步驟到此完成。開機後確認儲存容量的狀況吧。



2015年4月10日金曜日

[日本旅遊]2014-12-28 c87 day1/中野/歌舞伎町

早安,ふなっしー。
現在已經沒有那個動力始發上戰場了。一方面是真的想要的東西常常是連始發也買不到啦。
ふなっしー會紅到這種程度真的是始料未及。

JR上野中央口一拍。

一瞬間就移動到戰場了。兵貴神速。

開場後的壓縮隊伍。這距離大概還要30分才能入場吧。

從此刻開始遠離現實,好好的享受戰場吧!

連續兩場都是QP:flapper擔任官方商品的圖。

這幾次參戰,已經會記得先到官方攤來看看了。
不過QP的圖比較沒興趣所以pass... 不過聖水是一定會買的。

意外的在痛酒區看到「電気ブラン」。似乎是話題商品所以買了一瓶。反正不貴...
之後試喝的感想:廉價的RUM... 「電氣」的原因是比較刺鼻的酒精味...
以價格來說算是有所值,濃度夠。


個人的第一攤一定是西館的魔法探偵社。這次花了30分鐘買到,還好。

但是uroboros就花了一小時... 他的購買難度真的是跟題材有很大的關係。
反正沒事就排排吧。曬曬太陽比較暖。


買完之後又得繞一大圈上4F。

圖上的柵欄內是各個企業超大手的待機位置。shaft/Aniplex/角川/TM/兔子/電擊這幾家。
等到隊伍消化得差不多之後,圈內就會改為cosply space。

拍這張照片的時間點是12:30。東映已經停止排隊了... 天啊...



期待かんなぎれい的新作。蠻喜歡他的圖。




Griffon這次也有擺PVC展示所以來拍拍。





100份的限量品已經賣得差不多了...反正沒社入買不到

AB之後就...的VA。

搔不到癢處的哈密瓜


聽說12點半就被掃光的葉子...




等身大滑鼠墊。揉起來果然很有迫力。








 双葉杏的面具www

嗯。有委託戰士買這東東的人真的是該好好感謝人家。快要跟戰書一樣重了...


意外的第一天下午都還買得到。

路過的時候看到結城友奈set還沒賣光想買,排進去之後到一半完售... Orz


京阿尼也很意外的到下午都還有貨。

眼鏡的彼方。 GARO? 那是啥可以吃嗎?


逛完了,戰場離脫。補一下早上沒時間拍的bigsight賣店商品。


本來想搭百合海鷗回去,突然想起來得去臨海線的lawson看看有什麼東西。
差點忘記...

路旁的攤販。有點想試看看雞皮燒,不過看了一下別人買的,份量似乎是有點少。放棄...

一顆500隻羊的肉包果然很大。

...好像都沒興趣。

這次捐血送的海報。沒待滿三週的觀光客不能捐...



學姊看起來一副怨念很深的樣子www

一罐咖啡+兩張杯墊就要賣1500!?我有沒有看錯...


poi. 動畫早點播的話應該會被掃光。

poi.


聽說lawson店員確保了999隻QB肉包,來試看看。¥165而已就當捏他吧。
味道有點微妙... 說是麻婆味但是放了酸菜!?

我也知道睡眠很重要啊...



目前的所在地就是戰場!

城收集... 最近好像停機加強內容去了...

兵貴神速。瞬移到中野。因為今天只買了幾本書就離開了,不需回旅館整理戰利品...

先到B1的超市買飲料。沒喝過這個版本的,試喝的感想是香味比較清爽。一般版的蘋果香像是比較熟的蘋果。


有在喝咖啡之後才注意到一樓的這家咖啡廳有冰滴的器具...




指南針中野店自辦的鋼普拉製作比賽。

(抖)



原來有這本書... 列入考慮。

沒有掃古本的需要了,中野也不需要花超過3小時。接著到新宿逛逛,順便吃新宿食肉center 23:00過後的¥1000燒肉吃到飽。

快成為歌舞伎町的地標了。

看到這門框才想起來這裡是人中之龍的聖地。順便巡禮一下,也剛好是第一次踏入歌舞伎町。

之前成為話題的機器人酒吧。可以坐上去拍照。不過沒帶腳架也沒那個恥力XD

公園改裝中。 感覺跟遊戲裡面的比例不太一樣。現實中的公園小了一號?

這時距離放題開始時間的23:00還有約2小時,想說來去玩玩三國志大戰。
沒想到アドアーズミラノ剛好結束營業...  Orz
看來只剩下三國志大戰神的駐紮店還有機會玩了。


站在神的後面...能夠在遊戲結束營運(2015/01/16)之前一睹神的風采也夠了。
因為只剩這邊有機台,而且正好是快要結束營運的時期,12台全部被霸台...
只好在後面看別人玩一小時半。


時間快到了,往新宿食肉center前進。
原來這附近也有二郎,備份一下...

I LOVE 歌舞伎町的招牌是可變亮度的...

人中之龍遊戲裡面唯一的地上停車場。還真的是...


結果新宿食肉center在年末年始期間不供應放題... Orz
只好來吃二郎。ショウブタヤサイニンニク!