OmniAICreator/Qiita-1.07M huggingface dataset:
Python Design Pattern - テンプレートメソッド


[Python in Practice: Create Better Programs Using Concurrency](http://www.amazon.co.jp/gp/product/B00EO3TRL2)より

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# http://www.amazon.co.jp/gp/product/B00EO3TRL2
# Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns (Developer's Library) 

import abc
import re
import HTMLParser


class AbstractWordCounter(object):
    __metaclass__ = abc.ABCMeta

    @staticmethod
    @abc.abstractmethod
    def can_count(filename):
        pass

    @staticmethod
    @abc.abstractmethod
    def count(filename):
        pass


class PlainTextWordCounter(AbstractWordCounter):
    @staticmethod
    def count(filename):
        if not PlainTextWordCounter.can_count(filename):
            return 0
        regex = re.compile(r"\w+")
        total = 0
        with open(filename) as readfile:
            for line in readfile:
                for _ in regex.finditer(line):
                    total += 1
        return total


    @staticmethod
    def can_count(filename):
        return filename.lower().endswith((".py", ".txt"))


class HtmlWordCounter(AbstractWordCounter):
    @staticmethod
    def count(filename):
        if not HtmlWordCounter.can_count(filename):
            return 0
        parser = MyHTMLParser()
        with open(filename) as readfile:
            parser.feed(readfile.read())
        return parser.count


    @staticmethod
    def can_count(filename):
        return filename.lower().endswith((".html", ".htm"))


class MyHTMLParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.regex = re.compile(r"\w+")
        self.inText = True
        self.text = []
        self.count = 0

    def handle_starttag(self, tag, attrs):
        if tag in {"script", "style"}:
            self.inText = False

    def handle_endtag(self, tag):
        if tag in {"script", "style"}:
            self.inText = True
        else:
            for _ in self.regex.findall(" ".join(self.text)):
                self.count += 1
            self.text = []

    def handle_data(self, text):
        if self.inText:
            text = text.rstrip()
            if text:
                self.text.append(text)


def count_word(filename):
    for wordCounter in (PlainTextWordCounter, HtmlWordCounter):
        if wordCounter.can_count(filename):
            return wordCounter.count(filename)


c = count_word("/tmp/sample.txt")
print "c=" + str(c) + "\n"

h = count_word("/tmp/sample.html")
print "h=" + str(h) + "\n"
```
Paperclipのattachmentの削除方法



destroyを使います。

http://www.rubydoc.info/github/thoughtbot/paperclip/Paperclip/Attachment#clear-instance_method


```
class Picture < ActiveRecord::Base
  [:picture].each do |col|
    has_attached_file col,
    styles: {:medium => "300x300", :thumb => "100x100"},
    default_url: "common/:style/icon-file-nodata.png",
      url: "/data/images/:class/:parent_id/:id/:attachment/:style/:filename"
    validates_attachment_content_type col,
      :content_type => ["image/png", "image/jpg", "image/jpeg"]
  end
end
```

```
Picture.first
Picture.first.picture
#=> Paperclip::Attachment
Picture.first.picture.destroy
#=> 
[paperclip] deleting ~/pictures/1/pictures/original/5558.jpg
[paperclip] deleting ~/pictures/1/pictures/medium/5558.jpg
[paperclip] deleting ~/pictures/1/pictures/thumb/5558.jpg
[paperclip] deleting ~/pictures/1/pictures/large/5558.jpg
=> true
```


destroyはclear+saveだとリファレンスに書いてありますが、中身もそのまんまでした。

```ruby:lib/paperclip/attachment.rb
# line 259
def destroy
  clear
  save
end
```
filter_var関数を使ってIPアドレスかどうかをチェックする

## 概要
以前に[IPアドレスかどうかをチェックするPHPスクリプト](http://qiita.com/tiida26/items/b82f48a338bc1611f718)というのをゴリゴリ書いてみたが、`filter_var`関数を使ってチェックが可能であるということお教え頂いたので書いてみた。前回同様に処理は"配列内の文字列がIPアドレスであればTrue、そうでなければFalseをechoする"というもの。




## コード

```php:tekito.php
<?php

$str = array("1.2.3...4", "1.2.3.4.", "hoge.2.3.4", "1.2.256.4", "1.2.3.4");

foreach($str as $x) {
    if(filter_var($x, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        echo "True" . PHP_EOL;
    } else {
        echo "False" . PHP_EOL;
    }
}

?>
```



## 使用例
上記の`tekito.php`をそのまま実行

```shell-session
$ php tekito.php 
False
False
False
False
True
```



## 使用した関数
- filter_var

その他メールアドレスやURLのフィルタリングも出来て便利そう。

http://php.net/manual/ja/filter.filters.validate.php
jquery.csv2table.jsでShift_JISのCSVを表示する

CSVファイルを読み込んでブラウザにテーブル表示できるjquery.csv2table.jsというJQueryプラグインがあります。使い方は簡単です。

```html
<html>
<header>
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="http://jsgt.org/lib/jquery/plugin/csv2table/v002/js/jquery.csv2table-0.02-b-4.7.js" type="text/javascript" charset="utf-8"></script>
</header>
<body>
<div id="view0"></div>
<script>
$(function(){
  $('#view0').csv2table('./data1.csv');
});
</script>
</body>
</html>
```
data1.csvの内容は以下の通りです。

```text
日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材
2014-12-14 08:04:36,大成功,水上機基地建設,828,0,345,345,0,1,0
2014-12-14 08:19:08,成功,長距離練習航海,0,100,30,0,0,0,0
2014-12-15 22:55:59,成功,長距離練習航海,0,100,30,0,0,1,0
2014-12-15 22:56:09,大成功,海上護衛任務,345,345,34,34,0,0,0
```
ブラウザでの表示結果は以下のようになります。
![c64901f25c9ecbbb0157741ad2e22dd0.png](https://qiita-image-store.s3.amazonaws.com/0/13667/d593bf43-67c3-34fb-e632-9dcb005f3b9f.png)

ただし、うまくいくのはdata1.csvがUTF-8の場合です。WindowsではCSVはShift_JISのことが多いです。これはExcelがBOM付きのUTF-8でないと、UTF-8のCSVを正しく読み込んでくれないからです。Ajaxでファイルを読むと、特に指定がないとUTF-8として読まれるので、CSVがShift_JISだと文字化けします。
![e7e4f7d4936aee036b3428611266a50a.png](https://qiita-image-store.s3.amazonaws.com/0/13667/5ad354bd-4027-c141-a402-0d196cb7a40f.png)

これを避けるにはCSVのエンコーディングにSJISを指定します。JavaScript側で行うには、XMLHttpRequestのoverrideMimeTypeでMIME Typeを上書きすればよいです。ただしこの方法は、InternetExplorerでは10以降でしか使えません。overrideMimeTypeの例は以下の通りです。csv2tableのソースコードを書き換えるのを避けるために、ajaxSetupでCSVファイルのMIME Typeを上書きしています。

```js
$.ajaxSetup({
    beforeSend: function(xhr, settings){
        if (settings.url.endsWith(".csv"))
            xhr.overrideMimeType("text/csv;charset=Shift_JIS");
    }
});
$(function(){
  $('#view0').csv2table('./data1.csv');
});
```

この問題はサーバー側で対処すればInternetExplorerのバージョンに依存せずにすみます。サーバーがApache httpdなら.htaccess等で```AddType "text/csv; charset=Shift_JIS" .csv```すればよいです。

この記事とよく似たブログ記事はいくつかあるのですが、csv2tableとShift_JISのCSVの場合にどうするかについて、正しい対処法が書いてある記事がなかったので書いてみました。
Nancy+OWINでセキュアなページを作成する

一式を https://github.com/ken200/OwinAuthWithNancy に配置しています。

本件に関連するソースコードは MyNancyModule.cs に記載しています。

## 必要パッケージ(Nancy関係のみ)

+ Nancy
+ Nancy.MSOwinSecurity
+ Nancy.Owin

Nancyの認証はASP.NET、OWINとは切り離されているため、Nancy.MSOwinSecurityパッケージをインストールしてOWINのセキュリティー機構を利用できるようにする必要があります。


## ソースコード

SecureModuleクラスのほうです。

/secureの定義で呼び出している this.RequiresMSOwinAuthentication() で非認証時アクセス不可(Exception吐く)設定しています。

this.Context.GetMSOwinUser() で認証ユーザー情報を取得できます。

```csharp
public class MyNancyModule : NancyModule
{
    public MyNancyModule() : base()
    {
        Get["/"] = _ => 
        {
            return "hello";
        };

        Get["/hoge"] = _ =>
        {
            return "hoge";
        };

        Get["/login"] = _ =>
        {
            return new Nancy.Responses.HtmlResponse()
            {
                Contents = (s) => 
                {
                    using (var sw = new StreamWriter(s, System.Text.Encoding.UTF8)) 
                    {
                        sw.Write(@"
<html>
<head>
<title>ログイン</title>
</head>
<body>
<form action=""/login?RedirectUrl=/secure"" method=""post"">
<label for=""username"">ユーザー名</label>
<input type=""text"" name=""username"" />
<input type=""submit"" />
</form>
</html>
");
                    }
                }
            };
        };
    }
}

public class SecureModule : NancyModule
{
    public SecureModule()
    {
        Get["/secure"] = _ =>
        {
            this.RequiresMSOwinAuthentication();
            var user = this.Context.GetMSOwinUser();
            return string.Format("hello, {0}. this page is secure!!", user.Identity.Name);
        };
    }
}
```
Titaniumの外部jsライブラリをBowerで管理


[Titanium Advent Calendar 2014](http://qiita.com/advent-calendar/2014/titanium)の24日目。
[Dtector Inc.](https://dtector.jp)の[@Fe_snow](http://twitter/Fe_snow)です。普段メモ代わりくらいにしか投稿していませんでしたが、小ネタを書かせていただきます。

クリスマスには欠かせないTitaniumでの外部jsライブラリの管理について書こうと思います。

先ず、[Titanium](http://www.appcelerator.com/titanium/)で外部のjsライブラリを使いたいと思った場合、どこかに`lib`ディレクトリなんかを作って、そこに`lib/hoge.js`の様に落としてきた外部jsファイルを置いて、`require`するのが一般的かと思います。

しかし、これだと外部のjsライブラリを自分のプロジェクト内で管理することになり、少し気持ち悪いです。

そこで、[Bower](http://bower.io)に外部jsライブラリの管理を任せることにします(`Bower`自体は`npm`で入れてください)。
通常の`Bower`と同じ要領でプロジェクトルートに`bower.json`ファイルを用意して`bower install -g`をします。
例えばこんな感じで、とりあえず便利な[string.js](http://stringjs.com)、[jsUri](https://github.com/derek-watson/jsUri)、[Q](http://documentup.com/kriskowal/q/)を入れてみます。

```bower.json
{
  "name": "some_app",
  "version": "0.0.1",
  "ignore": [
    "**/.*",
    "node_modules",
    "components"
  ],
  "dependencies": {
    "string.js": "git://github.com/jprichardson/string.js.git#3.0.0",
    "jsUri": "git://github.com/derek-watson/jsUri.git#v1.3.0",
    "q": "git://github.com/kriskowal/q.git#v1.1.2"
  }
}

```

次に、なんでもいいですが、`bower_includes`という名前でファイルを定義して、jsファイルの場所を記述します。

```bower_includes
string.js/lib/string.min.js
jsUri/Uri.js
q/q.js
```

そして`alloy.jmk`の`pre:compile`イベント内に下記の様なコードを追加します。

```Javascript:alloy.jmk
task("pre:compile", function(event, logger) {
  var wrench = require("wrench"),
      fs = require("fs"),
      path = require("path");

  var componentsDir = event.dir.project + "/bower/",
      distDir = event.dir.resources + "/bower/",
      includesPath = event.dir.project + "/bower_includes";
  wrench.mkdirSyncRecursive(distDir, 0755);

  if (path.existsSync(includesPath)) {
    fs.readFileSync(includesPath).toString().split("\n").forEach(function(target){
      if (fs.statSync(componentsDir + target).isFile()) {
        fs.writeFileSync(distDir + path.basename(target), fs.readFileSync(componentsDir + target));
      }
    });
  }
}
```

こうすることで、ビルドした際に`Resources`以下にもjsファイルが展開され、`require`で外部jsライブラリが使用することができます。
具体的には`Q = require('bower/q')`のように一行書くだけで利用できます。

このようにTitaniumでも[Bower](http://bower.io)を利用して、スマートに外部jsライブラリを管理してみてはいかがでしょうか。


明日の[Titanium Advent Calendar 2014](http://qiita.com/advent-calendar/2014/titanium)最終日は[yagi_](http://qiita.com/yagi_)さんです。宜しくお願いします。
How to get PyCPX installed (OSX Yosemite, Canopy)



PyCPX is a python wrapper for the IBM CPlex. While it can be downloaded via pip and easy_install, we need several steps to successfull installation.

### Environment:
- Mac OS X Yosemite
- Enthough Canopy (https://www.enthought.com/products/canopy/)

### Step 1: installing CPLEX
- Downloaded CPLEX is compressed with .cpgz. Decompress it to get .bin file first. Then chmod and execute it on terminal.
- Go to python directory (```CPLEX_Studio1261/cplex/python/2.7/x86-64_osx```) and execute ```python setup.py install```. Make sure that your python is Canopy's one (not ```/usr/bin/python``` but ```/Users/[username]/Library/Enthought/Canopy_64bit/User/bin/python```).
See also http://www-01.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.studio.help/Optimization_Studio/topics/PLUGINS_ROOT/ilog.odms.cplex.help/CPLEX/GettingStarted/topics/set_up/Python_setup.html

### Step 2: installing PyCPX with linking CPLEX
- Just executing ```pip install pycpx``` will produce the following error:


```
In file included from pycpx/pyconcert.cpp:255:

pycpx/cplex_interface.hpp:12:10: fatal error: 'ilcplex/ilocplexi.h' file not found

#include <ilcplex/ilocplexi.h>
```

We actually need to specify the include directory that you downloaded in Step 1! The answer is:

```pip install --global-option='build_ext' --global-option=-I[the path where you downloaded CPLEX]/CPLEX_Studio1261/cplex/include pycpx```

See also http://stackoverflow.com/questions/18783390/python-pip-specify-a-library-directory-and-an-include-directory
mac tips

# finderにフルパスを表示

ターミナルで以下コマンドを実行

```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true

$ killall Finder
```

# アプリケーションで隠しファイルを開きたい

```
ファイル選択のダイアログ中で Cmd + Shift + .
```

# finderで隠しファイルを表示したい
```
defaults write com.apple.finder AppleShowAllFiles TRUE
```

# finderで隠しファイルを表示したくない
```
defaults write com.apple.finder AppleShowAllFiles FALSE
```
ログイン処理を行うOWINミドルウェアの作成

一式を https://github.com/ken200/OwinAuthWithNancy に配置しています。

本件に関連するソースコードは LoginMiddleware.cs と startup.cs に記載しています。


## 必要パッケージ

+ Microsoft.Owin

+ Microsoft.Owin.Security

+ Microsoft.Owin.Security.Cookies

+ Owin


## 構成物

## ミドルウェア

Microsoft.Owin.OwinMiddlewareクラスを継承して作成するのが無難かと思われます。

KatanaProjectに依存することになるけど、MS製なのでさほど問題にはならないと考えています。

ミドルウェアでの認証関係について、複雑なことは行っていません。読んでもらえればわかるけど、SignInメソッドの「context.Authentication.SignIn(userIdentity);」で認証登録し、その後リダイレクトしています。

```csharp

//ミドルウェアコードを一部抜粋

public class LoginMiddleware : OwinMiddleware
{
    public LoginMiddleware(...)
        : base(...)
    {
        ...
    }

    public async override Task Invoke(IOwinContext context)
    {
        if(!IsAuthenticated(context))
        {
            await SignIn(context);
            return;
        }

        await Next.Invoke(context);
    }

    ...

    private async Task SignIn(IOwinContext context)
    {
    	//ログインユーザー名の取得
        var userName = await _loginOption.UserNameGetter(context);

        if (string.IsNullOrEmpty(userName))
        {
            //レスポンスに書き込み。次ミドルウェアへの伝番は行わない。
            await WriteResponse(context.Response, 401, "invalid parameter.");
            return;
        }

        //ユーザーストアに対象ユーザーが存在するか確認
        var uMng = new MyUserManager();
        var userIdentity = await uMng.CreateAsync(userName);
        if (userIdentity == null)
        {
            await WriteResponse(context.Response, 401, "invalid user.");
            return;
        }

        //認証登録
        context.Authentication.SignIn(userIdentity);
        
        //リダイレクト
        var q = context.Request.Query[_loginOption.RedirectUrlQueryName];
        var redirectPath = !string.IsNullOrEmpty(q) ? q : _loginOption.DefaultRedirectUrl;
        context.Response.Redirect(redirectPath);
    }
    
    ...
}
```

## ユーティリティークラス

UseXXXX()な拡張メソッドを定義する。これ経由でミドルウェアを登録する慣わし？

```csharp
public static class LoginExtentions
{
    public static IAppBuilder UseLogin(this IAppBuilder app, LoginOptions loginOption, LogoutOptions logoutOption)
    {
        return app.Use<LoginMiddleware>(loginOption, logoutOption);
    }
}
```

Startupクラスでの登録

```csharp
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        //クッキーベースの認証する際に必要なミドルウェア
        app.UseCookieAuthentication(new CookieAuthenticationOptions() {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
        });

        //独自認証ミドルウェア
        app.UseLogin(
            new LoginOptions() { 
                LoginUrl = "/login", 
                LoginMethod = "POST", 
                UserNameGetter = async (ctx) => {
                    var form = await ctx.Request.ReadFormAsync();
                    return form.Get("userName");
                },
                DefaultRedirectUrl = "/secure"},
            new LogoutOptions() { 
                LogoutUrl = "/logout", 
                DefaultRedirectUrl = "/" });

        app.UseNancy();
    }
}
```
Chefを使ってみる - 実践編(2) ディレクトリを作成する

* 対象サーバで共通的に作成するディレクトリを作成する
* ミドルウェア用のディレクトリはミドルウェアインストール時に作成するので対象外
* cookbook名は「set_dir」とする

# Cookbookを作成し、Recipeなどを編集していく
##クックブックを作成
<pre>
$ knife cookbook create set_dir -o site-cookbooks
DL is deprecated, please use Fiddle
ffi-yajl/json_gem is deprecated, these monkeypatches will be dropped shortly
** Creating cookbook set_dir
** Creating README for cookbook: set_dir
** Creating CHANGELOG for cookbook: set_dir
** Creating metadata for cookbook: set_dir
</pre>

## Recipeを作成
```rb:set_dir/recipes/default.rb
# /root/workを作成（root用作業ディレクトリ）
directory "/root/work" do
  owner "root"
  group "root"
  mode  "0755"
  action :create
end

# /var/log/scriptsを作成
directory "/var/log/scripts" do
  owner "osap"
  group "osap"
  mode  "0775"
  action :create
end

# /opt/scriptsを作成
directory "/opt/scripts" do
  owner "root"
  group "root"
  mode  "755"
  action :create
end

# /var/log/scriptsへのシンボリックリンク作成
link "/opt/scripts/logs" do
  to "/var/log/scripts"
end
```
OWINミドルウェアの伝番制御について

こんなミドルウェアがあったとして

```csharp
public class HogeMiddleware : OwinMiddleware
{
    public async override Task Invoke(IOwinContext context)
    {
        System.Diagnostics.Debug.WriteLine("Hoge Before");
        await Next.Invoke(context);
        System.Diagnostics.Debug.WriteLine("Hoge After");
    }
}

public class FooMiddleware : OwinMiddleware
{
    public async override Task Invoke(IOwinContext context)
    {
        System.Diagnostics.Debug.WriteLine("Foo Before");
        await Next.Invoke(context);
        System.Diagnostics.Debug.WriteLine("Foo After");
    }
}

public class BarMiddleware : OwinMiddleware
{
    public async override Task Invoke(IOwinContext context)
    {
        System.Diagnostics.Debug.WriteLine("Bar Before");
        await Next.Invoke(context);
        System.Diagnostics.Debug.WriteLine("Bar After");
    }
}
```
StartupクラスでHogeMiddleware, FooMiddleware, BarMiddleware の順に登録し、アクセスした場合、

```
Hoge Before
Foo Before
Bar Before
Bar After
Foo After
Hoge After
```

と表示される。

Next.Invoke()呼び出したらそこで終わりではなく、それ以降に処理がある場合は、リクエスト時の処理とは逆順で事後処理が実行される。

ミドルウェアのInvokeメソッドで分岐が発生する場合は、分岐末尾でreturn;しないと思わぬ結果になる恐れあり。
Pythonを利用して任意の形式のファイルをダウンロードする


この投稿は [クローラー／スクレイピング Advent Calendar 2014](http://qiita.com/advent-calendar/2014/crawler)の12月24日用です。

## はじめに

Webサイトを閲覧していると、任意の形式のファイル（zip、pdf）などをまとめてダウンロードしたいケースがあると思います。

手作業でダウンロードしても良いのですが、こういう場合はPythonやRubyなどのスクリプト言語を使用すると簡単に処理が書くことができます。

今回はPythonを使用してダウンロードするスクリプトを書いてみました。

## ライブラリ

本当は標準ライブラリのみでも良いのですが、今回は下記のライブラリを利用しました。

* [requests](http://docs.python-requests.org/en/latest/)
* [BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/)

## ライブラリのインストール

```shell
pip install requests
pip install BeautifulSoup
```

## ソースコード

処理内容としては次の通りです。

* URLからリンクを抽出
* リンクから該当する拡張子のURLとファイル名を抽出
* ファイルを少しづつダウンロード

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import time

from BeautifulSoup import BeautifulSoup

BASE_URL = u"http://seanlahman.com/"
EXTENSION = u"csv.zip"

urls = [
    u"http://seanlahman.com/baseball-archive/statistics/",
]

for url in urls:

    download_urls = []
    r = requests.get(url)
    soup = BeautifulSoup(r.content)
    links = soup.findAll('a')

    # URLの抽出
    for link in links:

        href = link.get('href')

        if href and EXTENSION in href:
            download_urls.append(href)

    # ファイルのダウンロード（ひとまず3件に制限）
    for download_url in download_urls[:3]:
		 
        # 一秒スリープ
        time.sleep(1)

        file_name = download_url.split("/")[-1]

        if BASE_URL in download_url:
            r = requests.get(download_url)
        else:
            r = requests.get(BASE_URL + download_url)
        
        # ファイルの保存
        if r.status_code == 200:
            f = open(file_name, 'w')
            f.write(r.content)
            f.close()
```

## 終わりに

エラー処理や、ダウンロードURLの調整など改善する点は多々ありますが、
ひとまず任意のファイル形式（zip, pdfなど）のファイルをダウンロードできるようになりました。

Pythonなど使用すると、とても簡単にスクレイピングをすることができるので、
サイトに合わせて改善しながら、手持ちのスクリプトを増やしていくのが良いのではないでしょうか。

## 参考リンク

Sean Lahman Databaseについて

* http://www.slideshare.net/shinyorke/python-39061157
ASP.NET Identityで独自認証する

一式を https://github.com/ken200/OwinAuthWithNancy に配置しています。

認証関係のソースコードは UserManager.cs に記載しています。


## 「独自認証」仕様

+ ユーザー情報としては、「ユーザー名」のみ使用する。後述するが、ユーザーIDも持つ必要あり。しかし、使わないので適当な値をセットしている。

+ パスワードチェックは行わない。

+ ユーザー名が非管理者的な名称("admin","root"以外)の場合にログイン許可する。


## 参照したWebページ

http://okazuki.hatenablog.com/entry/2013/11/10/190811

一般的な独自認証について知りたい。または、使用するフレームワークが ASP.NET MVC の場合は、こちらを参照したほうが断然よいです。

独自認証でのパスワードチェック関係で少しはまったポイントについても記述されています。


## 必要パッケージ

+ Microsoft.AspNet.Identity.Core

ASP.NET Identityのコアパッケージ。

(余談ですが、MS製Webフレームワークは Microsoft.AspNet.* というネームスペースになります。)


## 構成物

### Microsoft.AspNet.Identity.IUserインターフェイス実装クラス

ユーザー情報を表す。ユーザーIDとユーザー名が必須項目。

今回はIDが不要のため、オブジェクト生成する度にGUIDを割り付けているが、ふつうはこんなことしないので注意。

```csharp
public class MyUser : IUser
{
    public string Id { get; set; }

    public string UserName { get; set; }

    public MyUser()
    {
        Id = Guid.NewGuid().ToString();
    }
}
```

### Microsoft.AspNet.Identity.IUserStore<T>インターフェイス実装クラス

ユーザーストアを表す。このクラスでユーザー情報の登録・削除・更新、参照を行う。

パスワード情報も管理する場合は、IUserPasswordStore<T>インターフェイスの実装も行う必要あり。

```csharp
public class MyUserStore : IUserStore<MyUser>
{
    public MyUserStore(){}

    public Task CreateAsync(MyUser user)
    {
    	//何もしない
        return Task.Delay(0);
    }

    public Task DeleteAsync(MyUser user)
    {
    	//何もしない
        return Task.Delay(0);
    }

    public Task<MyUser> FindByIdAsync(string userId)
    {
    	//今回、ユーザーIDは利用しないので、呼び出されたらException吐く
        throw new NotSupportedException("UserId is not supported");
    }

    private bool ExistUser(string userName)
    {
        if (userName.ToLower() == "admin" || userName.ToLower() == "root")
            return false;
        return true;
    }

    public Task<MyUser> FindByNameAsync(string userName)
    {
    	//spec:「管理者っぽい名前(adminまたはroot)」は弾く
        return Task.Run<MyUser>(() =>
        {
            return !ExistUser(userName) ? new MyUser() { UserName = userName } : null;
        });
    }

    public Task UpdateAsync(MyUser user)
    {
    	//何もしない
        return Task.Delay(0);
    }

    public void Dispose()
    {

    }
}
```

### Microsoft.AspNet.Identity.UserManager<T>クラス

IUserStore<T>実装クラスを使ってユーザー管理を行うクラス。今回はこのオブジェクトを内包するファザードクラスを定義した。

CreateAsync()でSystem.Security.Claims.ClaimsIdentityクラスを取得し、これを使って認証登録処理が行われる。

```csharp
public class MyUserManager
{
    private UserManager<MyUser> _uMng;

    public MyUserManager(UserManager<MyUser> uMng)
    {
        this._uMng = uMng;
    }

    public MyUserManager()
        : this(new UserManager<MyUser>(new MyUserStore())) { }


    public async Task<ClaimsIdentity> CreateAsync(string username)
    {
        var user = new MyUser() { UserName = username };
        var activeUser = await _uMng.FindByNameAsync(user.UserName);

        if (activeUser == null)
        {
            return await _uMng.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
        }
        else
        {
            return null;
        }
    }
}
```
LPC1114でI2C

I2Cマスタの動作確認用に、LPC1114でI2Cのスレーブを作ってみました。
あまりに簡単で申し訳ないくらいです(^^;
mbed･･･やっぱり良いですね～

http://nora66.com/mbed/lpc1114.html#2014/12/24
PHPUnitを動かしてみる


# マニュアル

http://phpunit.de/manual/4.0/ja/index.html

# 環境設定

注意：gitbashを使うのは色をだしたいから。コマンドプロンプトでもOK。  

1. gitbashを立ち上げる  
2. 画面上部を右クリック->プロパティ->フォント->MS ゴシック  
3. HelloWorldTest.phpとHelloWorld.phpを任意のフォルダにおく  
4. gitbashで次のコマンドを実行  

```
phpunit --colors HelloWorldTest.php | cat  
```

※コマンドプロンプトの場合は「--colors」と「 | cat」は不要。
OS X Yosemiteで日本語を打っているときでも英記号はASCIIのまま打ちたい

OS Xの「ことえり」で日本語を打っているとき、スペースを押すと、いわゆる「全角スペース」が入ります。$%^&#@!)( といった記号類でも、対応する「いわゆる全角英数字記号」が入ります。

これが嫌な場合、OS X 10.9までは
```defaults write com.apple.inputmethod.Kotoeri zhsy -dict-add なんたら -bool no```
として、日本語入力中であっても、英数字や英記号はASCIIのまま入るよう設定することができました。

ところが、OS X Yosemiteにアップグレードしたところ、この設定が効かなくなってしまいました。

じゃあどうするか。`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist`をいじれば良いようです。オリジナルとの差分はこんな感じです。
https://gist.github.com/mrmt/e4de97787e90a1c8f554/revisions

gistに置いておいたので、よければ使ってください。
[Yosemite:/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist](https://gist.github.com/mrmt/e4de97787e90a1c8f554)
SoftLayer (TOK02)の仮想サーバーのCPUスペックを確認してみた

# TOK02で使用されいる仮想サーバーのCPUスペック
TOK02ことSoftLayer東京データ・センターの仮想サーバーで使用されているCPUは、 **[インテル® Xeon® プロセッサー E5-2683 v3](http://ark.intel.com/ja/products/81055/Intel-Xeon-Processor-E5-2683-v3-35M-Cache-2_00-GHz)**らしいです。

E5-2600ファミリーといえば、2014年9月にリリースされた2ソケット・サーバー向けのHaswellプロセッサですね。

ユーザーとして見た場合、E5-2683 v3は、QPI速度9.6GT/sと前代と比較し大きくCPU性能が向上していますし、命令セット拡張としてもAVX 2.0 (Advanced Vector Extensions 2.0)が搭載されていますので、大幅な浮動小数点演算性能向上が期待できます。

また、データ・センター側としても、メモリがDDR4規格に対応しているため省電力運用ができますし、サポートするCPUが最大18コアのため仮想サーバーの集約率向上につながります。

ちなみに、TOK02の仮想サーバー用のディスクはSSDが使用されているそうです。

# OSから確認
念のため先週オーダーした仮想サーバー（2vCPU）のOSにログインして確かめてみました。

``# cat /proc/cpuinfo``

```
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz
stepping	: 2
microcode	: 42
cpu MHz		: 2000.066
cache size	: 35840 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 15
wp		: yes
flags		: fpu de tsc msr pae cx8 sep cmov pat clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good unfair_spinlock pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt tsc_deadline_timer f16c rdrand hypervisor lahf_lm abm arat epb pln pts dts fsgsbase erms
bogomips	: 4000.13
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz
stepping	: 2
microcode	: 42
cpu MHz		: 2000.066
cache size	: 35840 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 15
wp		: yes
flags		: fpu de tsc msr pae cx8 sep cmov pat clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good unfair_spinlock pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt tsc_deadline_timer f16c rdrand hypervisor lahf_lm abm arat epb pln pts dts fsgsbase erms
bogomips	: 4000.13
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:
```

確かに、モデル名が、**Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz**と書かれています。

# 気になるお値段

2014年12月24日時点での、Virtual Server (Public Node)の料金は以下のとおりです。

| vCPU数 | 時間課金の場合 | 月額課金の場合 |
|:-----------|------------:|:------------:|
| 1 | $0.016 | $10.88 |
| 2 | $0.031 | $21.75 |
| 4 | $0.063 | $43.50 |
| 8 | $0.125 | $87.00 |
| 12 | $0.188 | $130.50  |
| 16 | $0.250 | $174.00 |

最新のCPUがこの価格感で使えるのは、パブリック・クラウドならではですね。
あれからぼくたちはおとなになれたかな (TwitCasting / 脆弱性AC2014)

性なる夜にこんばんはこんばんは
この記事は、[脆弱性"&'<<>\ Advent Calendar 2014](http://www.adventar.org/calendars/622) 24日目の記事です

クリスマス・イブらしく、異性の脆弱性ハンターひしめくTwitCastingさんとのやりとりを晒し


![3年以上前のやりとり。ツイキャスさんの黒歴史?](https://qiita-image-store.s3.amazonaws.com/0/63967/0e98e26b-e88c-05b0-99bc-a18b45b0e90e.png)



なお筆者は、今夜は男ばかりの焼肉会に行くことになる模様
こちらからは以上です
vpcompressd

expandの逆をします。

これだけマスクの扱いが特殊ですね。マスクと対応する入力を拾ってきて、出力には下から詰めます。

```c
#include <immintrin.h>
#include <stdio.h>

unsigned int in[16] = {100,101,102,103,
                       104,105,106,107,
                       108,109,110,111,
                       112,113,114,115
};

unsigned int out[16];

void test(__mmask16 mask)
{
    for (int i=0; i<16; i++) {
        out[i] = -1;
    }

    __m512i v = _mm512_loadu_si512(in);

    _mm512_mask_compressstoreu_epi32(out, mask, v);

    printf("0x%04x: ", mask);
    for (int i=0; i<16; i++) {
        printf("%3d, ", out[15-i]);
    }
    puts("");
}

int
main()
{
    printf("      | ");
    for (int i=0; i<16; i++) {
        printf("%3d, ", 15-i);
    }
    puts("\n---------------------------------------------------------------------------------------");

    test(1);
    test(0xaaaa);
    test(0x8888);
    test(0x0303);
    test(0x0462);
    test(0xffff);
}
```


```
      |  15,  14,  13,  12,  11,  10,   9,   8,   7,   6,   5,   4,   3,   2,   1,   0, 
---------------------------------------------------------------------------------------
0x0001:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 100, 
0xaaaa:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 115, 113, 111, 109, 107, 105, 103, 101, 
0x8888:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 115, 111, 107, 103, 
0x0303:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 109, 108, 101, 100, 
0x0462:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 110, 106, 105, 101, 
0xffff: 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 
```


明日は @tanakmura が vpscatterdd について書きます。
おすすめiOS開発ルール


チームでiOSアプリを開発する場合、アプリ全体のコード・クラス設計等に統一感が出るよう開発ルールを決めることが多いかと思います。
今回は私がiPadアプリを開発するに当たって決めた開発ルールの中でうまくいったなと思うモノを紹介します。

##前提
開発ルールを適用したプロジェクトの概要は以下です。異なる性質のプロジェクトでは有用でないかも知れないので注意してください。

* iPadアプリ
* 規模
 * コード行数は5万行程度（コメント等も含めた数字）
 * 開発者だけで7名のチーム
 * 詳細設計〜単体テストだけで工数30人月程度
* 開発者のスキルレベルはiOS経験が数年ある人が半分、他のプラットホームで開発経験はあるが、iOSは初めてという人が半分

##開発ルール

###1.基本的にViewControllerには1対1でDataControllerを作り、すべての状態をそこで管理する
理由はViewControllerを薄くするためです。
[objc.ioの記事](http://qiita.com/gonsee/items/76ee350d6ef266bb33da)で、UITableViewDataSourceをViewControllerでなく、別クラスに実装することでViewControllerを軽くするという方法が紹介されていますが、これはその適用範囲をさらに広げたものです。
ViewControllerには基本的に一切の状態を持たせず、NSObjectのサブクラスとしてDataControllerクラスを定義しそこですべての状態を管理します。
DataControllerの責務は以下です。

* 状態を管理する  
ユーザからの入力、サーバから受信したデータなどの状態を保持します。その変更は基本的にDataController内でのみ行います（DataController以外のクラスはDataControllerのメソッドを呼ぶことで変更を行う）
* サーバとの通信を通信層に委譲する  
受信したデータをキャッシュする、受信したデータをモデルにマッピングする、サーバのAPIに合わせてエンドポイントを決めたり送受信するデータのフォーマットを決めたりするといった責務は通信層が負うのでDataControllerは関知しません。DataControllerが行うのはサーバに送信するデータを通信層に渡すこと、通信層からもらったモデルを保持し、ViewControllerに状態が変更されたことを通知すること、通信のエラー処理です。

DataControllerという名前にした理由は以下です。

* ViewControllerとの対応がわかりやすい  
例えば、AccountViewController, AccountDataControllerのような名前になるので対応するViewControllerがわかりやすいです。
* TableViewと関係ない状態も持つのでDataSourceという名前にしたくなかった

###2.Subviewの更新はViewクラスにモデルを渡してViewクラス内部で行う
悪い例は```view.nameLabel.text = @"myName";```のようなものです。
理由はカプセル化するためです。ごく基本的なことですが意外と守られていない気がします。
特にUITableViewCellのサブクラスの更新をcellForRowAtIndexPathで行っているためにcellForRowAtIndexPathが長くなってしまうのはよく見るアンチパターンです。以下の例のように、ControllerからはbindModelメソッドでモデルを渡すだけにします。
（勿論このルールはCell以外のViewについても適用されます。）

```objc
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TodoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    TodoCellModel *todo = [self.todos objectAtIndex:indexPath.row];
    [cell bindModel:todo];
    return cell;
}
```

###3.UITableViewCellのサブクラスに対応するViewModelを作り、そこにCellに表示する状態をすべて持たせる
Cellのselectedフラグなど、ユーザからの操作で変化する状態などもViewModelに持たせます。
ViewModelを作る理由は以下です。

* Viewを薄く、Modelを厚くしてテストを容易にするため。文字列のフォーマットのテストなどで重宝しました。
* キャッシュするため。パフォーマンスチューニングを行うときに計算結果や文字列のフォーマットの結果をViewModelにキャッシュすると非常に効果がありました。CellはReuseされるのでキャッシュができません。

###4.クラスは短く、メソッドも短く
1クラス150行まで、1メソッド20行までを目安にしていました。
妥協したところもありますが、8割程度はこの制限内に収まっていました。
短くするだけでとてもわかりやすくなるのでおすすめです。
Kent Beckは1メソッド3行程度で書くそうですがまだまだその境地には至れていません。。

##まとめ
如何でしたでしょうか。参考になりましたら幸いです。
フィードバックなどありましたら[@anton0825](https://twitter.com/anton0825)または[ブログ](http://anton0825.hatenablog.com/)までお願い致します。
SlimのシンタックスハイライトをSublimeText2に入れてみた

Railsで開発でSlimを導入したのですが、読みづらく何とかならんのかと思い。
シンタックスハイライトを利用できると知りインストールしました！

##Ruby Slim
こちらからインストール
https://github.com/slim-template/ruby-slim.tmbundle


##SublimeText2のPreferences>PackageControll
![スクリーンショット 2014-12-24 8.41.40.png](https://qiita-image-store.s3.amazonaws.com/0/48577/e985b9e2-7138-a68e-8e6a-dab5720136e3.png)

##InstallPackageを選択
![スクリーンショット 2014-12-24 8.41.46.png](https://qiita-image-store.s3.amazonaws.com/0/48577/f184b0ef-9c0b-63a7-008e-ca26ee1f9256.png)

##目的のもの検索。今回は「Ruby Slim」
![スクリーンショット 2014-12-24 8.42.02.png](https://qiita-image-store.s3.amazonaws.com/0/48577/baec57bb-fcc3-3d56-172e-0ca574811693.png)

##Sublime Textを再起動する
slimファイルを開くとシンタックスハイライトがされています。
![スクリーンショット 2014-12-24 9.18.36.png](https://qiita-image-store.s3.amazonaws.com/0/48577/7f58ba3e-a7e1-db38-b81d-141db1eda21b.png)
プログラマになること#3


###記述する動機
私、とある専門学校でPGを教えています。はや８年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、公開していきたいと思います。全て実例です。個人名は秘密！！

###出会い
私、10数年前、フリーのエンジニアとして、多忙な日々を送っていました。
縁あって、某量販店資本のプログラマ教育を行うこととなります。
大卒で、就職しそこねた人達でした。
当時は就職が厳しい頃だったので、特に珍しくもなく、こちらはやる気満々です。

###環境
ハードは要求どおり’。サーバーなんか結構良かった。
ソフトウェアについては、予算が無いの一言で、Oracleが調達できなかった。
LAMP環境とIIS環境を構築

###普段何やってるの？
社内システムがVB6とのことで、まずはVB6のC/Sを教える。
教えても、教えても、「やらない」自己投資もしない。
不思議になって「何やってるの？」「モンハン、マリオですかね」
そうですか。ゲームですか。そんなんだから現役でどこにもいけないんだよ。

###理想と現実
精一杯教えたけど、結局１０名中７名までがプログラマとしてデビューできた。３名はアウト（一次面接で落ちる）。
２名がインターン先で大問題を起こしてくれて、結局その会社との付き合いは終わってしまった。
パワハラは厳禁だけれども、約束事の重たさをしっかり教えないとだめです。痛感しました。
モデリングをするメリットのお話

この記事はペパボアドベントカレンダー24日の記事です。
前回は@adarapataさんの[ゲームを作るときに考えていること](http://qiita.com/adarapata/items/a5e1790bc725292ad692)でした

# まえがき
はじめまして yuma300 と申します。仮想通貨界隈ではびっとぶりっとというハンドルネームで活動をしております。

ハンドルネームからもご想像つくかもしれませんが、元々は組み込み系の会社で下回りの開発を長くやっておりました。その組み込み系の会社では研修時にかなり長い時間をかけてUMLモデリングを叩きこまれて、今でもとても役に立っております。その経験を活かしてペパボというWeb業界にきても効率的に開発できてるんじゃないかと自分では思っておりますｗ

ということで今回は実際に開発現場でモデリングをすることで感じたメリットを僕の経験に基づいて書いていこうと思います。実際どのようにモデリングを開発プロセスに取り入れているかについては次回以降の記事で書いていこうと思います。

# 本文
## 開発チームでの情報共有がしやすい
実際に実装する前に、どのような実装になるのか開発チーム内で共有することができます。チームで開発するとなると、たいがいコードレビューをするわけですが、コードレビューの段階になって設計レベルで不備や不合理な点がみつかって、設計からやり直すとなると多大な手戻りが発生してしまいます。モデリングをして開発チームで共有することで、実装をする前に設計レベルのレビューができ、コードレビューの段階での設計からやり直すといった手戻りを抑えることができます。

更にコードレビューでコードだけ見せられるより、モデリングした図を見ることでより一層コードの理解が進み、的確かつ速くコードレビューをすることができます。

後から新しい人が開発チームに入ったときもコードを追わなくても、モデリングした図を見ることでどのような事をどこでしているのか把握することができます。

## プロダクトオーナーとの仕様調整がしやすい
要求分析をする過程で、プロダクトオーナーの要求が整理されプロダクトオーナー、開発チーム間での認識をあわせることができます。大まかに定義すべき要件が漏れ無くこの段階で決めておけば、実装してから考慮されてないケースに対応するためそれまで実装したものを大幅に変更するという事態を防げます。

シーケンス図やクラス図まで用意するとかなり細かな仕様や制約をプロダクトオーナーと共有することが出来ます。

これらを早期にプロダクトオーナーと共有することで早い段階でプロダクトオーナーからフィードバックを貰うことができます。そのフィードバックには仕様変更も含まれるわけで実装をしてから仕様変更に対応するより、だいぶ効率的です。


## プロダクトオーナーへの進捗報告がしやすい
クラス図を用意しておき、実際に実装を開始した後に実装が完了したメソッドやクラスをクラス図上で色分けしておけばプロダクトオーナーに進捗報告をする際、パッと見てどの程度出来上がっているかがわかってもらえます。

実装も大詰めを迎えてリリース期日近くになってきた際に、優先度についてプロダクトオーナーと話しあう際、今の実装状況とその機能を実装するためにどのクラス・メソッドを実装する必要があるのかを照らし合わせながら視覚的に議論することができます。

## テスト駆動開発しやすい
モデリングするとなるとたいがいオブジェクト指向設計をすることになるわけですが、よい設計を実現するため当然各クラスは疎結合 高凝集となるようなインタフェースを用意することになります。

モデリングの段階でそれらインタフェースが定義されるので実装の段階ではそれらインタフェースが期待通り動く事を確認するテストコードを用意すればよいことになります。実装にあわせてテストコードを用意するのでなく、まずインタフェースがあってそれが正しく動くテストコードを用意するという流れになるので必然的に効率的にテスト駆動開発ができます。

## 作業分担しやすい
上で述べた通り、モデリングの段階でインタフェースが定義されているため、それらインタフェースを実装するために必要な作業量や開発チームメンバーの力量を鑑みながら作業を視覚的に割り振る事ができます。

それらインタフェースは粗結合・高凝集になっているため作業がバッティングする心配もほとんどありません。

## 作業の見積もりがより正確になる
モデリングによりインタフェースが定義されて、どの機能を実装するのにどのような作業が必要になるかより具体的にイメージできるためより正確な見積もりをモデリングの段階でプロダクトオーナーに伝えることができます。

## リリース計画を立てやすい
モデリングの段階で機能の優先度と作業量の見積もりを視覚的に把握できるため、どのようにリリースしていくかの計画をプロダクトオーナー、開発チーム双方がしやすくなります。

# あとがき
弊社では、基本的にプロダクトは全部内製なので主な利点としてはこれくらいなのですが、受託開発して外部の方々と連携してプロダクトを作る場合は上記に上げた事以外にも様々なメリットがでてきます。
従って弊社では受託開発する場合に比べてモデリングするメリットは少ないのですが、それでもこれらメリットを考えるとモデリングをするのは開発効率アップに多大に寄与すると僕は考えます。

現在僕が所属する部署では開発プロセスにスクラムを取り入れております。
今後の僕の課題としてはモデリングの手法をこの部署でのスクラムに更に最適化していき、社内にもそのノウハウを広げていこうと考えております。

次は@shikakunさんです?
Pythonモジュールのインポート

# 目的
いくつかのモジュールからなるパッケージを作成した場合、インポート時にフォルダ名(パッケージ名)、ファイル名(モジュール名)、インポートする関数やクラス名を書く必要があり import 文が長くなる。これらを短くしたい。もしくは、モジュールを跨いでデフォルト設定でインポートしたい。

# Python におけるインポートの仕様
[ここ](http://blog.livedoor.jp/odaxsen/archives/1592322.html) によると、
> import されたモジュール名は import を行っているモジュールのグローバルなシンボルテーブルに置かれます。import 文には、あるモジュール内の名前を、import を実行 しているモジュールのシンボルテーブル内に直接取り込むという変型が あります。(from..import..)

とのことなので、`__init__.py` で import を行うと，パッケージを import するだけで，`__init__.py` 内で import したシンボルを利用できる．

例えば，

    /foo
      - __init__.py
      - bar.py

というフォルダ構成で、

```shell-session
$ cat bar.py
PIYO=100

$ cat __init__.py
from bar import PIYO
```

とした場合、`import foo` で，foo.PIYO が利用できる．これを使えばモジュール内での複雑な実装を隠してライブラリを提供できる。
Bootstrap の modal dialog が影の下に隠れる問題

Bootstrap の modal dialog でダイアログ自体が影の下に隠れてしまうことがあった。`.modal-dialog` の z-index が影のレイヤよりも小さいこと問題で、適当に大きな値を設定しておけば回避できる。

**設定例**

```html
<div class="modal-dialog" style="z-index: 1500">...</div>
```
プログラムの追加と削除の一覧から表示だけを消したい

## 参考

* [[プログラムの追加と削除] ツールの一覧から手動でプログラムを削除する方法](http://support.microsoft.com/kb/314481/ja)

`regedit`を起動し以下から該当のプログラムを見つけて削除すればよい。

> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
ピザハットとコラボしてアンドロイドにおこのみpizz

OSにピザハットを宅配サービス。アンドロイドちゃんがおこのみメッセージを大人？こども？女？男？と選択枝をだし答えて承認したらいただきますか・・・yes。noで答えて注文完了。名前とかはていばんだけどね。ピザハットのメニューはアップロードされる。。。
循環バッファを Stream で無限リスト化して扱う

順序付けされたコレクションの中に要素が環状に並んでいるように参照できる**循環バッファ** (リングバッファ) てもんがあります。プログラミングで扱うときはインデックスの余剰を使ってコレクションの最後まで読み取ったら次はまた先頭から始めることで実現することができるんですけど、Scala ではこの環状バッファを `Stream` を使って無限リストっぽく扱うことが出来ます。

```scala
class Inventory[T](inventory:Seq[T]) {
  def toStream(i:Int):Stream[T] = inventory(i % inventory.size) #:: toStream((i + 1) % inventory.size)
}
```

循環バッファで例示に向いた使用例ってぱっと思い付かないんですけど、接続中の複数のサーバから準備が出来たものを返すスピンロックなど?

```scala
new Inventory(connections).toStream(Random.nextInt.abs).find{ _.isReady }
```
Debugアプリ用アイコンを簡単に作る

パッケージ名を変えて Release版と Debug版、両方のパッケージをインストールできるようにしてる人は多いと思います。そんな時、ラウンチャーで並んでしまい、どっちが Debugだったか迷ってしまうことも多いのでは。

そんな時につかえるスクリプトを作りました。おなじみのシェル芸と imagemagickをあわせたものです:
https://gist.github.com/dagezi/194c9972ca5ca36dd2db

AndroidStudioで生成した Gradleプロジェクトを前提としています。ディレクトリ構成が違う場合は適宜編集してください。

これをアプリケーションのモジュールのディレクトリで走らせると、Debug版アイコンの右下におざなりに黄色い四角がつきます。これでラウンチャー上でひと目で怪しさがわかるはずです。:

![ic_launcher.png](https://qiita-image-store.s3.amazonaws.com/0/28133/c4068f56-8f6b-3bb2-def3-ee4c2e82ce98.png)

色とか位置とかは、スクリプトの最初の方に書いてあるのでなんとなくわかると思います。というか、わかってください。
座標は、アイコンサイズを100としたときのパーセンテージです。

一応、mipmapも変換してくれるとは思いますが、試してません。あしからず。
外部不経済の行方

ビットコインのようなproof-of-work型の分散システムは、計算資源への過剰投資が発生し、その意味で必ず外部不経済が発生することが知られています。経済学における外部不経済とは、事業者の経済活動に対して、事業者以外が支払っているコストが限界費用を押し上げる効果のことです。例えば、公害を撒き散らす企業があったとして、環境への悪影響を顧みず商品を製造して売る場合、製品の価格に環境配慮のコストは織り込まれません。このように、売り手と買い手が負担しないコストを外部が負担している場合に、外部性という言葉を使います。経済学者のピグー（1877-1959）は、適切な法規制をかけ、環境に負荷をかけない形で製品を市場に出し、その分のコストを価格に織り込めば、外部不経済を回避できるとしました。もし、ビットコインが外部不経済を内包するのであれば、事業者が負担していないコストで、限界費用を押し上げるメカニズムがあることを指摘する必要があります。

さて、半年以上前の2014年4月21日に発行された日経ビジネスで、「国家に突きつけられた挑戦状」という副題を付けたビットコインの特集が組まれました。その中で、ビットコインの懐疑派と推進派の意見の対立軸が列挙され、マイニングによる環境への影響が取り上げられました。

<b>懐疑派</b>　ビットコインの採掘（マイニング）はいつか破綻する。電力消費も大きく、地球環境への負荷が大きい。
<b>推進派</b>　計算量は需給で調整されるため、持続可能だ。既存の非効率な銀行システムに比べ、環境負荷も小さい。

銀行と分散型システムのどちらがより効率的な決済機能を提供しているかは、通常だと、取引手数料を比較することで決着します。より効率的な事業者の取引手数料がより安くなるからです。しかし、ビットコインは、新規コイン発掘競争と取引認証を一体化しているため、この比較方法は公平ではありません。そこで、電気代などの資源消費と発掘されるコインの期待値がバランスすると仮定した上で、マイニング産業の総収入を計算します。それを取引件数で割ることで、1取引当たりの資源消費量を導き、これを銀行の取引手数料と比較してみることにします。以下は、2014年12月22日時点での概算です。

<b>ビットコインの時価</b>　1BTC当たり300〜400ドル
<b>発掘コイン数</b>　1回当たり25BTC
<b>発掘競争回数</b>　1日当たり144回
<b>取引件数</b>　1日当たり9万件
<b>マイニング産業の総収入</b>　時価&times;発掘コイン数&times;発掘競争回数=108〜144万ドル/日
<b>資源消費量</b>　総収入&divide;取引件数=12〜16ドル/件

計算結果から、1取引当たり1200円から1600円程度の資源消費が発生しているということがわかります。これは日本からの海外送金の典型的な取引手数料である4000円と比べてやや安い程度の水準です。という訳で、現状では、既存の銀行決済システムがビットコインよりも非効率だと一刀両断することはできません。また、ビットコインの約9万件の取引の中には、ミキシングサービスのような匿名性を高めるだけの送金処理などが含まれており、実質的な経済活動に寄与する取引の実数について正確なところはわかりません。送金するユーザの立場から見れば、取引手数料がほぼ無料のビットコインはありがたい存在ですが、ビットコインシステム自体が効率的だと主張するためには、クレジットカード並みの1日1億件程度の取引件数が必要になってくるでしょう。マイニング産業の総収入の変動なしで、この取引件数を達成したならば、無駄な計算で資源の浪費をしているという非難の幾分かは緩和されるのではないでしょうか。

ここで、もう一つの論点である計算量の話に移ります。計算量が需給で調整され、採掘が持続可能であるというビットコイン推進派の主張には概ね同意できます。ただし、2016年の6〜8月頃にコインの供給量が半減すると見られており、その際、ビットコインの価格上昇のタイミングに遅れが生じると、採算が悪化したマイナーが多数退場してしまう可能性があることは知っておく必要があるでしょう。それから、計算量の歴史的推移を論じた資料として、イングランド銀行が発行する2014年9月の<a href="http://www.bankofengland.co.uk/publications/Documents/quarterlybulletin/2014/qb14q3digitalcurrenciesbitcoin2.pdf" target="_blank">論文</a>を挙げておきます。7ページ目に、1アドレス当たりの計算量がログスケールでプロットされており、ほぼ一貫して計算量が増大していく様子を確認できます。専用採掘機の技術革新のスピードが速く、ビットコイン経済圏がまだ発展途上であることを考慮すると、この図から計算資源への過剰投資という結論を導き出すのは難しいと言えます。

proof-of-work型の分散システムにおいて、計算資源への過剰投資が発生するメカニズムは次のようなものです。まず、あるマイナーが限界収入の増大を狙って計算資源に投資します。他のマイナーも同様に計算資源に投資するため、全体の計算量が有意に増大し、最終的にdifficultyを上昇させ、限界費用の増大を齎します。各マイナーは、自分の投資が他のマイナーにとっての外部不経済の要因になることを考慮しないので、マイニング産業全体としては計算資源への過剰投資になってしまいます。これが、各マイナーが負担しないコストで限界費用を押し上げるメカニズムです。この理論を、歴史を刻み始めたばかりのビットコイン経済圏に適用するのは不可能ではないかというのが、私の意見です。
PNGの非可逆圧縮ーLossy PNG


# 背景
Webページの高速化するためにはイメージサイズをできるだけ小さくすることが必要です。たとえば、最近のWebページのコンテンツタイプごとのサイズは以下のようのなっており、イメージが全体の半分程度を占めています。

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/38304/a6a1c3a2-c310-2602-304f-d65e60939eab.png "httparcvhie.org")

さらにイメージの中でのフォーマットは、以下の図のようにJPEGで約半分、PNGとGIFがぞれぞれ1/4ずつとなっています。

![chart-2.png](https://qiita-image-store.s3.amazonaws.com/0/38304/592a48ec-c87a-f513-d5be-f350db85e0f9.png)

JPEGは基本的に画質のトレードオフでコンテンツ作成者がサイズを決めていると思いますが、GIFやPNGは可逆圧縮のためサイズを小さくすることが難しいです。特に透明画像を使いたい場合はPNGしか選択肢はありませんが、パフォーマンスを考えるとPNGでもサイズをなるべく小さくしたいです。この秋に開催された[O'Reilly Velocity Euro Conference](http://velocityconf.com/velocityeu2014/)でもいつくかのセッションで挙げられていましたが、Lossy PNGを使うことで画像のサイズを小さくできます。

# Lossy PNGの原理

PNGの圧縮にはRGBからindex colorに減色する方法がありますが、ここではRGBのままでの非可逆圧縮について説明します。なお、index colorの非可逆圧縮は以下の説明と違うアルゴリズムが必要です。

## PNGの圧縮の原理
通常のPNGのエンコーダは、大きく分けて次の3段階の処理で行われます。

1. スキャンライン化などの前処理
1. フィルタ処理
1. 圧縮処理

圧縮処理はDeflate方式で圧縮を行います。これは、よく使われるZIPとほとんど同じです。画像データをそのまま圧縮処理してもあまり圧縮されないため、フィルタ処理でより効率的に圧縮できるよう画像データを変換します。
フィルタ処理を簡単な例で説明します。
例としてR成分だけの赤い画像を考えます。R成分だけを抜き出すと、

    190, 191, 192, 193, 194, 193, 192, 191, 190, 189

これを左隣との差分に置き換えると

    190, 1, 1, 1, 1, -1, -1, -1, -1, -1

となります。左端は0との差分なのでそのままの値になります。このように変換することでより高い圧縮率を得られます。

## 非可逆圧縮
差分を計算するところで、少々「うそ」をついて

    190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

とすればどうでしょう？　デコードした画像は

    190, 190, 190, 190, 190, 190, 190, 190, 190, 190

となり、元の微妙な赤の陰影が単色の画像に劣化しますが、より圧縮することができます。
これがPNGの非可逆圧縮の原理です。
こうして出来上がったPNGファイルは通常のPNGファイルと全く同じです。言い換えれば、PNGファイルだけを見て非可逆圧縮されたものか、もともと単色の画像だったかは判別できません。
したがって、非可逆圧縮されたPNGファイルも通常のPNGデコーダでデコードできます。

これがLossy PNGの最大の利点です。WebPなど圧縮率を改善した新しいフォーマットが提案されていますが、使えるWebブラウザは限られています。しかし、Lossy PNGの場合、フォーマットそのものは通常のPNGであるため、ほとんどすべてのWebブラウザで表示できます。

#使用したツール
今回はソースコードが確認できる
[lossypng](https://github.com/foobaz/lossypng "lossypng")
を使用しました。実際の圧縮アルゴリズムは上記より複雑です。
また、圧縮した画像の評価には
[dssim](https://github.com/pornel/dssim "dssim")
を使用しました。これは画像の評価で標準的に使われているstructual similairityを計算するツールで数字の小さいほど画像間の差がないことを表します。

#評価
##写真
まず、写真を圧縮してみました。
元画像です。
![lena.png](https://qiita-image-store.s3.amazonaws.com/0/38304/3d3c4c75-0d55-5512-5454-1bc6abb12750.png)
475KB
lossypngは-sオプションで圧縮率を指定できます。-s=0でlosslessで、数字が大きくなるほど圧縮率が大きくなります。以下は何種類かの圧縮率で圧縮した画像です。
![lena-lossy-20.png](https://qiita-image-store.s3.amazonaws.com/0/38304/46dbf640-f359-9c5c-3c8c-4f073584ad02.png)
-s=20 84KB (18%) DSSIM 0.033773
ファイルサイズは元画像の18%まで小さくなりましたが、パッと見た目はほとんど劣化が目立ちません。

![lena-lossy-30.png](https://qiita-image-store.s3.amazonaws.com/0/38304/0b0f5ca9-54c9-8de8-ac46-d7da4c5e2fe8.png)
-s=30 61KB (13%) DSSIM 0.055768
サイズは13%ですが、肌などで劣化がわかるようになりました。

![lena-lossy-50.png](https://qiita-image-store.s3.amazonaws.com/0/38304/7c38a8e5-ae2e-2ee2-def1-e5595694b52b.png)
-s=50 40KB (8%) DSSIM 0.101474
ここまで小さくすると劣化がはっきりと目立ちます。

![lena-lossy-80.png](https://qiita-image-store.s3.amazonaws.com/0/38304/687d4ba3-7df6-3837-0055-1285298bb676.png)
-s=80 28KB (6%) DSSIM 0.169919
参考までにかなり圧縮率をあげた例です。

#まとめ
lossy PNGでサイズを大幅に小さくすることができます。また、表示するために特別なデコーダは必要ないので、PC、モバイルなどのほとんどのWebブラウザで表示可能です。
chefでrsync: fork: resource temporarily unavailable (11)出た時の対処法

`knife solo cook ubuntu`とかで

```
rsync: fork: resource temporarily unavailable (11)
```

出たらメモリ不足らしいのでローカル仮想環境ならVagrantfileを書き換えてメモリ量を増やしときましょう。VPSの時はまた別の対策がいるでしょう。
Stylus でクリスマスツリー


```sass:main.styl
@charset "UTF-8"
#wrapper
  margin 20px
  padding 5px
  background black

/* 台形 */
trapezoi(uplen, bottomlen, height, color = black)
  width uplen
  sidelen = (bottomlen - uplen) / 2
  border-bottom height solid color
  border-left sidelen solid transparent
  border-right sidelen solid transparent
  height 0


/* 二等辺三角形 */
triangle(bottomlen, height, color)
  trapezoi(0, bottomlen, height, color)

.christmas-tree
  w = 200px
  h = 50px
  k = 6
  width w
  treegreen = green
  > div
    margin 0 auto
  .star
    width w
    color yellow
    font-size 30px
    text-align center
    shadow = 0 0 10px white
    text-shadow shadow, shadow, shadow
    margin-bottom -10px
  .reaf
    border-radius 2px
    &:nth-of-type(2)
      rate = 0.3
      triangle(w * (1 - rate), h, treegreen)
    for i in (3..k)
      &:nth-of-type({i})
        rate = 0.3 - (0.2 * (1 / (k - 2) * (i - 2)))
        trapezoi(w * (1 - rate * (2.4 + 0.3 * (i - 3))), w * (1 - rate), h, treegreen)
  .trunk
    width (w / 8)
    height 20px
    background brown
  .pot
    width (w / 2)
    height 20px
    background orange
```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>クリスマスツリー</title>
    <link rel="stylesheet" href="main.css" type="text/css" media="screen" charset="utf-8">
  </head>
  <body>
    <div id="wrapper">
      <div class="christmas-tree">
        <div class="star">★</div>
        <div class="reaf"></div>
        <div class="reaf"></div>
        <div class="reaf"></div>
        <div class="reaf"></div>
        <div class="reaf"></div>
        <div class="reaf"></div>
        <div class="trunk"></div>
        <div class="pot"></div>
      </div>
    </div>
  </div>

</body>
</html>
```

![qi.png](https://qiita-image-store.s3.amazonaws.com/0/40717/7c98a3dc-60b6-8625-f07c-f13751c8dbe4.png)

Stylusの文法盛り込んでみようと思ったけどいまいち

台形をBorderで表現してしまったがために box-shadow でのデコレーションも全く出来なかった
s3cmdを使って1週間前のデータを定期的に削除する

s3cmdを使ってデータを定期的に削除するコマンドを作った。
今回はファイルの作成日時がファイル名自体に入っていたので、こんな感じでシェル作ってcronに設定しておしまい。これで7日前のデータが全部消える。


```console
s3cmd ls s3://bucket/ | awk '{ print $4 }' | grep `date +'%Y%m%d' --date "7 day ago"` | xargs s3cmd del
```

もしファイル名に日時が入っていない場合はアップロードされた日時をgrepで指定するとかで対応できそう。
s3cmdで○日以前のデータは削除とか出来れば何かあった時にも楽なんだけど、とりあえずこれで様子見。
zshでプロンプトをカラー表示する

zshでプロンプトをカラー表示してる人も多いと思う。カラー表示する方法は2種類書き方があって、ちょっと分かりにくいので、その方法についてまとめておく。

## 方法1
まず1つ目の方法として、プロンプト文字列を%F{色指定}と%fで囲めばその中は指定した色になる。「色指定」の部分には色の名前または数字を書く。使用できる色の名前と数字は以下の通り。

|色の名前|数字|
|:---|:--|
|black|0|
|red|1|
|green|2|
|yellow|3|
|blue|4|
|magenta|5|
|cyan|6|
|white|7|

%Fと%fの代わりに%Kと%kを使うと、背景色が変わる(bacKgroundのk)。

### 例

```zsh
PROMPT="%F{green}[mollifier]%f %# "
```

![zsh_prompt_1.png](https://qiita-image-store.s3.amazonaws.com/0/204/8c136247-f2de-6e83-7ef6-3e60bffac748.png)

```zsh
PROMPT="%K{green}[mollifier]%k %# "
```

![zsh_prompt_2.png](https://qiita-image-store.s3.amazonaws.com/0/204/7833fd86-7098-6849-d129-dad5615de10c.png)

## 方法2
もう1つ、colorsを使用する方法がある。まず準備として、こんな感じでcolors関数を読み込んでおく。

```zsh
autoload -Uz colors
colors
```

これ以降は\${fg[色指定]}と\${reset_color}で囲んだ部分がカラー表示になる。

「色指定」の部分には以下の色の名前が指定できる。方法1と違って数字では指定できない

|色の名前|
|:---|
|black|
|red|
|green|
|yellow|
|blue|
|magenta|
|cyan|
|white|

\${fg[色指定]}の代わりに\${bg[色指定]}と書くと背景色が変わる

### 例

```zsh
PROMPT="${fg[green]}[mollifier]${reset_color} %# "
```

![zsh_prompt_3.png](https://qiita-image-store.s3.amazonaws.com/0/204/43ed1653-d505-a95e-ddd2-9657f5dd4429.png)


```zsh
PROMPT="${bg[green]}[mollifier]${reset_color} %# "
```

![zsh_prompt_5.png](https://qiita-image-store.s3.amazonaws.com/0/204/461fc51e-7377-cda1-8778-7407766479c7.png)

## 方法1と方法2の違い
方法1と方法2は似てるけど少し違いがある。まず、方法1はcolorsに依存していない。なので、`autoload -Uz colors`しなくても方法1は使用できる。

もう一つ違いがあって、方法1はプロンプト表示だけでしか使えないけど、方法2は違っていて、echoとかの単なる文字列表示でも使える。

```
% echo "${fg[green]}hoge${reset_color}"
```

![zsh_prompt_4.png](https://qiita-image-store.s3.amazonaws.com/0/204/0e64de42-8eb6-0c8c-fa43-c4399232abf5.png)

プロンプトだけで使う場合は方法1、それ以外の文字列表示にも使うなら方法2、というふうに使い分ければよいとおもう。

## 参考
[Zsh - ArchWiki](https://wiki.archlinux.org/index.php/zsh#Colors)
PHPのフレームワークを定量的に(とても雑に)評価してみる

# 背景
とあるPHPのフレームワークの挙動でわからないところがあり、コードを見てみたところとてもつらい気持ちになりました。
そこで、実際のところコードの質というのは振り返られているのだろうかと思いたち、調べてみた次第。

まだ手法としてかなり雑だと思いつつ、現在までに見えてきたことをシェアしてみます。

# 評価手法

PHPMD (http://phpmd.org/) を使って各フレームワークのコードを評価しました。
PHPMDにはいくつかの評価ルールがあるのですが、今回はコードの複雑度に興味があったので**Code Size Rules** (http://phpmd.org/rules/index.html#code-size-rules )を利用しました。
PHPMDを使えば循環的複雑度等の定量的な指標を算出することもできるのですが、なんせどのように集計したらいいのか考えたり調べたりするのが面倒だったため、今回は単純に**「指摘箇所の数」**をカウントすることにしてみました。

## 指摘箇所とは
ルールにはそれぞれ閾値が設定してあり、たとえば、「メソッドの循環的複雑度等が10を超えたら指摘箇所として報告する」といったルールになっています。**10を超えたらどんなに複雑でも1ポイント**。つまりとても雑な評価です。

## 補足
各フレームワークのコードを持ってきて評価したつもりなのですが、使ったことがないフレームワークが多いので的はずれなことをしているかもしれません。

測定手順は

 1. 各フレームワークをsubmodule add 
 2. 例外として fuel のみ composer.phar install を実行 (実行しないと実態に則した評価ができないと思ったため)
 3. とはいえ fuel/vendor/ はノイズになると思ったため削除
 4. 計測

というものです。 

# 結果

|名前          |コード行数(L)|ファイル数(F) |指摘箇所(P)|(P/L)*100|(P/F)  |  (L/F)|
|-------------+------------+------------+----------+---------+------+-------|
|CodeIgniter  |   76894    | 288        | 399      | 0.52    | 1.39 | 267.0 |
|CakePHP      |  255441    | 673        | 1098     | 0.43    | 1.63 | 379.6 |
|Laravel      |   87320    | 530        | 148      | 0.17    | 0.27 | 164.8 |
|FuelPHP      |  116204    | 474        | 846      | 0.77    | 1.88 | 245.1 |
|Symfony      |  348190    | 3096       | 1085     | 0.31    | 0.35 | 112.5 |

なんとなく自分が興味をもっていたのがLaravelとSymfonyであり、かつ数値的には自分の好みに近そうなので安心しました。

いろいろ雑すぎて突っ込みどころはありすぎるかと思いますが、フィードバックも歓迎です。

見てもあまり意味は無いと思いますが、調査に使ったスクリプトは
https://github.com/k12u/php_frameworks
にあります。