Amazon.co.jp ウィジェット PC破壊日記的ブログ

Home

PC破壊日記的ブログ

このサイトの情報

このサイトについてお知らせします。
アドレス:http://www.pc-diary.com
このブログ直接:http://blog.pc-diary.com/ 、 もしくは、http://www.pc-diary.com/blog/
本家「破壊神 ホームページ」:http://1st-site.pc-diary.com/
tmproxy.exeについてはこちら→http://pc-diary.com/extra/tmproxy.html
DoCoMoパケット計算機はこちら→http://pc-diary.com/imode/
Outlook Express メールボックスサイズ容量警告プログラムはこちら(Vector)→http://www.vector.co.jp/soft/win95/net/se475524.html

ゲームソフト感想その1→巫女みこ☆かがみん


2018年になったので2017年を振り返る

このエントリーをはてなブックマークに追加

あけましておめでとうございます。本年もよろしくお願いします。

さて、2018年になりましたので、昨年2017年を振り返ってみます。
昨年はあちこち行った記憶が強いのですが、どうでしょうか。とくに大洗町は今年だけで3回は行った記憶があります。

  • 1月1日:初詣
  • 1月15日:コミックトレジャー29(インテックス大阪)
  • 1月29日:紅のひろば(蒲田Pio)
  • 1月~3月:COCO'S
  • 2月4日:伊勢神宮参拝
  • 2月12日:幻想郷サミット(名古屋国際会議場)
  • 2月19日:ポプテピピック ポップアップショップ(名古屋パルコ)
  • 2月25日:オートレストラン長島 訪問
  • 2月27日:ポプテピピックカフェ(プリンセスカフェ 名古屋駅)
  • 3月15日:田縣神社 豊年祭(田縣神社 犬山市)
  • 3月19日:ストリートフェスタ(大阪 日本橋)
  • 3月25日:大洗町散策(+ガルパンうぉーく)、クックファン たぶん2回目(茨城県大洗町)
  • 3月26日:東方合同祭事伍(東京都 蒲田 大田区産業会館Pio)
  • 4月2日:東方名華祭11(愛知県 ポートメッセ名古屋)
  • 4月16日:げんましんM@ster(大阪府 京セラドーム大阪)
  • 4月30日:うさばらし(愛知県 名古屋PARCO)
  • 5月6日:コミティア120(東京都 ビッグサイト)、竹仙堂(東京都 代田橋)、博麗神社例大祭14前日設営(東京都 ビッグサイト)
  • 5月7日:博麗神社例大祭14(東京都 ビッグサイト)
  • 5月13日:Happy UFO Party 2017(東京都 吉祥寺CLUB SEATA)
  • 5月21日:すいかといっしょ肆(東京都 蒲田 大田区産業会館Pio)
  • 6月4日:平安神宮参拝、古明地こんぷれっくす よっつめ(京都府 みやこめっせ)
  • 6月11日:東方幻想紅魔祭2(愛知県 名古屋国際会議場)
  • 6月17日:魔法陣グルグル アニメ先行上映会(東京都 丸の内ピカデリー1)
  • 6月18日:SUPER COMIC CITY東京140(東京都 ビッグサイト)
  • 6月25日:東方遊宴雀(京都府 みやこめっせ)
  • 7月9日:コスモール(愛知県 イオンモール名古屋みなと)
  • 7月16日:大洗町散策(+ガルパンうぉーく)、曲がり松夜市(茨城県大洗町)
  • 7月17日:博麗神社夏祭り(東京都 アトレ秋葉原)、魔法陣グルグル2 八巻サイン会(東京都吉祥寺 BOOKSルーエ)
  • 9月3日:コミックトレジャー30(大阪府 インテックス大阪)
  • 9月16日:萃夢荘 酒造り体験会&お泊まり会(愛知県 関谷醸造 ほうらいせん吟醸工房、中野屋旅館 萃夢荘)
  • 9月18日:京都東方合同[文々。新聞友の会](京都 パルスプラザ)
  • 9月30日:ぷよ主義9(東京都 蒲田 大田区産業会館Pio)
  • 10月1日:スーパーヒロインタイム(東京都 蒲田 大田区産業会館Pio)、魔法陣グルグルコラボ(東京都 アトレ秋葉原)
  • 10月8日:ホココス2017秋(愛知県名古屋市栄)
  • 10月14日:大洗町散策(+ガルパンうぉーく)
  • 10月15日:博麗神社秋季例大祭2017(東京都 ビッグサイト)
  • 10月22日:東方紅楼夢13(大阪府 インテックス大阪)
  • 10月29日:コスモール2017秋(愛知県 イオンモール名古屋みなと)
  • 11月4日:明野駐屯地_航空自衛隊航空祭(三重県 陸上自衛隊明野駐屯地)、伊勢神宮外宮参拝
  • 11月11日:おたコス8前夜祭(三重県 万協製薬)
  • 11月12日:おたコス8、多気おいない祭(三重県 万協製薬ほか)
  • 11月18日:ゆるキャラグランプリ2017(三重県 ナガシマスパーランド)
  • 11月19日:あんこう祭(茨城県大洗町)
  • 11月20日:魔法陣グルグル大原画展(東京都 西武池袋本店)、けものフレンズ 吉崎観音コンセプトデザイン展(愛知県 名古屋PARCO)
  • 12月2日:Intel 第8世代Coreプロセッサ発売イベント(大阪府 日本橋)
  • 12月9日:ガールズ&パンツァー最終章第1話鑑賞(大阪府 TOHOシネマズなんば)【※2回目以降は記載しません】

ええ・・・多くないですかこれ・・・。しかも大洗町は今年だけで4回行ってる・・・。
東京だけでカウントしても10往復・・・。正直行きすぎ。これだけで移動費用軽く20万はかかってる計算。
ほんと、今年はいろいろなイベントに参加したんだなぁと。

さて、今年前半でコスプレは終了した・・・はずなのですが、結局京都と大阪で2回してますね、これ。なんかこのままずるずるとときどきコスプレしてるような感じはします。

で、今年ですが、たぶん昨年とあまり変わらないかなと。毎週土日にどっか行くような気はしますけど、そればっかだと実生活に影響出るのでほどほどにかな。あと、新規開催のイベントには積極的に参加したいかなと。応援したい。
あと、あちこちのイベントでスタッフじゃないのにスタッフみたいなコトしてましたね。臨時ヘルプ。この姿勢は大事にしていきたいかなと。

それでは、今年もよろしくお願いいたします。


2017年度流行語大賞をざっくりとコメントする

このエントリーをはてなブックマークに追加

今年もやってきたよくわからない「流行語大賞」2017年度版。
超ざっくりとした私見を書きます。
なおこの記事に対するコメントは、誤字脱字の指摘を除き禁止です。

*流行語大賞

・インスタ映え

略語です。「Instagramでの投稿に耐えうるような写真を撮る、または撮った写真、またはその行為」ですね。
私はInstagramを使用していないのでよく分からないのですが、一般的に「美しい・目立つ・キレイ」な写真を撮ることだと感じています。
しかし、あまりにも度が過ぎる行為も中にはあるそうで。例として、撮影のためだけに注文して料理を残して帰ることがあったとか。食べ物を残すのは良い行為ではありません。お店での後処理も大変なのですよ?

・忖度

国会で使われたのが今年の最初かな?「他人のお気持ちを推し量ること」が語義のようです。
実際、一部野党がむやみやたらに使いすぎているように感じますが。
意味が分かりづらいからやめてほしいです。ほんとに。
なお、この言葉はファミリーマートのTwitterアカウントで「次に出して欲しい商品」の候補のひとつでした。そして流行語大賞の発表日である12/1に本当に「忖度御膳」が発売されました。
実際、企画そのものは数ヶ月前から進行しているものなので、選ばれるだろうという先見の明があったのは素晴らしいと思います。

*トップテン

・35億

よくわからないです。金額だけでは。なので調べました。
どうも芸人(ブルゾンちえみ)の「男は世界に35億人居る」が元のようです。
分かりづらい。流行ったのこれ?
過去の例に漏れず、じきにテレビから消えるでしょう。

・Jアラート

ミサイル等、日本本土に危機が迫ったことを察知して、落下前に知らせるシステムですね。実際、数回このシステムは発動しました。
ただ、受信環境が結構複雑で、「MNOキャリア(DoCoMo、au、Softbank)のSIM+各々のMNOが発売する携帯/スマートフォン(iPhone含む)」でないと、ほとんど受信に失敗するようです(実際に受信失敗した)。どうもETWSとは違うようです。
なお、実際にミサイルが落下するのが日本本土でなくても鳴ります。これは発射直後からある一定の時間内で日本本土に落ちることが予想されると判断された場合に即使用されるからです。そうでないと逃げる、備えるが出来ないですからね。

・睡眠負債

これもあまり分からないので検索。
どうも睡眠不足などによる寝不足症状の積み重ねのことを指すようです。
とはいっても、寝だめでは改善しないので、規則正しく生活する、寝過ぎない、起きすぎない、しか効果的な解決法は無いように思えます。

・ひふみん

将棋界の重鎮、加藤一二三九段その人。なお実力は一千二百三十九段じゃなく九段です。かとうひふみ くだんです。良くネタにされるようですが。
お堅い人かと思いきや、結構フランクな方のようで、将棋界のみならずTwitter上でもその活躍は止まることを知りません。自らに関わることなら積極的にリツイートされているようですし。

・フェイクニュース

朝日新聞とテレビ朝日のことですね。はい。それだけかって?それだけだよ。いい加減廃業して下さい。

・プレミアムフライデー

政府発案、正確には経済産業省が主導する、「金曜日の午後三時以降を休暇にし、その分楽しもうぜ!」なキャンペーン。
といっても、なかなか休めないのは事実ですし、飲食業などのサービス業じゃそうもいかないのもまた事実。
で、このことについてある企業が苦言を呈したらなんと経済産業省の中の人がその会社に来たようで。といっても批判とかではなく、プレミアムフライデーの真の意図を語って下さったようです。

その対談記事はこちら。
https://cybozushiki.cybozu.co.jp/articles/m001366.html
実は金曜日にこだわる必要が無いのは最大のポイント。名は体を表さないのです。

・魔の2回生

政治関係の用語らしいです。どうもこの2回生に当たる方達は不祥事が多かったようで。
それ以上コメントしづらいです。

・○○ファースト

アメリカ・トランプ大統領のアメリカファースト、小池都知事の都民ファーストが代表例でしょうか。トランプ大統領のアメリカファーストの考えは大事なことだと思います。
日本も「日本ファースト」「日本国民ファースト」でいきたいものです。特に政治家の方、切にお願いします。

*選考委員特別賞

・9.98

陸上の桐生祥秀選手が出した100m走の記録。ついに日本も9秒台の領域に突入したか、と感動もひとしお。
・・・でもそれしか該当する数字無いような。

・29連勝

なんと将棋関連から2つも。こちらは藤井聡太4段の記録ですね。なんとデビュー戦から公式戦29連勝という快挙。しかもデビュー戦初対局は先に名前を挙げた加藤一二三棋士その人。
さらに最年少記録も加藤一二三棋士が持っていたのをついに更新。この二人の出会いは運命なのかも知れません。
是非とも、最高齢記録や現役棋士の年数まで追い越すよう、がんばってもらいたいものです。

再度言いますが、上記は事実や記録、またはそこからの私見です。反論は一切受け付けません。


  • コメント不可
  • トラックバック不可

久々の初期不良:ITPROTECH USB3.0 10+3ポートハブ

このエントリーをはてなブックマークに追加

やはり私は初期不良から逃れられないようで・・・。

さて、今回初期不良が発生したのは、ITPROTECH社製USB3.0ハブ(10ポート+充電専用3ポート)。
今までANKER社製のUSB3.0ハブを使っていたのですが、どうも故障したらしくどのポートも使えなくなっていました。そこでその代わりとして購入したのがこの機種です。購入場所はオンラインショップ Just MyShopです。いろいろ割引を使ったので約5400円に。

そして数日前に到着したので、さっそく接続テストしたのですが、ポート1だけは正常に動くものの、それ以外のポート(2~10)では反応した後無反応、その後PC側がエラー「USBデバイスを正常に認識できません」の表示に。
このUSBハブは電源スイッチ(デバイスに電源を供給するスイッチ)があるのですが、それをOFFにすると反応せず、ONにするとエラーという始末。
ちなみに、充電ポート(11~13)は正常に動作しているようで、充電は正常にできました。
なお、接続テストに使用したのはUSB3.0フラッシュメモリ2種、USB3.0接続HDDケース(HDD入り)。この調査中の副作用か検証前から壊れてたのか、この検証中にUSBメモリ1個(128GB Sandisk)完全に壊れました。まあデータ何も入っていませんでしたが。

でこの事実をメーカーに伝えたところ初期不良との判断、それをショップに伝えて交換と相成りました。なお交換後の製品は正常に動作しているようです。(USB3.0メモリ3本で確認)

なお、調べたところ初期不良は13か月ぶり28度目のようです。Surface Pro 3の初期不良は2回と考えると13か月ぶり29度目となりますが、この辺どう扱うかねぇ...


---広告という名の商品紹介--- JUSTロゴ入 オールスイッチ式 ハイブリッド USB3.0ハブ - USB3.0×10ポートと2.4A充電専用×3ポートを装備 全ポートにON/OFFスイッチと通電LED搭載
https://www.justmyshop.com/app/invite/cfbec6503f92edabb5e947b23aa2171c

Microsoft OneDrive for Androidでファイルをダウンロードするとデータが化けることがある、その原因とは?

このエントリーをはてなブックマークに追加

Microsoftがサービスを提供しているクラウドストレージサービス、OneDrive。Windows10では標準機能の一つとして存在し、最もWindowsとの親和性が高いクラウドストレージです。そして、その他のPCやモバイルデバイスでも使用可能なように、ブラウザでの操作のほか、AndroidやiOS(Macintosh, iPhone, iPadなど)、Windows Phoneでもアプリとして環境が提供されています。これにより、主要なデバイスの間でファイルのやりとりが簡単にできます。私もよく愛用しています。

説明はこれぐらいにして。
今回トラブルが発生しました。
ある一つのファイル(zipファイル、774kB)をAndroid版OneDriveアプリにてダウンロードしたところ、極端に小さいファイルが生成されました。ファイルサイズは約6kB(6.56kB)。
最初はダウンロード失敗かなと思ったのですが、5回ダウンロードして全てほぼ同じファイルサイズである6.56kBに。その後、ファイル名のリネーム、拡張子の変更、保存場所の移動、Windows10 PC上に一旦コピーして別のフォルダへの書き戻し、と行ったものの、Android版OneDriveアプリでのダウンロード結果はいずれも同じ、6.56kBのファイルがダウンロードされるだけでした。なお、この現象が発生するのはこのファイルだけで、他のzipファイルを一つダウンロードしても問題なくダウンロード出来ました。

ここで気になったのは、ほぼ同じサイズのファイルが生成されていること。こんな感じになってしまいました。

Screenshot_20170415-084426

なので、一度この6.56kBのデータをBluetooth経由でWindows PCにコピーして中身を確認してみました。
すると、中身はなんとHTMLデータ。
タイトルタグは「Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.」
そしてこのHTMLファイルはリダイレクトが設定されていたのでURLを確認すると、「26avres%3DScanError%26averror%3DLIMIT_REACHED%26page%3Dviruswarning&」という文字列が含まれていました。
ひょっとして・・・?と思い、このファイルの拡張子をHTMLに変更した上でブラウザで開いてみると、下記のような画面が表示されました。

2017-04-13 (1)_

つまり、OneDriveがブラウザからのダウンロード時に行っているウイルススキャンが実行完了できず、そのために警告を出している画面でした。(ウイルススキャンはどのタイミングで行っているかは正確には不明です)
これが、Android版OneDriveアプリでのダウンロード時のデータ化けの正体でした。つまり、Android版OneDriveアプリでのダウンロードはブラウザと同じアクセス方法で行っていると推測されるため、それゆえウイルススキャン画面に移動、ただしアプリではそれを感知できず、表示された画面=ダウンロードすべきファイルと判断してダウンロードしたのだと考えられます。

こんなこともあるんだなぁと感じた日でした。
ちなみに、このファイルの中身はtar.gzファイルなのですが、その解凍に極めて時間がかかるものだったので、途中でウイルススキャンがギブアップ、いや、タイムアウトしたのではないかと。

Twitterのタイムライン(TL)をnode+MongoDBで保存、Ruby+Sinatraで表示できるようにしてみた。

このエントリーをはてなブックマークに追加

Twitter、私も利用しているのですが、フォロー数が多くなると問題となるタイムラインの流速問題。そうでなくても、公式クライアント含む各種Twitterではタイムラインの保存に限度があるので、過去の物を検索しようとしても不可能か、かなり困難です。
ならばTLを保存すれば良いのではないか?ということで、いろいろ調べた結果、「Twitter APIで取得できるデータはJSON形式、なのでMongoDBと親和性高い」ということで、この方向で進めることに。

参考にしたサイトが多数にわたるため、本記事の最後に記載します。参考にさせて頂いたことに感謝します。

1. 前準備

まずはRuby、node、MongoDBをインストール。私の環境はubuntu16.04 LTSですが、他のLinuxディストリビューションでも同様の環境は準備可能だと思います。ただ、できればOS/MongoDBは64bitを推奨。(データベースのサイズ制限、メモリ制限ほか様々な制限のため)

また、各ソフトウェアの細かい設定はしていない(標準設定のまま)なので、必要に応じ情報を収集して対応して下さい。


sudo apt install ruby
sudo apt install nodejs-legacy
sudo apt install npm

MongoDBについては、ubuntu16.04 LTSで標準のaptリポジトリでインストールされるパッケージが古すぎる(2.6.x系)ので、MongoDBの公式のインストール手順に従って3.x系をインストールして下さい。(2.6.x系だとソート時にソート用バッファメモリ不足が発生し、かつ回避が困難です)

Install MongoDB Community Edition on Ubuntu -- MongoDB Manual 3.4
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

一応、MongoDBが64bitでインストールされているか確認。


user@hoge:~$ mongo
> use admin
switched to db admin
> db.runCommand("buildInfo")
(中略)
"bits" : 64,
(後略)

問題無さそう。

ライブラリも必要。(途中で必要になる)

sudo apt install ruby-dev

次はnode用パッケージのインストール。

次はRuby-gemのインストール

2. MongoDBのアクセス制限の設定

MongoDB 3.6はパフォーマンスやセキュリティの関係で色々ワーニングが出ます。公式マニュアルにも記載がありますが、他にも日本語での説明ページがあったのでリンクしておきます。

MongoDB 3系を CentOS7 にインストール - Qiita
http://qiita.com/SOJO/items/dc5bf9b4375eab14991b

これ以外にも公式マニュアル他を参照して設定して下さい。まあデフォルトのままでも動きますけどね・・・。

3. TwitterのAPI KEYを取得する。

これはあちこちに解説記事があるので省略したい。必要な権限はツイートの読み取り権限のみです。書き込みはしないので今回は不要です。
consumer_key, consumer_secret, access_token_key, access_token_secretの4つのキーを後で使います。
一応、API申請ページにリンクしておきます。

4. Twitter TL取得用のスクリプトの作成。(前準備含む)

タイムライン取得にはMongoDBと親和性のあるNode.jsを利用します。まずはスクリプトの保存フォルダの作成と必要なライブラリの入手。


$ mkdir tw2db
$ cd tw2db
$ npm install mongoose
$ npm install twitter

次に、スクリプトの作成。これは下記サイトの内容そのままで動いたので丸パクリです(汗)
ただし、MongoDBのユーザー認証を有効にしているので、そこだけ改変しています。 Twitter の TL を全部 MongoDB にぶち込んでニヤニヤする - 凹みTips


var twitter  = require('twitter')
  , mongoose = require('mongoose')
  , Schema   = mongoose.Schema
;

// typeof で得た文字列を型に変換
var typeMap = {
        number   : Number,
        string   : String,
        boolean  : Boolean,
        object   : Object,
        function : Function
};

// オブジェクト/配列を受け取って Mongoose 用 Schema に変換
function makeSchema(data) {
        var schema = {};
        for (var x in data) {
                var type = typeof data[x];
                if (data[x] === null) {
                        schema[x] = Object;
                } else if (type === 'object') {
                        schema[x] = makeSchema(data[x]) ;
                } else {
                        schema[x] = typeMap[type];
                }
        }
        return schema;
}

// MongoDB へ接続
mongoose.connect('mongodb://dbuser:dbpasswd@localhost/Twitter');

// mongoose のスキーマ
var PostSchema, Post, isSchemaDefined = false;

// Twitter へ接続
new twitter({
        consumer_key        : 'XXXXXXXXXXXXXXXXXXXXXXXX',
        consumer_secret     : 'XXXXXXXXXXXXXXXXXXXXXXXX',
        access_token_key    : 'XXXXXXXXXXXXXXXXXXXXXXXX',
        access_token_secret : 'XXXXXXXXXXXXXXXXXXXXXXXX'
}).stream('user', function(stream) {
        stream.on('data', function(data) {
                // Friends リストのデータはすっ飛ばす
                if ( !('id' in data) ) {
                        return;
                } else {
                        console.log(data.user.screen_name, data.text);
                }

                // 最初のデータで Schema を作成
                if (!isSchemaDefined) {
                        PostSchema = new Schema( makeSchema(data, '') )
                        Post       = mongoose.model('Post', PostSchema)
                        isSchemaDefined = true;
                }

                // Post Schema から保存用のデータを生成して保存
                var post = new Post(data);
                post.save( function(err) {
                        if (err) console.error(err);
                });
        });
});

// 例外処理
process.on('uncaughtException', function (err) {
        console.log('uncaughtException => ' + err);
});

もちろんconsumer_key, consumer_secret, access_token_key, access_token_secretの部分は2.で取得した情報と書き換えて下さいね。
あと、ユーザー認証をする場合とユーザー認証をしない場合で、下記の行の修正が若干異なります。


*ユーザー認証する場合
mongoose.connect('mongodb://dbuser:dbpasswd@localhost/Twitter');
上記のdbuser、dbpasswdを置き換えて下さい。
*ユーザー認証しない場合
mongoose.connect('mongodb://localhost/Twitter');

あとは、動作テスト。


node tw2db.js

これで、自分のタイムラインに流れているツイートと同じものが流れてくるはずです。

5. Node.jsの自動起動と、自動Kill(cronで)

まずはNode.jsの起動を自動化します。これは下記ページを参考にして下さい。私はinit.dでサービス起動する形にしました。

initd-foreverでNode.jsアプリをデーモン化する | Developers.IO
http://dev.classmethod.jp/server-side/daemonize-nodejs-by-initd-forever/

Node.jsが重すぎるのか、一日以上経過すると頻繁にフリーズしているので、自動killするためのスクリプトを作ります。 cronで実行するので、シェルスクリプトに。ファイル名は例えば「autokill.sh」とかで。もちろんchmodで実行可能にするのを忘れずに。

#!/bin/sh

pid=`ps -elf | grep "tw2db.js" | grep -v grep | awk '{print $4}'`
if [ "${pid}" != "" ]; then
kill ${pid}
echo "kill ${pid}"
fi
sleep 2
nohup /usr/bin/node /path/to/tw2db/tw2db.js > /dev/null &

あとはcronに登録しておいて下さい。だいたい1日1回ぐらいでも良いと思います。私は1時間に一回(毎時40分頃)にしていますが・・・。

6. ビューア部分の作成(Ruby+Sinatra)

ある意味ここからが本番。

ビューアに必要なライブラリはこちら。


$ gem install mongo
$ gem install twitter
$ gem install sinatra
$ gem install sinatra-i18n
$ gem install rack-contrib
他にもあったかも・・・

そして、私が作成したスクリプトがこちら。なお、以下5つのファイル/フォルダを作成しています。


~/tw2db/viewer.rb
~/tw2db/views/tweets.erb
~/tw2db/config/application.rb
~/tw2db/config/locales/en.yml
~/tw2db/config/locales/ja.yml
~/tw2db/viewer.rb
require 'rubygems'
require 'mongo'
require 'sinatra'
require 'sinatra/i18n'
require 'rack/contrib'
require 'date'
require 'rack'
use Rack::Deflater
Sinatra.register Sinatra::I18n
#use Rack::Locale

#require './config'
CONNECTION_STRING = "mongodb://dbuser:dbpasswd@localhost/Twitter"
COLLECTION_NAME = "posts"
TAGS = ["mongodb","ruby"]
set :environment, :production

# The Unix epoch is the time 00:00:00 UTC on January 1, 1970
UNIX_EPOCH_TIME = Time.at(0)

# Strict version of +Time.parse+, returns +nil+ when parsing is failed.
def strict_parsetime(string)
  # +Time.parse+ returns localtime "1970/01/01 00:00:00" when parsing is failed.
  # So, ugly, I check whether returned value is UNIX epoch.
  time = Time.parse(string, UNIX_EPOCH_TIME) rescue nil
  if UNIX_EPOCH_TIME == time then
    # Previous +Time.parse+ possibly failed.
    time = nil unless (ParseDate.parsedate(string)[0] rescue nil)
  end
  time
end

def tweet_id2time(id)
  case id
  when Integer
    Time.at(((id >> 22) + 1288834974657) / 1000.0)
  else
    nil
  end
end

def time2tweet_id(time)
  (time.to_f * 1000 - 1288834974657).to_i << 22
end

configure do
  db = Mongo::Client.new(CONNECTION_STRING)
  TWEETS = db[COLLECTION_NAME]
I18n.default_locale = :ja
I18n.locale = :ja
end

get '/' do
    selector = {}

    @search_text=""
    @from_date=Time.at(1288834974657/1000)
    @to_date=Time.now
  @tweets = TWEETS.find({:id => {'$gte'=> (time2tweet_id(@from_date)),'$lte'=>(time2tweet_id(@to_date))}}).sort({"id" => -1}).limit(10000)
  @twcount=@tweets.count()
  erb :tweets
end
post '/' do
  @from_date=strict_parsetime(params[:from_date])
  @to_date=strict_parsetime(params[:to_date])
  if @from_date==nil
    @from_date=Time.at(1288834974657/1000)
  end
  if @to_date==nil
    @to_date=Time.now
  end
  @search_text=params[:search_text]
  @tweets = TWEETS.find({'$and':[{:text => Regexp.new(@search_text)},{:id => {'$gte'=> (time2tweet_id(@from_date)),'$lte'=>(time2tweet_id(@to_date))}}]}).sort({"id" => -1})
  @twcount=@tweets.count()
  erb :tweets
end

今回のスクリプトは外部接続を受け付ける設定「set :environment, :production がそれ」にしています。ここは必要に応じ改変して下さい。
ユーザー認証をする場合とユーザー認証をしない場合で、下記の行の修正が若干異なります。

*ユーザー認証する場合
CONNECTION_STRING = "mongodb://dbuser:dbpasswd@localhost/Twitter"
上記のdbuser、dbpasswdを置き換えて下さい。
*ユーザー認証しない場合
CONNECTION_STRING = "mongodb://localhost/Twitter"
~/tw2db/views/tweets.erb
<!DOCTYPE>
<html>

<head>
  <style>
    body{
      width:1000px;
      margin: 50px auto;
    }
    h2{
      margin-top:2em;
    }
        pre {
            /* Mozilla */
            white-space: -moz-pre-wrap;

            /* Opera 4-6 */
            white-space: -pre-wrap;

            /* Opera 7 */
            white-space: -o-pre-wrap;

            /* CSS3 */
            white-space: pre-wrap;

            /* IE 5.5+ */
            word-wrap: break-word;
        }
  </style>
    <title>Tweet Archive</title>
</head>

<body>
  <h1>Tweet Archive</h1>
  search by Time/Date <form action="/" method="post">
<br>
search string(Regexp)<input type="text" name="search_text" placeholder"文字列を 入れると検索します" value="<%= @search_text %>"><br>
since<input type="text" name="from_date" placeholder="yyyy/mm/dd hh:mm:ss" value="<%= @from_date %>"><br>
until<input type="text" name="to_date" placeholder="yyyy/mm/dd hh:mm:ss" value="<%=
 @to_date %>"><br>
<input type="submit">
</form>
  <% TAGS.each do |tag| %>
    <a href="/?tag=<%= tag %>"><%= tag %></a>
  <% end %>
<br>
search count:<%= @twcount %> <br>
  <% @tweets.each do |tweet| %>
<hr>
    <pre><h2><font size=6><%= tweet['text'] %></font></h2></pre>
    <p>
      <a href="http://twitter.com/<%= tweet['user']['screen_name'] %>">
        <%= tweet['user']['name'] %>
      </a>
      on <a href="https://twitter.com/<%= tweet['user']['screen_name'] %>/statuses/<%= tweet['id_str'] %>" target="_blank"><%= I18n.l Time.parse( tweet['created_at']).to_time , format: :long %></a><%= Time.at(((tweet['id_str'].to_i >> 22 )+1288834974657)/1000.0).strftime("%Y-%m-%d %H:%M:%S.%L %Z") %>

    </p>

    <img src="<%= tweet['user']['profile_image_url'] %>" width="48" />
  <% end %>

</body>

</html>
~/tw2db/config/application.rb

config.time_zone = 'Tokyo'
config.i18n.default_locale = :ja
~/tw2db/config/locales/en.yml、 ~/tw2db/config/locales/ja.yml (どちらも全く同じ内容です)
ja:
  time:
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日 %H時%M分%S秒 %z'
      short: ! '%Y年%m月%d日 %H:%M'

en:
  time:
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日 %H時%M分%S秒 %z'
      short: ! '%Y年%m月%d日 %H:%M'
あとはスクリプトを実行して、ブラウザからアクセスします。

ruby viewer.rb
立ち上げたサーバーのポート4567にアクセスすればOKです。
例:http://192.168.0.1:4567/
検索部分は正規表現ですが、あまり高機能じゃないので過信しないように。

X.参考にしたサイト群

今回は以下のサイトのスクリプトや情報を元に活用しました。本当に感謝です。

* MongoDBのインストール

MongoDBの薄い本(The Little MongoDB Book) - cuspy diary

http://www.cuspy.org/diary/2012-04-17/

* Twitter TLをMongoDBに保存

Twitter の TL を全部 MongoDB にぶち込んでニヤニヤする - 凹みTips

http://tips.hecomi.com/entry/20120908/1347094725

* forever と initrd-foreverで死活監視

Node.js 自動再起動モジュール - Qiita

http://qiita.com/disc99/items/57490f5eef3e2eb685ba

node.js node.jsスクリプトをforeverでデーモン化する -でじうぃき

http://onlineconsultant.jp/pukiwiki/?node.js%20node.js%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92forever%E3%81%A7%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3%E5%8C%96%E3%81%99%E3%82%8B

initd-foreverでNode.jsアプリをデーモン化する | Developers.IO
http://dev.classmethod.jp/server-side/daemonize-nodejs-by-initd-forever/

 

* node.jsの自動Kill(頻繁に固まるので)

node.jsの自動再起動 | 爆裂健.com

http://bakuretuken.com/node-js%E3%81%AE%E8%87%AA%E5%8B%95%E5%86%8D%E8%B5%B7%E5%8B%95/

* Ruby+Sinatraでログを表示する

Ruby MongoDB イン・アクション のTweetArchiverを作成する - 1.21 jigowatts

http://sh-yoshida.hatenablog.com/entry/2016/08/27/025808

* Ruby+Sinatraでpostデータ処理(検索用)

Sinatraでフォームからデータを受け取る方法

http://ruby.weva.jp/sinatra/2013/09/10/params.html

* Rubyでの日付文字列の処理の厳格化

Ruby の Time.parse で文字列を Time に変換するときのエラーチェック

http://www.metareal.org/2007/06/21/error-checking-in-ruby-time-parsing/

*Ruby+Sinatraの日付のロケール処理

RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita

http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

Hideki SAKAMOTO の雑記 (2010-09-26)

http://www.on-sky.net/~hs/index.cgi?date=20100926

Sinatra Recipes - Development - I18n

http://recipes.sinatrasapporo.org/p/development/i18n?


#ZenTour大感謝祭 でZenfone3を貸与頂いたのでレビューしてみる。その3:Zenfone3の良い点、悪い点(改善して頂きたい点)

  • Posted by: ベスリン
  • 2017年1月 8日 09:26
このエントリーをはてなブックマークに追加

過去記事

最後?に、ASUS Zenfone3について、良い点、悪い点(改善してもらいたい点)を列挙していきます。ここの投稿はここまでの投稿と重複する部分が多々ありますので、スルーしていただいても結構です。

※ 良い点

  • 常時LEDライトONによるカメラ撮影が可能。特に近接撮影での失敗が激減できる。
  • リアルタイムHDRで特に明暗混在している場所での撮影がきれいにできる。
  • レーザーオートフォーカスによる高速オートフォーカス、距離測定が可能。
  • DSDSで日本用SIMと海外用SIMの同時待ち受け(発着信通話、SMSの受発信)ができる。(もちろん日本用SIM2枚でもOK)つまり、2つの電話番号の同時待ち受けが可能。
  • Game Genieでお手軽にゲーム画面の録画や配信が可能。
  • Carrier Aggregation(CA)対応なので、対応地域では4G/LTE通信が高速化する。
  • Qualcomm Snapdragon 625 CPUとAdreno 506 GPUによるゲームや動画のなめらかで高速な動作、低消費電力
  • 高速な指紋認証&あらゆる角度での認証によるロック解除、カメラ起動や撮影が出来る。
  • スピーカーが底部にあるので、指で押さえて音量を抑えることが簡単にできる。
  • 専用のフリップカバーを使用可能。また裏側がほぼフラット(カメラ部分を除く)なので、専用品以外のカバーも使えそう。
    専用フリップカバーを装着した状態の写真です。カメラ部分も含めてフラットになり、置いた状態での操作性がさらに向上します。
    DSC01609DSC01610DSC01611

    ※悪い点、改善してもらいたい点

  • シャッター音は小さいものの、動画撮影開始・終了音が若干大きい。
  • ピント合わせ音が大きい。特に、持ち方の関係で手の部分がスピーカーのコーン(?)ボウル(?)形状になりやすく、それにより反響しかなり大きく聞こえる。指で押さえても高音域なので音が小さくなりにくい。
  • Game Genieのボタン、録画中の表示が画面を占有する。全画面の操作や確認が必要なゲームであると、誤爆しやすい。せっかく通知ウインドウという部分があるので、通知ウインドウに機能呼び出しを隠せないのかなと感じる。
    Screenshot_20170107-173204
  • DSDS機能は便利なのだが、優先ネットワークの切替に約1分かかる。(これはAndroidの仕様上仕方の無い部分かも知れませんが)
  • マルチユーザー機能が無い。(Androidの制限かも知れませんが、Zenfone2ではAndroid6.0にアップデートする際にマルチユーザー機能を継続することも可能なので、是非とも有効にしていただきたいところ)
  • SIM2とMicroSDが排他使用であるところ。システム領域で約12GBも使用するため、実質的な空き容量は24GB。4K動画が撮影できるので、多用すると一気に空き容量がなくなるので、どちらかを諦めざるを得なくなる。
  • NFC/FeliCa機能が無い(これは今後に期待でしょう)
  • 防水機能が無い(せめて突然の雨天でも対応可能なレベルでの防水は欲しいかなと)
  • PC Link機能が無い(Windows等からAndroidの画面をミラーリング、操作できる機能)これは今後に期待でしょう。

    ここまでいろいろ書いていきましたが、今回の検証を経て、買いたいかどうかを問われれば、「買い」であると言えるでしょう。ただ価格が若干高い(明らかに海外販売価格と日本での販売価格に剥離がある)ことと、SIM2とMicroSDとの排他使用がネックかなと。後者はせっかくの機能が生殺し状態になっているので・・・。

  • #ZenTour大感謝祭 でZenfone3を貸与頂いたのでレビューしてみる。その2:Zenfone3の新機能を見てみる

    このエントリーをはてなブックマークに追加

    関連記事

    Zenfone3ではZenfone2には無かった新しい機能があります。その一部をご紹介。

    I. Game Genie

    スマートフォンでゲームをする方にはうってつけの機能になるであろうGame Genie。Game Genie対象のゲームアプリを起動すると自動的にGame Genieが起動します(デフォルト設定の場合)対象アプリの判定方法が分からないですが、おそらくGoogle Playで「ゲーム」ジャンルとなっているアプリに対して自動的に有効になるようにしているのでしょう。もちろん、いわゆる「提供元不明のアプリ」や、ゲーム以外のアプリでもGame Genieを有効に出来るように設定できます。

    この機能を呼び出す方法はコントローラのような丸いボタンです。(左写真の左上)これを押すと中央画像(縦画面ゲーム)や右画像(横画面ゲーム)のように機能を呼び出せます。
    Screenshot_20170107-173204Screenshot_20170107-190155Screenshot_20170107-173151

    この機能は以下のようなことが出来ます。

    • メモリ(RAM) 領域の開放【機能名:スピードブースター】
    • ゲーム画面の録画、配信【機能名:ライブ&レコード】
    • インスタント検索(ゲーム名で素早く動画やキーワード検索できる)【機能名:検索】
    • 写真や動画を共有【機能名:共有】
    • 機能を素早く呼び出すためのオンスクリーンボタン

    一つ一つ解説していきます。

    1. スピードブースター
      これは今使用しているメモリの一部を開放して、ゲームに割り当てられるメモリ量が増えることを期待するおなじみの機能。まあこれは標準機能と同じなので省略。
    2. ライブ&レコード
      本機能の最も大きな特徴でしょう。ライブ機能はYouTubeまたはTwitchへのライブ配信が直接行えます。ローカルへ保存を選んで一時保存も出来ます。
      どちらも、フロントカメラ(画面側)で顔と共に配信/保存したりできます。
      お手軽に配信や保存が出来るのは非常にありがたいです。
      とりあえず、一度録画してみました(顔無しでの配信です)
      録画対象はここ最近、ゲームアプリで広告を表示させると頻繁に出現する、「MOBILE STRIKE」です。

      正直、単独でここまで録画できれば上等です。録画中に常時ムービーボタンが出る、Game Genieボタンが出ているのが玉に瑕ですが・・・。
    3. インスタント検索
      これは、今プレイ中のゲームアプリ名を自動的にキーワードに指定して検索し、ポップアップ(?)ウインドウに表示する機能です。動画(Youtube)、Google検索、ブックマークのいずれかを選択できます。ただし、ブックマークはこのミニウインドウ内でブックマークしたものだけを表示できるようです。ちょっとした調べ物には便利かなと。ただ動画を検索する意味ってあるかなぁ・・・w
      画像左から、動画検索、キーワード検索、ブックマークです。ブックマークはこの機能内で右下の★印をタップすると登録できます。
      GG_search
    4. 共有機能
      写真や動画を共有できます。それぞれ選択したあと、共有方法を選択して共有できます。
      ・・・ですが、これをわざわざGame Genie上で行う理由が思いつきませんでした。確かにゲームアプリを中断せずに共有できるのは魅力的なのですが、私の場合、何かしら編集してから共有することが多いので、だいたいゲームプレイ後に行うのですよね。まあ、画面キャプチャや動画撮影した直後に共有するのが楽に出来る、かな。 
    5. Game Genieボタン
      対応ゲームアプリ(またはGame Genieを起動する用に設定したアプリ)を起動した際に自動的に現れます。これがGame Genieを利用可能である合図となります。まあわかりやすいと言えばわかりやすいですね。

    II. DSDSDual-SIM Dual-Standby

    Zenfone2でもDual-SIM Dual-Standbyではありましたが、これはあくまで4G/3G/2G/LTE(SIM1)と2G(SIM2)のみの対応でした。これが、Zenfone3ではどちらのSIMも4G/3G/2G/LTE対応し、どちらも待ち受けできるのです。(ただ同時にLTE待ち受けには出来ないらしいです。同時4Gは対応SIMが無いので検証出来ません)

    私の手持ちのSIMで試してみましょう。なお手持ちのSIMはDocomo SIM、香港聯通SIM(3G対応。日本ではSoftbank) です。
    DSDS-set

    まずは待ち受け画面。ちゃんとDocomoとSoftbank(Unicom-HK)で待ち受けていることが確認できます。Docomoは4G+(CA)の表記になっています。
    Screenshot_20161231-194317

    次はSIM2であるUnicom-HKに、外部から電話を掛けてみました。さすがに海外発信になるため時間はかかりましたが、ちゃんと着信しています。(データ通信はローミングはクッソ高いので、現地に行った際にでも検証します・・・)
    DSDS-recv

    次はSMS発信。現在の料金チェックをSIM2に対して行いました。結果は問題なくSIM2に対してSMSが到着しました。
    DSDS-SMS

    これなら常時2枚刺し運用が出来ますね。

    ちなみに国内用SIMの2枚刺し運用も問題なく運用できるようです。(他のブログ等の情報)これを使えば、必要に応じてデータ通信するSIMを切り替える、なんていう運用が出来そうです。ただ、切替時間が1分ぐらいかかるのですよね・・・。

    III. カメラ機能関連

    Zenfone3のカメラ機能関連は、こんな機能があります。

    • レーザーオートフォーカス
    • 4軸手ぶれ補正[光学式、OIS](静止画)、3軸手ぶれ補正[電子式、EIS](動画)
    • リアルタイムHDR
    • 常時LEDライトON

    それぞれ分かる範囲で解説していきます。

    1. レーザーオートフォーカス
      レーザー光により素早くオートフォーカスが行われます。これをなかなか映像で再現できないのが心苦しいのですが、Zenfone2ではワンクッションあるような感じなのが、Zenfone3ではすでにだいたいピントが合っているような感じです。
      あと、このレーザーオートフォーカスを利用して、距離測定が可能です。インストール済のアプリ「Laser Ruler」で、10cm~150cmまでの距離測定が可能です。
      簡易機能なので、本格的なレーザー距離測定器のように測定位置にレーザー光が当たった状態が見えたりはしないのですが、平面が相手であれば結構正確に測定が可能です。
      (というか、測定位置にレーザー光が当たったのが見えるのであればクラス2のレーザー光出力機器に該当するのでちょっと直視が危険な領域です・・・)
    2. 手ぶれ補正
      Zenfone3では、手ぶれ補正は最高解像度(静止画16M、動画4K)まで対応しています。つまり、手ぶれ補正ONの状態でもZenfone3のカメラ機能を余すところなく使用できるのです。なお、Zenfone2では動画で手ぶれ補正をONにするとHD解像度までに制限されます。
      あまり参考になら無いと思いますが、手ぶれ補正をONにして動画や静止画を撮ってみました。
    3. リアルタイムHDR
      通常、HDR撮影と言えば、後加工(写真を撮影後に加工)が一般的でした。しかしZenfone3では常時HDR撮影が可能です。(なお、HDR Proという機能もあります。おそらくこちらが後加工のHDRでしょう。)
      この常時HDR撮影、何が便利かと言いますと、撮影準備中でも常にHDRが働いているので、撮影後の状態がシャッターを切るときまで常時分かる、ということです。これがどうして便利かは自明の理でしょう。
    4. 常時LEDライトON
      Zenfone3では撮影中常時LEDライトをONにする機能があります。いままではシャッターを切るときにLEDライトが光るため、特に近接撮影ではこのLEDライトが反射してうまく写らないことが多々ありました。(このため、外部ライトを準備して近接撮影することが基本だったのです)
      しかしZenfone3では常時LEDライトがONにできます。このため、その状態で撮影ができるのです。これは撮影時の状態を常時把握できるだけではなく、LEDライトがONになった状態でカメラの補正が働くため、今までのようなLEDフラッシュによる失敗が激減します。
      cam-light

    IV. 指紋認証による高速なロック解除

    Zenfone3では指紋認証によるロック解除が可能です。しかも、スライドして指紋を読み取らせる方式ではなく、タッチして読み取らせる方式です。その認証速度は非常に高速です。公称0.2秒は伊達じゃありません。また、どんな角度でも認証可能です。

    まずは高速認証とあらゆる角度での認証が可能であることをこの動画でご覧下さい。

    そしてこの指紋認証機能、未登録指紋でも以下のことが可能です。(つまり、指紋登録しなくても使える機能があります)なお、下記機能はロック解除中に可能です。

    • 着信応答(ロングタップ)
    • カメラを起動(ダブルタップ)
    • カメラシャッター(カメラ起動中にタップ)

    特にカメラシャッターはグリップ状態でタッチすればシャッターが切れるので、結構安定してシャッターが切れます。

    指紋登録し、その指紋で認証すると、上記に加えて以下の機能が使用可能です。

    • 端末のスリープ/ロック解除
    • 着信応答(制約あります。設定時に注意事項が出ます)
    • スナップコール(この機能の詳細は不明です・・・)

    昔の指紋認証機能はもっぱらロック解除に特化しておりましたが、指紋認証部分を指紋認証以外にも使えるとはちょっと驚きです。高速な認証速度も相まって、非常に便利な機能と言えるでしょう。
    ちなみに、登録した指紋を指紋登録設定画面で確認できます。登録された指紋だと下の写真のように表示されます。(指紋1で触った状態)
    Screenshot_20161231-221614

    Index of all entries

    Home

    2進数時計
    ※クリックで読みやすくなります。
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません
    Search
    Feeds

    Google Adsense
    Tag Cloud

    このページの最初に戻る