<< 4月 2013 | Home | 6月 2013 >>

Atlassian ユーザーグループに参加! #augj

参加というか開催しました。

今回はHipChatのプロダクトマネージャが急遽来日ということで開催。
スライド、セッション動画は以下のページにまとめてあります。
第8回Atlassianユーザーグループ@株式会社ロフトワークス #augj - Atlassian User Group - Atlassian Japan Confluence

HipChatはいわば「リッチなIRC」、であったり「Atlassian版のCampfire」だったり。
つまりエンタープライズ向け、クラウド型チャットサービスです。

Campfireと比べて何がいいの?という点はネイティブアプリケーション(iOS、Android、Mac OSX)があったり、SMSやメールなどオフライン、アイドル状態の時の通知の設定が柔軟なことなど。

IRCではなく、ChatterではなくなぜHipChatを選んだのか、といった話やAPIを使った外部システム連携などの事例も聞けて大変有意義でした。

HipChatだけでなく、Atlassian製品であるCrucibleの事例もお話いただきました。コードレビューツールはReviewBoard、GitHubを使ったことがあるけれども素朴で「まーそんなもんかな」という感じ。
Crucibleは既読フラグがあったり、他の人のアクティビティがわかったり、そしてなにより見た目が綺麗なことがステキ。GitHubと連携できるようになったら使ってみようかな?


Atlassianから提供していただいたHipChat Tシャツ


懇親会も盛況!

Togetterはこちら:
第8回 Atlassian ユーザーグループ #augj - Togetter

このエントリーをはてなブックマークに追加   

JIRA 6.0 のインストール/アップデート(バージョン 5.2 から) #JIRA #atlassian

JIRA はAtlassian社のJava ベースの人気バグトラッキングシステムで、TwitterJBossApacheCodehausTwitterでも使われています。
とっつきやすさと高機能をうまく両立しており、また見た目が洗練されている素晴らしい製品です。
オープンソースプロジェクトへは無償ライセンスを提供してくれるので私のプロジェクトでも使っています

今回は5.2からリリースされたばかりの6.0へアップグレードをしました、新規インストールの手順もほとんど同じ。

1. 現行 JIRA のバックアップ、新規インスタンスでインポート
既存 JIRA インスタンスより、
ADMINISTRATION > Import & Export > Backup System
File name: jirabackup130522 > "Backup"

無事成功すると Data exported to: /Users/yusukey/jirahome/export/jirabackup130522.zip
と表示されます。(JIRA4.4からはzipで圧縮されるようになった)
ここで現行インススタンスはシャットダウンします。

2. Atlassian より最新版をダウンロード
http://www.atlassian.com/software/jira/downloadより atlassian-jira-6.0.tar.gz をダウンロードします。

3. データベースの作成
ウチではMySQLを使っているので以下の様な感じ。

./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 5.X.XXMySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database jira600 character set utf8;
Query OK, 1 row affected (0.00 sec)


以前データベースへのコネクションプールの設定は conf/server.xml 内にしていましたがこれはJIRAの管理画面から設定するように変更になりました。

4. JIRA Configuration Toolによるデータソース、JIRA_HOMEの設定
以前はatlassian-jira/WEB-INF/classes/entityengine.xmlを手動してデータベース接続先を指定していましたが、JIRA4.4以降ではJIRA Configuration Toolという簡単なGUIで設定をできるようになりました。Configuration Toolはbin/config.shまたはconfig.batで起動できます。
または初回起動後にWebUIで設定することもできるそうです。

Configuration Toolの画面

JIRAは以前のようにMySQLのJDBCドライバを同梱しなくなったので以下のように古いJIRAインスタンスから手動でlibディレクトリに配置する必要があります。Configuration Tool起動後でも大丈夫。
cp ../jira-5.2/lib/mysql-connector-java-5.1.10.jar lib


データベース接続の設定内容は $JIRA_HOME/dbconfig.xml に、またJIRA HOMEはatlassian-jira/WEB-INF/classes/jira-application.propertiesに保存され、手動で変更することも可能です。

ちなみにdbconfig.xmlの内容はこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>

<jira-database-config>
<name>defaultDS</name>
<delegator-name>default</delegator-name>
<database-type>mysql</database-type>
<jdbc-datasource>
<url>jdbc:mysql://localhost:3306/jira600?useUnicode=true&amp;characterEncoding=UTF8</url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<username>mysqluser</username>
<password>********</password>
<pool-size>15</pool-size>
<validation-query>select 1</validation-query>
</jdbc-datasource>
</jira-database-config>


以前はMySQLで文字化け対策としてJDBCURLに useUnicode=true&characterEncoding=UTF8 と指定していましたが、Configuration Toolは自動的にこれらを追加してくれるみたいです。

5. server.xmlの設定
ウチのサーバではApacheをフロントに立ててAJPで接続しているのでAJPコネクタをセットアップします。また使わないHTTPコネクタは無効に設定。

<Server port="9005" shutdown="SHUTDOWN">
.
.
.
<!--
<Connector port="8080"
.
.
.

</Engine>
<Connector port="9009"
maxHttpHeaderSize="8192" maxThreads="20" minSpareThreads="20" maxSpareThreads="20" useBodyEncodingForURI="true"
protocol="AJP/1.3" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="600000" disableUploadTimeout="true" />
</Service>
</Server>


6. JIRA の起動
startup.sh より起動。start-jira.sh というスクリプトもあるけど何が違うのかは不明。
"No jira.home is configured."と出て起動できなかった

7. データのインポート
JIRA にアクセスし、インポート。
最近のバージョンではエクスポートしたファイルは JIRA_HOMEのimportディレクトリに配置しておく必要があります。
$ mv ~/jirahome/export/jirabackup130522.zip ~/jirahome/import/


Import Existing Data
File name: jirabackup121114.zip

便利!

インポート中の状況表示

8. インポート失敗!
以上でバージョンアップが完了・・・・のはずがAO4AEACD_WEBHOOK_DAOというテーブルが重複しているとかでインポートに失敗してしまい今日は断念。


エラーメッセージ全文:
There was a problem restoring ActiveObjects data for the plugin JIRA WebHooks Plugin(com.atlassian.jira.plugins.webhooks.jira-webhooks-plugin) #1.0.10 plugin. Importing table AO_4AEACD_WEBHOOK_DAO failed. Please check the log for details.


例外スタックトレース全文:
2013-05-22 02:07:14,706 JiraImportTaskExecutionThread-1 ERROR anonymous 127x21x1 18sbkw7 118.243.84.51 /secure/SetupImport.jspa [jira.bc.dataimport.DefaultDataImportService] Error during ActiveObjects restore
com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with plugin JIRA WebHooks Plugin(com.atlassian.jira.plugins.webhooks.jira-webhooks-plugin) #1.0.10 (table AO_4AEACD_WEBHOOK_DAO):Error executing update for SQL statement 'CREATE TABLE AO_4AEACD_WEBHOOK_DAO (
ENABLED BOOLEAN,
ENCODED_EVENTS TEXT,
EXCLUDE_ISSUE_DETAILS BOOLEAN,
FILTER TEXT,
ID INTEGER AUTO_INCREMENT,
LAST_UPDATED DATETIME,
LAST_UPDATED_USER VARCHAR(255),
NAME TEXT,
REGISTRATION_METHOD VARCHAR(255),
URL TEXT,
PRIMARY KEY(ID)
) ENGINE=InnoDB'
at com.atlassian.activeobjects.backup.ImportExportErrorServiceImpl.newImportExportSqlException(ImportExportErrorServiceImpl.java:30)
at com.atlassian.activeobjects.backup.SqlUtils.onSqlException(SqlUtils.java:53)
at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:42)
at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:84)
at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:62)
at com.atlassian.dbexporter.importer.TableDefinitionImporter.doImportNode(TableDefinitionImporter.java:50)
at com.atlassian.dbexporter.importer.AbstractImporter.importNode(AbstractImporter.java:49)
at com.atlassian.dbexporter.DbImporter.importData(DbImporter.java:73)
at com.atlassian.activeobjects.backup.ActiveObjectsBackup.restore(ActiveObjectsBackup.java:158)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.restoreActiveObjects(DefaultDataImportService.java:467)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.performImport(DefaultDataImportService.java:673)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.doImport(DefaultDataImportService.java:273)
at com.atlassian.jira.web.action.setup.DataImportAsyncCommand.call(DataImportAsyncCommand.java:66)
at com.atlassian.jira.web.action.setup.DataImportAsyncCommand.call(DataImportAsyncCommand.java:29)
at com.atlassian.jira.task.ImportTaskManagerImpl$TaskCallableDecorator.call(ImportTaskManagerImpl.java:146)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'ao_4aeacd_webhook_dao' already exists
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1647)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1566)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:37)
... 20 more


9. なるほどよくわからん
インポートに失敗するので推奨される方法ではないけどJIRA5.2のデータベースをまるまるコピーしてみることに。
するとやはりao_4aeacd_webhook_daoというテーブルの重複が。あれ?
$ mysqldump jira520 | mysql jira600
ERROR 1050 (42S01) at line 23: Table 'ao_4aeacd_webhook_dao' already exists
mysqldump: Got errno 32 on write


データベースの破損を疑ったけれども壊れている様子はない。
$ mysqlcheck jira520
jira520.ao_4aeacd_webhook_dao OK
jira520.ao_563aee_activity_entity OK
jira520.ao_563aee_actor_entity OK
jira520.ao_563aee_media_link_entity OK
...




関連記事:
JIRA 5.2 のインストール/アップデート(バージョン 5.0.4 から) #JIRA #atlassian - #侍ズム
JIRA 5.0.4 のインストール/アップデート(バージョン 4.4.3 から) #JIRA #atlassian - 侍ズム #samuraism
JIRA 4.4.3 のインストール/アップデート(バージョン 4.4 から) #JIRA #atlassian - 侍ズム #samuraism
JIRA 4.4 のインストール/アップデート(バージョン 4.3.4 から) #JIRA #atlassian - 侍ズム
JIRA 4.3.4 のインストール/アップデート(バージョン 4.3 から) - 侍ズム
JIRA 4.3 のインストール/アップデート(バージョン 4.2.2 から) - 侍ズム
JIRA 4.2.2 のインストール/アップデート(バージョン 4.2.0 から) - 侍ズム
JIRA Git Plugin のインストール - 侍ズム
JIRA 4.2 のインストール/アップグレード(バージョン 4.1 から) - 侍ズム
JIRA 4.1 のインストール/アップグレード(バージョン 4.0.2 から) - 侍ズム
JIRA 4.0.0 から JIRA 4.0.2 へのアップグレード - 侍ズム
アトラシアン(Atlassian)製品の価格と購入方法
Atlassian が JIRA4 をリリース - 指名ユーザライセンス制を導入 - 侍ズム
JIRA 3.13.1 へ FishEye プラグイン 2.3 をインストール
JIRA をバージョン 3.13.1 へアップデート - 侍ズム
FishEye 1.6.3 のインストール
JIRA をバージョン 3.12.3 へアップデート

このエントリーをはてなブックマークに追加   

#jjug_ccc に参加しました

前エントリは講演者としての話で、このエントリは参加者としての話。

JJUG CCC(クロスコミュニティカンファレンス)は年二回、日本Javaユーザーグループが開催しているカンファレンス。
JJUG CCC 2013 Spring – 開催概要 | 日本Javaユーザーグループ

・基調講演-1 Javaのこれからを考える
Javaユーザーグループの現況についての説明や、オッサン化の進むJavaコミュニティのあり方についての話など。今更ながら年二回のJJUG CCCのスポンサーフィーで回しているということを知りました。幹事に若い方が二人入られたと言うことで心強い!

・基調講演-2 What’s New for JavaFX in JDK 8
3D対応だよ!とかCGの世界では何を今更・・・という感はあるけれどもOpenGLを使ったコードよりもとてもシンプルに3D表現ができる気がする。OpenGLのコードを書いたことがあるわけじゃないけど、見た限りはオブジェクト指向からはほど遠い低レベルなAPIで直感的でない感じ(その分パフォーマンスは良いのかもしれないけど)。
JavaFXの3D関連のAPIは「これなら自分でも叩ける!」と感じさせるものでした。

・Java EE 6 から Java EE 7 に向かって
新卒で配属されて最初に開発したのがWebLogic 5.1でJ2EE 1.2ベースのB2Cサービスでした。1.2→1.3→1.4→5→6→7と着実に進化しているわけだけれども、ちゃんとIDEを使っていたのでJ2EE 1.2の時点でそれなりに完成度の高い仕様だったと思っています。
Java EE 5あたりでEoDと謳って簡単に開発できるよ、としていたのはIDEに頼らない猛者が楽をできるための仕様なんじゃないかと・・・。
で、話はそれたけれどもJava EE 7はEoDじゃなくてイマドキなWebSocketsやHTML5対応が目玉(だと思ってる)。以前は1歩も2歩も先を行っていたJ2EE/Java EEも、進歩の早いWebの世界からすると今では2歩、3歩遅れている状態で正直残念な感じはあります。
が、ベンダのサポートが受けられるアプリケーションサーバでこれらの機能が実装されれば保守的な現場でもWebSockets/HTML5が採用されるかもしれないと思うと熱い!

・Project Lambda Essential
オレオレプロジェクトではさっさとJava 8に移行してしまおうかと思わせるセッションでした。一部理解できていないので復習したいところ・・・。

・ニコニコAndroid開発 – アプリ・サーバサイド両面から見た開発事情
AndroidのAPIに頼ろうとしたら「fragmentation」で問題にぶち当たってしまったので動画再生周りなどを内製のテクニックでカバーした、等すごいノウハウが詰まっているセッション。ドワンゴ恐るべし!

・失敗から学ぶAPI設計
一番広いホールに割り当てて頂いたけど、ほぼ満席状態だった気がします。聴講ありがとうございました!

・Groovy2.Xの新機能
Javaの延長でRubyっぽくユルく書けるのがGroovy、必ずしもJavaの文法にはこだわらずイマドキで、固く書けるのがScalaというイメージだけどGroovyは固くも書けるようにしている模様。幅広く適用できるのを目指しているのかもしれないけど迷走しているようにも見えたり・・・。
でもAndroid StudioがGradle推しだったりするのでG*界隈はもっともっと盛り上がっていきそう!

・Facebook4Jで近づくJavaとFacebook Graph API
Twitter4Jのデザインを再利用していただいているFacebook4Jのセッション。実装・インターフェースのデザインだけでなくWebサイトや、英語のメーリングリストも用意する、とか色々と参考にしていただけていて照れるばかり。Twitter API以上にメソッドがあるようでメンテナンス大変そう・・・。でもTwitterもFacebookも同じ感覚で扱えるのはスバラシイ!!!

・地方における勉強会事情
2コマ分ぶち抜きのセッションだったのでFacebook4Jの話を聞いた後で途中参加。地方では集客であったり、講師を集めるのだったりが大変という話も。
岡山、大阪、仙台の勉強会に行ったことあるけれどもそれはそれで良い雰囲気があると思います。特に東京は人が多いのでプログラミング言語別にきっちりコミュニティが分かれている感じ(全部がそうではないけど)、でも地方では母数が少ないためか言語の分け隔てなく交流があるのが好きです。
若い人を呼び込むには、女性を呼び込むにはどうしたら良いか、という話もあがったけれども難しいところ。来たいけれども(オッサンばかりで|男性ばかりで)来づらいということがあるのであればうまくしたいところですね。潜在需要がそもそもないのであれば若者によりキャッチーなScalaとかGroovyとか(GroovyはなぜかJava以上にオッサンだらけだけど・・)で盛り上がったらいいなーと思います。


余談だけれども今回の会場はベルサール新宿というイベントホール。ベルサール**はどこも駅からちょっと離れているけれども広くて綺麗でステキな会場です。最大3トラック同時進行の大規模なカンファレンスをコミュニティベースで運営してしまうJJUGの底力を感じさせます。
スバラシイ場を用意していただいたJJUGスタッフの皆様ありがとうございました!

このエントリーをはてなブックマークに追加   

JJUG クロスコミュニティカンファレンス(CCC)にて「失敗から学ぶAPI設計」について話をしました #jjug_ccc #ccc_h4

日本Javaユーザー会が年2回開催するカンファレンス、JJUG CCCにてTwitter4JのAPI設計の話をしてきました。

失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc JJUG CCC 2013 Spring from Yusuke Yamamoto


使いやすいと評判をもらってるTwitter4JにおいてどういうAPI設計の失敗をしているのか!?・・・実は大きな失敗はしていないというのがネタでした。
ただ、一度決めたインターフェースを永遠に互換性をもたせるようなことはしていないので利用者に混乱を与えやすい箇所や、テストのしにくい箇所などは失敗とまでは言わないまでも適宜変更を加えてきました。
インターフェースの変更というのは「やってはいけない」変更のうちの一つ。しかも非常に多くのアプリケーション/サービスで使われているTwitter4Jでいかに混乱を避けてインターフェースを変更してきたかというのも大事なトピックとして話をしてきました。
要は
・バージョンx.y.zのうちzの部分については互換性を持たせる
・zのバージョンアップでも場合によっては一部@deprecatedにする
・yのバージョンアップを2回ほど重ねたあたりで@deprecatedを廃止する
・移行用のドキュメントはしっかり書いて混乱を防ぐ
といったところ。

看板に掲げていた「API設計の失敗」の実例として挙げたのは、細かいことだけれどもファクトリの導入において若干混乱を招いてしまったこと。
ファクトリパターンですら初心者にはちょっと難しいので導入するならstaticファクトリメソッドがいいね、最初からそうすれば良かった、という感じです。
後からSingletonオブジェクトを取得できるstaticメソッドを導入したんだけれども結構Twitter4Jをがっつり使っている人にも知られていない状態です。
小難しい話じゃないけれども(いつも難しい話はしないよう心がけてます)、むやみにカッコイイアーキテクチャ、デザインパターンにしないというのは大事だと思う。

自分ではTwitter4Jを使った大したアプリケーションを作っていないくせに、全体的にはとてーもとてーもとてーも利用者目線で考えてAPI設計をしているだけあってうまくいっています。何をどう考えて設計しているかは自分の中で体系立てられていないのでいずれ整理した上で、再現可能な気がしたら「成功するAPI設計パターン」的な話をできたらいいなーと思っています。

参考図書としてあげたのは2冊。Effective Javaは鉄板。Practical API DesignはJavaプログラマ全員読むべき!とは思わないけれどもフレームワークだとか、システムの共通部分を設計・開発する人にはお勧めです。NetBeansプラットフォームのAPI設計をした方の著書です。



関連記事:
JJUG CCC 2013 Springに参加しました~! - Challenge Java EE !
泥箱的なメモ — JJUG CCC Spring 2013 #jjug_ccc に参加してきた所感とか
makopi23のブログ 「JJUG CCC 2013 Spring」に参加しました
JJUG CCC 2013 Springに行ってきました - Keep It Simple, Stupid
JJUG CCC 2013 Springに参加してきました #jjug #jjug_ccc - uehaj's blog
JJUG CCC 2013 Springをやってみた - arclamp
失敗から学ぶAPI設計 #ccc_h4 #jjug #jjug_ccc - Togetter

このエントリーをはてなブックマークに追加   

5月23日(木) Atlassian ユーザーグループ - 渋谷 #augj

唐突ですが5月23日(木)に渋谷のロフトワークス様でユーザー会を行うことになりました。来週です!

今回はHipChatのプロダクトマネージャの来日に合わせての開催となります。
HipChatを試したことがある方も、ない方も(私は今日初めて触りました・・・)お気軽にご参加ください!

HipChatはざっくり行ってしまえばエンタープライズ向けでログが残るIRCとでもいいましょうか。
クラウドチャットサービスでAtlassian製品との親和性の高さ、カスタマイズ可能で表現力豊かなemoticon(絵文字)、API連携による他システムとの連携のしやすさが特徴です。
5月23日(木) 19:00〜 Atlassianユーザーグループ@株式会社ロフトワーク(渋谷) #augj

参加費は無料(懇親会参加は1000円)です。JIRAやConfluenceなどAtlassian製品のユーザーが集まるはずなのでHipChatだけでなくAtlassian製品に興味のある方は参加して損はないはず!

このエントリーをはてなブックマークに追加   

Gunosy仕組み解説のロジックにある大きな大きな穴

GunosyはTwitterやFacebookの投稿からキーワードを抽出して興味があるであろう記事を個々人にパーソナライズして毎日届けてくれるというレコメンドエンジン・サービスです。

このエンジンの仕組みは単にはてなブックマークを吸い取っただけに過ぎないとする記事がちょっと話題になっています。
Gunosyのレコメンドエンジンの仕組み解説 - ベンチャー・アンダーグラウンド

最初記事のタイトルとURLをTwitterで見かけただけで記事の中身は読んでいませんでした。仕組みとか(ユーザー的には)どうでも良くて、それっぽく働けば良いと思うし。
「Gunosyすごい!」「気になる情報が毎日いっぱい届く!」という声をよく見かける(中の人@fukkyyが良くRTしている)のでそれっぽく、それなりにうまく動いているのではないかと思います。
自分は毎日Twitter、RSSリーダーにへばりついて情報消化しているのでGunosyで受信するヘッドラインは「あぁ、それ見たなぁー」という内容が多いです。が、それはむしろアルゴリズムがうまく働いていることと言えるのではないかと。つまりTwitterやRSSリーダー消化がおろそかになってもGunosyを見ておけばそれなりに話題に追いついていける、はず。

しばらくして、記事が非難の声と共に拡散しているのを見てから読みました。そこで思ったのは
・それっぽく書かれていれば内容の検証なしに拡散する
ということ。

いろいろ違和感のある内容ですが一点特に気になったのは

検索エンジンの検索順位1位のリンクのクリック率は大体約50%だ。2位は10%前後、3位は5%以下に落ちる。だから、2500人のユーザーが1つの記事を見に行くということは、母数(つまりその記事が配信された人数)が最低でも1万6650人以上※いることになる。

という段落。
Gunosyは検索エンジンではないのでクリックスルーレートは検索エンジンの結果ページと大きく異なるはず。
なぜならば検索エンジンは特定のトピックに対して検索して自分がしらべたかったことが書いてある(書いてありそうな)ページをクリックするから。ぴったりのページがあれば2つ以上のリンクをクリックすれる必要はありません。
Gunosyは特定のトピックではなく、ユーザーが興味ありそうな記事を収集してくるので2つ以上の、そして掲載順がトップでないリンクをクリックする動機が大いにあります。
なので「2500人のユーザーが1つの記事を見に行くということは、母数が最低でも1万6650人以上いることになる」という推測は成り立たないのではないかと。

まぁ、はてなブックマークの機械キューレーションサービスだったとしてもそれがユーザーとして意義があると感じられるならいいじゃない?

公式声明?にて「バズりやすい批判でアフィリエイトで稼ぎたいだけなのではないかと疑ってしまった」とありました。ぼくもアフィリエイトで稼ぎたいので機械学習に関する書籍のリンクを張っておきます。このエントリのタイトルもバズりやすい雰囲気にしてみました。



関連記事:
Gunosyはこんなもんだし、自称情報強者落ち着きなさいよという話。 — 乱れなよ、そして召されなよ
[衝撃]Gunosyはただの「はてブ拡張サービス」だった?衝撃の分析まとめ - NAVER まとめ
Gunosy炎上についてvingowの米重克洋社長「API使うだけでこんな風に怒られるんだというのはかなり怖い」 : 市況かぶ全力2階建
なぜ『Gunosy』か、『はてなブックマーク』か、というおかしな話になっているのか?
ここ最近のGunosy関連の批判についての所感

このエントリーをはてなブックマークに追加   

ゆとり社員に度肝を抜かれた? #yutori_history

「ゆとり社員に度肝を抜かれた瞬間」という記事がちょっと話題。

ゆとり社員に度肝を抜かれた瞬間 | キャリア | マイナビニュース

以下団塊ジュニア/就職氷河期世代35歳男性の所感。


・「会社のお酒の席で『自分の知り合いも呼びたい』と言い出した。もちろん会社とは無関係の、プライベートの友だち。びっくりしました」(23歳/女性)
会社の酒の席に友達を呼んで何が楽しいのかわかんないけどそういう空気じゃないなら指導してあげれば?

・「新入社員の同期の誰かが誕生日だったようで、社員が使用している食堂で大きな声で誕生日会をしていたこと。浅はかだなと思い、スルーした」(29歳/女性)
同上。おかしいと思う/社風に合わないなら指摘してあげれば?

・「会社の飲み会を『用事がある』と断った新入社員。帰りに、ふとコンビニに立ち寄ると、その社員がジャンプを立ち読みしていた」(38歳/男性)
会社に人生を捧げる時代でもないので面白くないなら出なけりゃいい。「興味ないんで」とか言って断るよりもオトナかと。会社の近所でたたずんでるのは浅はかだけど。

・「始業後すぐに『今日は何時に終わりますか』と聞かれた」(33歳/男性)
社会人としてのリズムがつかめない新人にとって強い関心事項なのは確か。

・「簡単な仕事だから午前中に終わらせるようにと念を押したら、午後に『あんたには簡単かもしれないけど、自分には大変だった』と半泣きで切れられた。絶句して何も言えなかった」(45歳/男性)
何も言わないんじゃなくて何が難しかったのか聞くなり自分の教え方が悪かったのか考えるなりすれば?

・「定時の3分前から帰り支度をはじめる」(27歳/女性)
定時1時間前からソワソワする人とか結構普通と思う。

・「上司に今度のみに行こうと誘われたとき、『機会があれば』と言っていた」(48歳/男性)
この返しは確かにオカシイとおもう。

・「部長に呼ばれているのに、『いま携帯探してるんで行けません』と言った新入社員がいた。戻ってきてから探せといいくるめた」(40歳/男性)
これは確かにあり得ない。走って部長のところに行くべき。

・「聞きたいことがあったとき、手をあげて先輩を自席に呼びつけていた」(30歳/女性)
まぁ呼びつけるのはいかがなものかと確かに思う。PCの画面を見ないと聞けないような内容なのであれば「ちょっと見てもらえますか?」って来てもらうのはあり。

・「初対面のあいさつで、いきなりタメ口を聞かれたことがあった。どうして良いか分からず、とりあえず普通に会話を続けた」(41歳/男性)
不適切な場なら「どうして良いか分からず」という先輩もいかがなものかと。

・「上司に仕事を頼まれて『マッハでやります!』と言ったとき」(30歳/女性)
やる気があってよろしい。

・「新人をお昼に誘ったとき。親睦(しんぼく)を深められたと勘違いされたのか、『朝が弱いので遅刻したときはうまく言い訳しておいてください』と頼まれた」(33歳/女性)
「勘違いしてんじゃないよ、甘えるな」って言えばいい。

・「会社のイントラ上で『kwsk』や『www』など、2chのような会話を繰り広げていた社員。総務が慌てて削除していた」(30歳/女性)
いいんじゃない?暇な総務・・・

・「『先輩ツンデレなんだからー』と言ってくる。無視した」(31歳/女性)


・「『了解』ですらビジネスマナーに反しているのに、『りょ!』と言われた。適切な言葉を使うよう促しました」(25歳/女性)
「承知いたしました」というべきで「了解」、「りょ!」は適切じゃないと思う。ちゃんと指導してあげるいい先輩!

新人類とかゆとり世代とか、なんかわかりやすい命名がされることで際立っているよう見えるけど「常識」は絶対的なものではなく結局個々人の主観でしかないと思う。まぁそんなもんかと。ゆとり世代を批判している世代も新人のときあれこれ言われてたんでしょ?

ゆとり世代代表(とネタにされているけど実際のところゆとり世代ではありません)の@megascusの転職をお祝い申し上げます!いつからか愚痴ばっかりでストレスがすんごい溜まっていそうで心配していました。新天地に行けるようでうれしいです!
ゆとり Advent Calendar : ATND

このエントリーをはてなブックマークに追加