boscoworks.log

boscoworksのブログ的な

レガシーコードと戦っているはなし

概要

PHP7が話題になるなか、EOLをとっくに迎えたPHPを使ったシステムを運用するケースは少なくないかと思います。自分もそんなひとりで、今回はそのレガシーコードたちを抱えながらどうにかしてPHPのバージョンアップを進めようとした苦労話です。
今回はPHP5.3から5.5にあげます。5.5もレガシー感あるけど・・・まぁ・・・。

なぜやるか

エンジニアにとってはEOLなPHPを使うこと自体がナンセンスだと思いますが、建前的に考えた理由としては:

  1. PHPそのものの不具合が直る
  2. PHPそのものがはやくなる
  3. 悪い人に攻撃されにくくなる
  4. 最近出てるイケてるライブラリとかツールとかが使えるようになる

みたいな感じでしょうか。

なにをしたか

  1. php.netを読み漁る
  2. 後方互換のない機能を洗い出す
  3. システムに対して影響範囲を洗い出す
  4. php -l とかやる
  5. テストを実施する
  6. エラーログを確認する

これをひたすら繰り返します。

どのへんでつまったか

そこそこ大きなシステムを複数にまたがって確認しましたが、ひっかかったのはだいたい以下の4点でした。

マジッククォーツ

PHPを長く使ってる人はあんまり使わないような気もしますが、フレームワークで使われてるケースはあるみたいなので要注意。

preg_replaceのe修飾子

これはいたるところにありました。そもそもe修飾子は割とメジャーに使う機能だったけどなぁ。

Declaration of %s::%s() should be compatible with that of %s::%s()

継承元のメソッドと継承先のメソッドで引数の個数や型がずれてるとPHP strict standardsエラーが出るようになります。プログラム的には良くないんだろうけどPHP的には昔からあんまり意識されてない部分で、これも該当箇所が結構ありました。

参照渡し

perlとか書いてた人は割と参照渡しする感じですかね。PHPでは最新だと使えなくなりました。これはそんなに数はなかったのですが、探すのに苦労しました。

で、結局

なんとかひとつのシステムを無事にアップデートできたようです。
でもPHP5.5もEOL近いし、PHP7にしたいなーとも思いつつ。
最近のWebアプリの開発ってPHPからRubyに主流がシフトしてるのかなーと感じながら、PHPはいまだに好きなので、いろいろ今後も試していこうかと思います。

IPアドレスと位置情報をマッピングするテーブルをHadoopを使った解析基盤に作ってみた

概要

データ解析をやっていると、「いつ・誰が・何をした」っていう調査は比較的容易に実現できるものだと実感していますが、「どこで」というキーワードを使った解析は意外に難しい気がしています。
スマートフォンからはGPSを使えばそれなりに取れます(やったことはないけど)。
PCのブラウザからとなると、ユーザから申告してもらうか、IPアドレスからおおよその位置を割り出すしかありません。
今回は、IPアドレスと位置情報を結びつける、データ解析用マッピングテーブルをどうにかして作った話です。

続きを読む

Cloudera World Tokyo 2013 に参加してきました

気が付けばHadoopを使ったログ解析基盤システムのエンジニアになって1年。ようやく少しは話についていけるようになりました。
Hadoopのバージョンアップなんかも視野に入れたりしてて、より一層知識欲しいところだし、ということで Cloudera World Tokyo 2013 に行ってきました。

概要

開催日時 2013年11月7日(木) 10:00-18:30
開催場所 目黒雅叙園
MAP
大きな地図で見る
主催 Cloudera株式会社 http://www.cloudera.co.jp/jpevents/cwt2013/

内容

1. Amebaにおけるログ解析基盤Patriotの活用事例

  • 株式会社サイバーエージェント 善明晃由氏 飯島賢志氏
  • http://www.slideshare.net/cyberagent/cloudera-world-tokyo-2013
  • patriot = 全社共通ログ解析基盤(ユーザ行動分析・レコメンド)
  • Hive/MR HBaseで活用、flumeで収集
  • Hadoop CHD4.3
  • ジョブ数 2012/3:3154Jobs/day 2013/11:11639Jobs/day
  • ジョブスケジューラ cronで登録→管理はDB→workerで実行
  • バッチ設定はgithubで管理 pull request を受け付け
  • Jenkinsで簡単なレビューを実行(入力パーティション率・非効率なJOINなど)
  • flume: 80services log type: 160types host: 1000
  • flume aggregator: 4core MEM8GB RAID1*2 2台
  • final aggregator: 4core MEM24GB RAID1*2 5台
  • collectorなどを自作してflumeにアドオン

2. SQLで実現するバッチ処理とストリーム処理

3. AmebaにおけるRHadoopの活用事例

  • 株式会社サイバーエージェント 和田 計也氏
  • RHadoop RからHadoopを簡単に使うためのRライブラリ
  • rmr -> RからMR実行
  • RandomForestを実装
  • RHadoopで全サービスを一気に分析
  • サービスごとのデータをRの関数に通し、それぞれの分析結果を出力させる
  • あるサービスのKPIを別のゲームの同等の機能から予測する
  • さくっとmodel構築した結果はShinyで魅せる

4. Hadoop コミュニティと YARN の現状

  • 日本電信電話株式会社 小沢 健史氏
  • HadoopRDBMSでデータ量により使い分け
  • NTTグループ内でサービス活用
  • より簡単に運用できるように HA構成の運用をしやすいように改善
  • MapReduceの処理最適化
  • ログの出力内容を改善
  • 足りないドキュメントを追加
  • YARN: Yet Another Resouce Negotiator
  • JTの役割を分割 リソース管理=YARN ジョブスケジュール=各コンポーネントのマスター
  • NodeManager
  • Apache Mesos
  • Resource Managerが単一障害点になってしまった

Hadoop徹底入門を読んだ

初心者なんで、とりあえずパフォーマンスチューニングとかはなしで、概論的なとこだけ。
入門書としてはこれが一番と勧められたので読んだのだけど、とっかかりとしてはなかなか分かりやすかったと思う。
まぁ実際に手を動かさないと何とも分かんないところあるけどね・・・。

第1章 Hadoop ってなんだろう?

  • Hadoop とは
    • 大規模なデータを処理するための並列分散処理基盤
    • テラバイト・ペタバイトクラスのデータに対して、同じ処理を複数のサーバで同時に処理できる
  • Hadoop の概要
    • ログ解析、レコメンデーションエンジン、検索エンジンなどで用いられるケースが多い
    • 大規模データ対象のバッチ処理向き
  • Hadoop が提供する機能概要
    • ハードディスク・ハードウェアを複数並べて同時に利用できる仕組み
    • 分散処理で共通して使う機能
  • Hadoop の適用領域
項目 RDBMS Hadoop
データサイズ 小さなデータの参照・更新 大きなデータの挿入・参照。更新はない
レスポンスタイム 早い 遅い
サーバ台数と性能向上策 1桁台数でスケールアップ(マ シンスペック向上) 数十台~数千台でスケールア ウト (台数増加)
データ構造 構造化データ 準構造化データ
    • 事前にデータ構造の定義が不要
  • Hadoop の構成と処理概要
    • Hadoop 関連プロジェクト
HDFS (Hadoop Disributed FileSystem) 分散ファイルシステム。高いスループットと信頼性が特徴
MapReduce (Hadoop MapReduce) 分散処理フレームワーク
Hive Hadoop を操作するためのSQL的なインターフェース
Pig Hadoop を操作データフローで記述するスクリプト言語的なインターフェース
Sqoop DBMSHadoop でデータをマイグレーションする
HBase 拡張性のあるKey-Value型データストア
ZooKeeper アプリケーションを集中管理するためのプロダクト
    • HDFSMapReduce に対して、それぞれ「マスターサーバー」と「スレーブサーバー」がある
Master Slave
HDFS NameNode DataNode
MapReduce JobTracker TaskTracker
  • HDFS の利便性
    • 透過性: ユーザーはファイルシステムの裏側で複数のサーバーが動いていることを意識する必要がなく open / close / read / write が出来る
    • 拡張性: スレーブサーバーを増やすことでスループットを向上できる
  • HDFS の信頼性
    • レプリケーション性: ひとつのファイルを分割してブロックにし、複数のスレーブサーバーに冗長化して書き込んでいる
    • NameNode には冗長化構成の仕組みがない
  • HDFS での処理パターンの限定
    • 連続的なストリーム読み込みを前提(=ランダムアクセス読み込みは想定されておらず、向かない)
    • 書き込みは1度だけで、更新はできない
  • MapReduce
  • MapReduce Shuffle処理
  • MapReduce Reduce処理
    • 集計処理

第2章 Hadoop の導入

ローカルモード 疑似分散モード 完全分散モード
利用目的 手元の環境で MapReduce 動作確認 手元の環境の HDFS 上で MapReduce 動作確認 分散処理環境構築
サーバ台数 1台 1台 n台
HDFS 利用 利用しない 利用する 利用する

第3章 Hadoop 分散ファイルシステム HDFS

  • HDFSアーキテクチャ
    • DataNode
      • 「ブロック」という固定長に区切られた塊ごとに管理
      • ブロックサイズはデフォルトで 64MB
      • 各ブロックはレプリケーションにより複数のDataNode に配置される
      • 複数配置されたブロックは「レプリカ」と呼ばれる。デフォルトで3つ作られる
    • NameNode
      • メタデータの管理
      • メモリ上で管理される
      • 処理の内容は軽い
      • HDFS の使用状況確認
      • クライアントからの HDFS 操作の受付
      • DataNode の死活監視
      • DataNode から NameNode にハートビートを送信
      • レプリカの数の制御
      • レプリカ数が少なくなれば複製、多くなれば削除
    • HDFS の利点
      • 巨大なファイルを扱える
      • シーケンシャルアクセスで高いスループットを出せる
      • DataNode の一部が故障しても、ファイルの欠損を回避できる
      • 容量にスケーラビリティがある
  • WebUI による管理
    • NameNode のヒープメモリ使用状況
    • HDFS の総容量
    • HDFS の残容量
    • DataNode の死活状況
    • 縮退中の DataNode レプリケーション中のブロック数
    • fsimage が格納されているディレクトリ

第4章Hadoop MapReduce フレームワーク

  • JobTracker
    • ジョブの受付
    • 処理の割り当て
    • 分割した処理の情報把握
    • Map 処理結果の把握
    • 異常終了時の処理再割り当て
    • 失敗頻度の高い TaskTracker のブラックリスト化
    • 複数の TaskTracker での並列実行割り当て
    • ジョブ履歴管理
    • ジョブ進捗通知 TaskTracker 死活監視
      • 600000ミリ秒で脱退させる
      • mapreduce.jobtracker.expire.trackers.interval で設定
    • TaskTracker 追加
  • TaskTracker
    • Child プロセス(Worker プロセス)の生成と処理実行
    • Child プロセスの状況確認
    • 処理停止の通知
    • ハートビート通信
    • Map処理数、Reduce処理数の把握
    • タスク処理のタイムアウト設定
      • 600000ミリ秒
      • mapreduce.task.timeout で設定
    • タスク処理のスロット数(並列処理実行数)設定
      • デフォルトで2
      • Map スロット: mapreduce.tasktracker,map.tasks.maximum
      • Reduce スロット: mapreduce.tasktracker.reduce.tasks.maximum
  • JobClient
    • JobTracker にジョブ依頼
    • ジョブ実行のためのアプリケーションを HDFS に格納
    • JobTracker から通知されるジョブ実行状況の受信
    • ユーザー単位でのジョブ管理 (優先度変更・強制終了)

第5章MapReduce プログラミング入門

package net.kzk9;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; public class WordCount
{
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);&#8232;private Text word = new Text();&#8232;@Override&#8232;protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{&#8232;String line = value.toString();&#8232;StringTokenizer tokenizer = new StringTokenizer(line); while(tokenizer.hasMoreTokens())&#8232;{
word.set(tokenizer.nextToken());
context.write(word, one); }
} }
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable value = new IntWritable(0);&#8232;@Override&#8232;protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException&#8232;{
int sum = 0;&#8232;for(IntWritable value : values)
sum += value.get(); value.set(sum); context.write(key, value);
} }
public static void main(String[] args) throws Exception



{&#8232;Configuration conf = new Configuration();&#8232;GenericOptionsParser parser = new GenericOptionsParser(conf, args); args = parser.getRemainingArgs();
Job job = new Job(conf, "wordcount"); job.setJarByClass(WordCount.class); job.setMapperClass(Map.class); job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);
job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class);
job.setNumReduceTasks(1);
FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1]));
boolean success = job.waitForCompletion(true);






System.out.println(success); }
}
  • word_count_compile.sh
export HADOOP_HOME=/usr/lib/hadoop
export DIR=wordcount_classes CLASSPATH=$HADOOP_HOME/hadoop-core.jar for f in $HADOOP_HOME/lib/*.jar; do
CLASSPATH=${CLASSPATH}:$f; done
rm -fR $DIR
mkdir $DIR
javac -classpath $CLASSPATH -d $DIR WordCount.java jar -cvf wordcount.jar -C $DIR .
rm -fR $DIR
  • 実装概要
    • Mapper
      • org.apache.hadoop.mapreduce.Mapper クラスを継承
      • 入力Key-Value、出力Key-Value の4つをそれぞれ指定
      • map() 関数を実装
      • context.write() は何度でも呼び出して良い
public static class Map extends Mapper<KeyIn, KeyOut, ValueIn, ValueOut> {
@Override
protected void map(KeyIn key, ValueIn value, Context context) throws IOException, InterruptedException
{
context.write(new KeyOut, new ValueOut); }
}
    • Reducer
      • org.apache.hadoop.mapreduce.Reducer クラスを継承
      • 入力Key-Value、出力Key-Value の4つをそれぞれ指定
      • reduce() 関数を実装
      • context.write() は何度でも呼び出して良い
public statuc class Reduce extends Reducer<KeyIn, KeyOut, ValueIn, ValueOut> {
@Override
protected void reduce(KeyIn key, Iteravle<ValueIn> values, Context context) throws IOException, InterruptedException
{
contect.write(new KeyOut, new ValueOut); }
}
    • Test
package net.kzk9;
import net.kzk9.WordCount;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mrunit.mapreduce.MapDriver; import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
public class WordCountTest extends TestCase
{
private WordCount.Map mapper; private MapDriver driver; @Before
public void setUp()
{
mapper = new WordCount.Map(); driver = new MapDriver(mapper);
}
@Test
public void testWordCountMapper() {
driver.withInput(new LongWritable(0), new Text("this is a pen")) .withOutput(new Text("this"), new IntWritable(1)) .withOutput(new Text("is"), new IntWritable(1)) .withOutput(new Text("a"), new IntWritable(1)) .withOutput(new Text("pen"), new IntWritable(1))
.runTest(); }
}

第6章SQLインターフェイスHive

  • Hiveとは
    • HiveQLと呼ばれる処理言語でSQLライクに処理内容を定義
    • HiveQLで書かれた処理はHiveがMapReduceジョブに変換して実行
  • HiveとRDBMSの違い
    • オンライン処理に不向き
    • トランザクション処理の機能はない
    • 行単位の更新不可
    • インデックス機能はない
  • テーブルの格納方式
  • MapReduce と Hive
    • INSERT OVERWRITE: テーブル全体を書き換える
    • EXPLAIN: MapReduceジョブ実行プランを表示
  • DDL
    • CREATE TABLE, DROP TABLE, ALTER TABLE
    • ROW FORMAT: データ上で行を区切るためのデリミタ設定
    • STORED AS: データ格納方法を指定
      • SEQUENCEFILE: Hadoop 標準のファイル形式
      • TEXTFILE: テキスト形式
      • RCFILE: Record Columnar File, カラムでデータを格納
    • CREATE VIEW, DROP VIEW: SELECT文をもとに作られる仮想表の操作
    • SHOW TABLES: テーブル情報確認
    • SHOW PARTITION: パーティション情報確認
    • SHOW FUNCTION: 関数情報確認
    • DESCRIBE: テーブルのカラムやパーティションを確認
  • HiveQLにおけるデータ型
    • プリミティブ型
      • 整数型
        • TINYINT: 1バイトの整数
        • SMALLINT: 2バイトの整数
        • INT: 4バイトの整数
        • BIGINT: 8バイトの整数
      • 浮動小数点型
      • 論理型
        • BOOLEAN: TRUE/FALSE
      • 文字列型
        • STRING: 文字列
    • 配列型
        • ARRAY: データ型を配列として扱う
    • MAP型
        • MAP: key-value形式でデータを扱う
    • 構造型
        • STRUCT: 複数のデータ型を構造化する
  • データの格納
    • LOAD: Hiveのテーブルにデータを格納
    • INSERT OVERWRITE: SELECT文で指定したクエリの結果を格納
  • SELECT文
    • データのソート
      • SORT BY: Reduce処理単位でソート
      • ORDER BY: 得られるデータ全てをソート
      • FROMで指定出来るテーブルは一つだけ
    • UNION ALL: 異なるクエリの結果を結合して、ひとつのテーブルに出力
  • コマンドライン・シェルからの実行
    • hive -f ファイル名
    • hive -e HiveQL文

Hadoop Conference Japan 2013 Winter に参加してきました

昨年末にチーム間の異動がありまして、Hadoopを使ったデータマイニングが主業務になりました。
それまで(一応)Webアプリケーションエンジニアだったのですが、今は見習いデータマイニングエンジニア。
上司の方には「今までのノウハウをこれからに活かしてほしい」らしいですが、正直戸惑いと模索の日々が続いています(その上、年が明けてから解析業務1個もやってない)
そんな中、年に1回くらいのペースで開催されるというHadoop Conferenceが開催されるということで、見聞を広げる意味合いを込めて参加してきました。

概要

開催日時 2013年1月21日(月) 10:00-18:00
開催場所 東京国際展示場
MAP
大きな地図で見る
主催 Hadoopユーザ会 http://hcj2013w.eventbrite.com/

内容

1. Hadoop を取り巻く環境

2. LINEのHBaseを利用した大規模なメッセージストレージ

3. Hadoop meets Cloud with Multi-tenancy

4. Amazon Elastic MapReduceHadoopコミュニティの関わり

  • Volume, Velocity, Variery
  • yelp auto-suggest
  • DynamoDB
  • aws/big-data

5. Hadoop's Power to Transform Business

6. Introduction to Impala 〜Hadoop用のSQLエンジン〜

7. Hadoop上の多種多様な処理でPigの活きる道

8. スケーラブルなシステムのためのHBaseスキーマ設計

  • http://www.slideshare.net/Cloudera_jp/hbase-hcj13w
  • hdfsで動作するnosql
  • シャーディングをサポート
  • 書き込み可能、スケールアウト可能
  • rdbmsにある機能がhbaseにはない 大量のデータがある時のみhbase
  • rdbmsと論理設計まではほぼ同じ
  • 非正規化
  • カーディナリティは高い

9. いかにしてHadoopにデータを集めるか

10. トラブルシューティングのために欲しかった、Hadoopがまるっと分かる可視化ツール

感想

正直Hadoopを扱って正味2か月程度の僕には難易度の高いものでした。理解度2割ちょいってところ。
特にKeynoteが一番難しかったかな。何をメモったらいいか分からんかった。
Pigは業務で使っているから一番理解できたかなぁ。PigUnitってのは知らなかったな。
トレンドとしてはHive, Impala, fluentdあたりは熱い感じだった。どれもいまいち分からなかったけど。
これらをそもそも業務にフィードバックできるかっていうと、結局のところHadoopクラスタに対して結構大規模な改修をかけなきゃいけないはずで、そうなると社内政治的に厳しい気がする。

詳しくはTogetterあたりを見るとわかりやすかった気もする。
http://togetter.com/li/443400
現段階の実力では、理解できる人のツイートなりブログなりを見て、ようやく少し理解できる程度で、講演を聞いてそのままパッとわかるようになるには、まだまだ経験が足りなすぎるなぁ、という印象でした。

結局僕は自分の至らなさを痛感してベッコリ凹んで会社に帰っていきましたとさ。

Aizu.LT::Tokyo #1 に参加してきました。

兼ねてより機会があれば参加していたAizu.LTですが、このほど東京でも開催されるとのことで、今回も登壇してきました。

勉強会タグ、使うの久々だなー。ちょいちょい出てるんだけど。もっとアウトプットしていかないとダメですね。

概要

開催日時 2012年7月21日(土) 14:00-16:00
開催場所 株式会社タイムインターメディア
MAP
大きな地図で見る
主催者 @luxion

内容

1. Groovy!

2. インターネットと著作権

3. Corosuke meets UXD

  • @corosuke_k
  • User Experience Design
  • ユーザに「これすげぇー」って思わせるのが仕事

4. 最近読んだ本読みたい本


感想適当だなー。
メモるの忘れたのもあるけど、ゆるーくやるのもこのAizu.LTの良さだと思うんですよね(言い訳)

今回

今回は告知から開催まであまり日が無かったこと、告知そのものをほとんど行わなかったこともあって、内輪感はどうしても強かったのですが、内容はかなりギッチリ詰まっていて、充実した時間を過ごせましたね。
Aizu.LTでよくスピーカーとして登壇するメンバーは結構固定化しつつあって、彼らはなんだかんだで場数を踏んだせいもあり、やはりトークは巧い。
また、今回はかなり技術的に傾倒していた感もあり、これはこれで面白かったな、と。Aizu.LTはライフハック的なLTも結構あったりするし。

今後

東京開催、面白かったのでまたやりたいですね。会津大学卒業生結構いるんだから、話をどんどんしたい。
もちろん趣旨的には会津大学と関係なくても参加OKで、むしろ交流を広める会なので、いろんな人と話をしたい。


自分の話すネタとしては、業務紹介系にどうしても行きがちなので、別のネタも話せるようになれるといいなぁ。
ま、次回までにゆっくり考えます。

最後に

@luxion 幹事お疲れさまでした。また誘って下さい。
参加された方もお疲れ様でした。

入社のご報告

 先月9日に、前職であるヤフー株式会社を退職しまして、3週間ほど春休みを頂戴しました。
4月1日付けで、株式会社ドワンゴにエンジニアとして入社しました。


 噂には聞いてましたが、すげぇ会社ですよ。ドワンゴ
エンジニアのレベルが平均的に高い印象。ニュース記事とかTwitterとかで見かける顔もちらほらいらっしゃいます。
前職でも凄い人たくさんいたはずなんだけどね。何しろ人多くて。


 自己紹介をする暇もなく、初日の午後から検証作業をやっていました。
チームの人は未だに僕が何者か分かっていないんじゃないですかね。
勤務開始からようやく5日、会社に慣れる暇すらなく、ひたすら検証、テスト、調査、コード修正に追われています。


 自覚はしてますが、背伸び感は結構ありますね。
ドワンゴでエンジニアを名乗るには、足りない物が多過ぎて、今はただのお荷物。
ただ、これを望んで転職したので、背伸び感が背伸びじゃないと思えるくらいに実力はつけたいところ。


 ろくに仕事も出来ない入社5日目の中途が言う台詞じゃないのですが、ヤフーにもいいところいっぱいあって、それをドワンゴにフィードバック出来る機会は結構あると思うのです。
そういうところは、自重せずに行きたいな、と。


 まずは実力の底上げからですかね。Ruby勉強しなきゃ。
1週間で、多少なりの自負みたいなものはゴミくずだと認識を改めました。


 それと社内での人脈作りたい。1週間働いた感じ、プロジェクトが結構クローズドに運用されてるので、どう知り合えばいいものかな。
ヤフーの方とも定期的に情報交換とかしたいですね。
社内外の方との交流ってのは、今後僕の課題。


 目標は「ドワンゴに行って、あいつ変わったな」って言われること。もちろんポジティブな意味で。1分1秒でも早く。
頑張ります。よろしくお願いします。