年別アーカイブ: 2012年

おうちサーバ更改案

うーん。

HDDのみ交換 Segate Barracuda 3TB → 13,000円程度✕2=26,000

Atomで再構成

マザー: 7,000

RAIDカード: 5,000

メモリ:4,000

windows home server2011: 6,000

ディスク:26,000

ACアダプタ: 10,000

→ 58,000

MacMini 52,800

メモリは手動で増設:8,000

ディスク(1TB):20,000

結局欲しいのはデータバックアップのディスクなんだよね。しかも、デジカメ+DV+iTunes

もともとサーバがあるところのバックアップだから冗長化も実は不要だしOSも問わないよな。。。

さよなら!僕らのソニー

さよなら!僕らのソニー (文春新書)。著者はジャーナリスト。ノスタルジーに溢れるあまり、公平的で客観的な視点に欠ける嫌いもあるが、それこそタイトルに「僕のソニー」と謳う位なのでいやな気はしない。本書を読み終えた際に真っ先に思い浮かんだのは「グーグルで必要なことはすべてソニーが教えてくれた」。本を読み終えた時点で、関連する他の本を読みたいと思わされた時点で及第点。

内容そのものはソニーブランドがいかに滑落をしていったか、ではなく、出井以降の体制に対する批判であり、結果論的な分析にとどまる。確かにおやおやと迷走を思わすリアルタイムな記述も少なくないがブランド戦略に失敗したのはエレキ(技術)軽視と断罪してしまうのは正直軽薄な気もする。

とくにテレビ事業に関するオペレーションの甘さを指摘する部分もあるにはあるが、具体性に乏しく、また、他社を踏まえての分析も無いのでその点は非常に物足りない。ソニー滑落の原因は本書で述べられている、技術者軽視および技術者が会社を去るという点にあるのは間違いないとは思う。ただ、それ以上に、技術者を離脱させてしまうような社内カンパニーの連携不足、iPodと類似する製品ををデザインしつつもソニーミュージックエンターテイメントに気を使い立ちあげられなかった、ことなど、そもそも社内の意識の低下が大きいのだと思う。

そしてそれを経営者の問題、視点だけで切ってしまうのは正直物足りない。むしろ、役員・部長クラスの意識がソニースピリットを失ってしまったことに問題があるのではと思ってる。

そういう意味で第5章の約1.5ページで語られてしまった「25人のプレジデント」。ここをもうちょっと掘り下げて欲しい。また、同時代の他社の分析もあるとなおのこと良いのだろうが、新書にそこまでを求めるのは酷か。

ただ、繰り返しになるが他の本を読みたいと思わせた時点で価値ある一冊。

 

追記:本書を読んでも、どうすればソニーが(この本で言う)ソニーらしい会社でいるのか、は全く分らない。そういう意味で「さよなら!」というタイトルもある意味適切。

観察眼

観察眼 (角川oneテーマ21)。大阪出張での新幹線での退屈しのぎに購入。サッカー選手が本を書くケースは多いけれども、過去に例が無い共著。そして今野が書くのはおそらく初めてでは。。。

遠藤は信頼する力 ジャパン躍進の真実と課題を書いているが、この本自体も中澤著 不屈との対比もあり非常に面白かったので購入。

今野自身のイメージは

①U-20の頃から読みは非常に良い、インターセプトの上手いボランチ。フル代表に入れる逸材だと騒いでましたw.

②テクニックもボランチを出来る程度にはあるものの、パスは直近の選手にしか出さず、やや難あり。

③正直、センターバックとしても今ひとつ印象が薄い。Jで見ててもうならさせられる場面は少ない

イメージでした。本を読んでみて分かるのは、サッカーをそもそも知らないでプレーしていたと言うエピソードの多さ。城福監督より色々とイロハを教わりそれまでは感覚でプレーしていたとの事。②の通りなるほど、やっぱりそういう事か、と感じる反面、一方で守備のポジショニングは良かった印象が意外な一面を知ることができた。これだけでも買った価値はあり。

また本を読んでいて全般的に感じたのは、ほどほどの深さの記述もあれば、相当にマニアックな内容もあった点。例えば

「ミスプレーの一つ前のシーンを考える」という項。パスが弱かったために、相手にツメられる時間を与えてしまいボールを失った場面。悪いのは奪われた選手か、パスを弱く出してしまった選手か。こういう見方は正直、しているのでふ~んと感じる。でも、文書として大半の人はあまり意識してない局面だと思う。(自慢がしたい訳で無い)

かと思えば以下のように文章だけでは想像しづらいが、細かい話もある。

こちらのトップ下の選手の左横にボランチが入っていくとする。そうすれば相手の右MFがケアに来ます。その時にこちらのサイドバックがオーバーラップして、相手のサイドバックを引き出すんです。そうしたら相手のサイドバックの裏にスペースができる。そこにFWが走りこんでパスを流すだけで、相手のセンターバックの一人を引き出せる。そうしたら当然、相手のゴール前中央はセンターバック一人と逆サイドのサイドバックだけ。そこを付けばチャンスになるんです。

前のフレーズには一切ふ~んでやりすごした自分も、上記の文章は頭の中にフィールドを描いて選手を配置してと、理解に時間がかかった。逆にそれだけの内容が書かれている発見。

あと、こんな一文もレッズサポ的に惹かれましたw.

両サイドに開いて「そこからやりますよ」っていうのは機械的に感じてしまう。それに外に張らせていながらそこまでボールが届かなかったら、一人少ない状況で戦っているのと同じ事になってしまう。しかも、外で張っている選手は「ボールが来たらやればいい」という感じになってしまう。そういう「形ができた時」しかプレーできないっていうのはサッカーじゃありえないこと。

2011年の浦和レッズは外から見ていて、そんな感じだった。

対談が短いのは残念ですが、今までの二人の露出度を見ても(遠藤>>今野)、程良くまとまった一冊でした。

采配  落合博満

采配  落合博満 落合博満 采配。今年に入ってからだが本屋で平積みされているのを見て購入。帯にもやられた。「孤独に勝てなければ勝負に勝てない」。孤独という言葉に惹かれた時点で疲れてたのは間違いないw。

読んでみると面白かった。やはり野球本は読み込んでいないだけに万事が新鮮。本を読んでいるときに気になる文があるといつもページの角を折っているが、この本で追った回数は14。かなり多い。以下抜粋。

上司や監督に「嫌われているんじゃないか。」そう考え始めた時は、自身を見る目が曇り始めたサインだと気がついて欲しい。

実力で仕事をつかみとった訳ではなく、けが人が出たことでポジションを取って1軍で出場し、まずまずの結果を残した選手がけが人が戻った後、ポジションを失ったときに思うケースがあることからの一説。

心技体ではなく体技心

これは激しく同感。

ビジネスマンも野球選手も3つの敵、「自分」「相手」「数字」と戦っている。

去年の自分と戦って成績・成長を示すことも重要ですよね。確かに。そして実績を残せば残すほど、自分を変えることが難しくなり自分と場合によっては去年の自分より悪くなるかもしれない。サッカーと違って、数字で明確に表現で来てしまう部分があるスポーツならではと感じます。

ミスは叱らない、手抜きはしかる

以前、目にしたストイコビッチのインタビューと同じイメージ。ストイコビッチはチャレンジしての失敗は叱らないが、チャレンジしないことそのものは叱ると言っていた。これは普段心がけていることだけに、うれしい。

もう紹介するのが面倒になってくるほど良かった本なので、後は買ってくださいw.ただ、以下だけは最後に紹介。

シンプルに伝えようとすると、相手の耳に入りにくい

いや、確かに読んでみればそうですが、このパターンにハマっている気がした一説。確かにテニスをしていたときによく感じた事を思い出したけれども、できる人が使う表現が、シンプルで難しいけれども、習得して初めてその言っている言葉の意味が分かったという体験が多かったです。「腰を入れて打て!」とかね。いくら腰を入れたフォームを指導されても、形だけで腰が使えてないからさっぱり分からなかった。

この本で紹介されている例では、あまりにシンプルな言葉で伝えると、かえって、「誰でも知っているような簡単なことしか言わないな」「それくらい、オレだってわかっているよ」となり耳が塞がり、いくら説明をしても聞いてくれなくなってしまう。聞き手が聞く準備ができるようにすることの大事さを語っている。

仕事を説明する際も同様でポイントを絞って教えるケースはあるが、結構、通じないケースも多い。ポイントを絞っても、それ以上にそのポイントすら難しいケースもあるだろうが、あえて難しい言葉で喋って方が心が開かれるのかもと感じたのは、大きな発見だった。

 

 

Twitterダイジェスト2012/1 ①

https://twitter.com/#!/publickey/status/155095510968041472

正直使ってみたい。特に

バグ修正の40%が新たなバグを混入という研究結果

この研究では、以下のような発見があったそうです。

バグ修正のための変更のうち40%が新たなバグを混入している(デグレード

500行以上の変更の約半分がバグ混入のきっかけとなっている。

1行だけの変更のうちバグを混入してしまう変更は4%

バグ混入してしまう変更は、1行だけの追加の場合約2%、1行だけの変更の場合には約5%

かなり感覚としっくりくる。

https://twitter.com/#!/ryoasai74/status/154254413559627778

という話と、perl – O’ReillyのiPhoneアプリ本からepubをぶっこぬくを見ると、英語版ドキュメントの敷居がぐっと下がる!!

https://twitter.com/#!/takoratta/status/154511912246312961

残念ながらIPv6担当は外れてしまったけれども、覚えておきたい。

https://twitter.com/#!/jptechcrunch/status/154005463766269952

神話#1:エンタープライズは退屈だ

分からんでも無い。

神話2: エンタープライズ向けソフトウェア・ビジネスはスケールしにくい

そんなことは無いだろう。

神話3: 企業のIT部門は動きが遅くて付き合いにくい

これは論破できないw。

神話4: MicrosoftOracleには勝てっこない

アメリカの記事だけにw。少なくともMicroSoftに勝てないという印象は無いね。

神話5: エンタープライズイノベーションは起きない

そのとおりでしょ。

https://twitter.com/#!/ryoasai74/status/151976382543577088

ビジョンは共感します。でも、具体的なアクション、実現策がもうひとつ理解できない。

これがはたしてプログラマーなのか・・・。

https://twitter.com/#!/Jxck_/status/151291442285903873

https://twitter.com/#!/kysnm/status/150965712243007488

力作過ぎて見れてない。。。

 

こんなところで。

iTunesで再生チャートランキングを定期的に自動で作りたい(3)

ひとまず、作ってみた。

MySQLでデータ管理をして、プログラムを実行すると、前回からの再生回数が差分として登録される。

DBはざっとこんな構成でテーブルは2つのみ。

mysql> desc tbm_track;

+———————-+————–+——+—–+———+——-+

| Field | Type | Null | Key | Default | Extra |

+———————-+————–+——+—–+———+——-+

| Track_id | int(11) | NO | PRI | NULL | |

| Name | varchar(160) | YES | | NULL | |

| Artist | varchar(80) | YES | | NULL | |

| Album_Artist | varchar(45) | YES | | NULL | |

| Album | varchar(200) | YES | | NULL | |

| Genre | varchar(45) | YES | | NULL | |

| Kind | varchar(45) | YES | | NULL | |

| Size | int(11) | YES | | NULL | |

| Total_Time | int(11) | YES | | NULL | |

| Disc_Number | int(11) | YES | | NULL | |

| Disc_Count | int(11) | YES | | NULL | |

| Year | int(11) | YES | | NULL | |

| Date_Modified | datetime | YES | | NULL | |

| Date_Added | datetime | YES | | NULL | |

| Bit_Rate | int(11) | YES | | NULL | |

| Sample_Rate | int(11) | YES | | NULL | |

| Play_Count | int(11) | YES | | NULL | |

| play_date | datetime | YES | | NULL | |

| Play_Date_UTC | datetime | YES | | NULL | |

| Sort_Atrist | varchar(45) | YES | | NULL | |

| Compilation | varchar(45) | YES | | NULL | |

| Persistent_ID | varchar(45) | YES | | NULL | |

| Track_Type | varchar(45) | YES | | NULL | |

| Location | varchar(500) | YES | | NULL | |

| File_Folder_Count | int(11) | YES | | NULL | |

| Lobrary_Folder_Count | int(11) | YES | | NULL | |

+———————-+————–+——+—–+———+——-+

26 rows in set (0.02 sec)

mysql> desc tbl_update

-> ;

+————————+————-+——+—–+———+——-+

| Field | Type | Null | Key | Default | Extra |

+————————+————-+——+—–+———+——-+

| Track_ID | int(11) | NO | PRI | NULL | |

| Update_data | datetime | NO | PRI | NULL | |

| Type | varchar(45) | YES | | NULL | |

| Play_Count | int(11) | YES | | NULL | |

| Incremental_Play_Count | int(11) | YES | | NULL | |

+————————+————-+——+—–+———+——-+

5 rows in set, 1 warning (0.02 sec)

mysql>

Javaのソースはひとまず動かしたレベル。XMLの読取はhttp://d.hatena.ne.jp/terazzo/20080524/1211656594を参考にして、そこのソースは割愛。

import java.io.IOException;

import java.net.URL;

import java.util.Date;

import java.util.List;

import java.util.Map;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.EntityTransaction;

import javax.persistence.Persistence;

import javax.persistence.Query;

import org.xml.sax.SAXException;

import sample.plist.PropertyListUtils;

public class ItunesList {

/**

* @param args

*/

public static void main(String[] args) {

// TODO 自動生成されたメソッド・スタブ

ItunesList t = new ItunesList();

try{

t.printTracks();

}catch (Exception e){

e.printStackTrace();

}

}

private static final String TEST_FILE_PATH = “file:C:\\Users\\jun\\Music\\iTunes\\iTunes Music Library.xml“;

public void printTracks() throws IOException, SAXException {

// xmlファイルの読み込み

//URL url = getClass().getResource(TEST_FILE_PATH);

URL url = new URL(TEST_FILE_PATH);

Object content = PropertyListUtils.load(url);

Map tracks = (Map)*1 {

try{

Integer track_id_xml = (Integer)xml_track.get(“Track ID”);

//すでにDBに登録済みかチェック

boolean already_rip_check=false;

for(TbmTrack tbm_track_db : db_mater_list){

if(tbm_track_db.getTrack_id() == track_id_xml.intValue()){

//再生回数を更新

already_rip_check = true;

if*2.intValue() ){

TblUpdate update = this.setTblUpdate(tbm_track_db,(Integer)xml_track.get(“Play Count”));

em.persist(update);

tbm_track_db.setPlay_Count*3;

}

break;

}

}

if(!already_rip_check){

//該当レコードが無いので新規追加

TbmTrack track = setTbmTrack(xml_track);

em.persist(track);

}

}catch (Exception e){

e.printStackTrace();

}

}

tx.commit();

em.close();

emf.close();

}

private TblUpdate setTblUpdate(TbmTrack tbmtrack,Integer fromXml){

TblUpdate update = new TblUpdate();

update.setTrack_ID(tbmtrack.getTrack_id());

update.setUpdate_data(new Date());

update.setPlay_Count(tbmtrack.getPlay_Count());

update.setIncremental_Play_Count(fromXml.intValue() – tbmtrack.getPlay_Count());

return update;

}

private TbmTrack setTbmTrack(Map xml_track) {

TbmTrack track = new TbmTrack();

track.setTrack_id*4;

track.setAlbum*5;

track.setAlbum_Artist*6;

track.setArtist*7;

if(xml_track.get(“Bit Rate”) != null){

track.setBit_Rate*8;

}

track.setCompilation*9;

track.setDate_Added*10;

track.setName*11;

track.setGenre*12;

track.setKind*13;

track.setSize*14;

if(xml_track.get(“Disc Number”) != null){

track.setDisc_Number*15;

}

if(xml_track.get(“Disc Count”) != null){

track.setDisc_Count*16;

}

if(xml_track.get(“Year”) != null){

track.setYear*17;

}

if(xml_track.get(“Date Modified”) != null){

track.setDate_Modified*18;

}

if(xml_track.get(“Sample Rate”) != null){

track.setSample_Rate*19;

}

if(xml_track.get(“Play Count”) != null){

track.setPlay_Count*20;

}

if(xml_track.get(“Play Date”) != null){

track.setPlay_Date(new Date(((Integer) xml_track.get(“Play Date”)).longValue()));

}

track.setPlay_Date_UTC*21;

track.setCompilation*22;

track.setPersistent_ID*23;

track.setTrack_Type*24;

return track;

}

public static List getAllRecordsTbmTrack(EntityManager em){

Query q = em.createQuery(“select t from TbmTrack t”);

List list = q.getResultList();

return list;

}

}

*1:Map) content).get(“Tracks”);

int i=1;

EntityManagerFactory emf = Persistence.createEntityManagerFactory(“JPA_test”);

EntityManager em = emf.createEntityManager();

// DBの最新情報を取得

List db_mater_list = getAllRecordsTbmTrack(em);

EntityTransaction tx = em.getTransaction();

tx.begin();

for (Map xml_track : tracks.values(

*2:xml_track.get(“Play Count”) != null) &&

tbm_track_db.getPlay_Count() != ((Integer)xml_track.get(“Play Count”

*3:Integer)xml_track.get(“Play Count”

*4:Integer)xml_track.get(“Track ID”

*5:String)xml_track.get(“Album”

*6:String)xml_track.get(“Album Artist”

*7:String)xml_track.get(“Artist”

*8:Integer)xml_track.get(“Bit Rate”

*9:String)xml_track.get(“Compilation”

*10:Date)xml_track.get(“Date Added”

*11:String)xml_track.get(“Name”

*12:String)xml_track.get(“Genre”

*13:String)xml_track.get(“Kind”

*14:Integer)xml_track.get(“Size”

*15:Integer)xml_track.get(“Disc Number”

*16:Integer)xml_track.get(“Disc Count”

*17:Integer)xml_track.get(“Year”

*18:Date)xml_track.get(“Date Modified”

*19:Integer)xml_track.get(“Sample Rate”

*20:Integer)xml_track.get(“Play Count”

*21:Date)xml_track.get(“Play Date UTC

*22:String)xml_track.get(“Compilation”

*23:String)xml_track.get(“Persistent ID”

*24:String)xml_track.get(“Track Type”