So-net無料ブログ作成
検索選択
プログラミング ブログトップ
前の10件 | 次の10件

mailpeeper-tls ver.1.0.8リリースを一応した。 [プログラミング]

mailpeeper-tlsはとりあえず諸々対応で、最終的にdark modeに対応できました。一応、もうGitHubにはあげてあるのだけれど、どこかに.appファイルは上げておかないとね。そのうちそのうち。問題が残ってるかもしれないし。

デバッグはボタン一発で実行できたけど、リリースするバイナリはどこにあるんだ? 別途作らないといけないんだったっけか。大体デバッグしたバイナリはいろいろ情報が入れられてたりするからなぁ。

場所は
Library/Developer/Xcode/DerivedData/
以下のわかりにくいところにある。
Xcodeでいつ頃かに変わったんだよな。アクセスするのXcodeからFinderに行かないと面倒すぎる。というか、ユーザーのお膝元のディレクトリに作って欲しいんだが、これをこの場所に置く意味とメリットってどこにあるんだろう。

DevelopmentとDeploymentがあったので、デプロイにファイルができるようにする。
メニューの「Product > Scheme > Edit Scheme」からDeploymentに変える。
少し小さめのバイナリができるので、それを提供します。

http://www010.upp.so-net.ne.jp/mihumi/softs/mailpeeper-tls.app.1.0.8.zip


リリースノートとしては、

●諸々不具合対応+機能追加 (in Jan, 2017)ver.1.0.8
El Capitanで使えなくなったという報告を受けてビルドし直す。
ついでにコンパイルのワーニングをとる(大体longからintへの暗黙キャスト)。
pop3sなGmailが取れなくなっていたけどアプリパスワードで回避(結局、何もやってない)。
Notification Centerに対応しようとしてソースに入れ込んではある。
OpenSSLを新しくしたのと、OpenSSL由来の例外がありそうなので止めておいた。
macOSのダークモード対応

という感じなんですが、本当は一番最後だけ頼まれてたんですよね。まぁ仕事しながらやってこの程度でできたから上出来かもしれない。あと動作確認したのはmacOS Sierraなので他は知りませんw。

一応対応しましたぞ。しばらくは放置します。何かとんでもない問題があれば対応するかもしれません。本気でやればGitHubからでも何とかなるなる〜♪

コメント(1) 
共通テーマ:パソコン・インターネット

macOSのダークモードでステータスバーの文字を反転させたい [プログラミング]

mailpeeper-tlsでStatus barにアイコンを表示させて、それがdark modeでも大丈夫なようになりました。

http://mackuba.eu/2015/03/04/how-to-add-icons-to-menu-bar-on-yosemite/

ここはどこから情報を取ってきているのかわからないけど、きっちり解決したのでありがたかった。やっぱり英語ソースはわりと日本のよりか信頼性あるわ。


でも、メニューバーの右側のステータスバーと言われるところにも、文字列は突っ込むことができて、大体以下のようなソースで入れ込んであった。言い方が他人事なのは自分がインプリしたわけじゃないから。抜粋&改変してあるのでそのままどこかに入れ込んでも使えないかもしれない。
  NSStatusBar *statusBar = [NSStatusBar systemStatusBar];
  NSStatusItem *statusItem = [statusBar statusItemWithLength:NSSquareStatusItemLength];
  NSMutableAttributedString *attStr = [[[NSMutableAttributedString alloc] 
			initWithString:@"hoge"]] autorelease];
  [attStr addAttribute:NSForegroundColorAttributeName 
			value:[NSColor blackColor] range:NSMakeRange(0,[attStr length])];
  statusItem.highlightMode = YES;
  [statusItem setAttributedTitle:attStr];

こんな感じで書いてある。改変したところも大丈夫だと思うが、二つのソースをコンバインして作ったのでコンパイルかけてない。多分手直しすれば大体はいいだろうけど。

そんで、これではダークモードで文字列が沈み込む。NSColorは黒だけど、highlightColorとかにしてもダメだったし、hilightModeも入れてはみたものの入れ込む文字列に反応しなかった。黒いまんま。ステータスバーの他の日付とか、バッテリー残量数とか、文字なのに反転するから根本的にはできるはずなのだが…。

気持ちの悪いことに、クリックされて展開されるメニューに関してはきちんとダークモードに対応している。なんじゃこりゃw。とにかく、ステータスバー直の文字列の色を左右する設定がうまくいっていないことは確かだ。ん〜これもアイコンイメージのダークモードを解決する時みたいに面倒だな。どこかに書いていないだろうか。Xcodeのリファレンスって見難いし、サンプルコードがあまり載っていないんだよな。特にAPI周りは。

ステータスバーのオブジェクトを作って、そのアイテムを作って、そこに文字列を叩き込む、という具合なのは、アイコンイメージと同じだろう。さっきも言ったようにNSColor hilightModeはダメ。

あ…
NSColor textColor
で通っちゃったw。きちんと反転するね。

具体的には
[attStr addAttribute:NSForegroundColorAttributeName
value:[NSColor textColor] range:NSMakeRange(0,[attStr length])];
としただけ。

あ〜あっけないなぁw。こういうの一番頭にくるというか気が抜ける。実装がドキュメントに反映されてないタイプ乗って試行錯誤するしかないから、やってる時は不安で終わったら終わったでこんなのに引っかかってたんだと思ってしまう。

まぁなんにしても解決したのでいいや。mailpeeper-tlsぼちぼち新バージョンリリースします。三週間ぐらいかかっちゃったね。とりあえず、gitをcommitして、githubには上げておこう。ん〜きちんとメールアイコンを作ってからのほうがいいかな。しかし、今回は少し勉強になったな〜。というか、もうObjective-C触りたくないんですけどw。

コメント(0) 
共通テーマ:パソコン・インターネット

macOSのダークモードでステータスバー対応が面倒な感じ。 [プログラミング]

mailpeeper-tlsでいつだかに導入されたDockとメニューバーのダークモードにてこずった。ググっても全然情報が出てこないからスクラッチしようと思っていたが決着があっさりついた。

http://qiita.com/itoru257/items/445738ed0bf7fadf1ebf

これを調べる前は
macos menu bar darkとか
macos status bar darkで
調べたんだけど、全然出てこない。xcodeとかで絞っても駄目だった。

メニューバーベースのアプリケーションはそもそも少ないわけで、AppleのDeveloperなページで読んでスクラッチするしかないかと思っていた。

https://developer.apple.com/reference/appkit/nsstatusbar

これあたりかなぁと思ったり。


でも結局、一番初めに貼ったリンクの先の
[[[NSAppearance currentAppearance] name] containsString:NSAppearanceNameVibrantDark]
というところを判断材料にして適宜実装しないといけないってことらしい。

ただ、アイコンの状態変化がいくつかあるので、その度にチェックを入れてアイコンを描き直さないといけないというのは、正直だるいというかソースがあまりきれいでなくなる気がする。アイコンだけじゃなくて文字もフォントの色変えないといけないしね。

というか、AppleがUIの変更に合わせるようにアプリケーションの変更を迫るのってどうなんだ。もっと気にするべきバグとかがあるんじゃないんですかねAppleさん。


ともあれ、dark modeに手動で変更した場合の通知って、どこで受け取るんだっけ。AppControllerあたりなのかな。最初はawakeFromNibあたりで設定すればいいものの、不定期に変えられた場合はどうなるのかとかは調べてない。

status barもそうだけど、macOS独自のシステムプログラミングが慣れてない。というか調べれば終わりなんだけど、Macって使い方ばっかり出てきてどんだけ利用者をバカにしているユーザーがいるんだよってなもんで。Windowsの調べ物って結構数があって速攻でかたがつくんだけどな。


しかし、上の解決法は使えなかった。途中でダークモードに変えた場合に対応してくれないみたいなのだ。だから、途中から
[[[NSAppearance currentAppearance] name] containsString:NSAppearanceNameVibrantDark]
を発動させて変えさせることができない。何にしても面倒だ。そしていちいち変更を加えるのは煩雑過ぎてコードの中に入れ込むのはあまりうれしくない。

http://mackuba.eu/2015/03/04/how-to-add-icons-to-menu-bar-on-yosemite/

これはどうかなと思ってやってみる。どこからの情報か知らないけど面倒がなさそうでよさげだ。動けばなんでもいいんだけどさ。


あ~できた。

NSImage *icon = [NSImage imageNamed:@"icon_menu.png"];
icon.template = YES;
statusItem.image = icon;
statusItem.highlightMode = YES;

を自分のソースに適用したら白黒を勝手にいい感じにしてくれる。変な話白黒逆転していてもたぶん大丈夫。もしかしたら最初にやった方法では根本的な解決にならないんだろうな。Qiitaとか玉石混淆すぎるし、きちんとした情報じゃない場合は自分のブログにでも書けよ。


.xcassetsを導入したから、.icnsファイルともファイル名で管理ともおさらばだ。とはいえ、面倒だから全部それに変更したわけじゃないけど。assetsを使ったのは実はダークモードが解決するかと思って使ったけど、あんまり影響はないようだった。白黒のアイコンにしてあげないと似合わないので、新しくステータスバーのアイコンを変えてあげないとな。そういうのセンスがないんだけどまぁ今はフリーの素材もあることだし。


イメージは解決したから、あとは文字だな。受信件数を数字で示しているのだけれど、今のところダークモードでも普通モードでも大丈夫な設定に変えられていない。いろいろ設定を真似て見たものの、イメージの設定とはちょっと違うよう。灰色にしてどっちも見えるようにするっていう回避方法は避けたい。まぁそのうちそのうち。

コメント(0) 
共通テーマ:パソコン・インターネット

久しぶりのXcodeでの開発。 [プログラミング]

mailpeeper-tlsはコンパイラのワーニングの通りに直しているので、それが妥当かどうかはほとんど考えてない。やたらlongからintの暗黙キャストが行われていて、受け側も渡す側もlongにしておいた。まぁメモリの使用量は増えてもそんなに問題ないだろう。にしても64bitのintってlongと同じってどこかでみた気がするのだが、そもそもintってOSのbitによって違うんだよね? それともLLVMは環境に影響されずintは32bit整数とか決めちゃってるんだろうか。まぁいいや、Xcodeの実装とかかもしれないし。

正直Cocoa使うの久しぶりです。できるならARCとかにしちゃいたいけど、面倒でやってません。いちいちreleaseしないといけないのね。ともあれ、Xcodeメニュー > Edit > Convertに変換する方法があるみたいだけど、信用が置けなくて使ってません。まぁ大丈夫なんだろうけど、メモリリーク気になるしやった方がいいのかな。

人のコードを触っていると綺麗に書く人だなぁと思うコードと、お前精神状態疑うよという酷いコードが結構真っ二つに分かれる。幸いなことに私がいじくっている元のコードはきれいだった。どちらかというと私が汚染している感じw。ん〜自分が書いているコードなら、人に見せる場合はコメントを含め綺麗に書くんだけど、まぁ基本切り貼りで動かなかったら手を入れる感じのお気楽コーディングで通しています。自分で検証コードを書いてから本体に組み込むような慎重派だから、本体に粒度が低いベタベタなコーディングはしません。ただ、元からあるものを直すとかは仕方なくべったりしてしまうことも多いけど。

Xcodeは出た当時は、こんなIDEがタダで提供されるなんてApple太っ腹、と思っていましたが、今となってはEclipseもVisual StudioもIDEはタダな訳で。先鞭をつけたという意味では画期的だったかもしれない。昔はコンパイラとかすごく高かったんだよ。Borland bccがタダで配られた時は嬉しかったけど、結局Win32APIがわからんとどうしようもなかったので、ネットが今ほど整備されていなかった状況では如何ともし難かった。今と違ってネットに情報を見つけるのも一苦労だったし。Googleが検索始めたら何の問題もなくなったけど、その前は頑張ってInfoseekとかで見つけるしかなかった。

正直Xcodeはそれほど好きじゃないです。Visual Studioの方が慣れているというか、探し物がすぐに見つかる感じがしました。今はXcodeでも右クリックメニューからGoogle検索する項目が出てくるけど、できれば付属のヘルプに飛ぶ項目があればいいのだが、そこいらへんはIDEとして断絶している感じ。どこかに内蔵ヘルプに飛ぶメニューあったっけ? まぁネットの方がサンプルコードが具体的にあったりするので、ググった方が早いんじゃということなんでしょうが、そこは自分達の一次情報を見せて欲しいんだよね、見づらくても。


んで、deprecatedな関数を潰しているのだけれど、やっぱり代替する関数が全然違う動作をしていたり、扱う型が全然違かったりで、動作検証を含めて難航気味。自分でスクラッチしたわけじゃないから、元の動作の意味を考えて、GUIとの動作を勘案してやらないといけない。変えた理由はわかるんだけど、元のコードにがっつり関数依存の制御が入ってしまうと直すのがシンドい。

それにしても、どうしてこうもXcodeのプロジェクトに非互換が入りまくるのかな。Windowsでここまで変化があったら批判芬芬だろうな。MSは下位互換というか未来に行っても比較的動く方だと思う。Macとかコンパイルし直さないと動かないとか多すぎる。前にスクリーンセイバーを作っていた時も、OSが変わるごとにコンパイルし直さないといけない時期があった。アホかとか思った。エミュとかで過去の互換性を維持するかのように見せて、すぐそのサポートを打ち切るしね。まぁ企業対応が最悪という評判はそういうところから来ているのかもしれない。

なんというか、今までよくMacについてきた人がたくさんいたもんだよね。レガシー資産をすぐに切り捨てるので、ジョブズの潔さが出ているとも言えるのだが、正直横暴すぎるよね。また同じことしたらどうなることやら。わりと仕様に利益があるUSBのType-Cコネクタでさえ、iMac登場時のUSBほど暖かくは迎えられていないだろう。

僕としては、お手軽お気軽にプログラミングできればいいのだけれど、この先Apple不安だなぁ。MSではもうほとんどプログラミングしていないけれど、そのぶんHTML5とかのWebプラットフォームを気にしているから、どうしてもWindowsを離れることができなかったりする。結局、パソコンでビジネス使いするのWindowsだし。今ではスマホからアクセスすることも多くなったわけだけど、やっぱり作るのはWindowsマシンでってことになるわな。iOSを扱わない限りは仕事でMacを使うことはできないわけで。

そういう意味では使うのに腰が引けてしまっているところがある。iPhoneはすぐにAndroidでも乗り換えできそうだけど、パソコンは開発環境として使ってしまうといろいろ根深い理由ができてしまって移行するのがしんどくなる。今は熱心な人に後を押されてメンテしているけど、正直自分がこのソフトを改造したの半分忘れてたしね。今の開発の活動拠点はWebであるので、仮想化がある今、実はどこでも開発できたりはするんだけども、macOSを使って楽しい時期はとうの昔に過ぎてしまっている。

だけどUbuntuのGUIでいつも使おうなんて思えない。そこのところはWindows, Macを完全に離れることは不可能だ。かなりできることは多くなってきてはいるけれども、メーカーのサポートをきちんと得られるという状態にはなっていない。そこが非常に残念だ。


あ~Notification Centerが上手く使えない。NSNotificationCenterじゃなくNSUserNotificationCenterを使うっぽい。あとデリゲートとかなんかせんとあかんぽい。

コメント(0) 
共通テーマ:パソコン・インターネット

HTML5の道は厳しい。 [プログラミング]

ソーシャルエロゲーをやっていると、いまだにFlashで作られているものがある。そんなに前に作られたものではないのに、開発が止まらなかったのだろうな。HTML5でできたゲームも多くなってきているが、いくつかのゲームは読み込みが異常に遅かったり、そもそもFlashのような演出ができていなかったりで、正直あまり出来がいい物が少なかったりする。

Flashではパーツごとを動かすぬるぬるアニメがあるのだが、HTML5ではあまり見かけない。あったとしても編集ソフトで一回コマごとに絵を作って、それを紙芝居風に動かしているのしか見たことがない。エロゲーの出たり入ったりの繰り返しであればそれでいいのだろうけど、正直あまり応用が利く方法ではない。


HTML5をうろうろと見回ってみて、CreateJSあたりがいいんじゃないかなと思ったり。

http://www.buildinsider.net/web/popularjslib/2016

ここには目的が違うので書かれていないのだけれど、Adobeが関わってるっぽい。私企業の参加するOSSというのはなんとなく眉唾ものだったりするけれど、あのIBMですら元々Eclipse作っていたわけだし、そんなに気にする必要はないのかもしれない。ゲーム系だとEnchant.jsあたりなんだろうなぁ。いまいち掴みきれてないけど、次期Flashみたいな感じなのはやっぱりCreateJSなのかなと思っているんだけど、実際使ってみていないのでなんとも言えない。

http://www.sejuku.net/blog/3902

素でHTML5を扱うにはシンドい歳になってきたので楽ができればいいなと思っている。でも、ある程度CSSでできるアニメーションぐらいはやっておいた方がいいんだろうなぁ。暇なとき少し頑張ろう。


コメント(0) 
共通テーマ:パソコン・インターネット

GrowlからNotification Centerに変えるのってそんなに難しくないかも。 [プログラミング]

一時期GrowlはMacOSXに入れる意味が十分にあったのだが、今はNotification Centerがあるため、対応していれば特に入れる必要は少なくなった。入れる意味がないわけではないが、OSにその機能があるならそれを使った方がいいなと思ったりはする。それがAppleのあからさまなパクリであっても。

一次情報はここみたい。
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Notifications/Articles/NotificationCenters.html

こっちの方が具体的で簡単だね。
http://cocoathings.blogspot.jp/2013/01/introduction-to-user-notifications-in.html

ちょっとmailpeeper-tlsに突っ込んでみる。簡単に実装できそうだな。

ぐはっ。GUIを作るところが明らかに変。表示されている作成画面と、実際に表示される画面が違う。アラートも出ているのだが、新しく直そうとすると部品が違う挙動をする。そういや、前もこんなことあったような気がするなぁ。それで適当に回避して先に進んだんだったっけ。グラフィカルなエディタがXcodeの本体に組み込まれたときに変な感じになったような気がした。

とりあえず、立ち上がりはするけれども、メニューが開かなくなった。う〜ん、一から作ったのではないので、何が悪いのかわからない。それに新しくなったXcodeが更に邪魔をしている感じ。とりあえず、GitHubからPullしてきて、そこだけいじってみて直す方策を考えよう。ん〜Gitでローカルにコミットしておけばよかった。これでは戻れないよ。


《後記》
git clone https://github.com/miffy/mailpeeper-tls.git
してきて、コンパイルが通るようにして、GUIが直るようにしました。

最終的には、autoresizingが邪魔をしていて、部品を選択状態にして、赤いバーを選んでdeleteキーで全部消しました。昔から使っているアプリのGUIの表示が崩れた場合は、autoresizingを無効にしてあげると大丈夫っぽい。というか、挙動が変すぎてどうやっていいかわからなかったよ。あと変更が変わらないときに、オレンジ色のバーを消すと直るってのも特に気にしてなかったからハマった。

とりあえず、GitHubのおかげでリカバーできた。クラウドは偉大だな。


ん?deliverNotificationが発動しない。デバッグで直前で止めるとNotification Centerのポップアップが出てくるんだよね。何が悪いんだろう。連発しているのが良くないのかな。でも、一度止めると出てくるんだよね。でもsleep()で止めたところで出てこない。んでGrowlだとたくさん出てくるんだけど、Notification Centerだとまとめられちゃう。出るだけマシなんだけど、どうにかして普通の動作で動くように持っていきたい(解決してねーのかよw)。

コメント(0) 
共通テーマ:パソコン・インターネット

mailpeeper-tlsのビルドを通るようにする。 [プログラミング]

mailpeeperのためにOpenSSLを直に使おうということになった。まぁHomeBrewはMacPortsみたいにダメプロジェクトじゃないのでいいか。


HomeBrewでOpenSSL入れるときになんか出た。エラーじゃないけど、やっとかないとダメそうな設定があるので。
A CA file has been bootstrapped using certificates from the SystemRoots
keychain. To add additional certificates (e.g. the certificates added in
the System keychain), place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include
    PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig

Xcodeに設定すれば、そこを見てくれるのかな。というか、これだけのために環境変数は入れたくないのだが。

ええと、結果だけ述べると、Project設定のBuild SettingsのHeader Search Pathに
/usr/local/Cellar/openssl/1.0.2j/include
を直に設定してあげた。リンクの方が潰しが効くと思ったけど、Finderでリンクのパスのコピーがすんなりできなかったので、実ファイルがあるパスで。

あと実際のバイナリである.dylibファイルを適宜新しいものにコピーしてあげた。なぜかlibz.dylibが必要らしいので、前のまま残しておいた。前もOpenSSLのフォルダ以外に別途入れたんだっけ? いまいちXcodeの認識する設定がどこに存在するのかがわからない。gccからLLVMに変わったあたりから更にどうなったのかがよくわからなくなってしまった気がする。

あとGrowlじゃなくてmacOS標準のNotifier(正式になんて言うんだっけ?)で通知を出したいなぁ。今更Growlもないでしょうし。最近使い出した人は入れてない人も多いでしょうし。調べればすぐなんでしょうけど、腰が重いのですわ。

コメント(0) 
共通テーマ:パソコン・インターネット

mailpeeper-tlsを久しぶりにいじってみる [プログラミング]

苦労してアクセスしてくれた人がいたので、mailpeeperのメンテをしようと思います。思ってるだけで不発に終わる可能性大です。Xcodeの仕様ってガンガン変わるから、それまでのソースがビルドすら通らないという状況があるわけです。

ほらあったw。ビルドしたらInfoPlist.stringsが無いって言ってるよw。早くもググるのも面倒になってきたw。まぁ正月だから時間があるのでやりますよ。というか、会社に行っている時間にやりたい。ん〜英語リソースが勝手に加えられちゃってるのかな。というか、それがマストになったのかな。めんどいw。

違った。エラーになっているところに絶対パスが採用されているらしい。前のところと場所変えているから、InfoPlist.stringsがないと勘違いしている。というか、絶対パスなんて指定した覚えないんだけどな。しかも特定のファイルしかそうなってないし。面倒なのでプロジェクトから日本と英語のリソースを消して一から入れなおす。ファイル参照だけを消してゴミ箱行きにせずに、またプロジェクトに登録する。うん、大丈夫っぽい。


次にビルドエラーになったのが、
openssl/crypto.h:122:10: 'openssl/e_os2.h' file not found
というもの。手元にあるOpenSSLのヘッダファイルが見えてないらしい。なんで見えてないかというと、おそらくそれまではシステムが使っていたOpenSSLのヘッダを使っていたと思われる。

http://qiita.com/marumaru/items/ca801c957986302f6fe6

El Capitanからダメになったのか…。エルキャピたん全然萌えないなw。MacOSXというかmacOSは明らかにダメOSに陥っていく。まだ完成の域でも無いのにデグレしていってる。どうするかな。できればXcodeの設定内で、もっと極言するならプロジェクト内で解決したいんだけど。

//#include <openssl/e_os2.h>
#include "e_os2.h"

とかにすれば、緊急回避はできるのだが、それを全部やらなきゃいけないのはしんどいし、オリジナルのソースはそのままで動かしたいし。新しくなってそれで手を入れるときに毎回この作業をしなくてはいけないのは正直シンドいっす。

めんどいけどHomeBrewでOpenSSLを入れなおすというのが正しいのだろうな。というか、新しいバージョン入れないとHeartBleed入りっぱかもしれないし。サーバじゃないからいいのかもしれないが気持ち悪いのに変わりはない。何にしてもライブラリは新しい方がいい。今年中に終わらなさそう。まぁ個人的に急ぎの用でもないし、前に気付いたバグの修正も入れておこうかな。バグというよりOpenSSLのしりぬぐいで例外処理を加えるだけだけど。至らないライブラリを使うとこれだから…。というか、世界中でも数人しか開発者がいないとか言ってるしね。


というわけで、この件は年越ししそうだなぁ。アニメのBD-Rへの書き出し作業も押しているし。そういや、今回は予想外に面白いものがあったな。バーナード嬢曰くとか、終末のイゼッタとか、全然マークしてないのが面白かった。WWW.WORKING!!とかも思いのほか良かった。

コメント(0) 
共通テーマ:パソコン・インターネット

HTMLのテーブルをExcelで作る。 [プログラミング]

Excel自体でHTMLに保存できたんだけど、テーブルの中身にいらない書式が付いてきちゃうので、プレーンな表を出力したい。

http://www.ken3.org/vba/backno/vba080.html

元々のソースはHTMLを全部出力して、IEで表示させていたけれど、改造版はHTMLのテーブルだけ欲しいので、完全にHTMLのドキュメントとせずテーブルだけ出力するようにした。

'Win32のShellExcute()
Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" _
(ByVal hwnd&, ByVal lpOperation$, ByVal lpFile$, _
ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&) As Long
    
Sub HTMLテーブルに抽出()
    
    'Application.InputBoxでセルを選択させる
    Dim objHANI As Range '選択されたセルの集合
    Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8)
    If IsEmpty(objHANI) Then 'キャンセルが押されたかチェックする
        MsgBox "キャンセルが押されました"
        Exit Sub
    End If

    'ファイルをオープンする
    Dim FNO      As Integer                     'ファイル番号
    Dim strFNAME As String                      'ファイル名保存用
    FNO = FreeFile                              '空いてるファイル番号を取出す
    strFNAME = ThisWorkbook.Path & "\test.txt"  'ファイル名を作る
    Open strFNAME For Output As #FNO            'テキストファイルを新規作成

    'HTMLのヘッダーを書く
    Print #FNO, "<table border=1>"  'テーブルの開始

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count         '行のループ
        'ヘッダセル
        If y = 1 Then
            Print #FNO, "<tr>";
            For x = 1 To objHANI.Columns.Count  '列のループ
                'セルの値を<TD>で囲って出力
                Print #FNO, "<th>" & objHANI.Cells(y, x).Value & "</th>";
            Next x
            Print #FNO, "</tr>"  '行の終了タグ
        End If
        
        'データセル
        Print #FNO, "<tr>";  '行の開始タグ
        For x = 1 To objHANI.Columns.Count  '列のループ
            'セルの値を<TD>で囲って出力
            Print #FNO, "<td>" & objHANI.Cells(y, x).Value & "</td>";
        Next x
        Print #FNO, "</tr>"  '行の終了タグ
    Next y

    'HTMLのタグを閉める
    Print #FNO, "</table>"

    'ファイルをクローズする
    Close #FNO

    'ファイルを開く
     Call ShellExecute(0, "open", strFNAME, vbNullString, "", 5)
    
End Sub


Windowsだけでしか動かないと思うんだけど、Win32APIのShellExecute()で出力したファイルが上がるようにした。どうせMS OfficeはWindowsでしか使わないし別にいいだろう。

ちなみにMacのLibreOfficeでは、Application.InputBox()のところで止まる。Win32以前の問題である。
libreofficemacro.png
ver4.1なのでWindowsとかの新しいバージョンとかだったら動くかもね。とりあえず、互換性を考える人は新しいメソッドは使わない方がいいだろうね。ただ選択セル範囲を得るだけだから他にもやり方はありそうだし。


そもそもどうしてこんな事をしているかだけど、このブログに表を載せようとすると否が応でもHTMLタグを打ち込まないといけなかったりする。他にもタギングは必要なところはあるけれども、正直tableタグの中身を打ち込んでいくのは気がひける。小さい表ならまだしも、多くなると気が遠くなる。


実はApplication.InputBox()は、Office2013からの導入で、それ以前のExcelでは使えなかったりする。

https://msdn.microsoft.com/ja-jp/library/office/ff839468.aspx

お手軽なんだけど、古いExcelではだめだし、OpenOffice系列でも動くかどうかよく確かめてない。というか、OfficeのVBAの互換ってどこまであるんだろう。VB6頃の文法っていまだに生きてるのVBAぐらいなんじゃないかと。とはいえ、VisualBasic.Netの文法とかどれだけ変わったのか知らないけどね。


新しくしてみた。バグも取った。
Sub HTMLテーブルに抽出汎用版()
    
    Dim objHANI As Range                        '選択されたセルの集合
    'ダイアログとか出さずに選択範囲そのまま
    Set objHANI = Selection

    'ファイルをオープンする
    Dim FNO      As Integer                     'ファイル番号
    Dim strFNAME As String                      'ファイル名保存用
    FNO = FreeFile                              '空いてるファイル番号を取出す
    strFNAME = ThisWorkbook.Path & "\test.txt"  'ファイル名を作る
    
    Open strFNAME For Output As #FNO            'テキストファイルを新規作成

    Print #FNO, "<table border=1>"              'テーブルの開始

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count             '行のループ
        'ヘッダセル
        If y = 1 Then
            Print #FNO, "<tr>";
            For x = 1 To objHANI.Columns.Count  '列のループ
                'セルの値を<TD>で囲って出力
                Print #FNO, "<th>" & objHANI.Cells(y, x).Value & "</th>";
            Next x
            Print #FNO, "</tr>"                 '行の終了タグ
        Else
        
        'データセル
            Print #FNO, "<tr>";                     '行の開始タグ
            For x = 1 To objHANI.Columns.Count      '列のループ
                'セルの値を<TD>で囲って出力
                Print #FNO, "<td>" & objHANI.Cells(y, x).Value & "</td>";
            Next x
            Print #FNO, "</tr>"                     '行の終了タグ
        End If
    Next y

    'HTMLのタグを閉める
    Print #FNO, "</table>"

    'ファイルをクローズする
    Close #FNO
    
    'VB.Netじゃないとダメ?
    'Dim p As System.Diagnostics.Process =_
    'System.Diagnostics.Process.Start (strFNAME)
    
    'exeでないと開かない。
    'Dim rc As Long
    'rc = Shell(strFNAME, vbNormalFocus)
    
    '他のプラットフォームでもいけるか?
    With CreateObject("Shell.Application")
        .ShellExecute strFNAME
    End With
    
End Sub


結局、最後でコケる。Windows以外はShellExcute()みたいな挙動はさせにくいな。というか、できたらCOMとかの実装もできているってことになりそうだし。まぁファイルができるところまでできているから気にしない!w

コメント(1) 
共通テーマ:パソコン・インターネット

コンピューター言語ってどう使われるか全然わからん。 [プログラミング]

ある集まりで偉いおじさんが今から時代はSwiftだとか言っていて驚いた。おいおい、OSSになってからそんなに時間がたっていないし、基本iOSやMacのアプリを作るための言語なのに、大企業が何とかと言い出したりしたらしく、風見鶏みたいな現場を離れたおじさんたちが煽る。というか、新しいMacBook Pro買ってくれるならいくらでもやるよ? でもマシンくれないんでしょ?ケチだから。どうせ会社の金のくせにね。それまではHTML5をやれと言っていたけれど、何で今更そんなものをやるんだ?とか抜かす。いや、どの言語やるにしてもHTML5からむだろ、今時のアプリケーションは。

まぁどの言語がどういう使われ方でよく使われるかどうか分からないのは知っての通りだ。Javaなんて初めはどこでも動くし、端緒としてモバイルで動かすためのものだったりしたわけだ。だけど、今はデータベースを読んでビジネスロジックを組む道具と化している。そういう仕事をしたことがないからどういうものなのかいまいちよくわからないが、Java2頃の私が本格的にやっていたころには考えもつかなかった。マルチプラットフォームだけど一つのバイナリで動くってのがすごいはずだったのだが、そのメリットがほとんど生かされていない。

最近ではJavaの文法でAndroidのアプリが書けたりするのだが、動作する仕組みがPureJavaではないばかりか、Javaですらない。ただJavaの文法を借りているだけだ。なので後釜のOracleがGoogleを訴えるのはどうかと思うのだけれど、基本金が取れるところはOracleだったら取りに行くだろうな。Sunがそのままあったら訴えていたかどうかは微妙なところ。うまいことして協力して金を巻き上げていたような気がする。

というか、企業買収などがあって資本関係が変わると、今まで常識的に控えていた訴訟とかをする傾向にある。JPEGの訴訟とかもそうだったんじゃないかな。一般的なスタンダードとして使うから使ってもパテント料は取らないという話だった。それはGIFとかも同じで、最初はタダだとか抜かしていたユニシスが、個人ユースにまでケチをつけてきて課金しようとした。ユニシス最悪です。世の中のビジネスが口約束で通らないというのがよくわかります。日本の法では口約束も契約のうちだったはずなんだが、外国はれっきとした事実があったとしても訴訟にして金を得ようとするのでした。

SwiftがOSSとして確立してサーバ側で動くにしろ、他にもJavaScriptだって同じようにサーバ側というか、クライアントサイドじゃないところで動いているし、わざわざSwiftをあげなくてもいいと思うんだよね。おじさん達は生き馬の目を抜くようなこの業界で生きてきたから先んじて利益を上げることに必死なんだろうけど、Macで開発やりたい奴なんてそれほど多いとは思えんのだがね。今となっては、どのプラットフォームにも開発環境はGUIで用意されているし、あえてAppleのSwiftを選ぶ必要もないとは思うんだけど。ただ単にパートナー企業が少しでも動きを見せるとそれにつられちゃうんだろうな。悲しい技術者の性w。

ともあれ、またSwiftをやってみようかなという気にはなった。Appleのはもちろん、OSSになって普通のプログラミング言語としてどう動きを見せているのか。個人的に少し気になってはいたんだよね。会社でMacを買ってくれるなら喜んで仕事中にバリバリやるんだけども。どうせLinuxとかに移植されたOSSの方しかやらせてくれないんだろうなと思いつつ…。

コメント(0) 
共通テーマ:パソコン・インターネット
前の10件 | 次の10件 プログラミング ブログトップ