SlideShare a Scribd company logo
1 of 40
Download to read offline
1 © Takahashi Fumiki
2015年のサバイバル学習術
Web開発技術の税引後利益
を最大化しよう!
WP-D Fes #03
2 © Takahashi Fumiki
高橋 文樹
2001年、幻冬舎主催の文学賞を受賞し、大
学在学中に作家デビュー。その後、長い冬
の時代を過ごし、2007年に「自身の作品を
Webで発表する技術を身につける」を目標
にWeb業界に転職。
2010年に独立して株式会社破滅派を設立。趣味は家づくり。
3 © Takahashi Fumiki
Gruntなるものをはじめた
タスクランナーで業務効率化
4 © Takahashi Fumiki
なぜGrunt?
• Sassコンパイル, JS圧縮はCodekitで満足していた
• プラグインなどOSSを配布する以上、有償ツール
じゃない方がいいかなと思った
• 共同作業でもCodekit買わない人が多かった
5 © Takahashi Fumiki
Grunt終わってた
© Takahashi Fumiki6
http://lab.sonicmoov.com/markup/gulp-instead-of-grunt/
7 © Takahashi Fumiki
その他の情報によると……
• Gruntはかれこれ1年ぐらい新規開発が止まっている
らしい
• Gulpの方が簡潔に書けて、速度も多少早いらしい
• GulpはGoogleのWeb Starter Kitにも採用された

https://developers.google.com/web/starter-kit/
8 © Takahashi Fumiki
こういうことはよくある
9 © Takahashi Fumiki
損をしない方法があったのでは?
10 © Takahashi Fumiki
そんなものはない
11 © Takahashi Fumiki
収支決算
出資 資産
Grunt学習時間 Gruntの知識
Grunt固有の知識 Grunt終了のお知らせ
タスクランナーの知識
Gulp学習時間 Gulpの知識
Gulp学習時間 Gulp固有の知識
税引後利益
これを最大化しよう!
どんなツールも
いつかなくなる
A Story about Flash
Flashにまつわる物語
© Takahashi Fumiki12
13 © Takahashi Fumiki
2008年、Flashはすごかった (1)
• はじめて就職した会社で、「コーダー」「デザイナー」と
「Flasher」の間には明確な給与の差があった
• FlashできないWebデザイナーの給料は額面30万超えないと言
われた
• LoftworkのサイトにFlash+CMS連携で1500万と書いてあった
14 © Takahashi Fumiki
2008年、Flashはすごかった (2)
• ブラウザへのインストール率も95%ぐらいで、もっとも普
及した実行環境だった
• JavascriptでFlashと同等の表現をするのは至難の業だった
• ActionScript 3.0が出た頃で、「まともなプログラミング言
語になった」と言われていた
15 © Takahashi Fumiki
2008年、Flashはすごかった (3)
• TextLayoutFrameworkというプロジェクトがすごかった
• AdobeならではInDesign並の組版(縦書き・フォント・
禁則処理・縦中横)
• 僕は小説家なので、Webで書籍と同じように小説を読め
るようにしたかった
16 © Takahashi Fumiki
Flash累計学習時間
0
1500
3000
4500
6000
2007年 2008年 2009年 2010年 2011年 2012年 2013年
2010年こんな感じに(写真参考)
http://takahashifumiki.com/web/programing/774/
© Takahashi Fumiki17
18 © Takahashi Fumiki
完成した結果
• WordPressでコンテンツを入稿すると、Flashで縦書き表示。フォントもヒラギノ
明朝でアンチエイリアスも効いており、大変美しい。ページめくり。
• 超頑張ってルビ・自動縦中横・自動行頭下げも実現した。
• SEO対策もばっちり。Flashは一度書き出されたHTMLをXMLとして再解釈し、レ
ンダリングするからボットでも安心。
• コピペ対策もばっちりで、お気に入りの箇所をブックマークできた。
• ページ内検索で、検索ワードが作品内に何個登場するかも実現できた。
本当にがんばった
© Takahashi Fumiki19
20 © Takahashi Fumiki
ちょうどその頃……
だがしかし
Steve JobsがFlashを名指しでDisる
https://www.apple.com/hotnews/thoughts-on-flash/
© Takahashi Fumiki21
AdobeはAirでFlashいけると主張
http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f3cb56e2a12cc36970aa-8000.html
© Takahashi Fumiki22
そうこうしているうちにWebブラウザがCSS3対応
http://blog.antenna.co.jp/CSSPage/2012/08/koboepub3.html
© Takahashi Fumiki23
Webフォントも高品質に
http://fontplustips.com/item/27-logowebfont2.html
© Takahashi Fumiki24
ここまで言われるように
http://readwrite.jp/archives/20117
© Takahashi Fumiki25
26 © Takahashi Fumiki
もうFlash使わなくなった
2012年
27 © Takahashi Fumiki
失ったもの
• Flash Builder(2回ぐらいアップデートしたので9万ちょい?)
• Flash固有の知識に費やした学習時間
• Flashのライブラリについての知識
• MXMLなどのタグ名
• Font埋め込みに関する知識
28 © Takahashi Fumiki
得たもの
• 暗号化、フォント埋め込みなど、それまで普通にWebサイトを作っているだけでは必要がなかった知識
• 鬼の正規表現
• ライブラリを使うのではなく、作るとはどういうことか
• Nightly Buildを利用することにまつわる苦労。最先端は辛いな! いやー、つれーわ!
• フロントエンドとバックエンドの連携
• 非同期処理についての基本知識(フォント5M、ルビ書き出しのためのレンダリング規則)
• 文字コードに関する深い知識
• タレントを探す嗅覚(クリエイターズクリエイター)
29 © Takahashi Fumiki
多くを失ったが
多くを得た
結論
30 © Takahashi Fumiki
たとえば、正規表現
public	
  static	
  function	
  tcy(xml:XML,	
  textToTcy:String):XML{	
  
	
  	
  	
  	
  //すべてのノードにアクセス	
  
	
  	
  	
  	
  for(var	
  idx:String	
  in	
  xml..*){	
  
	
  	
  	
  	
  	
  	
  	
  	
  //テキストノードにのみ処理を行う	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(xml..*[idx].nodeKind()	
  ==	
  "text"){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  replacedTcy:String	
  =	
  xml..*[idx].toString();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  FIXME:	
  とりあえず1∼2文字の場合だけ変換	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(replacedTcy.match(/^[a-­‐zA-­‐Z0-­‐9!?]{1,2}$/)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/([a-­‐zA-­‐Z0-­‐9!?]{1,2})/,	
  "<flow:tcy>$1</flow:tcy>");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //中間を修正	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/([^a-­‐zA-­‐Z0-­‐9,	
  .&!?'"	
  -­‐])([a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐zA-­‐
Z0-­‐9!?,	
  .&'"	
  -­‐])/g,"$1<flow:tcy>$2</flow:tcy>$3");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //FIXME:	
  一字挟んでtcyがあった場合(22∼23など。行頭・行末はうまく行く)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/(</flow:tcy>[^a-­‐zA-­‐Z0-­‐9!?,	
  .&'"	
  -­‐])([a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐
zA-­‐Z0-­‐9!?,	
  .&'"	
  -­‐])/g,	
  "$1<flow:tcy>$2</flow:tcy>$3");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //先頭だけを修正	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/(^[a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐zA-­‐Z0-­‐9,	
  .&!?'"])/,"<flow:tcy>$1</
flow:tcy>$2");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //最後だけを修正	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/([^a-­‐zA-­‐Z0-­‐9,	
  .&!?'"])([a-­‐zA-­‐Z0-­‐9!?]{1,2})$/,"$1<flow:tcy>$2</
flow:tcy>");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //横に寝てしまう文字を起こす	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //参考情報	
  http://forums.adobe.com/thread/646184?tstart=0	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //FIXME:	
  UTF-­‐8でEast	
  Asian	
  Widthがambiguousであるかどうかを知るにはどうしたら?	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //tcyが連続になっていると横につながってしまうので、spanに修正	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  regStr:String	
  =	
  "▲△▼▽☆★*①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅨⅩⅰⅱⅲⅳⅴⅵⅶⅷαβγΩ‰
℃Å♪♩♫♬";	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(textToTcy	
  !=	
  "")	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  regStr	
  +=	
  textToTcy;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  reg:RegExp	
  =	
  new	
  RegExp("(["	
  +	
  regStr	
  +	
  "])",	
  "g");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(reg,"<flow:span	
  textRotation="rotate270">$1</flow:span>");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  replacedTcy	
  =	
  replacedTcy.replace(/(°F)/g,	
  "<flow:span	
  textRotation="rotate270">$1</flow:span>");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //元のノードに入れ直す	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  xml..*[idx]	
  =	
  replacedTcy;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  return	
  new	
  XML(xml.toXMLString().replace(/&lt;(/?)flow:([^&]*?)&gt;/g,"<$1flow:$2>"));	
  
}
31 © Takahashi Fumiki
たとえば、暗号化
package	
  com.hametuha.cypher	
  {	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  import	
  flash.utils.ByteArray;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  import	
  com.hurlant.crypto.symmetric.*;	
  
	
  	
  	
  	
  import	
  com.hurlant.crypto.prng.Random;	
  
	
  	
  	
  	
  import	
  com.hurlant.crypto.Crypto;	
  
	
  	
  	
  	
  import	
  com.hurlant.crypto.hash.*;	
  
	
  	
  	
  	
  import	
  com.hurlant.util.Hex;	
  
	
  	
  	
  	
  import	
  com.hurlant.util.Base64;	
  
	
  	
  	
  	
  public	
  class	
  Crypto	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  暗号を解読して返す	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  data	
  ByteArray	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @return	
  String	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  static	
  function	
  decrypt(data:ByteArray,	
  pswd:String):String	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  pad:IPad	
  =	
  new	
  NullPad();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  cipher:ICipher	
  =	
  com.hurlant.crypto.Crypto.getCipher("blowfish-­‐
ecb",Hex.toArray(Hex.fromString(pswd)),pad);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  pad.setBlockSize(cipher.getBlockSize());	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  (cipher	
  is	
  IVMode)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  ivmode:IVMode	
  =	
  cipher	
  as	
  IVMode;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ivmode.IV	
  =	
  Hex.toArray("");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  cipher.decrypt(data);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  data.position	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  data.readMultiByte(data.length,	
  "utf-­‐8");	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}
32 © Takahashi Fumiki
たとえば、アニメーション
package	
  com.hametuha.utils.Math	
  
{	
  
	
  	
  	
  	
  import	
  flash.geom.Point;	
  
	
  	
  	
  	
  public	
  class	
  Dimension	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  function	
  Dimension()	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  内容物が縦横比を保ったままコンテナの中に収まるようサイズを取得する	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  content	
  内容物の幅と高さ	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  container	
  コンテナの幅と高さ	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @return	
  Point 新しい内容物の幅と高さ	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  static	
  function	
  rectangleMaxLimit(content:Point,	
  container:Point):Point	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  adjustedContent:Point	
  =	
  new	
  Point();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //内容物の方が縦長の場合、高さで制限する	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(isHigher(content,	
  container)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(content.y	
  >	
  container.y){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.y	
  =	
  container.y;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.x	
  =	
  content.x	
  /	
  content.y	
  *	
  container.y;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.x	
  =	
  content.x;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.y	
  =	
  content.y;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //内容物の方が横長の場合、幅で制限する	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(content.x	
  >	
  container.x){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.x	
  =	
  container.x;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.y	
  =	
  content.y	
  /	
  content.x	
  *	
  container.x;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.y	
  =	
  content.y;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  adjustedContent.x	
  =	
  content.x;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  adjustedContent;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  オブジェクトがどんな形をしているかを返す	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  content	
  形を知りたいオブジェクト	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @return	
  String	
  "square",	
  "high",	
  "broad"のいずれか	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  static	
  function	
  getShape(content:Point):String	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  shape:String;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(content.x	
  ==	
  content.y)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  shape	
  =	
  "square";	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  if(content.x	
  <	
  content.y)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  shape	
  =	
  "high";	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  shape	
  =	
  "broad";	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  shape;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  /**	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  2つのオブジェクトを比較して、1つ目のオブジェクトの方が縦長だったらtrue	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  sub	
  比較したいオブジェクト	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @param	
  obj	
  比較対象のオブジェクト	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  *	
  @return	
  Boolean	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  static	
  function	
  isHigher(sub:Point,	
  obj:Point):Boolean	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(sub.y	
  /	
  sub.x	
  >	
  obj.y	
  /	
  obj.x)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  true;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  false;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}
package	
  com.hametuha.book.animation	
  
{	
  
	
  	
  	
  	
  import	
  com.hametuha.book.events.PagenatorEvent;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  import	
  flash.display.Sprite;	
  
	
  	
  	
  	
  import	
  flash.events.Event;	
  
	
  	
  	
  	
  import	
  flash.events.EventDispatcher;	
  
	
  	
  	
  	
  import	
  flash.events.IEventDispatcher;	
  
	
  	
  	
  	
  import	
  flash.events.TimerEvent;	
  
	
  	
  	
  	
  import	
  flash.geom.Point;	
  
	
  	
  	
  	
  import	
  flash.utils.Timer;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  public	
  class	
  PagenatorFlip	
  extends	
  EventDispatcher	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  originalPoint:Point	
  =	
  new	
  Point(0,0);	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  leftPoint:Point	
  =	
  new	
  Point(-­‐100,0);	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  rightPoint:Point	
  =	
  new	
  Point(100,	
  0);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  accel:Number	
  =	
  1.5;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  timer:Timer;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  interval:int	
  =	
  33;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  vanishSpeed:Number;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  showSpeed:Number;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  buffer:Number	
  =	
  5;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  from:Sprite;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  to:Sprite;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  tategaki:Boolean;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  showPoint:Point;	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  var	
  vanishPoint:Point;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  function	
  next(_from:Sprite,	
  _to:Sprite,	
  _tategaki:Boolean):void	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from	
  =	
  _from;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to	
  =	
  _to;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  tategaki	
  =	
  _tategaki;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //消失点と表示点を設定	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  showPoint	
  =	
  (tategaki)	
  ?	
  leftPoint	
  :	
  rightPoint;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  vanishPoint	
  =	
  (tategaki)	
  ?	
  rightPoint	
  :	
  leftPoint;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  pageMove();	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  function	
  previous(_from:Sprite,	
  _to:Sprite,	
  _tategaki:Boolean):void	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from	
  =	
  _from;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to	
  =	
  _to;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  tategaki	
  =	
  _tategaki;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //消失点と表示点を設定	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  showPoint	
  =	
  (tategaki)	
  ?	
  rightPoint	
  :	
  leftPoint;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  vanishPoint	
  =	
  (tategaki)	
  ?	
  leftPoint	
  :	
  rightPoint;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  pageMove();	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  function	
  pageMove():void	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //表示設定	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from.alpha	
  =	
  1;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.alpha	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.visible	
  =	
  from.visible	
  =	
  true;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  setPoint(from,	
  originalPoint);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  setPoint(to,	
  showPoint);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //スピードの設定	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  vanishSpeed	
  =	
  (vanishPoint.x	
  -­‐	
  originalPoint.x)	
  /	
  10;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer	
  =	
  new	
  Timer(interval);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.addEventListener(TimerEvent.TIMER,vanishHandler);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.start();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dispatchEvent(new	
  Event(PagenatorEvent.PAGENATION_START));	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  function	
  vanishHandler(event:TimerEvent):void	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //アニメーションが終了していたら	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(isAnimationFinish(from,	
  vanishPoint,	
  vanishSpeed)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //表示を元に戻す	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from.visible	
  =	
  false;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from.alpha	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  setPoint(from,	
  originalPoint);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //速度を設定	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  showSpeed	
  =	
  vanishSpeed;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //リスナーを削除	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.removeEventListener(TimerEvent.TIMER,vanishHandler);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.addEventListener(TimerEvent.TIMER,showHandler);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //アニメーションを実行	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  vanishSpeed	
  *=	
  accel;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from.x	
  +=	
  vanishSpeed;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  from.alpha	
  /=	
  accel;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dispatchEvent(new	
  Event(PagenatorEvent.PAGENATION_EXECUTING));	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  private	
  function	
  showHandler(event:TimerEvent):void	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //アニメーションが終了していたら、イベントを発行	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(isAnimationFinish(to,	
  originalPoint,	
  showSpeed)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //表示を元に戻す	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.visible	
  =	
  true;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.alpha	
  =	
  1;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  setPoint(to,	
  originalPoint);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //リスナーを削除	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.removeEventListener(TimerEvent.TIMER,	
  showHandler);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer.stop();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  timer	
  =	
  null;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dispatchEvent(new	
  Event(PagenatorEvent.PAGENATION_ENDS));	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //アニメーションを実行	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else{	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  showSpeed	
  /=	
  accel;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.x	
  +=	
  showSpeed;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(to.alpha	
  ==	
  0)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to.alpha	
  +=	
  .2;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
33 © Takahashi Fumiki
たとえば、目標とするクリエイターの発見
"新藤愛大(Yoshihiro Shindo)――19
歳という若さでありながら、国内でも屈
指のActionScripterとして活躍する彼は、
フリーランスとしてFlash/ActionScript
にその身をささげている。"
http://www.itmedia.co.jp/enterprise/
articles/0805/12/news007.html
34 © Takahashi Fumiki
収支決算
出資 資産
flash学習時間 flashの知識
flash固有の知識 flash終了のお知らせ
GUI設計の知識
Xの学習時間 Xに固有の知識
税引後利益
ものすごくたくさんの
知識=資産
Xが何かはまだ
わからない
35 © Takahashi Fumiki
スキル習得の秘訣
• 実戦投入する
• 情報の荒野まで邁進する
• 学習曲線の坂を登ることを厭わない
36 © Takahashi Fumiki
1. 実戦投入
それとも 
お前何十年も修行して
達人にでもなるのを待ってから
戦場に出るつもりか?
気の長なげェ話だな
ベルセルク 第24巻
37 © Takahashi Fumiki
2. 情報の荒野まで邁進する
https://forums.adobe.com/thread/646184
38 © Takahashi Fumiki
3. 学習曲線の坂を登ることを厭わない
せめてこれぐらいまでは
やらないと成果はでない
39 © Takahashi Fumiki
上り終えた梯子は
捨て去られねばならない
ルートヴィヒ・ウィトゲンシュタイン『論理哲学論考』より
40 © Takahashi Fumiki
なにかすごいものを作ろう!
終わりに

More Related Content

What's hot

GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
超絶技巧プログラミングの世界(FTD2015)
超絶技巧プログラミングの世界(FTD2015)超絶技巧プログラミングの世界(FTD2015)
超絶技巧プログラミングの世界(FTD2015)mametter
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)mametter
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Yasutaka Kawamoto
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
diffの真髄
diffの真髄diffの真髄
diffの真髄fuku68
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索Akio Ishida
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Etsuji Nakai
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programmingmametter
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 

What's hot (20)

GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
超絶技巧プログラミングの世界(FTD2015)
超絶技巧プログラミングの世界(FTD2015)超絶技巧プログラミングの世界(FTD2015)
超絶技巧プログラミングの世界(FTD2015)
 
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
diffの真髄
diffの真髄diffの真髄
diffの真髄
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
llvm入門
llvm入門llvm入門
llvm入門
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 

Similar to WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!

Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfKosuke Saigusa
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本Damper Matsu
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~Takaaki Tanaka
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作るgumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作るgumilab
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
Ext.Directについて
Ext.DirectについてExt.Directについて
Ext.DirectについてYuki Naotori
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションKohei Kadowaki
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter IntegrationKazuki Nakajima
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for SmalltalkSho Yoshida
 

Similar to WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう! (20)

Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 
cloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdfcloud_firestore_schema_code_generation_for_flutter.pdf
cloud_firestore_schema_code_generation_for_flutter.pdf
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作るgumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
Ext.Directについて
Ext.DirectについてExt.Directについて
Ext.Directについて
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo
 
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for Smalltalk
 

More from 文樹 高橋

あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめあと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ文樹 高橋
 
テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする
 テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする
テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする文樹 高橋
 
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメもう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ文樹 高橋
 
マルチパブリッシング プラットフォームとしてのWordPress
マルチパブリッシング プラットフォームとしてのWordPressマルチパブリッシング プラットフォームとしてのWordPress
マルチパブリッシング プラットフォームとしてのWordPress文樹 高橋
 
縄文時代の小説を書く(1)
縄文時代の小説を書く(1)縄文時代の小説を書く(1)
縄文時代の小説を書く(1)文樹 高橋
 
GFLS入門 - GitFlowっぽいアレ-
GFLS入門 - GitFlowっぽいアレ- GFLS入門 - GitFlowっぽいアレ-
GFLS入門 - GitFlowっぽいアレ- 文樹 高橋
 
WordBench Tokyo Jan 30th, 2015
WordBench Tokyo Jan 30th, 2015WordBench Tokyo Jan 30th, 2015
WordBench Tokyo Jan 30th, 2015文樹 高橋
 
基本契約書ドラフト
基本契約書ドラフト基本契約書ドラフト
基本契約書ドラフト文樹 高橋
 
12 word pressカスタマイズ(プラグイン編)
12 word pressカスタマイズ(プラグイン編)12 word pressカスタマイズ(プラグイン編)
12 word pressカスタマイズ(プラグイン編)文樹 高橋
 
11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)文樹 高橋
 
10 word pressをインストール
10 word pressをインストール10 word pressをインストール
10 word pressをインストール文樹 高橋
 
09 ソーシャルブックマーク(3)
09 ソーシャルブックマーク(3)09 ソーシャルブックマーク(3)
09 ソーシャルブックマーク(3)文樹 高橋
 
07 ソーシャルブックマーク(2)
07 ソーシャルブックマーク(2)07 ソーシャルブックマーク(2)
07 ソーシャルブックマーク(2)文樹 高橋
 
06 ソーシャルブックマーク(1)
06 ソーシャルブックマーク(1)06 ソーシャルブックマーク(1)
06 ソーシャルブックマーク(1)文樹 高橋
 
05 はじめてのmy sql
05 はじめてのmy sql05 はじめてのmy sql
05 はじめてのmy sql文樹 高橋
 
04 filesystem include
04 filesystem include04 filesystem include
04 filesystem include文樹 高橋
 
03 var array_flow_func
03 var array_flow_func03 var array_flow_func
03 var array_flow_func文樹 高橋
 
02 はじめてのメール送信
02 はじめてのメール送信02 はじめてのメール送信
02 はじめてのメール送信文樹 高橋
 
06 オブジェクト指向の基礎
06 オブジェクト指向の基礎06 オブジェクト指向の基礎
06 オブジェクト指向の基礎文樹 高橋
 
05 再利用のためのインクルード
05 再利用のためのインクルード05 再利用のためのインクルード
05 再利用のためのインクルード文樹 高橋
 

More from 文樹 高橋 (20)

あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめあと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
あと一つプログラミング言語を
覚えたら死ぬ! 脳みそがパンクしそうな
あなたのための
nodeJSことはじめ
 
テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする
 テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする
テーマに機能を含めちゃダメなんて誰が決めた! テーマをモリモリにカスタマイズする
 
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメもう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ
もう自分で考えるのはやめよう! クリエイティブ・アウトソーシングのススメ
 
マルチパブリッシング プラットフォームとしてのWordPress
マルチパブリッシング プラットフォームとしてのWordPressマルチパブリッシング プラットフォームとしてのWordPress
マルチパブリッシング プラットフォームとしてのWordPress
 
縄文時代の小説を書く(1)
縄文時代の小説を書く(1)縄文時代の小説を書く(1)
縄文時代の小説を書く(1)
 
GFLS入門 - GitFlowっぽいアレ-
GFLS入門 - GitFlowっぽいアレ- GFLS入門 - GitFlowっぽいアレ-
GFLS入門 - GitFlowっぽいアレ-
 
WordBench Tokyo Jan 30th, 2015
WordBench Tokyo Jan 30th, 2015WordBench Tokyo Jan 30th, 2015
WordBench Tokyo Jan 30th, 2015
 
基本契約書ドラフト
基本契約書ドラフト基本契約書ドラフト
基本契約書ドラフト
 
12 word pressカスタマイズ(プラグイン編)
12 word pressカスタマイズ(プラグイン編)12 word pressカスタマイズ(プラグイン編)
12 word pressカスタマイズ(プラグイン編)
 
11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)11 word pressカスタマイズ(テーマ編)
11 word pressカスタマイズ(テーマ編)
 
10 word pressをインストール
10 word pressをインストール10 word pressをインストール
10 word pressをインストール
 
09 ソーシャルブックマーク(3)
09 ソーシャルブックマーク(3)09 ソーシャルブックマーク(3)
09 ソーシャルブックマーク(3)
 
07 ソーシャルブックマーク(2)
07 ソーシャルブックマーク(2)07 ソーシャルブックマーク(2)
07 ソーシャルブックマーク(2)
 
06 ソーシャルブックマーク(1)
06 ソーシャルブックマーク(1)06 ソーシャルブックマーク(1)
06 ソーシャルブックマーク(1)
 
05 はじめてのmy sql
05 はじめてのmy sql05 はじめてのmy sql
05 はじめてのmy sql
 
04 filesystem include
04 filesystem include04 filesystem include
04 filesystem include
 
03 var array_flow_func
03 var array_flow_func03 var array_flow_func
03 var array_flow_func
 
02 はじめてのメール送信
02 はじめてのメール送信02 はじめてのメール送信
02 はじめてのメール送信
 
06 オブジェクト指向の基礎
06 オブジェクト指向の基礎06 オブジェクト指向の基礎
06 オブジェクト指向の基礎
 
05 再利用のためのインクルード
05 再利用のためのインクルード05 再利用のためのインクルード
05 再利用のためのインクルード
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (12)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

WPD-Fes #3 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう!

  • 1. 1 © Takahashi Fumiki 2015年のサバイバル学習術 Web開発技術の税引後利益 を最大化しよう! WP-D Fes #03
  • 2. 2 © Takahashi Fumiki 高橋 文樹 2001年、幻冬舎主催の文学賞を受賞し、大 学在学中に作家デビュー。その後、長い冬 の時代を過ごし、2007年に「自身の作品を Webで発表する技術を身につける」を目標 にWeb業界に転職。 2010年に独立して株式会社破滅派を設立。趣味は家づくり。
  • 3. 3 © Takahashi Fumiki Gruntなるものをはじめた タスクランナーで業務効率化
  • 4. 4 © Takahashi Fumiki なぜGrunt? • Sassコンパイル, JS圧縮はCodekitで満足していた • プラグインなどOSSを配布する以上、有償ツール じゃない方がいいかなと思った • 共同作業でもCodekit買わない人が多かった
  • 5. 5 © Takahashi Fumiki
  • 7. 7 © Takahashi Fumiki その他の情報によると…… • Gruntはかれこれ1年ぐらい新規開発が止まっている らしい • Gulpの方が簡潔に書けて、速度も多少早いらしい • GulpはGoogleのWeb Starter Kitにも採用された
 https://developers.google.com/web/starter-kit/
  • 8. 8 © Takahashi Fumiki こういうことはよくある
  • 9. 9 © Takahashi Fumiki 損をしない方法があったのでは?
  • 10. 10 © Takahashi Fumiki そんなものはない
  • 11. 11 © Takahashi Fumiki 収支決算 出資 資産 Grunt学習時間 Gruntの知識 Grunt固有の知識 Grunt終了のお知らせ タスクランナーの知識 Gulp学習時間 Gulpの知識 Gulp学習時間 Gulp固有の知識 税引後利益 これを最大化しよう! どんなツールも いつかなくなる
  • 12. A Story about Flash Flashにまつわる物語 © Takahashi Fumiki12
  • 13. 13 © Takahashi Fumiki 2008年、Flashはすごかった (1) • はじめて就職した会社で、「コーダー」「デザイナー」と 「Flasher」の間には明確な給与の差があった • FlashできないWebデザイナーの給料は額面30万超えないと言 われた • LoftworkのサイトにFlash+CMS連携で1500万と書いてあった
  • 14. 14 © Takahashi Fumiki 2008年、Flashはすごかった (2) • ブラウザへのインストール率も95%ぐらいで、もっとも普 及した実行環境だった • JavascriptでFlashと同等の表現をするのは至難の業だった • ActionScript 3.0が出た頃で、「まともなプログラミング言 語になった」と言われていた
  • 15. 15 © Takahashi Fumiki 2008年、Flashはすごかった (3) • TextLayoutFrameworkというプロジェクトがすごかった • AdobeならではInDesign並の組版(縦書き・フォント・ 禁則処理・縦中横) • 僕は小説家なので、Webで書籍と同じように小説を読め るようにしたかった
  • 16. 16 © Takahashi Fumiki Flash累計学習時間 0 1500 3000 4500 6000 2007年 2008年 2009年 2010年 2011年 2012年 2013年
  • 18. 18 © Takahashi Fumiki 完成した結果 • WordPressでコンテンツを入稿すると、Flashで縦書き表示。フォントもヒラギノ 明朝でアンチエイリアスも効いており、大変美しい。ページめくり。 • 超頑張ってルビ・自動縦中横・自動行頭下げも実現した。 • SEO対策もばっちり。Flashは一度書き出されたHTMLをXMLとして再解釈し、レ ンダリングするからボットでも安心。 • コピペ対策もばっちりで、お気に入りの箇所をブックマークできた。 • ページ内検索で、検索ワードが作品内に何個登場するかも実現できた。
  • 20. 20 © Takahashi Fumiki ちょうどその頃…… だがしかし
  • 26. 26 © Takahashi Fumiki もうFlash使わなくなった 2012年
  • 27. 27 © Takahashi Fumiki 失ったもの • Flash Builder(2回ぐらいアップデートしたので9万ちょい?) • Flash固有の知識に費やした学習時間 • Flashのライブラリについての知識 • MXMLなどのタグ名 • Font埋め込みに関する知識
  • 28. 28 © Takahashi Fumiki 得たもの • 暗号化、フォント埋め込みなど、それまで普通にWebサイトを作っているだけでは必要がなかった知識 • 鬼の正規表現 • ライブラリを使うのではなく、作るとはどういうことか • Nightly Buildを利用することにまつわる苦労。最先端は辛いな! いやー、つれーわ! • フロントエンドとバックエンドの連携 • 非同期処理についての基本知識(フォント5M、ルビ書き出しのためのレンダリング規則) • 文字コードに関する深い知識 • タレントを探す嗅覚(クリエイターズクリエイター)
  • 29. 29 © Takahashi Fumiki 多くを失ったが 多くを得た 結論
  • 30. 30 © Takahashi Fumiki たとえば、正規表現 public  static  function  tcy(xml:XML,  textToTcy:String):XML{          //すべてのノードにアクセス          for(var  idx:String  in  xml..*){                  //テキストノードにのみ処理を行う                  if(xml..*[idx].nodeKind()  ==  "text"){                          var  replacedTcy:String  =  xml..*[idx].toString();                          //  FIXME:  とりあえず1∼2文字の場合だけ変換                          if(replacedTcy.match(/^[a-­‐zA-­‐Z0-­‐9!?]{1,2}$/)){                                  replacedTcy  =  replacedTcy.replace(/([a-­‐zA-­‐Z0-­‐9!?]{1,2})/,  "<flow:tcy>$1</flow:tcy>");                          }else{                                  //中間を修正                                  replacedTcy  =  replacedTcy.replace(/([^a-­‐zA-­‐Z0-­‐9,  .&!?'"  -­‐])([a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐zA-­‐ Z0-­‐9!?,  .&'"  -­‐])/g,"$1<flow:tcy>$2</flow:tcy>$3");                                  //FIXME:  一字挟んでtcyがあった場合(22∼23など。行頭・行末はうまく行く)                                  replacedTcy  =  replacedTcy.replace(/(</flow:tcy>[^a-­‐zA-­‐Z0-­‐9!?,  .&'"  -­‐])([a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐ zA-­‐Z0-­‐9!?,  .&'"  -­‐])/g,  "$1<flow:tcy>$2</flow:tcy>$3");                                  //先頭だけを修正                                  replacedTcy  =  replacedTcy.replace(/(^[a-­‐zA-­‐Z0-­‐9!?]{1,2})([^a-­‐zA-­‐Z0-­‐9,  .&!?'"])/,"<flow:tcy>$1</ flow:tcy>$2");                                  //最後だけを修正                                  replacedTcy  =  replacedTcy.replace(/([^a-­‐zA-­‐Z0-­‐9,  .&!?'"])([a-­‐zA-­‐Z0-­‐9!?]{1,2})$/,"$1<flow:tcy>$2</ flow:tcy>");                          }                          //横に寝てしまう文字を起こす                          //参考情報  http://forums.adobe.com/thread/646184?tstart=0                          //FIXME:  UTF-­‐8でEast  Asian  Widthがambiguousであるかどうかを知るにはどうしたら?                          //tcyが連続になっていると横につながってしまうので、spanに修正                          var  regStr:String  =  "▲△▼▽☆★*①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅨⅩⅰⅱⅲⅳⅴⅵⅶⅷαβγΩ‰ ℃Å♪♩♫♬";                          if(textToTcy  !=  "")                                  regStr  +=  textToTcy;                          var  reg:RegExp  =  new  RegExp("(["  +  regStr  +  "])",  "g");                          replacedTcy  =  replacedTcy.replace(reg,"<flow:span  textRotation="rotate270">$1</flow:span>");                          replacedTcy  =  replacedTcy.replace(/(°F)/g,  "<flow:span  textRotation="rotate270">$1</flow:span>");                          //元のノードに入れ直す                          xml..*[idx]  =  replacedTcy;                  }          }          return  new  XML(xml.toXMLString().replace(/&lt;(/?)flow:([^&]*?)&gt;/g,"<$1flow:$2>"));   }
  • 31. 31 © Takahashi Fumiki たとえば、暗号化 package  com.hametuha.cypher  {                    import  flash.utils.ByteArray;                    import  com.hurlant.crypto.symmetric.*;          import  com.hurlant.crypto.prng.Random;          import  com.hurlant.crypto.Crypto;          import  com.hurlant.crypto.hash.*;          import  com.hurlant.util.Hex;          import  com.hurlant.util.Base64;          public  class  Crypto          {                  /**                    *  暗号を解読して返す                    *  @param  data  ByteArray                    *  @return  String                    */                  public  static  function  decrypt(data:ByteArray,  pswd:String):String  {                          var  pad:IPad  =  new  NullPad();                          var  cipher:ICipher  =  com.hurlant.crypto.Crypto.getCipher("blowfish-­‐ ecb",Hex.toArray(Hex.fromString(pswd)),pad);                          pad.setBlockSize(cipher.getBlockSize());                          if  (cipher  is  IVMode)  {                                  var  ivmode:IVMode  =  cipher  as  IVMode;                                  ivmode.IV  =  Hex.toArray("");                          }                          cipher.decrypt(data);                          data.position  =  0;                          return  data.readMultiByte(data.length,  "utf-­‐8");                  }          }   }
  • 32. 32 © Takahashi Fumiki たとえば、アニメーション package  com.hametuha.utils.Math   {          import  flash.geom.Point;          public  class  Dimension          {                  public  function  Dimension()                  {                  }                                    /**                    *  内容物が縦横比を保ったままコンテナの中に収まるようサイズを取得する                    *  @param  content  内容物の幅と高さ                    *  @param  container  コンテナの幅と高さ                    *  @return  Point 新しい内容物の幅と高さ                    */                  public  static  function  rectangleMaxLimit(content:Point,  container:Point):Point                  {                          var  adjustedContent:Point  =  new  Point();                          //内容物の方が縦長の場合、高さで制限する                          if(isHigher(content,  container)){                                  if(content.y  >  container.y){                                          adjustedContent.y  =  container.y;                                          adjustedContent.x  =  content.x  /  content.y  *  container.y;                                  }else{                                          adjustedContent.x  =  content.x;                                          adjustedContent.y  =  content.y;                                  }                          }                          //内容物の方が横長の場合、幅で制限する                                  else{                                  if(content.x  >  container.x){                                          adjustedContent.x  =  container.x;                                          adjustedContent.y  =  content.y  /  content.x  *  container.x;                                  }else{                                          adjustedContent.y  =  content.y;                                          adjustedContent.x  =  content.x;                                  }                          }                          return  adjustedContent;                  }                                    /**                    *  オブジェクトがどんな形をしているかを返す                    *  @param  content  形を知りたいオブジェクト                    *  @return  String  "square",  "high",  "broad"のいずれか                    */                  public  static  function  getShape(content:Point):String                  {                          var  shape:String;                          if(content.x  ==  content.y)                                  shape  =  "square";                          else  if(content.x  <  content.y)                                  shape  =  "high";                          else                                  shape  =  "broad";                          return  shape;                  }                                    /**                    *  2つのオブジェクトを比較して、1つ目のオブジェクトの方が縦長だったらtrue                    *  @param  sub  比較したいオブジェクト                    *  @param  obj  比較対象のオブジェクト                    *  @return  Boolean                    */                  private  static  function  isHigher(sub:Point,  obj:Point):Boolean                  {                          if(sub.y  /  sub.x  >  obj.y  /  obj.x)                                  return  true;                          else                                  return  false;                  }          }   } package  com.hametuha.book.animation   {          import  com.hametuha.book.events.PagenatorEvent;                    import  flash.display.Sprite;          import  flash.events.Event;          import  flash.events.EventDispatcher;          import  flash.events.IEventDispatcher;          import  flash.events.TimerEvent;          import  flash.geom.Point;          import  flash.utils.Timer;                    public  class  PagenatorFlip  extends  EventDispatcher          {                                    private  var  originalPoint:Point  =  new  Point(0,0);                  private  var  leftPoint:Point  =  new  Point(-­‐100,0);                  private  var  rightPoint:Point  =  new  Point(100,  0);                                    private  var  accel:Number  =  1.5;                  private  var  timer:Timer;                  private  var  interval:int  =  33;                                    private  var  vanishSpeed:Number;                  private  var  showSpeed:Number;                  private  var  buffer:Number  =  5;                                    private  var  from:Sprite;                  private  var  to:Sprite;                  private  var  tategaki:Boolean;                  private  var  showPoint:Point;                  private  var  vanishPoint:Point;                                    public  function  next(_from:Sprite,  _to:Sprite,  _tategaki:Boolean):void                  {                          from  =  _from;                          to  =  _to;                          tategaki  =  _tategaki;                                                    //消失点と表示点を設定                          showPoint  =  (tategaki)  ?  leftPoint  :  rightPoint;                          vanishPoint  =  (tategaki)  ?  rightPoint  :  leftPoint;                                                    pageMove();                  }                                    public  function  previous(_from:Sprite,  _to:Sprite,  _tategaki:Boolean):void                  {                          from  =  _from;                          to  =  _to;                          tategaki  =  _tategaki;                                                    //消失点と表示点を設定                          showPoint  =  (tategaki)  ?  rightPoint  :  leftPoint;                          vanishPoint  =  (tategaki)  ?  leftPoint  :  rightPoint;                          pageMove();                  }                                    private  function  pageMove():void                  {                          //表示設定                          from.alpha  =  1;                          to.alpha  =  0;                          to.visible  =  from.visible  =  true;                          setPoint(from,  originalPoint);                          setPoint(to,  showPoint);                                                    //スピードの設定                          vanishSpeed  =  (vanishPoint.x  -­‐  originalPoint.x)  /  10;                                                    timer  =  new  Timer(interval);                          timer.addEventListener(TimerEvent.TIMER,vanishHandler);                          timer.start();                          dispatchEvent(new  Event(PagenatorEvent.PAGENATION_START));                  }                                    private  function  vanishHandler(event:TimerEvent):void                  {                          //アニメーションが終了していたら                          if(isAnimationFinish(from,  vanishPoint,  vanishSpeed)){                                  //表示を元に戻す                                  from.visible  =  false;                                  from.alpha  =  0;                                  setPoint(from,  originalPoint);                                                                    //速度を設定                                  showSpeed  =  vanishSpeed;                                                                    //リスナーを削除                                  timer.removeEventListener(TimerEvent.TIMER,vanishHandler);                                  timer.addEventListener(TimerEvent.TIMER,showHandler);                          }                          //アニメーションを実行                          else{                                  vanishSpeed  *=  accel;                                  from.x  +=  vanishSpeed;                                  from.alpha  /=  accel;                                  dispatchEvent(new  Event(PagenatorEvent.PAGENATION_EXECUTING));                          }                  }                                    private  function  showHandler(event:TimerEvent):void                  {                          //アニメーションが終了していたら、イベントを発行                          if(isAnimationFinish(to,  originalPoint,  showSpeed)){                                  //表示を元に戻す                                  to.visible  =  true;                                  to.alpha  =  1;                                  setPoint(to,  originalPoint);                                  //リスナーを削除                                  timer.removeEventListener(TimerEvent.TIMER,  showHandler);                                  timer.stop();                                  timer  =  null;                                  dispatchEvent(new  Event(PagenatorEvent.PAGENATION_ENDS));                          }                          //アニメーションを実行                          else{                                  showSpeed  /=  accel;                                  to.x  +=  showSpeed;                                  if(to.alpha  ==  0)                                          to.alpha  +=  .2;                                  else  
  • 33. 33 © Takahashi Fumiki たとえば、目標とするクリエイターの発見 "新藤愛大(Yoshihiro Shindo)――19 歳という若さでありながら、国内でも屈 指のActionScripterとして活躍する彼は、 フリーランスとしてFlash/ActionScript にその身をささげている。" http://www.itmedia.co.jp/enterprise/ articles/0805/12/news007.html
  • 34. 34 © Takahashi Fumiki 収支決算 出資 資産 flash学習時間 flashの知識 flash固有の知識 flash終了のお知らせ GUI設計の知識 Xの学習時間 Xに固有の知識 税引後利益 ものすごくたくさんの 知識=資産 Xが何かはまだ わからない
  • 35. 35 © Takahashi Fumiki スキル習得の秘訣 • 実戦投入する • 情報の荒野まで邁進する • 学習曲線の坂を登ることを厭わない
  • 36. 36 © Takahashi Fumiki 1. 実戦投入 それとも  お前何十年も修行して 達人にでもなるのを待ってから 戦場に出るつもりか? 気の長なげェ話だな ベルセルク 第24巻
  • 37. 37 © Takahashi Fumiki 2. 情報の荒野まで邁進する https://forums.adobe.com/thread/646184
  • 38. 38 © Takahashi Fumiki 3. 学習曲線の坂を登ることを厭わない せめてこれぐらいまでは やらないと成果はでない
  • 39. 39 © Takahashi Fumiki 上り終えた梯子は 捨て去られねばならない ルートヴィヒ・ウィトゲンシュタイン『論理哲学論考』より
  • 40. 40 © Takahashi Fumiki なにかすごいものを作ろう! 終わりに