ラブびあ

ビール。ときどきラブ

ファイルを検索する

Excelで指定したフォルダ内のファイルをピックアップする処理を書くときに使うクラスです。

FileFinder

Option Explicit
' -------------------------------------------------------------------------------
' FileFinder クラス
'     指定フォルダ内のファイルを検索するクラス
'     Find メソッドで検索を開始します
'     検索結果は OnFind イベントで処理してください
' -------------------------------------------------------------------------------

' 検索対象ファイル名の RegExp オブジェクト
Private filter As Object

' 検索対象ファイルの拡張子名の Array オブジェクト
Private extentions As Variant

' サブフォルダーも検索するフラグ
Private recursive As Boolean

' -------------------------------------------------------------------------------
' OnFind イベント
'     Find でファイルが見つかった場合に発火します
' 引数
'     file 検索で見つかった FileSystemObject.File オブジェクト
' -------------------------------------------------------------------------------
Public Event OnFind(file As Variant)

' -------------------------------------------------------------------------------
' FileSystemObject プロパティ
' -------------------------------------------------------------------------------
Public Property Get FileSystemObject() As Object
    Static fso As Object
    If fso Is Nothing Then
        Set fso = CreateObject("Scripting.FileSystemObject")
    End If
    
    Set FileSystemObject = fso
End Property

' -------------------------------------------------------------------------------
' Find
'     指定フォルダー内のファイルを検索します
' 引数
'     find_root       検索のルートフォルダー文字列を指定してください
'     file_filter     検索したいファイル名を指定してください(部分一致・正規表現可)
'     file_extentions 検索したいファイルの拡張子を指定してください
'                     例>Excelブックを検索したい場合 Array("xls","xlsx") を指定する
'     find_subfolders サブフォルダーも検索する場合は True を指定してください
' -------------------------------------------------------------------------------
Public Sub Find(find_root As String, Optional file_filter As String = "", Optional file_extentions As Variant = Nothing, Optional find_subfolders As Boolean = True)
    ' ファイル名フィルター作成
    Set filter = CreateObject("VBScript.RegExp")
    With filter
        .Pattern = file_filter
        .IgnoreCase = True
        .Global = True
    End With

    ' 拡張子名フィルター作成
    If IsArray(file_extentions) Then
        extentions = file_extentions
    Else
        extentions = Array()
    End If
    
    ' サブフォルダーも検索するフラグ
    recursive = find_subfolders

    ' 検索実行
    Call Dive(FileSystemObject.GetFolder(find_root))
End Sub

' フォルダー内を検索する
Private Sub Dive(folder As Variant)
    ' ファイルを検索する
    Dim file As Variant
    For Each file In folder.Files
        If IsTarget(file) Then
            RaiseEvent OnFind(file)
        End If
    Next

    If recursive = False Then
        Exit Sub
    End If
    
    ' サブフォルダーを検索する
    Dim subfolder As Variant
    For Each subfolder In folder.SubFolders
        Call Dive(subfolder)
    Next
End Sub

' ファイルが検索対象か判定する
Private Function IsTarget(file As Variant) As Boolean
    IsTarget = IsTargetFile(file) And IsTargetExtention(file)
End Function

' ファイル名が検索対象か判定する
Private Function IsTargetFile(file As Variant) As Boolean
    If filter.Pattern = "" Then
        IsTargetFile = True
        Exit Function
    End If
    
    IsTargetFile = filter.Test(file.Name)
End Function

' 拡張子が検索対象か判定する
Private Function IsTargetExtention(file As Variant) As Boolean
    If UBound(extentions) = -1 Then
        IsTargetExtention = True
        Exit Function
    End If
    
    Dim extension As String
    extension = FileSystemObject.GetExtensionName(file)
    Dim ext As Variant
    For Each ext In extentions
        If StrComp(extension, ext, vbTextCompare) = 0 Then
            IsTargetExtention = True
            Exit Function
        End If
    Next

    IsTargetExtention = False
End Function

使い方

FileFinderは Findメソッド で検索パラメーターを指定します。ファイルが見つかると、見つかったファイル FileSystemObject.Fileオブジェクト を引数とした OnFindイベント を発火するので WithEventsキーワード を使ってイベントを受け取ります。WithEventsキーワード は標準モジュールでは使えません。クラスモジュールを使ってください。

Private WithEvents ff As FileFinder

Public Sub Test()
    Set ff = New FileFinder
    ff.Find "C:\test", "hoge", Array("xls", "xlsx"), True
End Sub

Private Sub ff_OnFind(file As Variant)
    Debug.Print file.Path
End Sub

Windows版 Slack のフォントを変更する方法

つい先ごろSlackが日本語対応されましたが、日本語表示にすると、フォントの圧迫感?みたいなのがあって何だか疲れる気がしたので、任意のフォントに変更する方法を探してみました。

■注意事項
この方法は動作保証外だと思うのでダメだったら諦めてください。またアプリの再インストールなどが必要になることがあるかもしれません。自己責任でお願いいたします。

■対象バージョン
2.9-3.0

■手順
node.jsが使用するキャッシュファイルに、フォント指定のCSSを注入します。

C:\Users\[User]\AppData\Local\slack\app-2.9.0\resources\app.asar.unpacked\src\static\ssb-interop.js

の末尾に下記を追加します

onload = function(){
  $("<style></style>").appendTo("head").html("*{font-family:'Yu Gothic UI' !important;}");
};

これでアプリを再起動すればフォントが適用されます!常駐させていると×ボタンで閉じてもアプリが終了しないので ハンバーガーメニュー>ファイル>Slackを終了する で終了させてください。

Windows版 Slack (英語)でEnterで改行させる方法

日本語だとEnterで改行させるオプションが追加されていますが、これを英語でも使う方法です。どちらかと言うと英語圏の人には需要あるかも。

■注意事項
この方法は動作保証外だと思うのでダメだったら諦めてください。またアプリの再インストールなどが必要になることがあるかもしれません。自己責任でお願いいたします。

■対象バージョン
2.9-3.0

■手順
node.jsが使用するキャッシュファイルで、オプション判定のfunctionを上書きします。

C:\Users\[User]\AppData\Local\slack\app-2.9.0\resources\app.asar.unpacked\src\static\ssb-interop.js

の末尾に下記を追加します

onload = function(){
  TS.utility.contenteditable.isCursorInPreBlock=function(){
    TS.model.prefs?
    TS.model.prefs.enter_is_special_in_tbt=!0:
    TS.prefs.setPref("enter_is_special_in_tbt",!0);
    return !0;
  };
};

これでアプリを再起動すればEnterで改行されるようになります!常駐させていると×ボタンで閉じてもアプリが終了しないので ハンバーガーメニュー>ファイル>Slackを終了する で終了させてください。

Android開発2017春

あの 自戒の日 から二年半あまり。やらなきゃやらなきゃと思いつつ忙しいからしょうがないよね?と流されまくりましたが、ようやく最初の目標を達成しました。

初作品の メトロケ は、リアルタイム時刻表というか列車位置情報を表示するアプリになりました。作ってみて分かった最大の問題は、東京メトロは列車の本数が多いので列車位置を細かく知れたところでまったく有難くなかったこと。運転見合わせじゃなければそのうち来る。みたいな。これだけじゃ仕方ないので(このアプリに付けるべきか微妙かなーと思いながらも)PASMOの残高表示機能や駅名の読み上げ機能など付けてみました。英語併記や読み上げ機能は、万が一、外国人向けにマッチするかも。開発環境構築込みで80hくらいかかりました。

Daily Counter は、日々のエクササイズのセット数を記録するアプリが欲しくて作りました。運動している最中にタップするので、そこそこ荒いタップでも大丈夫なようにボタンを大きくし、ちゃんとタップできたか常に画面を確認するのはつらいので、カウントを読み上げるようにしました。また、preferenceの使い方を覚えるために、読み上げ機能の設定を持たせてみました。こちらは今のところ40hくらい。

次は何つくろうかな!



Windows開発環境

Java
http://www.oracle.com/technetwork/java/javase/downloads/index.html

AndroidStudio
https://developer.android.com/studio/index.html

bitbucket
https://bitbucket.org/product

GITクライアント
https://git-scm.com/


■参考サイト他

Androidアプリ開発
https://akira-watson.com/android/adt-windows.html

Android開発ガイド
https://developer.android.com/develop/index.html

アイコン
http://icooon-mono.com/

google play
https://play.google.com/store/apps/developer?id=beer@jp

GASでユーザー定義関数を使う

Google Apps Script
https://developers.google.com/apps-script/overview

■Custom Functions in Google Sheets
https://developers.google.com/apps-script/guides/sheets/functions

■functionに複数の範囲を渡して処理する例

=myfunction(A1:B5,C1:E5)
function myFunction() {
  var arr =[];
  for (var i=0 ; i<arguments.length ; i++) {
    for (var row=0 ; row<arguments[i].length ; row++) {
      for (var col=0 ; col<arguments[i][row].length ; col++) {
        arr.push(arguments[i][row][col]);
      }
    }
  }
  return arr.join();
}

自戒

東京メトロ オープンデータ活用コンテストに参加すべく夜なべしましたが、
結局応募まで至りませんでした。自戒を込めてやったところまで記しておく。
目標は「androidアプリでリアルタイム時刻表を作ること」でした。

Java
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
開発に必要なもの一式が入っている。これが無いと始まらない。

IDE(いずれか選択)
Eclipse + ADT
https://developer.android.com/sdk/index.html

Android Studio以前から存在していて比較的安定している
Eclipseユーザーは、こちらから入った方がとっつき易そう

Android Studio
https://developer.android.com/sdk/installing/studio.html

まだベータ版。毎日アップデートする勢いで開発中。
Eclipse版で足枷になっている旧バージョンのサポートを、
ある程度見限ってガシガシ更新しているように見えた。
機能的にEclipseに劣る点は無さそうで、
何よりサクサク動くので早くver1になって欲しい。

東京メトロAPIの呼び出しとjsonのパース
ポイントは
東京メトロAPIの開発者登録をしたキーが必要
jsonのパースにはgsonが良さそう?
・gson.jarをダウンロードしてlibsフォルダへ配置する
gradleにダウンロードさせても、アプリケーションからjarを探せないらしい
プロジェクトのlibsに配置して直接参照する
・gson的に、json-ldはjsonと同じ扱い
・インターネットへ接続する許可を設定する
AndroidManifest.xml に Manifest.permission.INTERNET を定義する
これがないと実行時にURLを開こうとすると原因がよーわからんexceptionになる。
http://developer.android.com/reference/android/Manifest.permission.html#INTERNET

ここに来るまで30時間ほど。

収穫はandroid開発のスタートラインまで来れた?こと。ふぅ。