坊主が上手にHatenaに坊主のコードを書いた

ITBOZEによるIT技術の備忘録ブログ

「`bind_listen': socket=/tmp/unicorn.sock specified but it is not a socket! (ArgumentError)」への対処

NginxとUnicorn連携の情報って、Web上に溢れてる。 けど、シンプルな構成、入門的な内容って、少ない気がする。。。

どもっ。ITBOZEです。

Unicornを起動するシェルスクリプトを作って、「起動っ!オリャっ!」ってやったら、失敗。 以下のエラーが吐かれた。。。

`bind_listen': socket=/tmp/unicorn.sock specified but it is not a socket! (ArgumentError)

で、ちょっと詰まったので、メモメモ。

結論から言うと、unicorn.sockファイルを、一旦消せばOK。

うん、やはり難しく考えないことが大事。

同じエラーにハマった方は、是非参考にしてみてください。

Rails - 「`bind_listen': socket=/tmp/unicorn.sock specified but it is not a socket! (ArgumentError)」への対処 - Qiita

TypeError “Cannot set property connection of #<Navigator>のエラー回避方法

最近、LispHaskellだけでなく、OCamlにまで手を出してる。 完全に関数プログラミングにハマっとるやないかーい。

どもっ、ITBOZEです。

Cordovaを使用したAndroidアプリ開発にて、Cordova自体のバグを回避する方法を会得したので、メモメモ。

まず、以下のエラーが発生。

TypeError “Cannot set property connection of #<Navigator>

上記エラーは、Android SDKのバージョンが、4.0.3以下で起きている。

また、タチの悪いことに、このエラーは、アプリの立ち上がりの際に発生するため、その後の処理が進まない。

で、詳しくエラーの原因を見ていると、以下のエラーメッセージが。。。

Uncaught TypeError: Cannot set property connection of # which has only a getter at file:///android_asset/www/cordova.js:512

これは、Cordova自体のバグで、自分のソースコードのバグではない。

そこで、とりあえず、以下のように、Try Catchで、エラーを回避する方法を採用し、事なきを得た。

対象は、以下の2ファイルの512行目あたり。

  1. platforms/android/assets/www/cordova.js
  2. platforms/android/platform_www/cordova.js
   function clobber(obj, key, value) {
      try {
        exports.replaceHookForTesting(obj, key);
        obj[key] = value;
        // Getters can only be overridden by getters.
        if (obj[key] !== value) {
            utils.defineGetter(obj, key, function() {
                return value;
            });
        }
      }
      catch (e){
        console.error('clobber error '+e+', obj='+JSON.stringify(obj)+', key='+JSON.stringify(key)+', value='+JSON.stringify(value));
      }
    }

同様の現象で困っている方、よかったら参考にしてみてください。

CordovaでのTypeError “Cannot set property connection of #<Navigator>エラー回避方法 - Qiita

「7つの言語、7つの世界」書評

最近、スケールアウトを見越した、並行・並列プログラミングにおいて、どの言語を用いるべきか?悩んでいた。

Golangを一通り学習したが、Goroutineやチャネルを使った並行性では、自分が意図することができない。

他にErlangHaskellなどを学習しようと思っていた折、「7つの言語、7つの世界」に出会った。

Amazon.co.jp: 7つの言語 7つの世界: Bruce A. Tate, まつもとゆきひろ, 田和 勝: 本

結論から言うと、自分の悩みが氷解。

作者が、自分と同じ考え方をしている点にも驚いた。


現在、「関数型プログラミング」の流行の兆しがある。

しかし、それは、「関数型プログラミング」という考え方自体ではなく、関数型プログラミングによる「並行・並列プログラミング」の方が重要ではないのか?

自分は、そう感じている。

かつて、「構造型プログラミング」から「オブジェクト指向プログラミング」へのパラダイム転換があったが、現在は、この「オブジェクト指向プログラミング」から「並行・並列プログラミング」へのパラダイム転換が迫られているのではないか?

今までの自分の中のモヤモヤをスッキリさせてくれた本であることは間違いない。

AngularJSで、あるコントローラーから別のコントローラーの$scopeへアクセスする方法

グラハムさんの「ハッカーと画家」を読んで激しく共鳴。
で、最近、「Land of Lisp」を読破した(もちろん、手を動かしながらね!)。
そしたら、夢にまで、たくさんカッコが出てきてる。。。どーしよー。


どもっ、ITBOZEです。


さて、今日は、AngularJSを使った案件でのお話。


あるコントローラー内でのイベント(ボタン押下など)によって、別のコントローラー内にある文字列を変更したい。。。なんてこと、ありませんか?


このような場合、つまり、あるコントローラーから別のコントローラーの$scopeへアクセスしたい場合の方法について、ちょっとハマったので、早速メモ。


で、結論から言いますと、それぞれのコントローラーの$scopeを、Factoryで共有させればいいんです!


では、以下で説明しますね。


まず、具体例として、以下のHTMLがあるとします。

<ソース(1)>

<!doctype html>
<html ng-app="app">
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js"></script>
    <script src="app.js"></script>
</head>
<body>
 
<div ng-controller="ControllerA">
    <h2>ControllerA</h2>
    <button ng-click="buttonClick()">
        buttonClick on current scope
    </button>
    <button ng-click="buttonClickOnControllerB()">
        buttonClick on ControllerB's scope
    </button>
</div>
 
<div ng-controller="ControllerB">
    <h2>ControllerB</h2>
    <button ng-click="buttonClick()">
        buttonClick on current scope
    </button>
    <button ng-click="buttonClickOnControllerA()">
        buttonClick on ControllerA's scope
    </button>
</div>
</body>
</html>


で、app.jsは、以下のとおり。

<ソース(2)>

var app = angular.module('app', []);
 
app.controller('ControllerA', function ($scope) {
    $scope.variable1 = "ControllerAだよ";
 
    $scope.buttonClick = function () {
        console.log("ControllerA");
        console.log("$scope::variable1", $scope.variable1);
    };
});
 
app.controller('ControllerB', function ($scope) {
    $scope.variable1 = "ControllerBだよ";
 
    $scope.buttonClick = function () {
        console.log("ControllerB");
        console.log("$scope::variable1", $scope.variable1);
    };
});


そして、ControllerA内の$scopeと、ControllerB内の$scopeをお互いに共有させるには、以下のFactoryを作ります。

<ソース(3)>

app.factory('SharedScopes', function ($rootScope) {
    var sharedScopes = {};
 
    return {
        setScope: function (key, value) {
            sharedScopes[key] = value;
        },
        getScope: function (key) {
            return sharedScopes[key];
        }
    };
});


で、上記のソース(3)を、ソース(2)に取り込むと、以下の感じ。

var app = angular.module('app', []);
 
app.controller('ControllerA', function ($scope, SharedScopes) { ← ココ
    
    SharedScopes.setScope('ControllerA', $scope); ← ココ
    
    $scope.variable1 = "ControllerAだよ";

    ・・・   
});
 
app.controller('ControllerB', function ($scope, SharedScopes) { ← ココ
    
    SharedScopes.setScope('ControllerB', $scope); ← ココ

    $scope.variable1 = "ControllerBだよ";
 
    ・・・   
});



そして、今までの内容を全て記載した、app.jsは、以下の通り。

var app = angular.module('app', []);
 
app.controller('ControllerA', function ($scope, SharedScopes) {
 
    SharedScopes.setScope('ControllerA', $scope);
 
    $scope.variable1 = "ControllerAだよ";
 
    $scope.buttonClick = function () {
        console.log("ControllerA");
        console.log("ControllerA::variable1", Scopes.getScope('ControllerA').variable1);
        console.log("ControllerB::variable1", Scopes.getScope('ControllerB').variable1);
        console.log("$scope::variable1", $scope.variable1);
    };
 
    $scope.buttonClickOnControllerB = function () {
        Scopes.get('ControllerB').buttonClick();
    };
});
app.controller('ControllerB', function ($scope, SharedScopes) {
 
    SharedScopes.setScope('ControllerB', $scope);
 
    $scope.variable1 = "ControllerBだよ";
 
    $scope.buttonClick = function () {
        console.log("ControllerA");
        console.log("ControllerA::variable1", Scopes.getScope('ControllerA').variable1);
        console.log("ControllerB::variable1", Scopes.getScope('ControllerB').variable1);
        console.log("$scope::variable1", $scope.variable1);
    };
 
    $scope.buttonClickOnControllerA = function () {
        Scopes.get('ControllerA').buttonClick();
    };
});
app.factory('SharedScopes', function ($rootScope) {
    var sharedScopes = {};
 
    return {
        setScope: function (key, value) {
            sharedScopes[key] = value;
        },
        getScope: function (key) {
            return sharedScopes[key];
        }
    };
});


いかがだったでしょうか?

良かったら、是非、参考にしてください。

※Qiitaにも投稿しました。

AngularJSで、あるコントローラーから別のコントローラーの$scopeへアクセスする方法 - Qiita

ActiveAdminのbreadcrumbの日本語化

最近、インフルエンザ熱よりもGroonga熱が、いっこうに下がりません。どうしよー。

どもっ。ITBOSEです。

さて、ActiveAdminの日本語化って、「ja.ymlとかdevise.ja.ymlを準備すれば良いよ」っていうのは、 皆さんご存知の通り。

でも、breadcrumb(パンくずリスト)が日本語化できねぇー。。。ってなってる人、いませんか?

自分、少しハマりました。。。

なので、早速メモ。


Active Adminのパンくずリストって、内部で「breadcrumb_links」っていう関数が呼ばれている。

Module: ActiveAdmin::ViewHelpers::BreadcrumbHelper — Documentation for gregbell/active_admin (master)


で、そのソースみたら、以下の箇所を発見。

name ||= I18n.t "activerecord.models.#{part.singularize}",

で, ya.ymlファイルに

activerecord:
  models:
      モデル名:   '日本語化した文言'

という感じで書いたら、見事に解決。

良かったら、参考にしてくださいー。

※Qiitaにも投稿しました。

ActiveAdminのbreadcrumbの日本語化 - Qiita

「福岡Groonga1」、マジで良かった話

福岡初のGroongaイベント福岡Groonga1に参加!
(2015年01月23日(金)19:00〜、at GMOペパボ株式会社 福岡支社)

福岡Groonga1 - Groonga | Doorkeeper

まず、すごい人がたくさんいて、驚いた。

・須藤功平さん(@ktou): Groonga開発者のお一人

・おんがえしさん(@ongaeshi): MilkodeやHonyomiなどGroonga(Rroonga)を使ったアプリケーション

・近藤 宇智朗さん: パーフェクトRubyの著者のお一人

などなど。。。


<勉強会の流れ>


1. 自己紹介

(1) 参加者のみなさん、それぞれ自己紹介。

(2) もう既に、実運用でGroongaを使っている方もいて、後で濃い話を聞けることになる。。。


2. 今日知りたい事

(1) 参加者のみなさんからのリクエスト

(2) 質疑応答で、須藤さんから丁寧に答えていただいた。


3. おんがえしさんからのお話

MilkodeやHonyomiなどGroonga(Rroonga)を使ったアプリケーションについてのお話

(1) Groonga(Rroonga)の実運用のお話や、実際のアプリを見ることができたのは、大収穫!!

(2) おんがえしさん、ぜひgemを使わせていただきます!!

ongaeshi (ongaeshi) · GitHub


4. 質疑応答など

(1) 全文検索の基礎(文書,lexicon,トークナイザなどなど)を分かりやすく話していただいた。その分かりやすさに、感動した。

(2) 実運用でのお話もしていただいた。  これは、これから本格的に使っていこうと思っている自分にとって、とても嬉しい情報だった。

(3) Elastic Search等との比較について

・導入が容易(Elastic Searchのような細かい設定はない。導入への敷居が低い)  
・他のシステムとの連携が容易  
・MySQLに組み込める  
・Nginxにも組み込める  
・データが大きくなってきた時、Spider(MySQLのプラグイン)は良いよ。  
・インデックスのデータが増えた時  
 →テーブル毎に分けて、リングバッファを作成すると、データを消しやすい。  
・ メモリ使用量について(mmapのお話など)  
・「0000-00-00」は、不正な値なので、使用しない方が良い。  
・途中でトークナイザを変更したい時  
 →1つの文書にn個のトークナイザを張れるので、 語彙表(タームテーブル)から作り直して移行すると良い。  
・複雑な検索(ネストした検索)は、どうしたらよいか?  
 →rangeフィルターの考え方を参考にしてみては?  

などなど。

須藤さんが、1つ1つの質問に、分かりやすく答えていただいたので、

Groongaへの心の敷居が低くなった。

うん、使うぞ!

Groongaへの情熱に火がついた。

Node.jsとAngularJS間での、Access-Control-Allow-Originトラブル回避方法

ちょっとハマったので、メモ。


サーバー側は、Node.js(クライアント側とは異なるドメイン), クライアント側はAngularJSという構成。


まさに、クロスドメイン環境。


で、サーバー側からJson取得したいって時に。


何もしなければ、間違いなく、「Access-Control-Allow-Origin」って怒られる。(もちろん、json取得できない)。


「AngularJSのConfigの設定か?」と思って、いろいろやってみるが、解決せず。


そこで、「サーバー側じゃね?」ってことで、以下のことを実施。


1.まず

$ sudo npm install cors


2.で、requireして、appに追加

var express = require('express');

var cors = require('cors'); ←ここ

var app = express();

app.use(cors()); ←ここ

そしたら、解決。

もし、同じように困っている人がいたら、参考にしてみてください。