hoge blog

燃えるゴミは火曜と金曜

Rのread.tableで起きた特定行へのエラー

最近R言語を使い始めました。

 

主にネットワーク解析を行っていまして、データをRに渡す際にtxtファイルやcsvファイルを使うのですが、今回はtxtファイルをread.tableで読み込む際に起きたエラーの話。

 

データの構造

今回はネットワーク構造、具体的にはエッジの情報をファイルから渡すため、txtファイルの中身は以下のような構造をしています。

 

ノードA1 ノードB1 エッジの重みW1
ノードA2 ノードB2 エッジの重みW2
 …

※ 見やすいため全角スペースを使っていますが、実際は半角スペース区切りです

 

このようなデータを読み込ませる際のプログラムは以下。

 

d <- read.table("data.txt")

 

シンプルです。

これを有向グラフとし、エッジの重みを付加させる場合は以下。

 

g <- graph.data.frame(d[1:2], directed=T)
E(g)$weight <- d3

 

今までこれでやってきました。 

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

 

特定の行に対するエラー

そして、いつものようにデータを読み込ませようとした時、このエラーが現れました。

 

scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, でエラー:
 6761 行目には 3 個の要素がありません

 

なぬ?

 

実は、ノードには日本語が含まれており、txtファイルの時点で日本語が文字化けしている場合が今までもありました。

でも今回は、6761行目を確認しましたが、ちゃんと要素は3つあるんです

 

うーむ...

 

とりあえず、6761行目を取り除き、行を1つ詰めてから再びread.tableしました。

 

scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, でエラー:
 6761 行目には 3 個の要素がありません

 

なんだとっ!?

 

6761行目がエラーだと言うから6761行目を取り除いたのに、新人の6761行目もエラーだと!?

こうなったら力技。

6700行目辺り〜6800行目辺り全てを取り除き、再度read.table!

 

scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, でエラー:
 6761 行目には 3 個の要素がありません

 

お手上げです。

 

これはもう、6761行目にあるデータに問題があるとは思えません。

きっと、どこかの行の何かのデータが悪さして、それが6761行目にしわ寄せされているんだろう(予想)。

Rによるデータサイエンス-データ解析の基礎から最新手法まで

Rによるデータサイエンス-データ解析の基礎から最新手法まで

 

解決策

いろいろ試行錯誤しましたが、最終的に以下のread.table文で読み込みに成功しました!

 

d <- read.table("data.txt", sep=" ", quote="", comment.char="")

 

これは、

  • sep=" " :区切り文字は半角スペースだと明記
  • quote="" :引用文字は使っていないことを明記
  • comment.char="" :コメントは使っていないことを明記

という3明記をすることで、無事に読み込み成功しました。

いろいろあるんですね〜。

ちなみに、sep=" "だけを指定で8954行目にエラー、quote=""を追加すると17480行目にエラーが出て、最後にcomment.char=""を追加で通りました(笑)

 

だいぶ心が折れそうでしたが、なんとか折れずに頑張れそうです。

 

「折れない心」をつくるたった1つの習慣 (プレイブックス 919)

「折れない心」をつくるたった1つの習慣 (プレイブックス 919)

 

 

MacBook ProとMySQLの組合せでハマった話

普段はMacBook Pro(以下、MBP)をメインに使っています。

MBPに入れているMySQLをずっと動かしていたのですが、設定ファイル変更等のためターミナルからmysql.server restartを実行したところ、

 

ERROR! The server quit without updating PID file (*****.pid)

 

と表示され、MySQLが起動しなくなってしまいました。

このような場合、The server 〜 PID fileGoogleで検索して同様のエラーとその対処法を探していく...のですが、ここでドツボにはまりました。

こちらのブログにも書かれていますが、上記のエラー文でググってみれば、原因・解決方法が多様なエラーだということが分かります。

 

私の場合

不要なプロセスをkillするだとか、PIDファイルやその周辺の所有権をいじってみたりだとか、検索で上位に出てくるものは(私の場合)ハズレでした。

 

私の場合、MBPが接続しているネットワークが変わったことが原因でした。

 

ネットワークが変わったとは、MySQLの起動時(mysql.server start)と終了時(mysql.server stop)に、別のネットワークに繋がっているということです。

実は、MacMySQLそれぞれの仕様が連鎖して起きたエラーだったのです。

 

 

原因1. MySQL起動中のMBPを別ネットワークに繋ぎMySQLを終了させる

これは、ノートパソコンだからこそ起きやすかったのかもしれません。

例えばMySQLを自宅で起動させ、職場・学校・カフェなどのネットワークで終了させようとすると、次の問題へ繋がります。

 

原因2. Macのローカルホスト名が変更される

以下の記事を参考にさせていただきました。

ざっくり言えば、繋げているネットワークが変わる(自宅→職場 や 学校→テザリング)と、Mac本体内で使用するローカルなホスト名が変更になる場合があるということです。

ローカルホスト名が変更になったところで、次の問題へ進みます。

 

原因3. MySQLのPIDファイルのファイル名が変わる

先のエラー文には、PIDファイルのファイル名も書かれていましたが、実はこのファイル名にローカルホスト名が使われています。

そのため、自宅で起動したMySQLが作るPIDファイル(例:home.local.pid)と学校で起動したMySQLが作るPIDファイル(例:school.local.pid)が異なることになります。

 

結果 MySQLはPIDファイルを見失う

上記の例を使うと、自宅で起動したMySQL(このときhome.loca.pidを作成)を学校で終了させようとした時、MySQLは存在しないschool.local.pidを探そうとするため、上述のエラーが発生していました。

 

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )

 

 

防止方法

以下の記事を参考に、ローカルホスト名を固定化することで再発を防止できました。

ちなみに私は、仕方なくMySQLを再インストールすることにしました。データベースを約半分失いましたが、勉強料ということで...

いや〜、ローカルホスト名がコロコロ変わるのも、ローカルホスト名をフェイル名に使用するのも、控えてほしいなぁ...

 

Apple iPod shuffle 2GB 第4世代 2015年モデル ブルー MKME2J/A

Apple iPod shuffle 2GB 第4世代 2015年モデル ブルー MKME2J/A

 

 

MVNOにしたけど最終的に得も損もしなかった話

携帯電話がスマホになってから、毎月の通信費が上がった方がほとんどだと思います。私は長年auを使ってきましたが、毎月のデータ通信使用量が0.5GBを切る程だったため、ある日思い切ってMVNOへ乗り換えることにしました。

 

「電話もめったに使わないし、データ通信も全然使わないし、MVNOが断然得!」

 

その考えでau系MVNO(当時)であるmineo(マイネオ)を選択。

今から書くのは、大きく得をする予定が全く得をしなかったパターンの話です。

 

事前の損得見積もり

mineoに変えるとどのくらい得をするのか、前もって概算しておきました。ちなみに、mineoとの契約は音声通話付きSIMカードのみで、本体はau時代のものを引き継ぎます。まず毎月の料金がどう変わるかですが、以下の通りです。

 

auの毎月の料金(7GB/月):8,600円

 → mineoの毎月の料金(1GB/月):1,800円

 

つまり、auからmineoに変えると、月々6,800円の得になることが分かりました。続いて、auの解約料金とmineoの契約料金は以下の通りです。

 

au解約に掛かる料金:37,000円

  • 誰でも割契約解除料:10,000円
  • MNP転出手数料:2,000円
  • 本体代残金:25,000円

mineo契約に掛かる料金:3,000円

  • 新規事務手数料:3,000円

 

2年縛りの途中で解約するため契約解除料がかかり、また2年かけて実質無料になるはずだった本体代金の残金を支払う必要がありました。解約料金と契約料金を合わせて40,000円の初期費用がかかることが分かりました。よって、

 

40,000 ÷ 6,800 = 5.88

 

このことから、auからmineoに乗り換えることによって生じる初期費用は約6ヶ月で元が取れ、mineo利用7ヶ月以降から月6,800円の得になるという概算が得られました!

 

「半年以上使えば今よりかなりお得になるぞ!!!」

 

実際に半年使ってみた

私がau時代に使っていたスマホXperia UL SOL22。

SONY au Xperia UL SOL22 ブラック

SONY au Xperia UL SOL22 ブラック

 

個人的には十分満足できる機種で、この機種にmineoのSIMカードを挿して利用しました。通話や通信品質に関しては、auの頃と比べて見劣りすることは特にありませんでした。

mineo生活にしてから6ヶ月間の平均月額料金は1875円。通話料は毎月異なりますが、利用途中でmineoの料金改定(値引き)などがあり、最終的にほぼ概算通りの月額料金となり、予定通り6ヶ月目から利用料の損得がプラスになりました

 

「よし、あとは毎月得をするだけだ!!」

 

アクシデント発生

それは、毎月得をしながらホクホクしていた9ヶ月目に発生しました。

Xperia UL SOL22 故障

電源ボタンに接触不良が起きたのか、画面がついたり消えたり長押しメニューが勝手に出てきたり、とにかく可愛かったSOL22がじゃじゃ馬に変貌してしまいました。この現象は、いくつか報告されているようです。

ここで、ふと頭をよぎる。

 

「これauで買ったスマホだけど、私はもうauユーザーじゃない・・・」

 

mineoユーザーの私はこのauスマホをどう修理すればいいんだ?

 

重なる不幸

当時の状況はこうです。

  • auユーザー時代に購入したXperia UL SOL22が故障
  • SOL22の購入時期は約20ヶ月前
  • 現在はauを解約し、SOL22にmineoのSIMカードを挿して使用中

結論から言うと、私はauユーザーではないため、auが提供する保証サービスを受けることはできません。また、本体の購入から1年以上経過しているため、メーカー保証も受けることができません

※仮に本体購入から1年以内だった場合、Sony製のXperiaauを通じて購入したため、Sonyが提供するメーカー保証をauを通じて受けることができるみたいです。
(参考:XperiaZ1の修理完了!回線契約してなくてもメーカー保証で無償で修理してくれました!

そしてもちろん、mineoとSOL22に直接関係は一切無いため、mineoに修理を依頼するのは御門違いです。この時点で有償保証は確定したわけですが、実は修理に関して3つの不安がありました。

  • とても忙しい時期で、auショップに行く暇があるのか?
  • スマホの代替機は少ないって聞く上、mineoの私が借りられるのか?
  • 大事な電話がたくさん掛かってくるのに、代替機が無いとどうなるんだ?

以上の不安が渦巻き、まずauショップへ行く暇すら無かったため、早々にSOL22の修理を諦めることにしました

そう、MVNOにして困ったことは、自ら持ち込んだ本体の修理が大変ということです。

そして、不幸は重なります。先ほどの不安の中でも出てきましたが、大事な電話が多い時期に本体が故障してしまい、更に、SOL22のじゃじゃ馬具合も日に日に増していっていたのです。

 

「ちくしょう!!!新規購入だ!!!」

 

やむなく、私はmineoが販売しているスマホを購入することにしました。当時のmineoが販売していたスマホは、当時の価格で安い順に以下の3種類。

  • LUCE KCP01K:33,600円(当時)
  • DIGNO M KYL22:51,840円(当時)
KYOCERA au DIGNO M KYL22 ホワイト

KYOCERA au DIGNO M KYL22 ホワイト

 
  • AQUOS SERIE SHL25:75,600円(当時)
AQUOS SERIE SHL25 (ホワイト) au

AQUOS SERIE SHL25 (ホワイト) au

 

 

「高ぇ...。得するためにmineoにしたのに本体新規購入とかマジかよ!!!」

 

ただもう、こればかりは仕方がありません。そして、まだ不幸は重なります。 実は私は、SuicananacoWAONヤマダ電機JALスターバックスカードなど、可能な限りおサイフケータイを活用している人間なのです。特に、SuicananacoWAONに関しては、SOL22本体にかなりの額の残高が残っていました。

つまり、おサイフケータイ付きスマホを買わなければ、それらが消えてしまうのです。

スマホの新規購入は予想外すぎる出費なため、なるべく安く抑えたいところです。が、最安のLUCEにはおサイフケータイ機能は付いていません。

やむなく私は、DIGNO M KYL22を51,840円で新規購入する羽目になったのです。

 

「半年以上使えば今よりかなりお得になるぞ!!!」

予定通り6ヶ月目から利用料の損得がプラスになりました。

「よし、あとは毎月得をするだけだ!!」

 

過去の発言が虚しく脳内に響きます。

悲しいかな、じゃじゃ馬になったSOL22と同じく22の名を持つものです。

更には、端末追加契約事務手数料として3,000円を追加徴収されるオマケ付き。

この後、本体の修理保証を付けたため月額料金も少し値上がりし、予想外の出費約55,000円を回収するのに5ヶ月かかりました。もちろん、mineo契約後7ヶ月目以降に蓄積したプラス分に加えて更に5ヶ月です

 

おわりに

auからmineoに乗り換えて14ヶ月、私はMVNOを利用することで得をしようとして、結局得も損もしませんでした。14ヶ月でmineoに支払った通信料金は、au契約のまま14ヶ月間auに支払う予定だった通信料金と変わらないものでした。だた1点異なるのは、手元に残ったものが

  • 動かないXperia UL SOL22
  • 新しいDIGNO M KYL22(mineo仕様)

になっている 点です。

今回の私の話は、特別なパターンの話でしょうか?いえ、今回のパターンは、キャリアで購入したスマホを使ってMVNOへ乗り換えるすべての人に起こりうることです。

今回のようなことを経験すると、キャリア3社とMVNOの料金の差には、やはり提供するサービス内容の差が大きく含まれているからと、少し納得できるようになりました。

 

追伸

私は訳あってmineoとの契約を14ヶ月で終了したため、得も損もしなかったと言っています。もちろん、14ヶ月目で全ての支出を回収できているため、15ヶ月目以降は毎月得をするだけです(auの毎月の支払い料金を8,600円に固定して考えた場合ですけどね)。

facebookのトリコロール賛同大会

11月13日にフランス・パリでテロが発生した。そこでfacebookは、パリ市民の平和と安全を願うキャンペーンとして、プロフィール写真にトリコロールを重ねることができる機能を発表した。

 

この機能を利用してトリコロールを重ねたプロフィール画像を設定するfacebookユーザは、きっとこの記事を書いている今も拡大しているだろう。

 

トリコロールのプロフィール画像facebookのフィード上に増えだしてきた頃、この機能へ対して疑問を呈したり、注意を呼びかける内容の記事が発表されだした。例えば以下のような記事だ。

 

この時点で一度だけ言わせていただくが、このような記事を書くのは本当にやめて頂きたい

 

記事から生まれる連鎖

今回のトリコロール機能に関しては、ネット上で賛否両論を巻き起こしている。つまるところ、フェイスブックレインボーの際と似たような現象で、"機能の利用者に疑問を投げかける者""その人達に反対する者"の論争である。

 

ざっくりと言えば、前者の主張は「機能の意味を理解せずに見た目や流行に乗っただけの利用者が気に入らない」といったところで、後者の主張は「とやかく言うな。僅かでも行動することが大切なんだ」といったところ。

 

正直、こんな論争に意味はない。これはきっと、違う考え方を受け入れられない限り終わらない争いだろうから。私一個人の意見としては、どちらも間違ってないと思う。前者の言う通り、「なんかトリコロール流行ってるやん(ポチ)」なんて利用者も沢山いるだろうし、後者の言う通り、いかなる気持ちであっても結果的にその意思表示が何か大きな救いに繋がるかもしれない。

 

話を先に進めると、この論争は、先に紹介したような前者の意見から始まっている。あのような記事が、全ての発端となっているのだ。

 

記事の中では、「プロフィール画像トリコロールにしている人を悪く言うつもりはない」というような意思表示がされていることも少なくない。

 

だが違う違う違う!

 

あなたがその記事を通じて言いたかったことは、その部分ではないはず。そして、その記事の読者もまた、その部分を重要とは思わない。誰から見ても、その記事が言っていることは「もうちょっと考えてから機能使えよ」「この機能必要ないだろ」という風に受け入れられるのだから。

 

そして、それらの記事は、その記事が言っていることにスポットを当ててfacebookでシェアされていく。そして、それをシェアした人は「ちゃんと考えてから行動しないとな」的な言葉を添えていく。それを見たお友達は、「そうですね。きちんと意味を把握した上で利用したいですね」といったコメントや、「私は○○○と考えてフランス国旗を重ねさせていただきました」なんてコメントが付いていく。

 

理解者はどうなる?

機能利用者へ批判的な記事は、主に機能の意味を理解していない人へ対して疑問を呈している。そこで言いたい。

  • その理解していない人というは、あなたの記事を読む人なのか?
  • 機能の意味を理解している人の気持ちを、どれほど考えたのか?

私の周りにも、流行に乗っただけでトリコロールにしたんだろうなという人たちがチラホラいる。これは私の完全なる主観での意見だが、その人たちは貴方達の記事を読まないだろうし、シェアすらも回ってこないのではないだろうか、と感じる。その記事の内容は、伝えたい人に伝わらなければ、ただの内輪で盛り上がっているだけの自己満足になってしまうのではないだろうか。もし自己満足の記事であれば、それはそれで良いと私は思う。

 

そして、私が声を大にして言いたいのは、機能の意味を理解している人の気持ちをどれほど考えて記事を書いたのか、である。特に、個人ブログはまだしも、facebook等で拡散されやすい大手ニュースサイト上に載る記事の場合、「この記事に色んな意見が付いてfacebookで拡散されていくかもな」という想像はどれほど行われたのだろうか。

 

facebookでシェアされるのは、多くの場合でシェア内容にポジティブな意見を持った場合である。今回も、先のような記事が私の周りでも沢山シェアされ、「うんうん、何も分からずこの機能使ってる人多いよね、うんうん」というった賛同大会があちこちで起きているのだ。

 

待てい!

 

私は、今回の機能がリリースされたかなり早い段階で、プロフィール写真にトリコロールを重ねた。それは、私にとってパリは、昨年旅行したばかりでかなり身近な街であったことや、数少ない海外旅行先の1つという特別な街でもあったことから、その時出会った人や街並みを思い出すと本当に心配になって、パリ市民の平和と安全を願ったからである。

 

しかし

 

周りは賛同大会である。トリコロールにした人が賛同大会に赴いて、「ちなみに私は〜」といった釈明すらしている。そう、恥ずかしくなってきたからである。自分のプロフィール画像トリコロールを重ねることが、周りの人から勘違いされているんじゃないかと、恥ずかしくなってきたから釈明しないといけなくなっているのだ。

 

やめてくれ!

 

機能を利用した時、周りにトリコロールの人はほぼ皆無だったが、フェイスブックレインボーの教訓から、同じ事態になることは想像できた。だが、理解せずトリコロールにする人が溢れても、気にならないと思ったので私はトリコロールを重ねた。そして、実際気にならなかった。賛同大会が起きるまでは

 

大会が起きるようになってからは、確かに、「無知な奴と思わるんじゃないか?」という気持ちも生まれた。はっきり言って、すごく居心地が悪くなってしまった。facebookが「パリ市民の平和と安全を願う人」を対象として始めたキャンペーンに、「パリ市民の平和と安全を願う私」が参加しただけなのに。

 

まとめ

facebookトリコロール機能の意味を理解せずに使うことに対してや、機能自体に対して批判する記事を書くことをやめてください。その記事は、パリ市民の平和と安全を願っている人を悩ませている可能性があります。