タグ:Opera ( 34 ) タグの人気記事

TabJugglerでスクロールできない問題を解決した。

 TabJugglerというタブ管理用のChrome拡張があって、すべての互換ブラウザに入れてるくらい便利なのだが、操作できなくなる問題があるので対処した。

 そもTabJugglerは、すべてのタブを対象とした「ひとつのウィンドウにまとめる」「ウィンドウを分離する」「タブの配置をソートする」という機能と、検索でリストアップした、あるいはしなかったタブを対象とした「閉じる」「分離する」という機能がある。この後者の検索で大量のタブをリストアップすると、操作ボタンが押し出されて操作不能になってしまう。大量のタブがあるからこそ使いたいのに!
 で、調べてみたら操作不能の原因はスクロールを禁じたスタイルにあったので、CSSをたった1行いじるだけで解決したという……。

 問題のCSSはExtensions\jgiplclhploodgnkcljjgddajfbmafmp\バージョン番号\assets\styles\popup.css。ExtensionsフォルダはOperaならProfile、ChromeとVivaldiならUser Data以下にあるが、識別子jgiplc(以下略)を検索した方が手っ取り早い。
 そのpopup.cssの11行目にあるoverflow: hidden;を、hiddenからscrollにすれば完了。


[PR]
by LordNoesis | 2016-02-11 20:00 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Opera12の起動を便利にしてみた。 ver.2.3.1

 セッション変換に失敗することがあったので1行だけ修正。今更使う人もいないと思うが。

; --------- --------- --------- --------- ---------
; RunOpera.ahk ver.2.3.1
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "R:\Opera"  ; Opera.exeの存在するパス。末尾"\"は不可。
  
  if %0%  ; 引数があった場合、Operaのパスと見なす
    OperaPath = %1%
  
  SessionsPath := OperaPath "\profile\sessions"  ; セッションフォルダのフルパスを指定。末尾"\"は不可。
  BookmarksPath := OperaPath "\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  
  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。
  
  AutoConvSW := 1  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。
  
  StackSW := 1  ; スタックの設定。 0:無視する。 1:スタックごとにフォルダを分ける。
  
  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  His0PrefixSW := 0  ; タブ履歴がなかった場合のプレフィックスの設定。 0:なし。 1:0を明示する。
  
  WriteTrgSW := 1  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。
  
; --------- --------- --------- --------- ---------
  
  IfNotExist, %SessionsPath%\
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    ExitApp
  }
  If WriteTrgSW {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      ExitApp
    }
  }
  
  IfNotExist, %SessionsPath%\autosave.win
  {
    IfExist, %SessionsPath%\autosave.win.bak
      FileMove, %SessionsPath%\autosave.win.bak, %SessionsPath%\autosave.win
  }
  IfExist, %SessionsPath%\autosave.win
  {
    FileCopy, %SessionsPath%\autosave_RunOpBak.win, %SessionsPath%\autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
    FileCopy, %SessionsPath%\autosave.win, %SessionsPath%\autosave_RunOpBak.win, 1
    GoSub, SessionAnalyze
  }
  
  FileCopy, %OperaPath%\ui\fastforward_backup.ini, %OperaPath%\ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。
  
  Run, %OperaPath%\opera.exe, , , OpPid
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }
  
  WinWait, マスターパスワードを入力してください ahk_pid %OpPid%, , 5
  If ErrorLevel
    return
  WinSet, Topmost, ON
  WinActivate
  Sleep, 300
  
ExitApp

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%\autosave.win
  If ErrorLevel {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%\autosave.win
    return
  }
  
  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\][\s\S]+?count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles .= " " HisTitle "`n"
  }
  If !WinTitles
    return
    
  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%\autosave.win, %SessionsPath%\%BackupName%
      If !ErrorLevel  ; 最終セッションのリネームに成功なら
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    FileDelete, %SessionsPath%\autosave.win.bak
    If AutoConvSW
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    ExitApp
return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If WriteTrgSW
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%  ; bookmarks.adrのバックアップは無制限なので注意
  
  CmdLine := SessionsPath "\" BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result
  
  Idx := 0
  BefGroupNum := 0
  His0Prefix :=
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)\][^\[]+group=(\d+)[^\[]+\[\1history url\][^\[]+count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    GroupNum := $2
    HisNum := $3 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
    
    if StackSW
      if (BefGroupNum != GroupNum) {
        if BefGroupNum
          Result .= "-`n`n"
        if GroupNum
          Result .= "#FOLDER`n  NAME=[Stack] " GroupNum "`n`n"
        BefGroupNum := GroupNum
      }
    
    If !HisReadSW {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    
    StringLen, HisNumLen, HisNum
    
    If !HisNum {
      if His0PrefixSW
        His0Prefix := "[" ZeroSupply(HisNum, HisNumLen) "] "
      Result .= "#URL`n  NAME=" HisPrefix HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    
    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }
  
  If (ResultBuf == Result)
    return
  Result .= "-`n`n"
  
  If WriteTrgSW {
    FileRead, BMBuf, *t *P65001 %BookmarksPath%
    StringGetPos, Idx, BMBuf, #DELETED
    if !Idx {
      StringMid, BMBufP, BMBuf, 1, Idx
      StringMid, BMBufS, BMBuf, Idx + 1
      Result := BMBufP Result BMBufS
      FileDelete, %BookmarksPath%
    }
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }
  
  If ACMoveSW {
    IfNotExist, %SessionsPath%\AutoConv\
      FileCreateDir, %SessionsPath%\AutoConv\
    FileMove, %CmdLine%, %SessionsPath%\AutoConv\%BackupName%
    If ErrorLevel
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%\AutoConv\
  }
return

; --------- --------- --------- --------- ---------

GetHisTitle(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

GetHisUrl(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

ZeroSupply(Num, NumDigit){
  StringLen, NumLen, Num
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    Num := 0 Num
  return, Num
}


[PR]
by LordNoesis | 2016-02-05 18:50 | テクノロジ | Trackback | Comments(0)

OperaNext15を試して、Chrome拡張入れてみた。

 Opera15(以下OPR)のOperaNextが出たので色々いじってみた。なおOperaNextというのは、Operaの次期バージョンのプレビュー版であり、αとかβとかウィークリービルドのたぐいであって、間違っても正式版ではないので注意。

 OPRでは、エンジンがWebKit(Blink)へと変更になるが、スタッフが「Operaらしさはそのまま」といってたもんだから、ワシは「Opera in Webkit」的なものが出てくると思っていた。だがそこに「Chromium Opera Edition」としかいいようがないものが出てきたせいで、ワシのみならず、Operaクラスタは阿鼻叫喚と化したのだった。そのあとでスタッフが「不安定な機能はまだ実装してないだけ」「高速リリース採用するので、いずれOperaらしくなるよ!」などと弁明したため、現状は様子見である。
 などといきなりdisり気味だが、現時点でもChromeの代替としては十分であり、ワシはサブとして使っていたChromeを捨てた! OPRが真にOperaの代替となるまでは、メインはOpera12が続投すればいいじゃない!

 で。OPRでは拡張機能もWebKitの物を使うことになる。Operaの拡張ストアにOPRでアクセスするとOPR対応版だけが表示されるが、その数はまだ多くはない。そこで、OPR拡張がないならChrome拡張を使えばいいじゃない!というのが本題である(前置き長ぇ。

 Download Chrome Extensionを導入することで、普通にChromeストアから拡張をインストールできる。

 普通にChromeのストアに行っても、OPRでは「Chromeに追加」が表示されないので、手動でインストールせねばならない。
 まず、crxファイルをDLする。crxはhttp://clients2.google.com/service/update2/crx?response=redirect&x=id%3D%26uc%26lang%3Den-US&prod=chromeで、IDをはさんだURLで入手できる。IDは拡張の個別ページのURLに含まれている、32文字くらいのアスキー文字列。例えばLastPassのhttps://chrome.google.com/webstore/detail/lastpass/hdokiejnpimakedhajhdlcegeplioahdならhdokiejnpimakedhajhdlcegeplioahdがそうなので、crxのURLはhttp://clients2.google.com/service/update2/crx?response=redirect&x=id%3Dhdokiejnpimakedhajhdlcegeplioahd%26uc%26lang%3Den-US&prod=chromeとなる。OPRで入力しても「Operaのストアじゃないからダメ」といわれるだけなので、IEなどで適当なフォルダに保存する。
 あとは野良拡張と同じ。OPRの拡張管理画面にドロップすると一覧に追加され確認が出るので、吹き出しの「インストール」を押せばおk。

 Opera Next 16では、opera://flags内のDynamic extension toolbar scalingを有効にすることで、アイコンの表示数を増やすことができるが、ウィンドウ幅依存なので表示しきれない可能性がある。

 ただし注意点がいくつかある。OPRの拡張バーは現状、最初の6個までしかアイコンを表示できない。非表示でも拡張自体は有効だが、アクセス手段がアイコンしかない場合は実質、利用不可能となる。アイコンの並び順=インストール順なので、アイコン必須の拡張からインストールし、一時的にアイコンが必要になった場合に上位の拡張を無効化するなどの工夫が必要となる。

 以下、試してみたよさげな拡張。

OPRストア


LastPass -- バージョン情報に「Chrome版」とある。
AdBlock

Chromeストア


はてなブックマーク GoogleChrome 拡張
Tab Manager -- タブ一覧。ファビコンのみ、あるいはファビコンとタイトル。
Tabs Outliner -- タブ一覧。ファビコンとタイトル。ポップアップでなく別ウィンドウ。OPRに未実装の「ウィンドウ間でのタブ移動」が可能。
Tab Expose -- タブ一覧。サムネイル。
theTabs -- タブ一覧。サムネイル。ポップアップでなく独立タブ。ひとつめのウィンドウのみ。
Zoom Text Only -- テキストのみ拡縮。ショートカットキーによる動作だが、設定はアイコンからしかできない。
PageRank -- Googleウェブ履歴にちゃんとタイトルが残る物の中で、シンプルなやつ。
AutoPatchWork
ToggleLink: Select Text From Link -- リンク上でshiftを叩くとただの文字列になる。5秒で元に戻る。


[PR]
by lordnoesis | 2013-06-01 13:30 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaの起動を便利にしてみた。 ver.2.3.0

 AutoHotKey_Lで、Operaの起動を便利にしてみた。をちょっと強化。AutoSave.winをブックマークに変換する際に、スタックごとにフォルダで分ける機能の追加。あと小規模改善。

; --------- --------- --------- --------- ---------
; RunOpera.ahk ver.2.3.0
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "R:\Opera"  ; Opera.exeの存在するパス。末尾"\"は不可。
  
  if %0%  ; 引数があった場合、Operaのパスと見なす
    OperaPath = %1%
  
  SessionsPath := OperaPath "\profile\sessions"  ; セッションフォルダのフルパスを指定。末尾"\"は不可。
  BookmarksPath := OperaPath "\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。
  
  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。
  
  AutoConvSW := 1  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。
  
  StackSW := 1  ; スタックの設定。 0:無視する。 1:スタックごとにフォルダを分ける。
  
  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  His0PrefixSW := 0  ; タブ履歴がなかった場合のプレフィックスの設定。 0:なし。 1:0を明示する。
  
  WriteTrgSW := 1  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。
  
; --------- --------- --------- --------- ---------
  
  IfNotExist, %SessionsPath%\
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    ExitApp
  }
  If WriteTrgSW {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      ExitApp
    }
  }
  
  IfNotExist, %SessionsPath%\autosave.win
  {
    IfExist, %SessionsPath%\autosave.win.bak
      FileMove, %SessionsPath%\autosave.win.bak, %SessionsPath%\autosave.win
  }
  IfExist, %SessionsPath%\autosave.win
  {
    FileCopy, %SessionsPath%\autosave_RunOpBak.win, %SessionsPath%\autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
    FileCopy, %SessionsPath%\autosave.win, %SessionsPath%\autosave_RunOpBak.win, 1
    GoSub, SessionAnalyze
  }
  
  FileCopy, %OperaPath%\ui\fastforward_backup.ini, %OperaPath%\ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。
  
  Run, %OperaPath%\opera.exe, , , OpPid
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }
  
  WinWait, マスターパスワードを入力してください ahk_pid %OpPid%, , 5
  If ErrorLevel
    return
  WinSet, Topmost, ON
  WinActivate
  Sleep, 300
  
ExitApp

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%\autosave.win
  If ErrorLevel {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%\autosave.win
    return
  }
  
  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\][\s\S]+?count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles .= " " HisTitle "`n"
  }
  If !WinTitles
    return
    
  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%\autosave.win, %SessionsPath%\%BackupName%
      If !ErrorLevel  ; 最終セッションのリネームに成功なら
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    FileDelete, %SessionsPath%\autosave.win.bak
    If AutoConvSW
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    ExitApp
return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If WriteTrgSW
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%  ; bookmarks.adrのバックアップは無制限なので注意
  
  CmdLine := SessionsPath "\" BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result
  
  Idx := 0
  BefGroupNum := 0
  His0Prefix :=
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)\][\s\S]+?group=(\d+)[\s\S]+?\[\1history url\][\s\S]+?count=(\d+)", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    GroupNum := $2
    HisNum := $3 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
    
    if StackSW
      if (BefGroupNum != GroupNum) {
        if BefGroupNum
          Result .= "-`n`n"
        if GroupNum
          Result .= "#FOLDER`n  NAME=[Stack] " GroupNum "`n`n"
        BefGroupNum := GroupNum
      }
    
    If !HisReadSW {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    
    StringLen, HisNumLen, HisNum
    
    If !HisNum {
      if His0PrefixSW
        His0Prefix := "[" ZeroSupply(HisNum, HisNumLen) "] "
      Result .= "#URL`n  NAME=" HisPrefix HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    
    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }
  
  If (ResultBuf == Result)
    return
  Result .= "-`n`n"
  
  If WriteTrgSW {
    FileRead, BMBuf, *t *P65001 %BookmarksPath%
    StringGetPos, Idx, BMBuf, #DELETED
    if !Idx {
      StringMid, BMBufP, BMBuf, 1, Idx
      StringMid, BMBufS, BMBuf, Idx + 1
      Result := BMBufP Result BMBufS
      FileDelete, %BookmarksPath%
    }
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }
  
  If ACMoveSW {
    IfNotExist, %SessionsPath%\AutoConv\
      FileCreateDir, %SessionsPath%\AutoConv\
    FileMove, %CmdLine%, %SessionsPath%\AutoConv\%BackupName%
    If ErrorLevel
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%\AutoConv\
  }
return

; --------- --------- --------- --------- ---------

GetHisTitle(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

GetHisUrl(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\][\s\S]+?" HisNum "=(.*?)\r?\n", $)
  return $1
}

ZeroSupply(Num, NumDigit){
  StringLen, NumLen, Num
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    Num := 0 Num
  return, Num
}

セッション確認ダイアログ

c0031643_22274759.png

ブックマーク変換例。

c0031643_12534236.jpg


[PR]
by lordnoesis | 2013-05-12 12:55 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、Operaの起動を便利にしてみた。 ver.2.2.0

 AutoHotkey_Lで、Opera12の起動を便利にしてみた。をちょっと改善。状況によってセッション退避やブックマーク変換が機能しない問題とか直ったはず(ちょっとしたってレベルじゃねーぞ。

 作者にもわからんくなってきたので、機能をまとめてみる。

  • Operaの起動前に、前回終了時のセッション(AutoSave.win)の内容を確認できる。
  • AutoSave.winを復元せずに、空のOperaを起動することができる。
  • 復元しない場合、AutoSave.winをブックマークに変換できる。
  • AutoSave.winの2世代バックアップ。
  • FastForward_backup.iniでFastForward.iniを上書きする(アップデート対策)。
  • 起動直後に出現するマスターパスワード入力ダイアログを最前面固定かつアクティブにする。
 ――うん、地味!

; --------- --------- --------- --------- ---------
; RunOpera.ahk ver.2.2.0
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "R:\Opera"  ; Opera.exeの存在するパス。末尾"\"は不可。

  if %0%  ; 引数があった場合、Operaのパスと見なす
    OperaPath = %1%

  SessionsPath := OperaPath "\profile\sessions\"  ; セッションフォルダのフルパスを指定。末尾"\"は不可。
  BookmarksPath := OperaPath "\profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。

  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。

  AutoConvSW := 1  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。

  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  WriteTrgSW := 1  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。

; --------- --------- --------- --------- ---------

  IfNotExist, %SessionsPath%\
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    ExitApp
  }
  If WriteTrgSW {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      ExitApp
    }
  }

  IfNotExist, %SessionsPath%\autosave.win
  {
    IfExist, %SessionsPath%\autosave.win.bak
      FileMove, %SessionsPath%\autosave.win.bak, %SessionsPath%\autosave.win
  }
  IfExist, %SessionsPath%\autosave.win
  {
    FileCopy, %SessionsPath%\autosave_RunOpBak.win, %SessionsPath%\autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
    FileCopy, %SessionsPath%\autosave.win, %SessionsPath%\autosave_RunOpBak.win, 1
    GoSub, SessionAnalyze
  }

  FileCopy, %OperaPath%\ui\fastforward_backup.ini, %OperaPath%\ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。

  Run, %OperaPath%\opera.exe, , , OpPid
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }

  WinWait, マスターパスワードを入力してください ahk_pid %OpPid%, , 5
  If ErrorLevel
    return
  WinSet, Topmost, ON
  WinActivate

ExitApp

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%\autosave.win
  If ErrorLevel {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%\autosave.win
    return
  }

  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles .= " " HisTitle "`n"
  }
  If !WinTitles
    return


  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%\autosave.win, %SessionsPath%\%BackupName%
      If !ErrorLevel  ; 最終セッションのリネームに成功なら
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    FileDelete, %SessionsPath%\autosave.win.bak
    If AutoConvSW
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    ExitApp
return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If WriteTrgSW
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%  ; bookmarks.adrのバックアップは無制限なので注意

  CmdLine := SessionsPath "\" BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result

  Idx := 0
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If !Idx
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)

    If !HisReadSW {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }

    StringLen, HisNumLen, HisNum

    If !HisNum {
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }

  If (ResultBuf == Result)
    return
  Result .= "-`n`n"

  If WriteTrgSW {
    FileRead, BMBuf, *t *P65001 %BookmarksPath%
    StringGetPos, Idx, BMBuf, #DELETED
    if !Idx {
      StringMid, BMBufP, BMBuf, 1, Idx
      StringMid, BMBufS, BMBuf, Idx + 1
      Result := BMBufP Result BMBufS
      FileDelete, %BookmarksPath%
    }
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }

  If ACMoveSW {
    IfNotExist, %SessionsPath%\AutoConv\
      FileCreateDir, %SessionsPath%\AutoConv\
    FileMove, %CmdLine%, %SessionsPath%\AutoConv\%BackupName%
    If ErrorLevel
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%\AutoConv\
  }
return

; --------- --------- --------- --------- ---------

GetHisTitle(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
  return $1
}

GetHisUrl(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
  return $1
}

ZeroSupply(Num, NumDigit){
  StringLen, NumLen, Num
  LoopNum := NumDigit - NumLen
  Loop, %LoopNum%
    Num := 0 Num
  return, Num
}

 これまでとは逆に、OperaPath等は末尾\不可になったので注意。

セッション確認ダイアログ

c0031643_22274759.png

ブックマーク変換例(下側はHisReadSW := 1)。

c0031643_22281581.jpg


[PR]
by lordnoesis | 2013-01-23 22:32 | テクノロジ | Trackback(1) | Comments(0)

AutoHotKeyで、Operaの拡張管理を開いてもKbMedia Playerが停止しないようにしてみた。

 KbMedia Playerでホットキーを有効にしてるとそちらが優先されて、Operaで拡張管理を開くショートカットが効かなくなるので、AHKで対策。
 打鍵で拡張管理を開き、長押しでKb停止。

#IfWinActive ahk_class OperaWindowClass
$^+E::
  KeyWait, E, T0.8
  if ErrorLevel
    Send, ^+E
  else
    SendPlay, ^+E
  KeyWait, E
return

 SendとSendPlayを逆にした方が(長押しで拡張管理にした方が)使いやすいかも。Kbはグローバルホットキーだし。


[PR]
by lordnoesis | 2012-09-13 20:42 | テクノロジ | Trackback | Comments(0)

AutoHotkey_Lで、Opera12の起動を便利にしてみた。

 前ver.のOpera12対応版。前ver.からフォークしたRamDisk運用補助の小規模改善も反映済み。

 Opera12対応は「マスターパスワードダイアログのタイトル変更に追従」「マスターパスワードダイアログを最前面表示するように」。Operaのver.によって最前面でなくなるのはなんなの、うっかりなの?

 ちなみに小規模改善の内容は「FastForward.ini初期化の対策」「autosave.winの2世代バックアップ」「セッション退避ダイアログのカウントダウン」。
 FastForward.ini初期化対策は、同じ場所にFastForward_backup.iniがあれば上書きするよってだけの機能。

; --------- --------- --------- --------- ---------
; RunOpera.ahk ver.2.1.0
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := ""  ; Opera.exeのフルパス。末尾は"\"。

  SessionsPath := OperaPath "profile\sessions\"  ; セッションフォルダのフルパスを指定。末尾は"\"。
  BookmarksPath := OperaPath "profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。

  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。

  AutoConvSW := 1  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。

  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  WriteTrgSW := 1  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。

; --------- --------- --------- --------- ---------

  IfNotExist, %SessionsPath%
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    
    Exit
  }
  If (1 == WriteTrgSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      Exit
    }
  }

  IfExist, %SessionsPath%autosave.win
    GoSub, SessionAnalyze

  FileCopy, %OperaPath%ui\fastforward_backup.ini, %OperaPath%ui\fastforward.ini, 1  ; FastForward.ini初期化の対策。

  FileCopy, %SessionsPath%autosave_RunOpBak.win, %SessionsPath%autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
  FileCopy, %SessionsPath%autosave.win, %SessionsPath%autosave_RunOpBak.win, 1

    Run, %OperaPath%opera.exe, , , OpPid
    WinWait, ahk_pid %OpPid%, , 60
    if !ErrorLevel {
      ifWinExist, Opera へようこそ ahk_pid %OpPid%
      {
        WinActivate
        WinWaitClose
      }
    } else {
      return
    }


    WinWait, マスターパスワードを入力してください ahk_pid %OpPid%, , 5
    If ErrorLevel
      return

    WinSet, Topmost, ON
    WinActivate
    Sleep, 300

ExitApp

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%autosave.win
  If (0 != ErrorLevel) {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%autosave.win
    return
  }

  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles := WinTitles " " HisTitle "`n"
  }
  If("" == WinTitles)
    return

  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%BackupName%
      If(0 == ErrorLevel)
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    If (1 == AutoConvSW)
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    Exit

return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If (1 == WriteTrgSW)
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%

  CmdLine := SessionsPath BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result

  Idx := 0
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1

    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)

    If (0 == HisReadSW) {  ; タブ履歴を無視する場合
      Result .= "#URL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }

    StringLen, HisNumLen, HisNum

    If (0 == HisNum) {
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "#URL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }

  If (ResultBuf == Result)
    return
  Result .= "-`n`n"

  If (1 == WriteTrgSW) {
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }

  If (1 == ACMoveSW) {
    IfNotExist, %SessionsPath%AutoConv\
      FileCreateDir, %SessionsPath%AutoConv\
    FileMove, %CmdLine%, %SessionsPath%AutoConv\%BackupName%
    If (0 != ErrorLevel)
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%AutoConv\
  }
return

; --------- --------- --------- --------- ---------

GetHisTitle(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
  return $1
}

GetHisUrl(OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
  return $1
}

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  return, Num
}

 Opera12、タブ大量でも起動が軽くなったのがいいね。でもUJS Managerが使えなくなったのが痛い。というか標準で実装しろと。エクステンション作れ/使えってか。ごもっとも。


[PR]
by lordnoesis | 2012-06-24 10:43 | テクノロジ | Trackback(1) | Comments(2)

AutoHotKeyでOperaの「新規ウィンドウ」をちょっと便利に+α

 せっかくマルチモニタ環境なのに、「新しいウィンドウ」が同じモニタに出現するのはもったいないので、「最大化時にCtrl+Nしたら、出現する新しいウィンドウを別のモニタに移動する」AHKスクリプト書いた。

#IfWinActive ahk_class OperaWindowClass

^n::
  WinGet, AWinMax, MinMax, A
  if (1 != AWinMax) {
    Send, ^n
    return
  }

  WinGet, AWinID, ID, A
  WinGetPos, AWinX, AWinY, AWinW, AWinH, A
  AWinX := AWinW // 2 + AWinX
  AWinY := AWinH // 2 + AWinY

  Loop, 2
    SysGet, Mnt%A_Index%, MonitorWorkArea, %A_Index% - 1

  if ((Mnt1Top < AWinY) && (AWinY < Mnt1Bottom) && (Mnt1Left < AWinX) && (AWinX < Mnt1Right))
    SendX := Mnt2Left, SendY := Mnt2Top
  else
    SendX := Mnt1Left, SendY := Mnt1Top

  Send, ^n
  WinWait, ahk_class OperaWindowClass, , 0, ahk_id %AWinID%
  WinRestore
  WinMove, , , %SendX%, %SendY%
return

 以下オマケ。

#IfWinActive ahk_class OperaWindowClass

F1::^w  ; タブ閉じ。
F2::^+Tab  ; 左のタブ。
F3::^Tab  ; 右のタブ。
F5::^r  ; F5禁止対策。

^Numpad0::^t

 Ctrl+1~9がスピードダイアルなら、Ctrl+0はズームリセットでなく新規タブだろJK。

 というか、新規タブからのアドレスバー検索が便利なことに今更気づいたので。検索バーのが便利だと思ってたのだけど(最大の理由は「タブの再利用」が嫌いだから)、アドレスバーは新規タブ開くだけでフォーカス当たるし、ブックマークや履歴も検索できる。新規タブだから、「タブの再利用」も問題ない。
 それに、エクステンション入れるとアドレスバーを圧迫するから、検索バー消したいし。メイン以外の検索エンジンはウェブ検索パネル使えばいいよね。

 Googleの検索結果にGoogleブックマークが表示されなくなった改悪も、これで解決ですね。


[PR]
by lordnoesis | 2012-06-20 17:40 | テクノロジ | Trackback | Comments(0)

AutoHotKey_Lで、OperaのRamDisk運用を便利にしたかった……。

 前回の更新直後に「コピーのタイミングってWindowsの起動/終了時でいいんじゃ……」と遅まきながら気づいてしまい、レストア/バックアップ機能だけ取り出し強化したのだが、結局、「バッチでXCOPY使えばいい」の域を出られなかった残念なAHKスクリプト。

 一応、起動時にOperaをRamDiskにコピーし、Opera終了時/Windows終了時には自動でバックアップしてくれる。――のだが、バックアップ対象を絞らないと30秒ほどかかるので、レジストリで「応答のないアプリケーションを自動で終了する」をONにしてると間に合わない。

 グループポリシーが使える環境の人は、シャットダウンスクリプトでXCOPY使うのが正解。でなければ、RamDiskを自動バックアップ対応のものに変えれ。

; --------- --------- --------- --------- ---------
;
; CopyOpera.ahk
;
; ・起動時にOperaをRamDiskにコピー(レストア)する。
; ・常駐中はOperaを監視し、隙あらばHDDにコピー(バックアップ)する。
;  ・Operaが終了した時や、Windowsが終了する時など。
; ・指定フォルダの除外コピーが可能(cacheフォルダやmailフォルダなど)
;
; --------- --------- --------- --------- ---------

#Persistent

  OperaPath := "C:\Program Files\Opera\Opera"  ; Opera.exeの存在するフルパスを指定。
  RamPath := "R:\Opera"  ; Operaのコピー先となるフルパスを指定。

  NGPathR := "profile\cache | profile\icons | profile\mail | profile\opcache | profile\temporary_downloads"  ; レストアしないディレクトリをOperaPathからの相対パスで指定
  NGPathB := NGPathR  ; バックアップしないディレクトリを、RamPathからの相対パスで指定

; --------- --------- --------- --------- ---------

  OperaPath := CutLastDelimiter(OperaPath), RamPath := CutLastDelimiter(RamPath)
  NGPathR := ConvList(NGPathR), NGPathB := ConvList(NGPathB)

  OpBackupSW := 0

  gosub, OpRestore

  SplashView("OperaReady!")

  OnExit, ExitOp
  SetTimer, CheckOp, 5000
return

; --------- --------- --------- --------- ---------

ExitOp:
  if OpBackupSW {
    Process, WaitClose, opera.exe
    gosub, OpBackup
    SplashView("OperaBackup!")
    Sleep, 3000
  }
ExitApp

; --------- --------- --------- --------- ---------

CheckOp:
  Cnt++
  if (30 < Cnt) {
    Cnt := 0
    FileCopy, %RamPath%\profile\sessions\autosave.win, %OperaPath%\profile\sessions\autosave.win, 1
  }

  Process, WaitClose, opera.exe, 1
  if (0 == ErrorLevel) { ; Operaが動いていなければ
    if OpBackupSW {  ; まだバックアップされていなければ
      gosub, OpBackup
      SplashView("OperaBackup!")
      OpBackupSW := 0
    }
  } else{  ; Operaが動いていれば
    OpBackupSW := 1
  }
return

OpRestore:
  DirList := DigDirList(OperaPath, OperaPath, NGPathR)
  DirSet(RamPath, DirList)
  DirListCopy(DirList, OperaPath, RamPath)
return

OpBackup:
  DirList := DigDirList(RamPath, RamPath, NGPathB)
  DirSet(OperaPath, DirList)
  DirListCopy(DirList, RamPath, OperaPath)
return

; --------- --------- --------- --------- ---------

ConvList(FileList) {
  Res := ""
  Loop, Parse, FileList, |, %A_Space% \
  {
    if ("" == A_LoopField)
      continue
    FieldBuf := CutLastDelimiter(A_LoopField)
    result := result FieldBuf "`n"
  }
  return, CutLastNL(result)
}

GetDirList(TrgDir, RootPath , NGList) {
  if ("" == TrgDir)
    return
  result := ""
  LoopPattern := RootPath "\" CutRootPath(TrgDir, RootPath) "\*"
  Loop, %LoopPattern%, 2, 0
  {
    GetDir := CutRootPath(A_LoopFileLongPath, RootPath)
    if !NGCheck(GetDir, NGList) 
      result := result GetDir "`n"
  }
  return, CutLastNL(result)
}

DigDirList(TrgPath, RootPath, NGList) {
  DirList := "`n"
  TrgDirList := GetDirList(TrgPath, RootPath, NGList) "`n"
  ResDirList := ""
  Loop {
    Loop, Parse, TrgDirList, `n
    {
      ResDir := GetDirList(A_LoopField, RootPath, NGList)
      if ("" != ResDir)
        ResDirList := ResDirlist ResDir "`n"
    }
    DirList := DirList TrgDirList
    TrgDirList := ResDirList
    ResDirList := ""
    if ("" == TrgDirList)
      break
  }
  return, CutLastNL(DirList)
}

DirSet(TrgPath, DirList) {
  Loop, Parse, DirList, `n
    FileCreateDir, %TrgPath%\%A_LoopField%
  return
}

DirListCopy(DirList, RootPath, SendPath) {
  Loop, Parse, DirList, `n
    FileCopy, %RootPath%\%A_LoopField%\*, %SendPath%\%A_LoopField%, 1
  return
}

NGCheck(Keyword, NGList) {
  Loop, Parse, NGList, `n
  {
    if (1 == RegExMatch(Keyword, "s)^" EscRegEx(A_LoopField)))
      return, 1
  }
  return, "0"
}

CutLastDelimiter(TrgPath) {
  StringRight, CharBuf, TrgPath, 1
  if ("\" == CharBuf)
    StringTrimRight, TrgPath, TrgPath, 1
  return, TrgPath
}

CutLastNL(TrgPath) {
  result := RegExReplace(TrgPath, "s)[\r\n]+\z", "", $, 1)
  return, Result
}

CutRootPath(TrgPath, RootPath) {
  return, RegExReplace(TrgPath, "s)^" EscRegEx(RootPath) "(\\)?", "", $, 1)
}

EscRegEx(trg) {
  EscList := "\`n.`n*`n?`n+`n[`n]`n{`n}`n|`n(`n)`n^`n$"
  Loop, Parse, EscList, `n
    StringReplace, trg, trg, %A_LoopField%, \%A_LoopField%, 1
  return, trg
}

; --------- --------- --------- --------- ---------

SplashView(TextBuf, Timer = 3000) {
  Progress, B1 ZH0 W800, %TextBuf%
  SetTimer, SplashClose, %Timer%
}

SplashClose:
  SetTimer, SplashClose, Off
  Progress, Off
return

 下位フォルダをいじるスクリプトに流用できるから、無駄死にではないぞ。ま、負け惜しみじゃないんだからっ。

 PCの突然死対策に、2分半に一度、autosave.winだけバックアップするようにしてみた。というか使うだけならバックアップするのこれだけでよさげ。


[PR]
by lordnoesis | 2012-04-16 22:39 | テクノロジ | Trackback | Comments(0)

AutoHotkey_Lで、Operaの起動と終了を便利にしてみた。

 RamDiskを少しでも活用しようとOperaのキャッシュフォルダを配置して(速度向上は体感できなかったが、HDD寿命的に)満足してたのだが、TL眺めてたら「RamdiskにOpera置いたら爆速」とあって、試してみたら速度向上したので、RunOpera.ahkに組み込んでみた。

 RamDisk起動機能を有効にすると、OperaをRamDiskにコピーして起動し、終了したら元のフォルダにコピーする。監視対象はRunOpera.ahkから起動したOperaのみ。Operaを起動させたままWindowsを終了した場合、Operaが終了するまで待機して元フォルダにコピーしてから終了する……ハズ。
 基本的な使い方は前回を参照。実は他にも地味に機能が増えてるが、普通に使う分には大差ないので省略。

; --------- --------- --------- --------- ---------
; RunOpera.ahk
; --------- --------- --------- --------- ---------

#WinActivateForce

  OperaPath := "C:\Program Files\Opera\Opera\"  ; Opera.exeの存在するパスを指定。末尾は"\"。

  SessionsPath := OperaPath "profile\sessions\"  ; セッションフォルダのフルパスを指定。末尾は"\"。
  BookmarksPath := OperaPath "profile\bookmarks.adr"  ; bookmarks.adrのフルパスを指定。

  RamPath := "R:\Opera\"  ; RamDisk起動時に、Operaのコピー先となるフルパスを指定。末尾は"\"。

  TimeLimit := 30  ; 最終セッション退避確認ダイアログを自動でスキップするまでの秒数。

  AutoConvSW := 0  ; 最終セッションを退避させる場合、自動でブックマークに変換する設定。 0:変換しない。 1:変換する。
  ACMoveSW := 1  ; 自動変換(↑)したセッションを隔離する設定。 0:隔離しない。 1:隔離する。

  HisReadSW := 0  ; タブ履歴(タブで表示したページの履歴)の設定。 0:最新のみ読み込む。 1:すべて読み込む。
  WriteTrgSW := 0  ; ブックマーク情報を書き込む場所の設定。 0:セッションフォルダにテキストで保存。 1:bookmarks.adrに書き込む。

  RamCopySW := 0  ; RamDisk起動の設定。 0:通常起動。 1:コピーして起動し、終了したら書き戻す。
      ; ※ RamDisk起動を利用する場合、Operaはスタンドアロン版であること。

; --------- --------- --------- --------- ---------

  IfNotExist, %SessionsPath%
  {
    MsgBox, 16, , セッションフォルダが見つかりません。`n%SessionsPath%
    
    Exit
  }
  If (1 == WriteTrgSW) {
    IfNotExist, %BookmarksPath%
    {
      MsgBox, 16, , bookmarks.adrが見つかりません。`n%BookmarksPath%
      Exit
    }
  }

  IfExist, %SessionsPath%autosave.win
    GoSub, SessionAnalyze

;  FileCopy, %OperaPath%ui\fastforward_backup.ini, %OperaPath%ui\fastforward.ini, 1  ; アップデートのたびにFastForward.iniが初期化される問題の対策。

;  FileCopy, %SessionsPath%autosave_RunOpBak.win, %SessionsPath%autosave_RunOpBak2.win, 1  ; ↓セッション退避etc.を実行しない時も念のため2世代バックアップ。
;  FileCopy, %SessionsPath%autosave.win, %SessionsPath%autosave_RunOpBak.win, 1

  Process, WaitClose, opera.exe, 60  ; ↓終了させたはずのOperaがゾンビ化してないか確認。
  if ErrorLevel {
    MsgBox, 16, , Operaはすでに起動しています。
    ExitApp
  }

  if RamCopySW {  ; RamCopySWが1なら
    FileCopyDir, %OperaPath%, %RamPath%, 1
    OnExit, ExitOp
    SetTimer, CheckOp, -1000
    RunWait, %RamPath%opera.exe, , , OpPid
  } else {  ; RamCopySWが0なら通常起動
    Run, %OperaPath%opera.exe, , , OpPid
    gosub, CheckOp
  }

ExitApp

; --------- --------- --------- --------- ---------

ExitOp:
  Process, WaitClose, %OpPid%
  FileCopyDir, %RamPath%, %OperaPath%, 1
ExitApp

; --------- --------- --------- --------- ---------

CheckOp:
  WinWait, ahk_pid %OpPid%, , 60
  if !ErrorLevel {
    ifWinExist, Opera へようこそ ahk_pid %OpPid%
    {
      WinActivate
      WinWaitClose
    }
  } else {
    return
  }

  WinWait, パスワード ahk_pid %OpPid%, , 5
  If ErrorLevel
    return

  WinActivate
  Sleep, 300
return

; --------- --------- --------- --------- ---------

SessionAnalyze:
  FileRead, OSession, *P65001 *t %SessionsPath%autosave.win
  If (0 != ErrorLevel) {
    MsgBox, 48, , Sessionの読み込みに失敗しました。`n%SessionsPath%autosave.win
    Return
  }

  Idx := 0
  WinTitles := ""
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1
    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    WinTitles := WinTitles " " HisTitle "`n"
  }
  If("" == WinTitles)
    Return

  SetTimer, RenewCount, 1000
  MsgBox, 259, 退避確認(30秒後に通常起動), 起動時に最終セッションを退避しますか?`n`n◆最終セッションの内容◆`n%WinTitles%, %TimeLimit%
  SetTimer, RenewCount, Off
  IfMsgBox, Yes
  {
    TimeNum := A_Now
    BackupName := TimeNum ".win"
    Loop {
      FileMove, %SessionsPath%autosave.win, %SessionsPath%%BackupName%
      If(0 == ErrorLevel)
        Break
      BackupName := TimeNum "_" A_Index ".win"
    }
    If (1 == AutoConvSW)
      GoSub, SessionConvert
  }
  IfMsgBox, Cancel
    Exit

Return

; --------- --------- --------- --------- ---------

RenewCount:
  IfWinExist, 退避確認( ahk_class #32770
  {
    TimeLimit--
    WinSetTitle, 退避確認(%TimeLimit%秒後に通常起動)
    if !TimeLimit
      SetTimer, RenewCount, Off
  }
return

; --------- --------- --------- --------- ---------

SessionConvert:
  If (1 == WriteTrgSW)
    FileCopy, %BookmarksPath%, %BookmarksPath%_%A_Now%

  CmdLine := SessionsPath BackupName
  SplitPath, CmdLine, , , , SessionName
  Result := "#FOLDER`n  NAME=[Session] " SessionName "`n`n"
  ResultBuf := Result

  Idx := 0
  Loop {
    Idx := RegExMatch(OSession, "\[(\d+)history url\].+?count=(.*?)\n", $, Idx + 1)
    If (0 == Idx)
      Break
    WinNum := $1
    HisNum := $2 - 1

    HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
    HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)

    If (0 == HisReadSW) {  ; タブ履歴を無視する場合
      Result .= "%uRL`n  NAME=" HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }

    StringLen, HisNumLen, HisNum

    If (0 == HisNum) {
      Result .= "%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
      Continue
    }
    Result .= "#FOLDER`n  NAME=" HisTitle "`n`n%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"

    Loop, %HisNum% {
      HisNum--
      HisTitle := GetHisTitle(OSession, WinNum, HisNum, Idx)
      HisUrl := GetHisUrl(OSession, WinNum, HisNum, Idx)
      Result .= "%uRL`n  NAME=[" ZeroSupply(HisNum, HisNumLen) "] " HisTitle "`n  URL=" HisUrl "`n`n"
    }
    Result .= "-`n`n"
  }

  If (ResultBuf == Result)
    Return
  Result .= "-`n`n"

  If (1 == WriteTrgSW) {
    FileAppend, %Result%, %BookmarksPath%, CP65001
  } Else {
    FileDelete, %CmdLine%.txt
    FileAppend, %Result%, %CmdLine%.txt, CP65001
  }

  If (1 == ACMoveSW) {
    IfNotExist, %SessionsPath%AutoConv\
      FileCreateDir, %SessionsPath%AutoConv\
    FileMove, %CmdLine%, %SessionsPath%AutoConv\%BackupName%
    If (0 != ErrorLevel)
      MsgBox, 48, , 変換済みセッションの移動に失敗しました。`n%SessionsPath%AutoConv\
  }
Return

; --------- --------- --------- --------- ---------

GetHisTitle(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history title\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

GetHisUrl(ByRef OSession, WinNum, HisNum, Idx){
  RegExMatch(OSession, "\[" WinNum "history url\].+?" HisNum "=(.*?)\n", $)
  Return $1
}

ZeroSupply(Num, Digit){
  StringLen, NumLen, Num
  LoopNum := Digit - NumLen
  Loop, %LoopNum%
    Num := "0" Num
  Return, Num
}

 ひょっとしたら、タイミングによってはコピーが不完全なんてことも、ないとは言い切れないので、注意。

 RamDisk全体をバックアップ/レストアするだけでよくね?という正論は受け付けてません><


[PR]
by lordnoesis | 2012-04-15 18:28 | テクノロジ | Trackback | Comments(0)
ブログトップ | ファンになる