2020年5月20日水曜日

Nintendo Switchとリングフィット アドベンチャーを定価で購入した方法(2020年5月)

今日、AmazonからNintendo Switchが届きました。
また、先日リングフィット アドベンチャーもAmazonから届きました。

入手困難な中、探し始めて約1ヶ月・・・どうにか定価で購入できましたので、どうやって購入できたかまとめます。



先に結論から言うと、まず事前に以下2つを準備し、

・商品ページを開いておく+自動再読み込みで商品ページを自動更新
・Twitterの入荷お知らせアカウントのフォロー+通知ON

通知が来たら、商品ページから即購入です。3分間くらいが勝負です。
気づけなかったら諦めて、次の入荷を待ちましょう。
(そもそも夏には落ち着くとのことですので、気長に待てる人は待つのもあり)

以下、詳細な流れをご紹介します。

Twitterで入荷通知→即購入

Twitterで入荷を通知するアカウントをフォロー、通知の設定をしておきます。
通知が届いたら即購入します。

最初からフォローしていたのはこちらのアカウント

しかし、5月7日のAmazon入荷時は確保できず。。。
通知が遅いかもしれないと思い、他のアカウントもフォロー+通知設定。

結果的には、5/11の入荷通知では、一番早かったのはこちらのアカウントでした。

次はこちら

そしてここの順番でした。

Amazonでの購入方法

Amazonで購入する場合のポイントを説明します。

何度も試す

これが大事です。
一度エラーが表示されたり、商品がなくなりました、と表示されても、
何度も繰り返すことで買えました。
おそらく小出しに在庫数を更新しているのでないかなと思います。
諦めずに何度も挑戦してみてください。

「カートに戻す」から購入

これで買えた気がします。
Twitterでもよく聞く話で、普通に商品ページから追加するよりも確度が高いのかもしれません。

出品者一覧からカート追加、購入

入荷しても、普通に表示されないことが多かったです。
その場合、出品者一覧から販売者:Amazonを選択してカート追加すればいけます。

Amazonアプリからも試す

PCからアクセスしてエラーが表示されて待ってしまう場合、スマホのアプリからも購入トライしてください。

おまけ、以下やったけど意味なし

AmazonのKeepaで監視

Chromeアドオンで、Amazonの掲載商品についての過去の価格がグラフで表示されるので、
今が買い時なのか判断できます。
また、価格が○○円以下になったら通知する機能もあり、これを活用しようとしました。

アドオンの紹介サイトはこちら

詳細な使い方はこちらにあります

ただ、この通知の検知がタイムラグがあったため、Switchのような即時売り切れてしまうものは不向きでした。大体5〜10分くらい遅れて通知される感じです。

楽天ブックスやイトーヨーカドー等ののオンラインストアもチェック

Amazon以外にも入荷するオンラインストアはたくさんあるので、色々チェックしておくこととしました。
ただ、Amazonに比べ入荷数が少ないせいか、即完売となるような気がします。なので、人力で買うのはかなり厳しい気がします。
また、在庫が残っていたとしても、Amazonと比較し購入までの操作数が多いため、入力している間に完売となってしまう感じです。

ヨドバシカメラ、ビックカメラ、イオン、ジョーシン等の抽選申し込み

抽選申し込みもありますが、かなり倍率高いので、気長に待つしかない。。。(ヨドバシカメラで出てたのは100倍とか?)
ただ、なかなか時間が取れない人は抽選しているところを探すしかないかと思います。


最後に、悩んだのは個人(転売屋)からの購入
一応、ヤフオクで相場を見ながら買うか迷ってました。
今は、大体中古なら40,000円、新品で42,000〜44,000円くらいな感じでした(新型モデル)
40,000円下回ったら買おうかなーとは悩んでました。
あと、メルカリは怪しいから見ない。
Twitterで時々見かける「譲ります」系も怪しいらしい。

あと、Amazonでも安く出品しているところがありますが、こちらも購入NGです。
一度リングフィット アドベンチャーを10,000円で購入しましたが、結局商品も届かず、マーケットプレイス保証で返金してもらいました。
個人情報が抜かれるだけらしいので要注意。

以上、ひさびさの投稿でした。

2020年3月31日火曜日

シムシティ(2013) がmacOS Catalina(10.15)で動作しない

日本語の記事がなかったのでまとめ。

我が家のMacでSIMCITYを久々に起動しようとしたところ、起動できなくなってました。

この画面で固まってしまう。。。

思い当たるのは最近macOSを、Mojave(10.14)から最新版のCatalina(10.15)にバージョンをしたこと。

シムシティの製品ページを見ると、動作OSのバージョンがMojave(10.14)までであることが発覚。。。


確かに、Catalina(10.15)からは32bitのアプリケーションが動作しなくなくなるため、見事にはまってしまった感じでした。

じゃあ、Catalina(10.15)にバージョン後は遊べないのか調べてみましたが、
一応、サポートのページに記載ありました。


アップデート予定として以下が記載されてました。
  • Civilization V (Mac Steam) *Updated Nov. 14, 2019*
  • Command & Conquer: Generals
  • SimCity 4: Deluxe Edition (Mac Steam) *App Store version updated Feb. 19, 2020
  • SimCity: Complete Edition (App Store) *Updated Dec. 2019*
  • The Sims 2: Super Collection (App Store) *Updated Jan. 13, 2020*

この「SimCity: Complete Edition」なら移行できたのでしょうが、持っているのは通常版。。。
あきらめて買い直すしかなさそうです。(そこまでしてやるかは微妙ですが。。。)

2016年10月17日月曜日

Logstash+Elasticsearch+Kibinaで自宅への不正アクセス状況を可視化してみる

Elasticが流行り始めて久しいですが、自分も使ってみたい。
と言っても、よくあるようなsyslogの監視とかTwitterの解析とかつまらないので
あまり他にやっていないものを読み込ませようと思いました。

と言うことで、勉強にもなるかと思い、サイバー攻撃関連のデータを可視化してみようと思います。
自宅にFWとかProxyとかあれば、それぞれのログを突っ込んでみたいけど、そんな大層なことはやっていないので、外と繋がっている普通の無線LANルータにあるアクセスログを取り込もうと思います。
ちなみに、無線LANルータのログの取り出し方は別にまとめます。一気に書くと内容が多くなりすぎちゃうので。。


事前準備

Elasticで公開されている手順どおりにインストールを進めていく。

まずは必須なパッケージである、JavaとApacheをインストール

# yum install java

# yum install httpd

ちなみに、Web画面でApacheを使うので、 Firewallのポート空けるのを忘れずに。

Logstash,Elasticsearch,Kibanaのインストール

yumでインストールするため、リポジトリを追加する。
以下2ファイルを作成。

# cat /etc/yum.repos.d/Elastic.repo 
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

# cat /etc/yum.repos.d/Logstash.repo 
[logstash-2.3]
name=Logstash repository for 2.3.x packages
baseurl=https://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

まずは、ElasticsearchとLogstashパッケージをインストールする。
# yum install elasticsearch
# yum install logstash


Kibanaはインストール不要のため、yumは使わず、Webページから圧縮ファイルをダウンロードしてくる。
# curl -O https://download.elastic.co/kibana/kibana/kibana-4.5.4-linux-x64.tar.gz
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 31.7M  100 31.7M    0     0  1013k      0  0:00:32  0:00:32 --:--:-- 2611k

解凍し、公開Webのフォルダに格納する。
# tar -zvxf kibana-4.5.4-linux-x64.tar.gz
# mv kibana-4.5.4-linux-x64 /var/www/html/
# mv /var/www/html/kibana-4.5.4-linux-x64 /var/www/html/kibana

セットアップ

まずは、Elasticsearchの設定をする。設定ファイルは以下。
# vi /etc/elasticsearch/elasticsearch.yml 

以下の2箇所を修正、追記。
普通は0.0.0.0で公開されるので設定不要なのだが、VMなど接続するIPアドレスが変わる場合は、きちんと接続可能なIPアドレスを明記する必要あり。
# network.host: 192.168.0.1network.host: ***.***.***.***

# enable cross-origin resource sharing
http.cors.enabled: true

次にKibanaの設定。設定ファイルは以下。
# vi /var/www/html/kibana/config/kibana.yml 

こちらもIPアドレスを記載。
server.host: "192.168.56.101"
elasticsearch.url: "http://192.168.56.101:9200"

最後にLogstashの設定。
ElasticsearchとKibanaはただ連携する設定しかしていないけど、
Logstashは対象のログファイルの読み込み設定とフォーマット、
Elasticsearchと連携する設定を行う。

以下ファイルを作成。
# vi /etc/logstash/conf.d/Security.conf

中身はこんな感じです。
input {
  file{
    path="/var/log/PR500MI/rSecurity.log"
    start_position = "beginning"
  }
}

filter {
  grok{
    match={
      "message" = "%{DATA:logdate} SRC=%{IP:srcip}/%{NUMBER:srcport} DST=%{IP:dstip}/%{NUMBER:dstport} %{WORD:protocol} %{DATA:action}\[%{DATA:actiondetail}\]"
    }
  }
  date {
    match = ["logdate", "YYYY/MM/dd HH:mm:ss"]
    locale = "en"
  }
  geoip {
    source = ["srcip"]
  }
}

output { elasticsearch {
    hosts = [  "192.168.56.101:9200" ]
  }
} 

解説を入れておくと、
input{ file{ pathで指定するのが読み込む対象のファイル(今回は別で取り込んでいる無線LANルータのアクセスログ)
start_position〜の記載は、ファイルの読み込みを先頭から行うように指定。
(デフォルトだと末尾から読み込む?らしいので)

また、
filter{ grok{ matchは、読み込むログのフォーマットを指定する。
フォーマットは以下にまとまっている。
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

また、フォーマットをチェックするために、以下のサイトを活用した。
http://grokdebug.herokuapp.com/

ここまででとりあえずはセットアップ完了。

起動

実際に起動してみる。
順番は、Logstash -> Elasticsearch -> Kibanaの順(なはず)

Logstashの起動
# service logstash start

設定ファイルの誤りでログの読み込みに失敗している、などの情報はログに残る。
 /var/log/logstash配下に出てるので確認する。

次にElasticsearchの起動
# service elasticsearch start
こちらも同様にログをチェックして、エラーが出ていないか確認する。
こちらは/var/log/elasticsearch配下です。

最後のKibanaの起動
# /var/www/html/kibana/bin/kibana

Kibanaでログデータを確認

長かった準備はここまででKibanaでログデータが参照できるか確認してみる。
KibanaのURL(http://***.***.***.***:5601/)へアクセスする。
こんな画面が出てくるはず。


書いてある通り、ここではIndexを指定する。
Kibanaでは分析するログデータのIndexとなる列を指定することで、柔軟な分析が可能となる。

本来、ここのページではログデータ内のカラムを参照し、Indexとなる列を選択させる画面である。
こんな風に選択する画面が出てくるのが正しいはず。

じゃあ、今回は何故違ったかと言うと、ログデータが正しく読み込めていないためだった。
色々ログファイルを見てみると、Elasticsearchのエラーログに以下のエラーが出ていた。(一部いじっています)
[2016-09-23 23:40:03,346][DEBUG][action.bulk              ] [Cobalt Man] [logstash-2016.09.23][4] failed to execute bulk item (index) index {[logstash-2016.09.23][logs][AVdXfSraUEBq1amZMjWs], source[{"message":"/09/23 13:56:48 SRC=119.93.79.167/35125 DST=***.***.***.***/23 TCP 廃棄[パケットフィルタ]","@version":"1","@timestamp":"2016-09-23T14:40:02.635Z","path":"/var/log/PR500MI/Security.log","host":"centos.localdomain","logdate":"/09/23 13:56:48","srcip":"119.93.79.167","srcport":"35125","dstip":"***.***.***.***","dstport":"23","protocol":"TCP","action":"廃棄","actiondetail":"パケットフィルタ","tags":["_dateparsefailure"],"geoip":{"ip":"119.93.79.167","country_code2":"PH","country_code3":"PHL","country_name":"Philippines","continent_code":"AS","region_name":"53","city_name":"Muntinlupa","latitude":14.390299999999996,"longitude":121.04750000000001,"timezone":"Asia/Manila","real_region_name":"Rizal","location":[121.04750000000001,14.390299999999996]}}]}
MapperParsingException[failed to parse [logdate]]; nested: IllegalArgumentException[Invalid format: "/09/23 13:56:48"];
 at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:329)
 at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:309)
 at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:436)
 at org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:262)
 at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:122)
 at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:309)
 at org.elasticsearch.index.shard.IndexShard.prepareCreate(IndexShard.java:529)
 at org.elasticsearch.index.shard.IndexShard.prepareCreateOnPrimary(IndexShard.java:506)
 at org.elasticsearch.action.index.TransportIndexAction.prepareIndexOperationOnPrimary(TransportIndexAction.java:215)
 at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:224)
 at org.elasticsearch.action.bulk.TransportShardBulkAction.shardIndexOperation(TransportShardBulkAction.java:327)
 at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:120)
 at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:68)
 at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:639)
 at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
 at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279)
 at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:271)
 at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
 at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
 at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Invalid format: "/09/23 13:56:48"
 at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187)
 at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826)
 at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType.parseStringValue(DateFieldMapper.java:362)
 at org.elasticsearch.index.mapper.core.DateFieldMapper.innerParseCreateField(DateFieldMapper.java:528)
 at org.elasticsearch.index.mapper.core.NumberFieldMapper.parseCreateField(NumberFieldMapper.java:241)
 at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:321)
 ... 22 more

"[Invalid format: "/09/23 13:56:48"]"なんてのを見ると分かるけど、無線LANルータのログファイルのデータが正しく読み込めていないことが原因で、パースエラーが起こっている様子だった。
ログファイルには、ちゃんと"2016/09/23 13:56:48 ..."と記載されていたが、なぜかElasticsearchで読み込まれるときには"/09/23 13:56:48"となってしまっていました。。

まとめ

実は、この原因が解決せず、Elasticは諦めました。誰か原因わかれば教えてください。
次回、同じことをSplunkで行った結果をまとめます。

2016年9月24日土曜日

ファイルの中身を逆順にするRubyスクリプト

ぐぐってみたけど、しっくりくるものが見つからなかったので、載せておきます。
プログラミング授業の課題でありそうなので、参考にしてください。
#!/usr/local/bin/ruby
require 'fileutils'

orgFile = "original.txt"
newFile = "new.txt"

File.open(newFile, "w") do |new_f|
  File.open(orgFile) do |org_f|
    lines = org_f.readlines # ファイルの中身を一行ずつ読み込み、配列に格納する
    lines.reverse!          # 配列の中身の順序を入れ替える
    lines.each do |s|
      new_f.puts(s)         # 配列の中身を一行ずつファイルに書き込む
    end
  end
end

実行すると、こんな感じになります。
# cat original.txt
1, aaa
2, bbb
3, ccc
# ruby  reverse.rb
# cat new.txt
3, ccc
2, bbb
1, aaa

もちろん、色々なやり方があると思いますが、自分は上のやり方がわかりやすいと思いました。

2016年8月28日日曜日

VirtualBoxのCentOS7入れて、sshでログインできるようにするまで

今までVMware使ってたけど、Mac環境なのでVirtualBoxを入れてみた。
そして、CentOS7をインストールして環境準備したけど。。

ホスト→ゲストに繋がらない。。
WindowsでVMware使ってたときは、ゲストOSのネットワーク設定をブリッジにしたら、ちゃんと別のIPアドレスが割り当てられたのに、VirtualBoxだと別セグメントのIPアドレスが割り当てられている。


色々調べてみると、2種類のNICを準備する必要があることが判明。
  • NAT
  • ホストオンリーアダプター(ネットワーク)
NATのNICで、【VMゲスト(CentOS)】ー【インターネット】との通信を行う。
ホストオンリー〜のNICで、【VMゲスト(CentOS)】ー【VMホスト(Mac)】の通信を行う。
詳細は以下で行うが、ネットワークのイメージはこんな感じ。
(IPアドレス、NIC名はウチで試した結果なので、環境によって異なります)



ホストオンリーアダプターの作成

まずVirtualBoxの設定で、ホストオンリーアダプターを準備する。

  1. VirtualBoxの「環境設定」メニューを選択
  2. 「ネットワーク」⇒「ホストオンリーネットワーク(H)」をクリック
  3. 右側にある一番上のボタンをクリックし、ホストオンリーネットワークを作成



仮想マシンにNICを割り当てる

次に、VMゲストの設定で、NICを2つ割り当てる。
  1. VirtualBoxで作成したVMを選択し、「設定」ボタンをクリック
  2. 「ネットワーク」をクリック
    (デフォルトでアダプター1にNATが割り当てられていることを確認、なければNATを割り当てる)
  3. アダプター2を選択し、ネットワークアダプターを有効化を選択。名前は先程作成したホストオンリーネットワークを選ぶ



仮想マシン上のOSでNICを有効化


最後に、VMゲストのOS上の設定で、NICを有効化する。
ただ、うまく行ってれば、自動的に認識され、有効化されているはず。
確認はifconfigを実行してみる。

# ifconfig
enp0s3: flags=4163  mtu 1500
        ether 08:00:27:4c:ef:c2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163  mtu 1500
        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fe8e:fbd2  prefixlen 64  scopeid 0x20
        ether 08:00:27:8e:fb:d2  txqueuelen 1000  (Ethernet)
        RX packets 48  bytes 7479 (7.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42  bytes 7737 (7.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


一瞬、3つ認識されているから大丈夫かと思ったが、インターネットへの通信に失敗している。
よくみると、NATのNIC(enp0s3)がIPアドレス割り当てられていない。
NICの設定を見る。

# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

 すると、「ONBOOT=no」となっており、有効化されていなかった。
「ONBOOT=yes」に書き換えてネットワークを再起動。

すると、今度はちゃんとIPアドレスが割り当てられており、インターネットへの接続も成功した。

# ifconfig
enp0s3: flags=4163  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::a00:27ff:fe4c:efc2  prefixlen 64  scopeid 0x20
        ether 08:00:27:4c:ef:c2  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 1180 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 1254 (1.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163  mtu 1500
        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fe8e:fbd2  prefixlen 64  scopeid 0x20
        ether 08:00:27:8e:fb:d2  txqueuelen 1000  (Ethernet)
        RX packets 578  bytes 51817 (50.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 334  bytes 57715 (56.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ちなみに、ルーティングテーブルはこんな感じになってるはず。

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 enp0s3
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 enp0s3
192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 enp0s8


以上、VirtualBoxでVM作った際のネットワーク設定についてでした。