MacにRictyフォントをインストール

久しぶりにMacbookを新調したのでRictyフォントをインストールしようとしたらError: SHA256 mismatchなるエラーが出てしまって調べていたらRictyのGitリポジトリが閉鎖されていたので次の手段でインストールしました。

 

  1. ricty_generator.shhttp://www.rs.tus.ac.jp/yyusa/ricty.htmlからダウンロード
  2. migu-1p-20150712.zip をhttps://osdn.jp/projects/mix-mplus-ipa/downloads/63545/migu-1p-20150712.zip/ からダウンロード
  3. Inconsolata-Regular.ttfとInconsolata-Bold.ttfをhttps://github.com/google/fonts/tree/master/ofl/inconsolata からダウンロード

 

これを全部のフォルダにまとめて入れて、ricty_generator.shを実行してfc-cache -vfを実行したら無事インストールできました。

現在の機材紹介

約15年ぶりにギターを再開し機材の断捨離を実行したのでまずは現在の機材紹介を書いてみます。

 

gears

 

メインギター

  • Ernie Ball Music Man Axis-EX

 

サブギター

  • Fender Japan ST54-70AS (ネックはFender Mexico製で換装)

 

エフェクター

  • tc electronic POLYTUNE 2
  • VOX Wah V847
  • BOSS OD-1
  • MXR EVH Phase90
  • MXR M-169 Carbon Copy Analog Delay

 

アンプ

  • LINE 6 POD (シュミレータですね。。。)

effectorboard

 

今のところ家弾きばかりなのでLINE 6 PODの初代をアンプ代わりにしてBEHRINGER UCG102でMacbook Airにつないで練習しています。

基本的にはアンプ直でヴォリュームとピッキングでどうにかすればいいと思っている方なんでチューナー以外は9割がた寝てるんですが・・・

最近はジミヘンばかり練習しているのとストラトの期間があまりに長かったのでストラトの音がどうも肌に合うようでAxis弾いててもST54-70ASの音に似せようとしている自分がいるのでサブギターをメインに昇格を、と思いつつネックの気持ちよさのためにAxisに立ち返ってしまうけどそれでもシングルコイルがやっぱり好きで、ってところで見つけた(いや、買えないけど)のがこいつ!

Cutlass&

 

シングルコイル、ちょいぶさいくだけど小ぶりなストラトフォルム、4:2のヘッドにメイプルネッ篩板が出てしまってますが)が出てしまってますが)にMusicman特有のネック幅!

すべてが私のためのようなモデル!
もちろんAxisの大好きなんだけどやっぱり自分がいます。

エフェクターの使い道や機材遍歴はおいおい書いてみたいと思います。

WordPressにGoogle Analyticsを導入する

WordPressにGoogle Analyticsの設定をいれたのでその手順を残しておきます。

1.Google Analyticsアカウント作成

https://analytics.google.com/analytics/web/#provision/SignUp/

にアクセスしてSign Upボタンをクリックします。

signup

 

次に新しいアカウント情報を入力します。

newaccount

Get Tracking IDをクリックすると利用規約同意のポップアップ画面が出るので同意するとTracking IDが表示されます。

trackingid_code

2. WordPressプラグインの「All in One SEO Pack」の導入

WordPressのDashboardを開いて[Plugins]→[Add New]でAdd Pluginsの画面を開いてAll in One SEO Packを検索します。

検索結果が表示された[Install Now]ボタンを押してインストールします。

allinoneseopacksearch

インストールが終わると[Install Now]が[Active]に代わるので[Activate]ボタンをクリックしてプラグインを有効化します。

有効にするとAll in One SEOの設定画面が有効になるので、Generalタブの中でGoogle Analytics IDの欄を探して自分のGoogle Analytics IDを入力し画面最下部の[Update Options]をクリックします。

allinoneseo_googleanalytics

3. 導入結果の確認

導入直後は結果がすぐに出ないのでReal Timeレポートで確認することができます。

その後、Google Analyticsにログインして[REPORTING]→[Real Time]→[Overview]を開き、結果を確認するために自分で自分のWordPressサイトにアクセスするとアクセス結果が表示されるので導入が成功したことがわかります。

analytics_realtime_overview

WordPressのアクセス権エラーの解消

テーマを変えようと思いzipファイルをアップロードしようとすると

Unable to create directory /wp-content/uploads/~~ Is its parent directory writable by the server?

のエラーが出てきました。

nginxの実行ユーザとWordPressの所有者・所有者グループは合わせていたんですが、php-fpmのユーザがapacheのままになっていたので、/etc/php-fpm.d/www.confのuserとgroupをnginxの実行ユーザとWordPressの所有者とグループに合わせてあげて php-fpmの再起動(service php-fpm restart)をすることで解消しました。

JavaScriptでPythonのrange関数のようにリスト作成

Pythonのrange関数のように開始値と終わり値を指定してリストを作成する関数を毎回書きたくないのでモジュール化。

Pythonのrange関数

range([start, ]stop[, step])

>>> range(3,10)
[3, 4, 5, 6, 7, 8, 9]
>>> range(3,10,2)
[3, 5, 7, 9]

これをJavaScriptでもやりたい

JavaScriptでほぼ等価の関数

var jsrange = function (start, end, step) {
  var array = new Array();
  var step = step === undefined ? 1 : step;
  var counter = start;
  var index = 0;

  while (counter < end) {
    array.push(counter);
    counter += step;
  }

  return array;

}

module.exports = jsrange;

インストール

% npm install jsranger

使用例

var jsranger = require('jsranger');

var L = jsranger(2, 20);
console.log(L);
  // should display the following
  // [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ]

var l = jsranger(2, 20, 2);
console.log(l);
  // should display the following
  // [ 2, 4, 6, 8, 10, 12, 14, 16, 18 ]

課題

数字以外の者が引数に来た時のエラーなど、引数のチェックを全くしてない

Reactでcheckboxの状態をステートで管理する

React (Facebook): managed state of controlled checkboxesのパクリと自分の理解のためのメモ

index.htmlの準備

<!DOCTYPE html>
<html>
  <head>
  ¦ <meta charset="UTF-8" />
  ¦ <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react.min.js"></script>
  ¦ <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react-dom.min.js"></script>
  ¦ <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
  </head>
  <body>
  ¦ <div id="content"></div>
    <script type="text/babel">
    // この中にReact書く
    </script>
  </body>
</html>

ReactクラスとState定義

2つあるinputのcheckboxがそれぞれチェックされているかどうかの状態を持つためのstateを準備。ついでにReactDOMレンダーも定義。

var CheckboxDemo = React.createClass({
  getInitialState: function () {
    return {
      data: [
        {id: 1, selected: false },
        {id: 2, selected: false }
      ]
    };
  },
  // この下にFormを書く
});
ReactDOM.render(
  <CheckboxDemo />,
  document.getElementById('content')
);

Form作成

Formの要素としてchecksを定義する。mapの中でCheckboxDemoオブジェクトにthisでアクセスできるようにbindしておく

render: function () {
  var checks = this.state.data.map(function (d) {
    return (
      <div>
        <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} />
          {d.id}
          <br />
      </div>
    );
  }.bind(this));
  <form>
    {checks}
  </form>
}

まだ理解できてないところとして__changeSelection.bind(this, d.id)のthisはCheckboxDemoなのかdなのか

changeSelection定義

チェックボックスが押された時の__changeSelection関数を定義。チェックボックスが押されたらidを__changeSelectionを渡して呼び出して__changeSelectionの中でdataの中を全部チェックして、渡したidとdataのidが一致したらselectedの真偽値を変更してdataを丸ごと変更かける

__changeSelection: function (id) {
  var nextState = this.state.data.map(function (d) {
    return {
      id: d.id,
      selected: (d.id === id ? !d.selected: d.selected)
    };
  });

  console.log(nextState); // 確認用
  this.setState( {data: nextState });
},

全部チェックを実装

form内を修正

<form>
  <input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks } />CheckAll
  <br />
  {checks}
</form>

changeAllChecksの定義

globalSelectorのチェックボックスがチェックされているかどうかをgetDOMNodeでとってきてchecksに入れて、checksをdataの全てのselectedに反映する

__changeAllChecks: function () {
  var chekcs = this.refs.globalSelector.getDOMNode().checked;
  var nextState = this.state.data.map(function (d) {
    return {id: d.id, selected: chekcs };
  });

  console.log('change all checks -> ', nextState)
  this.setState( { data: nextState })
}

全体コード

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.3/react-dom.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
  </head>
  <body>
    <div id="content"></div>
    <script type="text/babel">

    var CheckboxDemo = React.createClass({
      getInitialState: function () {
        return {
          data: [
            {id: 1, selected: false },
            {id: 2, selected: false }
          ]
        };
      },

      render: function () {
        var checks = this.state.data.map(function (d) {
          return (
            <div>
              <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} />
                {d.id}
                <br />
            </div>
          );
        }.bind(this));
        return (
          <form>
            <input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks } />CheckAll
            <br />
            {checks}
          </form>
        )
      },

      __changeSelection: function (id) {
        var nextState = this.state.data.map(function (d) {
          return {
            id: d.id,
            selected: (d.id === id ? !d.selected: d.selected)
          };
        });

        console.log(nextState);
        this.setState( {data: nextState });
      },

      __changeAllChecks: function () {
        var chekcs = this.refs.globalSelector.getDOMNode().checked;
        var nextState = this.state.data.map(function (d) {
          return {id: d.id, selected: chekcs };
        });

        console.log('change all checks -> ', nextState)
        this.setState( { data: nextState })
      }

    });



    ReactDOM.render(
      <CheckboxDemo />,
      document.getElementById('content')
    );
    </script>
  </body>
</html>

ReactをGulpでbabelifyするとUnexpected tokenでこけたら

React書いてGulpでビルドしようとしたらUnexpected tokenエラーが出るのでググると babel-preset-react 入れないとダメだった。

こけた後に出来るだけ最小構成にしてReactの書き方がまずかったかgulpfile.jsの書き方がまずかったのか確認した内容の備忘録。

エラー内容

% gulp
[03:57:42] Using gulpfile ~/react-gulp/gulpfile.js
[03:57:42] Starting 'default'...
events.js:142
      throw er; // Unhandled 'error' event
      ^

SyntaxError: ~/react-gulp/src/app.js: Unexpected token (6:2)
  4 |
  5 | ReactDOM.render(
> 6 |   <Child />,
    |   ^
  7 |   document.getElementById('container')
  8 | );
  9 |
    at Parser.pp.raise (~/react-gulp/node_modules/babylon/lib/parser/location.js:22:13)
    at Parser.pp.unexpected (~/react-gulp/node_modules/babylon/lib/parser/util.js:91:8)
    at Parser.pp.parseExprAtom (~/react-gulp/node_modules/babylon/lib/parser/expression.js:510:12)
    at Parser.pp.parseExprSubscripts (~/react-gulp/node_modules/babylon/lib/parser/expression.js:265:19)
    at Parser.pp.parseMaybeUnary (~/react-gulp/node_modules/babylon/lib/parser/expression.js:245:19)
    at Parser.pp.parseExprOps (~/react-gulp/node_modules/babylon/lib/parser/expression.js:176:19)
    at Parser.pp.parseMaybeConditional (~/react-gulp/node_modules/babylon/lib/parser/expression.js:158:19)
    at Parser.pp.parseMaybeAssign (~/react-gulp/node_modules/babylon/lib/parser/expression.js:121:19)
    at Parser.pp.parseExprListItem (~/react-gulp/node_modules/babylon/lib/parser/expression.js:988:16)
    at Parser.pp.parseCallExpressionArguments (~/react-gulp/node_modules/babylon/lib/parser/expression.js:341:20)

プロジェクト構成

.
├── gulpfile.js
├── index.html
├── node_modules
├── package.json
└── src
    ├── app.js
    └── child.react.js

node_modules

入れたものリスト

"devDependencies": {
  "babelify": "^7.2.0",
  "browserify": "^12.0.1",
  "gulp": "^3.9.0",
  "vinyl-source-stream": "^1.1.0"
},
"dependencies": {
  "react": "^0.14.3",
  "react-dom": "^0.14.3"
}

gulpfile.js

var gulp = require('gulp');
var browserify = require('browserify');
var babelify = require('babelify');
var source = require('vinyl-source-stream');

gulp.task('default', function () {
  return browserify('./src/app.js')
    .transform(babelify)
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./'));
});

index.html

<!DOCTYPE html>
<html>
  <body>
    <div id="container"></div>
    <script src="bundle.js"></script>
  </body>
</html>

src/app.js

var React = require('react');
var ReactDOM = require('react-dom');
var Child = require('./child.react.js');

ReactDOM.render(
  <Child />,
  document.getElementById('container')
);

src/child.react.js

var React = require('react');

var Child = React.createClass({
  render: function () {
    return (
      <div id="child">
        <h2>Child</h2>
      </div>
    );
  }
});

module.exports = Child;

解決策

これで gulp を実行すると冒頭のエラーが出るので冒頭に書いているように babel-preset-react をインストール(npm install --save-dev babel-preset-react)してgulpfile.jsを修正すればビルド成功する。

インストール後のdevDependencies(package.js)

"devDependencies": {
  "babel-preset-react": "^6.3.13",
  "babelify": "^7.2.0",
  "browserify": "^12.0.1",
  "gulp": "^3.9.0",
  "vinyl-source-stream": "^1.1.0"
}

修正後のgulpfile.js

var gulp = require('gulp');
var browserify = require('browserify');
var babelify = require('babelify');
var source = require('vinyl-source-stream');

gulp.task('default', function () {
  return browserify('./src/app.js')
    .transform(babelify,{presets: ["react"]})
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./'));
});

ビルド結果

これでgulpを実行するとちゃんとbundle.jsができあがってブラウザで<h2>Child</h2>のレンダリング結果が表示される。

% gulp
[04:11:17] Using gulpfile ~/react-gulp/gulpfile.js
[04:11:17] Starting 'default'...
[04:11:20] Finished 'default' after 3.67 s

ビルド後の構成

.
├── bundle.js
├── gulpfile.js
├── index.html
├── node_modules
├── package.json
└── src
    ├── app.js
    └── child.react.js

参考

4歳の娘のお気に入り絵本集

Advent Calendar 2015のお子さん、どんな本読んでる? Advent Calendar 2015の22日目の記事です。

昨日はmasahikoofjoytoさんの記事でした。

2013年の投稿から2年ぶりの投稿等いうことで、当時2歳だった娘も4歳になり文字数が増え、毎晩2冊以上読み聞かせをしていますが1冊は自分で読めるようになりました。

そんな4歳の娘が特に気に入っているレパートリーをご紹介します。

みんなでたのしいクリスマス

2年たっても色褪せぬ魅力のようです。この本は装飾も含めてベストバイの1冊です。読んでると心が温まります。

ゆきうさぎのねがいごと

クリスマスシリーズ第2弾です。これは昨年のクリスマス時期に旅行先のホテルでサンタさんが部屋にプレゼントを届けに来てくれるサービスを見つけてサンタさんから渡してもらったインパクトが強かったのか、宝物の1つのようです。

一度保育園で他の園児に私が読み聞かせをする機会があり娘がこの本を選んだんですが、結構長めの物語にもかかわらずみんなしっかり聞いてくれていたので3〜5歳位にぴったりな本なんだと思います。

からすのパンやさん

この本をきっかけに娘のパン屋好きが始まりました。かなり長いので眠たい時に読み聞かせをするのはちょっとしんどい時があります。(^ ^;)

でんしゃはうたう

この本のポイントはいかに顔と声で笑いをとるか!

何しろ擬音が延々と続くだけの本なので正直何が面白いのか全くわからないんですが、娘は毎回大爆笑です。

おおきくなりたいの

うさぎ好きの娘らしいチョイスです。絵もすごく可愛いです。

最後のオチはあえて説明せずに娘が気づく日を待ってます。

くまのこうちょうせんせい

大きな声で挨拶しましょう!を理屈ではなく感情で伝えてくれる良本です。

のせてのせて100かいだてのバス

これは面白いですよ!中のしかけがすごくて、100階建てバスの大きさをイメージさせてくれます。
こんなバスがあるなら一度乗ってみたいです。

はじめてのずかん

これは娘が私にいろいろな名前を教えるための教科書的に使っているようです。
この本の時は娘が先生役、私は園児役になります。

まだ他にも色々あるんですが、特に娘が気に入っている絵本をチョイスしました。

ちなみに、絵本の入手手段は以前は私が毎月1冊娘に選んでもらって買っていたんですが、この2年間は毎月実家に娘と二人で泊まりに行った時に毎晩私の父が寝る前に娘に手渡してくれているので毎月色んな種類の本が増えてます。

絵本を買い揃えようとすると意外とお金がかかるので助かってます。

これから1年、娘の絵本の趣味がどう変わっていくのかますます楽しみです。