Pychef's Diary

I consider myself an engineer, aren't I?

Objective-Cの「インスタンス変数」と「プロパティ」の違い

Objective-Cを始めてから、最初に戸惑ったのが「インスタンス変数(ivar)」と「プロパティ(プロパティ変数)」の違いです。

結論からいうと、「プロパティ」 = 「インスタンス変数 」+ アクセサ」のようです。

理由としては、レガシィな書き方(Objective-C 1.0)では下記のようにヘッダファイル(.h)にインスタンス変数を宣言し、その変数用にアクセサを用意し、その後、実装ファイル(.m)でセッター・ゲッターを記述する必要がありました。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    //インスタンス変数
    NSString *name;
}

//インスタンス変数用ゲッター
- (NSString *)returnName;

//インスタンス変数用セッター
- (void)setName:(NSString *)name;

@end


このままでは面倒臭いので(?)、モダンな書き方(Objective-C 2.0←イマココ!)では「プロパティ」という概念が使われるようになりました。
下記の通り、@property~ で宣言して、.(ドット)や_(アンダースコア)でアクセスするだけでゲットもセットもできます。

#import "ViewController.h"

@interface ViewController ()
@property NSString *name;
@end

@implementation ViewController{
    NSString *ivarString;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.propertyString = @"this is self-accessed property";
    NSLog(@"%@", self.propertyString);
    
    _propertyString = @"this is underscore-accessed property";
    NSLog(@"%@", _propertyString);

}

「プロパティ」を宣言すると、インスタンス変数とアクセサも自動的に生成されます。

ドットでアクセスすると、アクセサ経由。アンダースコアでアクセスすると、直接インスタンス変数を書き換えるようです。

以上

【レオパレス】LEONET(レオネット)のベーシック認証を回避する方法

長期出張で、レオパレスに滞在しています。

レオパレスには「LEONET(レオネット)」というインターネット環境が用意されているのですが、こやつがなかなか厄介。

問題点

主に2つの問題が自分の環境では発生しています

  1. SSHを10分ほど放置するとBROKEN PIPEが発生する(ターミナルで何も打てなくなる)
  2. 外出などで10時間ほど使わないとベーシック認証(IDとパスワードが求められるアレ)を求められる
対処法

1.に関しては、未だに対策方法を見つけられていないのですが
2.に関しては、何かしらの通信を断続的に発生させておけば良いので、
Macをお使いの方はアプリケーションからターミナルを起動させ、
以下のコマンドを打って、放置しておくだけで、ベーシック認証を回避できます。
(PCを立ち上げておく必要があります)

ping -i 3600 -s 1 指定URL

これで1時間ごとに、指定URLに、9バイトのPINGを飛ばします。

くれぐれも、1秒毎などに設定しないようご注意下さい(PING先に迷惑がかかります)。
ご利用はat your own riskでよろしくお願いします。


それにしても壁も薄く、エアコンも3時間タイマーが搭載されていてヒドいですね・・・

追記

1は、サーバー側の/etc/ssh/sshd_configに、ClientAliveInterval 15を追記したらタイムアウトしなくて済むようになりました。
てっきり、デフォでオンになっていると思っていましたが、そうではなかったようです。

『手を動かしながら学ぶ ビジネスに活かすデータマイニング』第9章に勝手に補足してみる

遂にid:TJOさんの『手を動かしながら学ぶ ビジネスに活かすデータマイニング』が発売されました。
子供の頃に、FFやドラクエが発売されるのを楽しみにしていたような気分で発売を待っていました!

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

厳密な数式うんぬんより、"イメージ"を大切にされているのが伝わってくる本ですね^^
今週末は出先で時間を見つけつつ、掲載コードを打っています。

さて、p.182 図9-7を描画しようとしたところ、コードが載っていないことに気づきました。図9-6では閾値を設けておらず、ごちゃごちゃしているため、support>=0.3で描画するエッジを限定しましょうという箇所です。

そこで簡単ではありますが、勝手にコードを補足したいと思います。ここでは図9-6がd.apなので、区別しやすいように図9-7はd2.apとして保存し、plotします。

d2.ap<-apriori(as.matrix(d),parameter=list(support=0.3))
plot(d2.ap,method="graph", control=list(type="items", layout=layout.fruchterman.reingold))

↓ こんなイメージになるかと。

f:id:pychef:20140824165506j:plain

p.182ではimportedのノードが一番上にきますが、ここではimportedが左にきています。これはRだけでなく、gephiやpajekでも共通しますが、ネットワークを描画するとき、必ずしも同じグラフが毎度できあがるわけではありません。

全体のバランスがあるべきグラフと同じであればOKです。

以上。

pandasをWinkdex APIで使って遊んでみる編

それでは先のリストの中からWinkdex APIを使って遊んでみましょう!WinkdexはBitcoinの価格指標の一種で最近サービスを開始しました。蛇足になりますが、Winkdexの創始者であるウィンクルヴォス兄弟は映画『ソーシャル・ネットワーク』のなかでザッカーバーグを訴えていたあのエリート双子兄弟のようです。では、まずはWinkdexの過去180日のプライスを取得してみます。

#encoding:utf-8
#http://docs.winkdex.com/

import pandas as pd
import requests as rq
import matplotlib.pyplot as plt

class Winkdex:

	def __init__(self):
		self.url = "https://winkdex.com/api/v0"
		self.hdrs = {"User-Agent":"my-winkdex-app"} #リファレンスにあるappnameを拝借してみます

	def timeseries(self,start,end): 
		par = {"start_time":start, "end_time":end} 
		res = rq.get(self.url + "/series", params=par,headers=self.hdrs)
		res = res.json()
		return res


winkdex = Winkdex()
varall = winkdex.timeseries("","")
timeprice = {}
tskeys = []
tsvalues = []

for series in varall["series"]:
	for results in series["results"]:
		timestamp = results["timestamp"]
		tskeys.append(timestamp[0:10]) #timestampの最初10文字だけ 
		tsvalues.append(results["price"]/100)

timeprice = pd.Series(timeprice)
ts = pd.Series(tsvalues, index=tskeys)
print(ts)

すると、こんなレスポンスが返ってくるはず。

2014-02-21    567
2014-02-22    601
2014-02-23    611
2014-02-24    547
2014-02-25    515
2014-02-26    581
2014-02-27    578
2014-02-28    564
2014-03-01    566
2014-03-02    556
2014-03-03    660
2014-03-04    662
2014-03-05    662
2014-03-06    653
2014-03-07    626
...
2014-08-05    580
2014-08-06    580
2014-08-07    588
2014-08-08    589
2014-08-09    585
2014-08-10    587
2014-08-11    576
2014-08-12    570
2014-08-13    545
2014-08-14    517
2014-08-15    493
2014-08-16    509
2014-08-17    492
2014-08-18    460
2014-08-19    487

つぎに、どれくらいボラっているのかを調べてみましょう。pandasのdescribeをつかえば簡単です。

print(ts.describe())
count    180.000000
mean     553.833333
std       75.190819
min      392.000000
25%      487.750000
50%      581.000000
75%      618.000000
max      666.000000

現在のプライスは特に特異なわけではなさそうです!では、matplotlibを使ってグラフを描画してみます。

ax = ts.plot()
ax.set_ylabel("WinkDex"); ax.set_xlabel("Time")
plt.show()

f:id:pychef:20140820221131p:plain

Bitcoin系APIリスト【2014年編】

お疲れさまです。pychefです。

 

先日、仲間内で自分が知っているAPIを持ち寄あう機会がありまして、なかなか面白いものが集まりました。某社の非公開(?)APIから、PokemonのAPIまでね。

で、僕はBitcoin系のAPIを紹介しました。自分がBitcoinをやっている訳でもないですし、周りでやっている人も少ないわけですが、世界規模で見ると多くの方々が熱中しているので開発チャンスがあるのではないかと思ったわけです。データ分析系ライブラリと親和性の高い時系列的データも得られますし。

 

ということで、本エントリでは独断と偏見で集めたBitcoinAPIリストを紹介したいと思います。*1

 

  1. CoinDesk http://www.coindesk.com/api/
  2. BTC-e https://btc-e.com/api/documentation
  3. BitStamp https://www.bitstamp.net/api/
  4. Coinbase https://coinbase.com/api/doc
  5. Vircurex https://vircurex.com/welcome/api
  6. Bitfinex https://www.bitfinex.com/pages/api
  7. CryptoCoin http://www.cryptocoincharts.info/v2/api/
  8. mcxNow https://mcxnow.com/about.html
  9. Cryptsy https://www.cryptsy.com/api
  10. Bitcurex https://bitcurex.com/en-pages,plnapi.html
  11. Bter https://bter.com/api/1
  12. CampBX https://www.campbx.com
  13. Winkdex https://winkdex.com/api

標準Pythonが好きです。でも、Anacondaのほうがもっと好きです。

お疲れさまです。夏休み最終日のpychefです。

きのう、『ビジネス活用事例で学ぶ データサイエンス入門』第3章のggplot2エラー対処法 - pychef’s diaryid:rep0oooさんにツイートしていただき、著者のid:yokkunsさんにまでRTして頂いたことで、今朝はアナリティクスを見てすこし幸せになることができました。ありがとうございます。なにより、同じ箇所でつまづいた方がいたと知ることができて、書いて良かったと感じました。

続きを読む

『ビジネス活用事例で学ぶ データサイエンス入門』第3章のggplot2エラー対処法

夏休みに、Rを勉強しようとid:yokkunsさんのビジネス活用事例で学ぶ データサイエンス入門を購入しました。前線で活躍されている方々の知識を2200円+税で買えるなんてお得すぎる!なんのためらいもなく購入です。

「Rの文法って特徴的だな~」と思いつつ第3章をカチカチ打っていたところ、p.61ページのggplot2でヒストグラムをプロットするところでエラーが発生(R-Code 03-08)。

 

Error : Mapping a variable to y and also using stat="bin".

With stat="bin", it will attempt to set the y value to the count of cases in each group.
This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
If you want y to represent values in the data, use stat="identity".
See ?geom_bar for examples. (Defunct; last used in version 0.9.2)

 

p.62上段のヒストグラムが描画できない!付録のオリジナルコードでもダメだった。エラーメッセージをみてみると、geom_bar()が怪しい模様。"If you want y to represent values in the data, use stat="identity"とあるように、以下のように書き換えるとアッサリ解決。

 

ggplot(mau.payment.summary, aes(x = log_month, y = total.payment, fill = user.type)) + geom_bar(stat="identity") + scale_y_continuous(label = comma)

 

きっと、R上級者の人にとってはショボすぎる問題でしょうけど、僕みたいなペーペーには困ると思うし、なによりヒストグラム1つがプロットできないからって、こんな素晴らしい本から途中離脱するというのはもったいなすぎると思ったので記しておきます。

「うごかねーからやーめた」なんてことは、技術書には往々にしてありえますからね(eg. 過去の自分)。