「web備忘録」カテゴリーアーカイブ

普段はwebのほうの仕事も多いのでそちらのお勉強の際のちょっとしたメモ書きです。

もしも一介の芸人がScala,PlayFrameworkに手を付けたら

全く歯が立たない、できない事でもとにかく飛び込んで、ボコボコにやられて、それでも食いさがったり、猛勉強したりして、徐々に理解したり、慣れてゆくってゆう成長の仕方しか知らないわたしは、身の程を知らないアホだからscalaとplayframeworkの理解にとりかかる。強引にやったら分かってくるし脳が後から付いてくるはずそーしてきたいつだって

知らなかった!AtomでReact×ES6×JSX書くヒトの為のpackage「language-babel」が既にあった

Babel JavaScript ES201x, React JSX & Flow Grammar & Transpiler
Babel JavaScript ES201x, React JSX & Flow Grammar & Transpiler

https://atom.io/packages/language-babel

早速入れた。

【React × ES6 × Flux】を手っ取り早く学びたい人の為にサンプル作った【3の倍数と3が付くときだけ猫になるCounter】 Cat comes out when that contains the multiples of 3 and the string to 3

AWS11-5

なかなかミニマムでこれらを学べるプロジェクトがみつからなくて、勉強も兼ねて作りました。 なるべく小さい部品だと分かりやすいですしね。 この【React × ES6 × Flux】を手っ取り早く学びたい人の為にサンプル作ったよ【3の倍数と3が付くときだけ猫になるCounter】(Cat comes out when that contains the multiples of 3 and the string to 3)は clickすると値が増えるだけの本当に簡素なものですが、 中身はFluxで管理しているのでコードリーディングするのに動きがわかりやすくなっています。 component内でeventを感知すると状態を更新し、更新されたstateは予めリスナー登録していたメソッドをactionTypeによって振り分けてstore内で更新して、状態を子componentに伝えます。

プロジェクトをダウンロードして gulp立ち上げるとローカルサーバー立ち上がります。 jsが変更される度にbrowserifyでまとめてbabelifyでES6をES5に変換後bundleしてくれます。 ReactをClass構文で書きたい方、ES6も勉強したい方にはいいと思います。(僕も奮闘中です)

Fluxに関してはいろいろな書き方があるのですが、今実務でやっているような書き方でやっています。 (EventEmitterはライブラリではありません。)

プロジェクトはこちらです

Fluxに関して言えば前にも理解深めるためにこんなの作りました React × Flux × ES6 [WIP]LINE風チャット

ここからはわたしの今後。 わたしはAngular2もReactもマスターすると決めました。 「RactのこれはAngularでいうところのこれかぁ」、とか「AngularでいうところのtemplateってReactでこーなんだー」って結びつきが強くなるんですよね。 5年後残らないかもしれない技術でも学んだ意欲と「あれとどこか似ているぞ」というはどんなものが資産になるしね。 フロントは多分これからも過渡期ですよね。 ずーーと。 止まらない電車が止まったら乗るのではなく、動いている電車に飛び込んで、しがみつかないといけないと思っています。

こんどはおんなじものをAngular2 × TypeScriptで作ってみたい

ではみなさんいい週末を!!

フロントエンド系の話

github

qiita

【React × Flux × ES6】LINE風チャット

fafa
話は表題と違うのですが、
小さい頃よく母親の作る料理がどこか一箇所凝ったものが混ざってて、
普通の味噌汁でいいのにしめじ入ってたり、
普通の魚でいいのに苦手な野菜をあんかけにして乗っけてきたり、
普通の白ごはんでいいのに栗入れてきたり、、
普通のカレーやハンバーグでいいのにと思ってたのですが、そのカレーすらも茄子が入ってたり、、
よく買い物から帰ってきたスーパーの袋に小さい紙切れ入ってて、
鮮魚売り場で取ってきたレシピなんですよ、
「今度これ、作るのか、、勘弁してくれ、、」て。
今では「美味しいじゃん!」と思えるかもしれませんが、
小学生ですから舌もこえてないですよ。

失礼しました。
RactとFlux周りを勉強しているうちにじゃぁ実装しながら学んだ方がいいのではないか、
と思いました。
ここから状態をどう分けるかをやらなくちゃいけないですね。 コードは
こちら

こちら
です。よかったら

【 併せて読みたい 】

【React】Reactの動きを理解したい人の為の最小サンプル

【REACT入門】過去のREACT初心者の自分にREACTのPROPSとSTATEの違いを簡単に説明してあげたい

【REACT × ES6 × FLUX】を手っ取り早く学びたい人の為にサンプル作ったよ【3の倍数と3が付くときだけ猫になるCOUNTER】

他のReact記事

フロントエンド記事

[javascript]
class ErrorReport{
public reportIt(){
if(this.num == 2){
return "error";
} else {
return "ok";
}
}
constructor(public num:number){
}
}
var faf = new ErrorReport(2);
alert(faf.reportIt());//error
[/javascript]

but this is diffcult to understand someone that saw source code,
then, extend class function,

[javascript]
class ErrorReport{
public reportIt(){
alert(this.errorNumber);
}
constructor(public errorNumber:number){
}
}
class RichErrorReport extends ErrorReport {
public reportIt(){
if(this.errorNumber == 1) alert("Memory Overflow");
else if (this.errorNumber == 2) alert("File Not Found");
else alert(this.errorNumber);
}
}
var faf:ErrorReport = new RichErrorReport(2);
alert(faf.reportIt());
[/javascript]

## duckTyping。Since the members are included in the type A in B, it does not matter even if the extra member is present. Operate
[javascript]
class A {
a: number;
}
class B {
a: number;
b: number;
}
var x: A = new B();

[/javascript]

## Definition of TypeScript can take advantage of the objects defined in the javascript side without
[javascript]
var A = (function(){
function A (msg){
this.msg = msg;
}
return A;
})();

declare class A {
msg: string;
constructor(msg: string);
}
var a = new A("Message frome Space");
alert(a.msg);
[/javascript]

https://jsbin.com/goweminevo/7/edit?html,js,output
[js]
var HelloWorldComponent = React.createClass({
render() {
return (
<h1>Hello {this.props.name}</h1>
);
}
});
React.render(
<HelloWorldComponent name="kenjimorita" />,document.getElementById("fafa")
);
[/js]


https://jsbin.com/goweminevo/9/edit?html,js,output

[js]
class HelloWorldComponent extends React.Component {
render() {
return (
<h1>Hello {this.props.name}</h1>
);
}
};
React.render(
<HelloWorldComponent name="kenjimorita" />,document.getElementById("fafa")
);
[/js]

https://jsbin.com/goweminevo/13/edit?html,css,js,output
[js]
var Tags = React.createClass({
getInitialState: function(){
return {
selected:''
}
},
setFilter: function(filter) {
this.setState({selected : filter})
this.props.onChangeFilter(filter);
},
isActive:function(value){
return 'btn '+((value===this.state.selected) ?'active':'default');
},
render: function() {
return <div className="tags">
<button className={this.isActive('')} onClick={this.setFilter.bind(this, '')}>All</button>
<button className={this.isActive('front')} onClick={this.setFilter.bind(this, 'front')}>front</button>
<button className={this.isActive('backend')} onClick={this.setFilter.bind(this, 'backend')}>backend</button>
<button className={this.isActive('infrastructure')} onClick={this.setFilter.bind(this, 'infrastructure')}>infrastructure</button>
<button className={this.isActive('database')} onClick={this.setFilter.bind(this, 'database')}>database</button>
</div>
}
});

var Kid = React.createClass({
render: function() {
return <ul>
<li>{this.props.name}</li>
</ul>
}
});

var List = React.createClass({
getInitialState: function() {
return {
filter: ''
};
},
changeFilter: function(filter) {
this.setState({
filter: filter
});
},
render: function() {
var list = this.props.Data;

if (this.state.filter !== '') {
list = list.filter((i)=> i.tags.indexOf(this.state.filter) !== -1);
console.log(list);
}

list = list.map(function(Props){
return <Kid {...Props} />
});

return <div>
<h2>moriken ToDo filter</h2>
<Tags onChangeFilter={this.changeFilter}/>
{list}
</div>
}
});

var options = {
Data: [{
name: 'Learn Ract',
tags: ['front', 'js']
},{
name: 'Learn SQL',
tags: ['backend', 'database']
},{
name: 'Learn Angular2',
tags: ['front','js']
},{
name: 'Learn AWS',
tags: ['infrastructure', 'backend']
},{
name: 'Learn SpringFrameWork',
tags: ['backend', 'Java', 'database']
},
{
name: 'Learn NodeJS',
tags: ['backend', 'database']
},
{
name: 'Learn TypeScript',
tags: ['front']
},
{
name: 'Learn Java8',
tags: ['backend','database']
},
{
name: 'Learn ES6',
tags: ['front']
}
]
};

var element = React.createElement(List, options);
React.render(element, document.body);
[/js]

[javascript]
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
<script src="https://cdn.rawgit.com/lodash/lodash/3.0.1/lodash.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<script>

function unsplat(fun){
return function(){
return fun.call(null, _.toArray(arguments));
};
}
var joinElements = unsplat(function(array){ return array.join('') });
var view = joinElements(1,2,90,"eee","ll");
console.log(view);

function lameCSV(str){
return .reduce(str.split("\n"), function(table, row){
table.push(
.map(row.split(","), function(c){return c.trim()}));
return table;
}, []);
};

var peopleTable = lameCSV("name,age,hair\nMerble,35,red\nBob,64,blonde");
console.log(peopleTable)

console.log(_.rest(peopleTable).sort());

var lyrics = [];
for(var bottles = 5; bottles > 0; bottles--){
console.log(bottles)
lyrics.push(bottles + "本のビールが残っている");
lyrics.push(bottles + "本のビール");
lyrics.push("ひとつ取って、隣に回せ");
if(bottles > 1 ){
lyrics.push((bottles - 1) + "本のビールが残っている");
}else {
lyrics.push("もうビールは残っていない");
}

}
console.log(lyrics);
</script>
</body>
</html>
[/javascript]

ES6(ECMAScript2015) related sites I have bookmarked

proto in ECMAScript 6 > <a href="https://See

reason is widely used. But non-encouragement.
See

Let's now check from now > See

You want to bookmark ES6 related

Specification

> See

free webbook

> See

good

> See

Tools can actually writing ES6

> See

It is checked whether to use a transformer compiler

> See

2日前までwebデザインの知識しかなかった芸人がサーバー構築して「サーバー構築芸人」になった話

search
AWS_Viso2 posted by (C)kanpan

わたしは算数、数学も苦手なのですが今日ミニマムでサーバー構築ができました。嬉しい。
今理解できた知識はほんの一部なんでしょうけど、それでも一般的なwebがどういうインフラ構築しててどうやってネットワークを敷いてるのか知ることができた。

あーなるほどな、通信ってこういうことだったのかって。

以下サーバー構築の環境でしたこと。
VPC内にプライベートサブネットとパブリックサブネットで分けて、
プライベート側にWebサーバー置いて、Apacheをインストール、機能を持たせて、IPアドレスをパブリックにしてインターネットゲートウェイに渡す。
ルートテーブルでパケットの仕分けした。

プライベートの方はデータベースサーバーを置いて、アクセスをパブリックサブネットからのwebサーバーだけに絞る。
ただそうするとMySqlをインストールすることもできないからプライベートサブネットからインターネットと通信できるように
NAサーバー置く。
NAサーバーはhttpとhttpsのIPアドレスをネット側に渡すようにした。DBとは一通にして。

スクラム開発で、サーバー側の人と距離が近いからちょっとでもネットワーク理解したくて、
そこから言語をやりたかった。

ここからが多分深いところでまだ「できる」と思っていないけど
「サーバーを構築した」っていうのは一旦自信を持っていいと思う(てゆーふうに鼓舞してきた)

ありがとうございました

PostCSS,asm.js,ES6,Angular2。。2015年のフロントエンド界隈ではこちらが次世代の技術みたいですよ

スクリーンショット 2015-08-22 21.41.04

今日大阪でフロントエンドの話がされたみたいですね。 けっこうこの4つが大事みたい。。

スクリーンショット 2015-08-22 22.04.29

はちさんがいうんだから間違えない。

Angular2ES6

KAIZENの方がいうんだから間違えない スクリーンショット 2015-08-22 22.06.01

PostCSS!?コンパイルなしに書くSCSSみたいな記述??合ってる?? ・PostCSSasm.js

ちょっと先取りしようと思っています。

image
[javascript]
//

Book = Backbone.Model.extend({
    initialize: function(){
        //検出エラーが生じた場合イベントが生成される。invalidイベントハンドラを追加すると検証エラーをフィードバックとして提供できるようになる
        this.on('invalid',function(model,error){
            console.log('**Validation Error:' + error + &quot;**&quot;);
        });
    },
    defaults: {
        name:'Book Title',
        author : 'No One'
    },
    printDetails:function(){
        //something
    },
    validate: function(attrs){
        if(attrs.year &lt; 2000){
            return 'Year must be after 2000';
        }
        if(!attrs.name){
            return 'A name must be provided';
        }
    }
});
var thisBook = new Book();
//2000年よりも前の年を設定
thisBook.set('year',1999,{validate:true});
console.log('Check year change' + thisBook.get('year'));

//モデルから名前を削除
thisBook.unset('name',{validata:true});
console.log('Check if name was removed:' + thisBook.get('name'));


//validフラグを指定しない場合,setメソッドの呼び出し時にvalidate関数は実行されない。
//ただしisValidメソッドを利用すれば、モデルが有効な状態かをいつでもチェックできる
//モデルが有効かどうかをチェック
console.log('Is model valid:' + thisBook.isValid());
// validate フラグを指定しない状態でルール違反
thisBook.set('year',1990);
//モデルが有効かどうかをチェック
console.log('Is model valid:' + thisBook.isValid());

[/javascript]

image

高いんだよこの本。。
でもやってやろうって気にさせてくれた。。
よく本を人に借りるっていうのあるけど、
お金掛けた方が必死で勉強するよ??

そんなわけでbackboneのモデルからお勉強。2月はCoffeeScriptとBackbone.jsとNode.jsやってきます。。

[javascript]
<script src="./js/external/jquery1.11.1.js"></script>
<script src="./js/external/underscore.js"></script>
<script src="./js/external/backbone.js"></script>
<script>
Book = Backbone.Model.extend({
initialize: function(){
console.log('a new book');
},
defaults:{
name : 'Book Title',
author: 'No One'
},
printDetails: function(){//繰り返し発生するタスクを処理するための関数
console.log(this.get('name') + 'by' + this.get('author'));
}
});
var myBook = new Book();
var thisBook = new Book({name: 'Beginning Backbone', author:'James Sugrue'});
console.log(thisBook.get('name')+ 'by' + thisBook.get('author'));

    console.log(thisBook.attributes);//すべての属性のJSON表現

    thisBook.set('name','Beginning Backbone.js');//コンストラクタの外側で属性値を変更する方法
    thisBook.set('year','2015');//yearという新しい属性値を作成

    //モデルで使用しなくなった属性の削除:unset()
    thisBook.set('year',2015);
    console.log('Book year' + thisBook.get('year'));
    thisBook.unset('year');
    console.log('Boook year' + thisBook.get('year'));

    //モデルの存在の確認:has()
    var hasYear = thisBook.has('year');
    var hasName = thisBook.has('name');
    console.log('Has an attribute called year:' + hasYear);
    console.log('Has an attribute called name:' + hasName);

    //clearメソッドを使ってモデル属性を全て削除する
    var newBook = new Book({name:'Another Book',author:'You'});
    //属性を全て削除
    newBook.clear();
    //newBook.hasがfalseを返す
    console.log('Has an attribute called name :' + newBook.has('name'));

    //モデルインスタンスの完全なコピ
    var clonedBook = thisBook.clone();

    //printDetails関数の使用
    thisBook.printDetails();

    //

//モデルのイベント
//変更イベントの処理
Book = Backbone.Model.extend({
initialize : function(){
// this.on('change',function(){//setメソッドが呼び出される度にこの関数が呼び出される
// console.log('Model Changes Detected');
// });

        //特定の属性の変更を待ち受ける場合。下記はname属性への変更のみ対応
        // this.on('change:name',function(){})

        //
        this.on('change',function(){

            // set()で呼び出される関数
            // console.log('Model has changed');

            //モデルの何が変更されたかを追跡する hasChanged()
            // if(this.hasChanged('name')){
            //     console.log('The name has changed');
            // }
            // if(this.hasChanged('year')){
            //     console.log('The year has changed');
            // }

            //変更された属性をまとめて取得:changedプロパティ
            // console.log('Changed attributes:' + JSON.stringify(this.changed));
            // Changed attributes:{&quot;name&quot;:&quot;Different Book&quot;}
            //Changed attributes:{&quot;year&quot;:&quot;34&quot;}

            //全ての属性について以前の状態をまとめて取得することもできる:previousAttributes
            // console.log('Previous attributes:' + JSON.stringify(this.previousAttributes()));
            // Previous attributes:{&quot;name&quot;:&quot;Book Title&quot;,&quot;author&quot;:&quot;No One&quot;}
            // Previous attributes:{&quot;name&quot;:&quot;Different Book&quot;,&quot;author&quot;:&quot;No One&quot;}

            //特定の属性に対して変更前の値を取得する: previous('属性名')
            console.log('Changed attributes:' + JSON.stringify(this.changed));
            if(this.hasChanged('name')){
                console.log('The name has changed from' + this.previous('name') + 'to' + this.get('name'));
            }
            // Changed attributes:{&quot;name&quot;:&quot;Different Book&quot;}
            // The name has changed fromBook TitletoDifferent Book
            // Changed attributes:{&quot;year&quot;:&quot;34&quot;}
        });
    },
    defaults: {
        name: 'Book Title',
        author: 'No One'
    },
    printDetails: function(){
        console.log(this.get('name') + 'by' + this.get('author'));
    }
});

//setメソッドには更新時にイベントを発生させないためのオプションパラメーターがある。このオプションを指定すると,changeハンドラが呼び出されなくなる
//変数を設定(本来ならchangeハンドラが呼び出される)
//changeハンドラが呼び出される
var thisBook = new Book();
thisBook.set('name','Different Book');
thisBook.set('year','34');
// //changeハンドラが呼び出されない
// thisBook.set('name','Differnt Book',{silent:true});

[/javascript]

grunt

1.javascriptの処理をそのまま実行できるカスタムタスク

カスタムタスク内は自由な記述が可能
[javascript]
module.exports = function(grunt){
grunt.registerTask('default','”hellow”と表示',function(){
grunt.log.writeln('Hellow').ok();
});
};
//grunt
[/javascript]

// 2.コマンドの引数受け取り

[javascript]
module.exports = function(grunt){
grunt.registerTask('displayArgv','引数表示',function(argv1,argv2){
grunt.log.writeln('argv1:' + argv1);
grunt.log.writeln('argv2:' + argv2);
})
}
//コマンド上で
grunt displayArgv:foo:bar
//argv1: foo
//argv2: bar
[/javascript]

ターミナルで
npm install
したら
このようなエラーが出たら

If you're seeing this message, either a Gruntfile wasn't found or grunt
hasn't been installed locally to your project. For more information about
installing and configuring grunt, please see the Getting Started guide:

プロジェクトにGruntfile.jsがありませんよ
こちらを実行
cd ~project
npm install --save-dev grunt

このようなエラーが出たら
kenjimorita-MacBook-Pro:study ***$ grunt

Local Npm module "grunt-combine-media-queries" not found. Is it installed?
Local Npm module "grunt-contrib-uglify" not found. Is it installed?
Local Npm module "grunt-csscomb" not found. Is it installed?
Local Npm module "grunt-imageoptim" not found. Is it installed?
Local Npm module "grunt-pngmin" not found. Is it installed?
Local Npm module "grunt-styleguide" not found. Is it installed?
Local Npm module "grunt-text-replace" not found. Is it installed?
Local Npm module "grunt-usemin" not found. Is it installed?
Running "connect:server" (connect) task
Started connect web server on https://0.0.0.0:9000

Package.jsonには書いてあるけど実際ローカルにこれらのプラグインインストールされていませんよ。
こちらのコマンドを実行
npm install --save-dev プラグイン名
npm install --save-dev grunt-contrib-uglify

※プロジェクトファイルでnpm install
$ npm install --save-dev // package.json 側に devDependencies と書いてあれば --save-dev は無くてもいい。
--save-devはpacage.jsonにインストール時に記述するコマンド

このようなエラーが出たら
npm ERR! peerinvalid The package grunt-contrib-coffee does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer grunt-contrib@0.11.0 wants grunt-contrib-coffee@~0.10.0

バージョンが違いますよ。
この上記の peerが今のバージョン。wantsのところが要求バージョン。

ライブリロード便利だなー。
これをGruntfile.jsに追加して
chromeとかfoxのアドオン追加すればいいみたい
https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei
[javascript]
watch: {
sass: {
files: ['<%= dir.sass %>/.scss'],
tasks: ['compass']
},
html_files:{
files:'html/
.html'
},
options:{
livereload: true
}
}
[/javascript]

[javascript]

var ary = ['bb','eeee','aaa','dddd','cc'];
var result = ary.sort();//["aaa", "bb", "cc", "dddd", "eeee"]

//文字の長さで順番を変えるsortカスタマイズ
function sortlength(a,b){
return a.length - b.length;
};
var result2 = ary.sort(sortlength);//["bb", "cc", "aaa", "dddd", "eeee"]

//ECMA5から追加されたArrayメソッド

//forEach(要素に対して順番に関数を呼び出す)
//順番に要素を足していく関数
//各要素に対してarrayメソッドが呼び出されている.//forEachは単に関数を呼び出している
var sum = 0;
var arraySum = function(value){
sum = sum + value;
}
var a = [1,3,5,7];
a.forEach(arraySum);
//↓無名関数をつかう
var su = 0;
var a =[1,4,5,7];
a.forEach(function(vaule){sum = sum + vaule});

alert(sum);

//map 要素を配列にして返す
var a = [1,3,5,7];
var m = a.map(function(value){return value + 1});//[2, 4, 6, 8]

//reduce forEachのように順番に関数を呼び出すが、関数で返却された値と要素の2つを引数にして次の関数を呼び出す
var a = [1,3,5,7];
var sum = a.reduce(function(pre,value){
return pre + value;//最後に関数の結果を返す為、都度格納する必要はない
});
//16

//filter 各要素に対して関数が呼び出される。関数がtrueを返した要素だけの配列が返却される
//偶数だけを配列にする

var fafa = [1,2,3,4,5,6,7];
var sum = fafa.filter(function(value){return (value % 2 == 0);})
//[2,4,6]

//every(全ての要素が条件を満たす場合true) some(いずれかの要素が条件を満たすばあいtrue)
var a = [1,2,3,4,5];
var be = a.every(function(value){return (value <= 3);})//全て3以下か?
var be = a.some(function(value){return (value <= 3);})//3以下の要素があるか?
[/javascript]

RegExpってなんていうのかって思っていたら
レジックスていうらしいね。

[javascript]

    var text = 'abc def ghi jkl';

    var re1 = text.replace(/\s/g,',');
    document.write(re1);
    //「,」直前の文字をグループの後ろに移動する
    document.write('&lt;br&gt;');
    var re2 = text.replace(/(.)\s/g,',$1');
    document.write(re2);

    //上記と同じものをreplaceのコールバックを使う

    var re3 = text.replace(/(.)\s/g,
        function(m1,m2){//第一引数はマッチ全体。第二引数以降はグループの前方参照.マッチ毎にコールバックされる
            return ',' + m2;
        })
    document.write('&lt;br&gt;');
    document.write(re3);

[/javascript]

lazyload.jsで遅延ロードとURLパラメーターを流入元毎にページ内のコンテンツ要素順序を変える(Jquery)

image
未リファクタリング。
パフォーマンスあんま。
とにかく機能だけ実装した叩き台。
regExpのところ全然。。もっとある。。
lazy.jsはここを参照しました。
ここ

URLパラメーターを取得、流入元毎にページ内のコンテンツの表示順序を変えるって
LPOっていうらしいね。初めて知りました。。勉強になります。。

順番はこれ。。力業ですけど。。もっとスマートな感じでやりたい。。
[javascript]
<script type="text/javascript" src="js/jquery1.11.1.js"></script>
<script type="text/javascript" src="jquery.lazyload.js"></script>
$(function(){
var href = window.location.href;
var result = href.match(/\?page=(\d)+/);
var $wrapper = $('#wrapper');
var $wrapperinner = $wrapper.html();
var $red = $('#red');
var $blue = $('#blue');
var $yellow = $('#yellow');
var redinner = $red.html();
var blueinner = $blue.html();
var yellowinner = $yellow.html();
var $last;
if(result[1] == "1"){
$wrapper.before(redinner);
$last = $wrapper.find('#red').last();
$last.empty();
}else if(result[1] == "2"){
$wrapper.before(blueinner);
$last = $wrapper.find('#blue').last();
$last.empty();
};
});

[/javascript]
html

遅延ロードには「data-original」属性でパス指定するみたいですね。んで普通のsrc属性にはダミー画像。srcなしなら灰色の画像がでるみたい。
オプションでfadeinとかスクロールに対しての画像読み込み準備とかできるみたいですね。
[html]
<div id="wrapper">
<div id="yellow"><div class="yellowhrefcontent hrefcontent"><span>わたしは2の場合ファーストビューになる黄色コンテンツです。</span></div></div>
<div id="blue"><div class="bluehrefcontent hrefcontent"><div>わたしは3の場合ファーストビューになる青コンテンツです。</div></div></div>
<div id="red"><div class="redhrefcontent hrefcontent"><p>わたしは1の場合ファーストビューになる赤コンテンツです。</p><div>ふぁふぁふぁ</div></div></div>
</div>
<div class="azy-container">
<div><img data-original="./img/1.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/2.jpg" alt="" class="lazy"></div>
<noscript><img class="lazy_fallback" src="./img/002.jpg" /></noscript>
<div><img data-original="./img/3.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/4.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/5.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/6.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/7.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/8.jpg" alt="" class="lazy"></div>
<div><img data-original="./img/9.jpg" alt="" class="lazy"></div>
</div>
[/html]
CSS
[css]
div.lazy-container{text-align:center;}
img.lazy{width:640px;height:480px;}

.hrefcontent{width:400px;height: 400px;text-align:center;vertical-align:middle;}
.redhrefcontent{background:red;}
.yellowhrefcontent{background:yellow;}
.bluehrefcontent{background:blue;}

[/css]

正規表現とjavascript文字列中に含まれるある文字の個数を返す

IMG_2921

正規表現の話題になったからおさらいしたし、
100から200の数字を検索掛けるのに、正規表現で/[100-200]/ではないよな??
と思ったので。。
おさらいをかねていい勉強になったわ
[javascript]
var str1 = 'わたしのサイトはhttps://kennjimoritattayahoo.co.jpですあなたのはhttps://watasshi.jpですね'
var reg1 = /http(s)?:\/\/([\w-]+.)+[\w-]+(\/[\w- .\/?%&=]*)?/gi;
//
var result = str1.match(reg1);
for(i= 0;i<result.length;i++){
document.write(result[i]);
document.write('<br/>');
}
var p1 = /[1-2]+([0-9][0-9])/g;
var str2 = '100匹わんちゃん。\n7人の店主';
var p2 = /^[0-9]{3,}/g;
var result2 = str2.match(p2);
for(i=0;i<result.length;i++){
document.write(result2[i]);
}
//行頭にある1文字以上の数字を抽出
var reg2 = /^[0-9]{1,}/g;
var str3 = '1000ですが\n99にもなります';
var result3 = str3.match(reg2);
//["1000"]しか返さない
//マルチラインを付けると改行コード直後、文字列末尾も検索する
var reg2 = /^[0-9]{1,}/gm;
var str3 = '1000ですが\n99にもなります';
var result3 = str3.match(reg2);
//["1000","99"];

    var reg4 = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?&amp;%=]*)?/g;
    var str4 = 'わたしはhttps://kennjimorita.jpです。';
    str4 += 'これhttps://korekore.jpもそうです';
    var result4 = reg4.exec(str4);
    for(i=0;i&lt;result4.length;i++){
        document.write(result4[i]);
        document.write('&lt;br&gt;');
    }



//execメソッド
var reg = /wow/g;
var target= 'fafwwoweeeewowfefawow';
matches = [];
while(match = reg.exec(target)){
    matches.push(match);
};


// javascript文字列中に含まれるある文字の個数を返す
var counter = function(str,seq){
    return str.split(seq).length -1;
}
var str = 'mooooooorita';
var str2 = 'moooorita';
var str3 = 'efafeofafeofa'
console.log(str + ':' + counter(str,'o'));
console.log(str + ':' + counter(str2,'o'));
console.log(str + ':' + counter(str,/\d/));
console.log(str + ':' + counter(str,/[a-z]/));

[/javascript]

クライアント側を草分けして進むとシステムに近づく話。。

こっちのクライアント側、htmlやらcssデザインだけやってればいいって問題じゃなくなってくるね。。
今だとメタ言語をコンパイルするのが当たり前のようにみんなやっていて。。(EJS,sass,coffeeとか)
こないだ見たのは、
ライブコーディング。
目の前でコーディングしちゃうんだけど、それがものすごい。。
圧倒的な差を見せつけられた。。
もちろん俺なんかとその人は圧倒的な差なんだけど。。
あれ見たら井の中の蛙じゃあかんと思うよ本当
あのライブコーディングという技術。一芸にする絶対。

脱線したけど、
ちょっと前の続き。
で、さらにフレームワーク使う。環境をいかに整えられるかってのも重要だし使い倒せるかってのもで、
これ普通に1ページ作るのにhtmlだけで終わりってのはないよ。ない。

自分が何が弱いかって環境設定。ツールの仕様。
なんで弱いかって理解してない。圧倒的に。
GitHub,sourceTree,Grunt,compass,sass,Xamppとか(最低限のスタートライン)
これらを使うってことは設定ファイルをいじることになって、一部コマンドライン、ターミナルとかいじる。
Rubyファイルだっていじるし..知らないですって言えない
それいじるってことはシステムがどう動くのかって理解も必要。。
で開発にファイル渡すのも普通にマージするとなると言語覚えなきゃだな。。

これは今後どういう環境であっても(OSが変わっても)作業環境を整えるのをパッパとやりたいし、
できない人のを手伝ってあげたいよね。

なので一回ね、自分で(というか理解して自力で)やらなきゃだよね。
どこかのサイトのをみてスムーズに整ったからOKてのじゃなくてね。

あとあれだ、Node.js勉強してからそれ思うようになった。
Eclipseとかインストールしてさ、EJSとかExpressとか学んでサーバー側の動きも理解しようとして、
思った。

エラーに強いとかっこいいなって。それって仕様を理解することだし、環境を熟知してるってことだよね。
つまりはシステム。。
少し前まで制作はただ単にデザインしてればと思ったけど、
更新性、可読性、汎用性、堅牢性、保守性、スピード性。。。
これ全部考慮したらhtmlファイル一つとってもシステムだよ。システム。

分からないことに蓋をしていただけなんだなと思いました。。とぼとぼ

なのでまずはフロントエンド周りの環境構築方法。
今日ちょっとやりましたので今週のどこかで載せようと思います。

システム言い過ぎでもうこたつでミカン食べたい。。
sails.js,React.js,Type.js,Angular.js,coffee.js,Node.js,backbone.js・・。
今年中に全部身につける。もちろんjavascript深化させながら。絶対。