2013年10月25日金曜日

Scalaはじめます。

動機は、
Play Frameworkでサポートしているというのが一番の理由。
html.scalaのテンプレートが理解できないのが気持ち悪いというのがもう一つの理由。

結局いずれもPlayに寄るものでした。

導入


http://www.scala-lang.org/ から、Scalaをダウンロードします。

コンパイル


scalac.bat ファイル名.scala

実行

scala.bat オブジェクト名

今のところ、@IT:スケーラブルで関数型でオブジェクト指向なScala入門 をなぞって学習中。


関連サイトは近々にまとめます。

2013年10月2日水曜日

[play]H2データベースをディスクへ出力する

デフォルトのapplication.confではメモリへの出力となっているH2データベースの出力先をディスクに指定します。これにより起動する度にデータがクリアされる問題を回避します。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:/path/to/db-file"

※defaultはデータベース名を指定します。


2013年9月6日金曜日

[EC2]Amazon EC2へのSambaの導入

Amazon AWSの販促資料に、月額10円/GBからファイルサーバーというのがありましてそれがどのようなものなのかはイメージがついていない(追記)のですが、1年間無料の枠内でファイルサーバーを運用してみようとSambaを導入するお話です。

そうしたら途中で躓きました。

#もちろん、ポートをIP限定で開放しております。

前提

samba 4.0.9

共有は以下

  • ログインユーザのホームディレクトリ
  • /mnt/home (ファイルサーバー用のEBSボリューム)

プリンタの共有はしない

Amazon Linux AMIを使っています。

$ uname -a
Linux ip-172-31-25-78 3.4.43-43.43.amzn1.x86_64 #1 SMP Mon May 6 18:04:41 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

準備

1.python26-devel.x86_64 をインストールします。configure中にpythonのヘッダファイルを利用するので、これがないとconfigureで失敗します。ここで躓きました。
# yum install python26-devel.x86_64

2.「Samba3.0インストール手順」にしたがって、libiconvをインストールします。

ビルドとインストール


1.tarballをダウンロードします。

2.configureを実行します。引数は以下のとおりで、上記blog(Samba3.0インストール手順)を参考にしました。

$ ./configure --prefix=/usr/local/samba --with-privatedir=/etc/samba --with-configdir=/etc/samba --with-libiconv=/usr/local --with-automount --with-pam --with-pam_smbpass --with-syslog > configure.log

3.make, make installを実行します
$ make
# make install

設定

ファイルのコピー

tarballの packaging/RHEL/setupディレクトリ内のファイルを、 /etc/sambaに移動します
# cp packaging/RHEL/setup/* /etc/samba

smb.confの設定

サンプルのsmb.confのこのブロックを流用して、/mnt/homeへの設定をしてしまいます。

[myshare]
   comment = Mary's and Fred's stuff
   path = /usr/somewhere/shared
   valid users = mary fred
   public = no
   writable = yes
   printable = no
   create mask = 0765
変更後

[myshare]
   comment = xxxxxxxxxxxx
   path = /mnt/home/
   valid users = username
   public = no
   writable = yes
   printable = no
   create mask = 0765


ユーザーグループの編集

sambaでログインするユーザをec-userグループに登録します。後述するパーミッションの都合に寄るものです。

# usermod -G ec-user username


領域のフォーマットとマウント

今回ファイルサーバーに使用する領域はAmazonEBSから新規に領域を確保して、EC2のインスタンスに登録しています。ただし、このままでは使用できないので、フォーマットして、マウントします。

# mkfs /dev/xvdb

EBS で hda となっていた領域はEC2上では、 /dev/xvda
      hdb となっていた領域はEC2上では、 /dev/xvdb というデバイスファイルになっています。

マウントは毎回実行しなければならないので、 /etc/rc.local に記載することにしました。

マウント先を作成:
# mkdir /mnt/home

rc.localに追加:
mount /dev/xvdb /mnt/home

パーミッションの編集

他のユーザーに編集されないよう、所有者とグループのみアクセス権を与えました。

以下の内容を/etc/rc.localに記載します。
chown ec2-user:ec2-user /mnt/home
chmod 706 /mnt/home


ポートの開放

以下の4つのポートを開放します。
sambaで利用するポート」 こちらのblogを参考にしました。


  1. AWSのConsoleからSecurity Groupを選択します
  2. 一覧からsambaをインストールしたEC2インスタンスが登録されている利用しているセキュリティグループを選択します
  3. 以下のポートを開放するルールを作成します。


    • 137/udp
    • 138/udp
    • 139/tcp
    • 445/tcp
udpについては閉じることも検討しなければならないかもしれません。

init.dへの追加


  1. /etc/samba(にコピーした)smb.initを、/etc/init.dへコピーします
  2. smbにリネームします
  3. smbのパーミッションを755に変更します
  4. smbを編集し、smb.conf、smbdおよびnmbdのパスを絶対パスで指定します
  5. chkconfig によって起動時に実行されるようにします
    # chkconfig smb on
  6. samba を開始します
    # ./smb start


接続試験

Windowsから、「\\amazonEC2のIPアドレス」のUNC形式でアクセスして認証の後に接続できることを確認します。

Apache2の設定

ほぼデフォルトを準用できました。

httpd.confの格納場所は /etc/httpd/conf でした。(環境によって異なります)

ホームディレクトリから、ドキュメントルートへシンボリックリンクを張る

# ln -s /var/www ~/www

init.dに登録


chkconfigコマンドで登録し、Linux起動時にApache(httpd)を起動するようにします。

/etc/init.d に移動して、chkconfigを実行
# chkconfig httpd on

ランレベルごとに起動するかどうかの確認は --list オプションをつけます。
# chkconfig --list httpd

表示確認


Amazon EC2のパブリックIPをブラウザに入力して、ApacheのWelcome画面が表示されればOK。

2013年9月5日木曜日

ぼやきです

starred.jsonをDBから扱えるようにしたほうが良いのか…。

[linux]RPMコマンド

インストール


# rpm -ivh rpmファイル名

インストール済みrpmリストの取得


# rpm -qa

検索


# rpm -qa | grep パッケージ名

削除


# rpm -e パッケージ名

依存関係を無視して削除


# rpm -e --nopdeps パッケージ名

[EC2] Amazon EC2へ HTTP+FTP導入

#ポート番号を個別具体的に絞り、自環境のグローバルIPをのみ開放して作業しております。


Apacheのインストール

yumを使ってインストールしました。

# yum install apache2

(省略) [y/N]  : yを押す

その他の設定

proFTPdのインストール


tarballからビルドしてインストールしました。

$ ./configure --prefix=/usr/local/proftpd
$ make
# make install

/usr/local/proftpd/etc/proftpd.conf の設定ファイルを編集します。

User/Group各ディレクティブを nobodyからftpに変更
# Set the user and group under which the server will run.
User                    ftp
Group                   ftp
proFTPdのユーザプロファイルを使っていないので、実在するユーザーにしないと起動しない。

DefaultRoot ~ のコメントを外し、有効化。
DefaultRoot ~     (行先頭の " # " を外す)
AnonymousFTPは運用しないので、のブロックはコメントアウトする。

Play Frameworkのインストール

  1. zipをダウンロードします
  2. 解凍します
  3. /usr/localに配置します
  4. usr/local/play-2.1.3にパスを通します
いざgrstarをpullしてきて実行しようと思ったところ…エラー。(別記事)

2013年8月24日土曜日

[Play][jQuery]GoogleReaderのStarを取り扱うWebアプリケーション

ちんたらしていましたが作りました。

https://github.com/eruchee/grstar/


使い方

  1. play frameworkを導入する
  2. 上記URLからプログラムを入手して展開する
  3. 展開先の public/ ディレクトリ に、ご自身のstarred.jsonを配置する。
  4. 展開したディレクトリでplay runを実行する
  5. http://localhost:9000/へアクセスする。

操作

j / k 下 / 上の記事を開く
n / p 下/ 上の記事を選択する
o 記事を開く
v 新しいウインドウで記事を開く
s 記事を削除する (削除を取りやめる、削除した記事を復帰させる)
r 読み込み直す

Sボタンを押した場合の動作
先頭に以下のマークがつきます。Sボタン押下時には以下のパターンで変化します。

(S押下前→S押下後)
  • 無印 → M ファイルからの削除待ち
  • D   → R   ファイルstarred.jsonへ復帰待ち
  • M   → 無印 ファイルstarred.jsonからの削除とりやめ 
 以下のマークは、starred.jsonへの反映が完了した時に変化します。
  • M   → D   ファイルstarred.jsonからの削除済み
  • R   → 無印 ファイルstarred.jsonへ復帰済み

制限

  • starred.jsonを最後まで読み切った際の考慮が甘すぎです
  • たくさんのアイテムにMやRをマークすると(特にR)、きちんと動きません。 原因?仕様?


2013年8月9日金曜日

[Play]Jsonデータの渡し方

ドキュメントでは受け取り方や、レスポンスの返し方は書かれているのですが、jQuery側から、サーバ側へのJSONの渡し方がありませんでした。この点を補足したいと思います。

Play Frameworkでは、JSONデータを受け取る際にContent-Typeがapplication/jsonでなければ、解釈しないようになっています。

jQueryには$.postもありますが、content-typeの設定が行えないのでこれは使わないことにします(注)。

低レベルで設定を行う$.ajaxを利用して、陽にContent-Typeを設定して、JSONを投げます。
$.ajax({
  type: "POST",
  contentType: "application/json",
  url: '/proccb',
  data: jsonstr,
  complete: function(e, xhr, setting) {},
  dataType: "json"
});

[JSON]改行を含めたJSON文書

Jacksonで、要素ごとに改行をする(インデントを加える)方法が日本語でなかなか見つからなかったので 記します。デフォルトですと一行で書き連ねるので、大きなサイズのJSONは読みづらくなってしまいます。

SerializationConfig.Feature.INDENT_OUTPUTをtrueにします。

mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,true);

出典 http://jackson-users.ning.com/forum/topics/newbie-question-how-to-write-with-line-breaks

2013年8月4日日曜日

[Javascript] Google Chrome の違うプロセスでタブを開く

Google Chromeにおいて、普通にwindow.openとした場合、同じプロセスで新しいタブを開いてしまい、処理が非常に重たくなる場合があります。せっかくマルチプロセスで動いてくれるのにこれはもったいない。

これを回避しつつ、新しいタブを開くロジックです。

wo = window.open();
wo.opener = null;
wo.location.href = URL;


以下が参考になりました。
https://code.google.com/p/chromium/issues/detail?id=153363

(雑記)
wo.blur() とか試してみたいけれどもまだやっておりません。

(追記)
Firefox、IEでも動作はしたので、ブラウザで切り分けることはないでしょう。

$.ajaxの送信完了イベントの受け取り

$.ajaxにおいては、
  • 送信前 (beforeSend)
  • 送信後 (complete)
  • 送信成功 (success)
  • 送信失敗 (error)
のように、様々なイベントをキャッチすることが可能ですが、そのコールバック関数が取る引数について。

$.ajaxのイベントには、$.ajaxのパラメータに指定するローカルイベントハンドラと、$ajaxCompleteのように指定するグローバルイベントハンドラがあります。違いは以下のとおりです。

  • ローカルイベントハンドラ : 定義した$.ajaxのみ対象とするイベント
  • グローバルイベントハンドラ : すべての$.ajaxを対象とするイベント(ajaxCompleteなど)
それぞれ、ステータスや、XMLHttpRequestオブジェクトなどが格納されるのですが、順番が異なるため、同じように実装すると、期待していたように動かないといったことが起こります。
グローバルイベントハンドラは多々有りましたがローカルイベントハンドラの引数の情報が見当たらなかった(参考文献の$.ajaxは公式だと思います)ので作成しておきます。

例)complete / ajaxCompleteの場合:

ローカルイベントハンドラ
$.ajax ( 
  省略
  complete : function(XMLHttpRequest, status){ },
)

グローバルイベントハンドラ
ajaxComplete(status, XMLHttpRequest, setting)

settingは、$.ajaxの引数や$.ajaxSetupによって設定したオプションが格納されます。


参考

2013年7月30日火曜日

Google Readerのstarred.jsonをとりあえず読み込むJava

GoogleReaderで残された「スター付きアイテム」を保存したJSONファイル starred.jsonをとりあえず読み込むJavaのソースです。

JacksonのObjectMapperを使用しています。

getter / setterを定義すれば組み立ててくれるので便利でした。

しかし、これだけ書いたのに、CoffeeScriptに持って行ったら10行かかりませんでした。


import java.io.*;
import java.lang.reflect.Type;
import java.net.URL;
import java.text.DateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.io.*;
import com.fasterxml.jackson.core.util.*;
import com.fasterxml.jackson.databind.cfg.BaseSettings;
import com.fasterxml.jackson.databind.cfg.HandlerInstantiator;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.deser.*;
import com.fasterxml.jackson.databind.*;


class JacksonTest{
public static void main( String[] args) {
StarredByGoogleReader str;
try{
ObjectMapper mapper = new ObjectMapper();

//str = mapper.readValue(new File("ministarred.json"), StarredByGoogleReader.class);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
str = mapper.readValue(new File("starred-old.json"), StarredByGoogleReader.class);

for (int i = 0; i< str.items.length;i++){
System.out.println(str.items[i].title);
}

}catch(Exception e){
e.printStackTrace();
}
}
}

class StarredByGoogleReader{
String id;
String title;
String author;
long updated;
String direction;
StarredItem[] items;

public String getId() { return id; }
public void setId(String s) { id = s; }
public String getTitle() { return title; }
public void setTitle(String s) { title = s; }
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public long getUpdated() {
return updated;
}
public void setUpdated(long updated) {
this.updated = updated;
}
public String getDirection() {
return direction;
}
public void setDirection(String direction) {
this.direction = direction;
}
public StarredItem[] getItems() {
return items;
}
public void setItems(StarredItem[] items) {
this.items = items;
}


}

class Canonical{
String href;

public String getHref() {
return href;
}

public void setHref(String href) {
this.href = href;
}

}
class Alternate{
String href;
String type;
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}

}
class Content{
String direction;
String content;
public String getDirection() {
return direction;
}
public void setDirection(String direction) {
this.direction = direction;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}

}
class Origin{
String streamId;
String title;
String htmlUrl;
public String getStreamId() {
return streamId;
}
public void setStreamId(String streamId) {
this.streamId = streamId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getHtmlUrl() {
return htmlUrl;
}
public void setHtmlUrl(String htmlUrl) {
this.htmlUrl = htmlUrl;
}

}
class StarredItem{
boolean isReadStateLocked;
long crawlTimeMsec;
long timestampUsec;
String id;
String[] categories;
String title;
long published;
long updated;

Canonical[] canonical;
Alternate[] alternate;
Content content;
Content summary;
String author;
String[] comments;
String[] annotations;
Origin origin;

public long getCrawlTimeMsec() {
return crawlTimeMsec;
}
public void setCrawlTimeMsec(long crawlTimeMsec) {
this.crawlTimeMsec = crawlTimeMsec;
}
public long getTimestampUsec() {
return timestampUsec;
}
public void setTimestampUsec(long timestampUsec) {
this.timestampUsec = timestampUsec;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String[] getCategories() {
return categories;
}
public void setCategories(String[] categories) {
this.categories = categories;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public long getPublished() {
return published;
}
public void setPublished(long published) {
this.published = published;
}
public long getUpdated() {
return updated;
}
public void setUpdated(long updated) {
this.updated = updated;
}


public Canonical[] getCanonical() {
return canonical;
}
public void setCanonical(Canonical[] canonical) {
this.canonical = canonical;
}
public Alternate[] getAlternate() {
return alternate;
}
public void setAlternate(Alternate[] alternate) {
this.alternate = alternate;
}
public Content getContent() {
return content;
}
public void setContent(Content content) {
this.content = content;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String[] getComments() {
return comments;
}
public void setComments(String[] comments) {
this.comments = comments;
}
public String[] getAnnotations() {
return annotations;
}
public void setAnnotations(String[] annotations) {
this.annotations = annotations;
}
public Origin getOrigin() {
return origin;
}
public void setOrigin(Origin origin) {
this.origin = origin;
}
public Content getSummary(){
return summary;
}
public void setSummary(Content summary){ this.summary = summary; }


}

jQueryイベントハンドラ

keydown(または他のキーボード押下イベント)で、どのキーが押されたかを知りたい

Eventオブジェクトの、whichを使う。

ちなむと、
A65
...
Z90

2013年7月29日月曜日

starred.jsonをとりあえず読み込むcoffeescript

先のplay framework上で、Google Readerのスターを読み込むためのcoffee scriptです。

Jacksonでごりごり書いているのとは違う大変さがありましたが終わってみると楽だなあという印象。

$ ->
 $.getJSON "/assets/starred.json", (data) ->
  $.each data.items, (index, item) ->
   $("#gr").append "<li><a href='" + item.alternate[0].href + "'>" + item.title + "</a></li>"

#システムの都合上、li, aタグは全角を使っています。

javascriptの呼び出し側に、id=gr属性を設定した、リスト要素が必要です。



JavaScriptへの変換はこちら。要jQueryです。


$.getJSON "/assets/starred.json", (data) ->

 →publicフォルダに配置したファイルはplay framework上では/assetsディレクトリとして見えています。

また、

    "alternate" : [ {
      "href" : "http://eruchee.blogspot.com",
      "type" : "text/html"
    } ],

これは配列を表しているので、

item.alternate[0].href の[0]をきちんと書かないとundefinedとなるというところで延々悩みました。JSONを知らない故のつまずきでした。

2013年7月21日日曜日

IntelliJ IDEA

Java あるいは Android向けのIDE

play frameworkのチュートリアル動画を見た時に、便利に見えたので、
これまでeclipseを使っていましたが、こちらに行ってみようかなあという感触もあります。


IntelliJ IDEA
Community版は無償(オープンソース)です。

日本語化

日本語化パッチ

導入方法

解凍して得られるresource_jp.jarファイルを IntelliJ IDEA のlibフォルダに格納します。

ただし、日本語のフォントを有効にしておかないと、日本語の部分が□□□□□となってしまうようです。
  1. [File]→[Settings]→左側のツリーから[Appearance]を選択します。
  2. 右側設定項目の UIOptions の中から、Override default fonts by (not recommended) に
    チェックを入れます。
  3. 日本語が利用できるフォントを選択します。

ビルドパスの追加


Eclipseからお引越しをしてきて、非常にわかりづらかった部分でした。設定の入り口が違うので、探すのが困難でした。

  1. 「ファイル」メニュー→「プロジェクト構造」 の順にクリックします。
  2. 左側の一覧から「SDK」を選択します。
  3. Classpath / Sourcepath など、必要なパスを編集します。





Play Framework

Play Framework

英語版

動画を見ると結構あっさりWebアプリケーションが作れるんだなあという印象。

サーバもDBも内包しているので構築も簡単。

$ を通常のプロンプト
[アプリケーション名] $ をplay frameworkのプロンプトとします。
 →例) [application] $

コンソール / 開発モードでのサーバの起動


コンソールの起動

$ cd application_path
$ play

開発モードでのサーバの起動

[application] $ run

または、

$ cd application_path
$ play run

運用モードでのサーバの起動

$ play start


2013年6月21日金曜日

FeedlyがOperaにもInternetExplorerにも対応

公式blogより。

7月1日のGoogle Reader終了に間に合うように作業してたんですね。
よかったよかった。

というわけで今後はOperaでFeedlyを使っていこうと思います

2013年6月13日木曜日

プログラムでの座標の扱い方.行の左上の座標

Java - Viewport



定義:
(1)ビューポイントの基準点(表示されているテキストエリアの左上)の座標
(2)3行目のテキストの左上の座標


テキストエリアのテキストを(1)から3行目までスクロールさせたとき、(3)' のラインと(3)のラインが重なるようにビューポイントを定義したいと思います。

このようにプログラムを定義すると、テキストエリア上で一行単位のスクロールを実現することができます。

そのためには、スクロールされたとき、4行目が(3)の位置までスクロールされた時に、その行の左上の座標(2)を取得する必要があります。


JViewport jv = this.scrollPane.getViewport();  
Point p = jv.getViewPosition();                      //4行目1文字目のどこかの座標が入ります。
int ptm = this.textArea.viewToModel(p);         //(2)の座標までの文字数(オフセットが入ります)
try{
   Rectangle mtv = this.textArea.modelToView(ptm);
        //取得したオフセットから、左上の座標を取得します。これが(2)です。
   System.out.println("ChangeViewState" + p + " ptm :"+ ptm + " mtv:" + mtv.getX() + ", " + mtv.getY());
   p.setLocation(mtv.getX(), mtv.getY());
   this.scrollPane.getViewport().setViewPosition(p);  //mtvの座標を新しいテキストエリアの表示位置に設定します。
}catch(Exception ex){
   ex.printStackTrace(); //例外対策※2
}

getViewPositionを実行した段階では、まだ左上の座標が取得できていません。そこで、

  1. viewToModelメソッドによりその1文字目のオフセットを取得する
  2. modelToViewメソッドにより項番1の文字の左上の座標を取得する

という処理を追加することで、(2)の座標が取得できるように補正しています。

※スクロールすると、その分大きくなります

※2代表例として、テキストエリアが空の場合、例外が起こります


この応用によって、行の左上の座標を取得できるようになります。(yet)


.net(C#, VB.net)

円弧の座標


http://www.atmarkit.co.jp/fdotnet/dotnettips/377screentoclient/screentoclient.html

TreeViewとNodesの座標

TreeViewクラスは、構成するノードのクラスTreeNodeを複数持っており、これらのクラスはそれぞれに座標情報を持っています。TreeViewクラスも、TreeNodeクラスもBoundsや時にPositionを持っているということです。

本稿はこの座標関連のプロパティについて整理してみたいと思います。

Opera15

あれー、ブックマークどこいったー?

スタッシュボックスって何?

ブックマークのインポートがグレーアウトされてる。
開発版だからまだってこと?

2013年5月30日木曜日

調査中とか諸々


調査中
  • Opera + MS-IME で突然漢字変換ができなくなる件
疑問
  • Facebookに見知らぬ人(女性)が友人申請をかけてくる
  • blogspotにアダルトサイトのRefererが大量に出現する
これって広告の類?SPAMなの?

2013年5月23日木曜日

[Java + JSON] Google Readerのスターをなんとかして扱いたい

Post Google Reader より、Star情報の取り扱いについては、有益な情報を見受けることができていません。Webアプリケーションとして公開できるほどのリソースを持っていないので完璧とは言えませんが、Starredに格納したデータを処理できるようなアプリケーションの開発を考えたいと思います。


2013年4月30日火曜日

amebloの画像へリンクするブックマークレット ver 0.2

ver 0.1はこちら

若干の手直しを加えました。
これによって、txxxxxxxxx_yyyyyyyyy.jpgのような形式(桁数適当)ファイル書式で指定されている、小さめサイズの画像を、オリジナル?oyyyyyyyyyyyy.jpgに置き換えます。


javascript:(function(){ var _d = document; var array = _d.body.innerHTML.match(/("|')([^"']+?\.)(jpg|gif|png|bmp|jpeg)("|')/ig); if(!array) return alert('見つからなかった。'); var exist = {}; for(var i=0; i < array.length; i++) { if(!exist[array[i]]) { array[i]=array[i].replace(/t\d\d\d\d\d\d\d\d_/,"o"); _d.write('<a href=' + array[i] + '><img src=' + array[i] + '></a>'); exist[array[i]] = 1 }} _d.close()})()

2013年4月21日日曜日

[C#][WinAPI]キーボードフック

WM_????_LLのみフックできる。DLLはいらない。 (途中)

[C#][WinAPI]クリップボードへのフック

メッセージは、protected override void WndProc(ref Message m)
を、オーバーライドして必要なものだけを処理する。
今回は、WM_DRAWCLIPBOARD と、 WM_WM_CHANGECBCHAIN の2つ。

SetClipboardVirewerにセットするインスタンスのウインドウハンドルは、this.Handle


(要調査)ハンドリング対象外のメッセージは、継承元へ投げなきゃしなくちゃいけないはずだった。
base.WndProc(ref m);
こういうイメージです。

参考 http://www.radsoftware.com.au/articles/clipboardmonitor.aspx    
    http://mastercsharp5.appspot.com/question/5080eaad4f1eba38a4bfe6c6

2013年4月12日金曜日

Post Google Reader

最近の動向を押さえていなかったのも宜しくなかったのかもしれませんが、この度の、Google Readerの終了はBlogを全部RSSとATOMでまとめて読んでいたので大変困っております。

代替策を考えなくては…。

 要件


 長くなるかもしれないので下に記載

2 候補

1) feedly http://www.feedly.com/


2) The OLD READER http://theoldreader.com/

  • Google Readerからの移行に数ステップを要する
    ReaderからOPMLをエクスポートし、OLD READERへIMPORTする)
  • 各RSSで最新20件の記事までがインポートされる様子…これも併用期間で対処しなくてはいけない様子
  • バックグラウンドでタブを開くGoogle Chrome拡張
  • 設定より
    • Scrolling through posts marks them as readはオフ(スクロールしてフィードの一覧を見ると既読になる)
    • Show only those folders/feeds that have unread itemsはオン(左側のフィード一覧のうち、未読があるフィードのみ表示する
  • Opera対応
  • (5月13日追記)既読・未読を引き継げない
    • 5月22日追記 既読・未読の引き継ぎはあきらめました。
  • 6月13日追記)古い記事が結構すぐに消えてしまって、未読が20件程度しか保持できていないように見える。うーんこれは問題だ。
というわけで試用を止める。 
5月23日追記 試用再開 未読を併用期間を取ることで吸収できそうだと判断しました。

3) Livedoor RSSリーダー

試してます

  • 未読件数は引き継げない。これは仕方がないのだとあきらめるしかないのかもしれない。
    その分、GoogleReaderとの併用期間が必要なのだと考えた
  • ショートカットキーがGoogle Readerと異なる。かなり異なります。
  • 未読の単位がRSS/Feed単位 記事単位で未読にできないと困ります。
  • 推奨環境はIE / FireFox








ameblo関連ブックマークレット

13/04/30追記 変更を加えました。 


アメーバブログ(アメブロ)の画像を保存する方法(2013年2月現在)から挙動を把握して、Operaから使うため、ハイパーリンクを追加。

かろうじて、なんとなく解るレベル。



javascript:(function(){ var _d = document; var array = _d.body.innerHTML.match(/("|')([^"']+?\.)(jpg|gif|png|bmp|jpeg)("|')/ig); if(!array) return alert('見つからなかった。'); var exist = {}; for(var i=0; i < array.length; i++) { if(!exist[array[i]]) { _d.write('<a href=' + array[i] + '><img src=' + array[i] + '></a>'); exist[array[i]] = 1 } } _d.close()})()

2013年3月2日土曜日

2013年2月2日土曜日

[Java]ファイル入出力

Java ファイルの入出力

Stream バイナリ



java.io.*


Onputに対応してInputがある。


Reader/Writer テキスト



例外