OmniAICreator/Qiita-1.07M huggingface dataset:
squid で proxy server を構築する手順

#【squid で proxy server を構築する手順】

# ◇ 演習環境
* CentOS7

# ◇ 構築手順

## 1. squid インストール
```bash
yum install squid
```

## 2. 設定
* 基本的にデフォルトのままで OK。
* アクセス許可設定もデフォルトで定義されている localnet の範囲内に収まれば設定変更不要。
* Port は 3128 を使用。

```/etc/squid/squid.conf
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
```


## 3. サービス起動設定

a. サービス開始

```bash
systemctl start squid
```

b. 自動起動設定の追加

```bash
systemctl enable squid 
```

c. 自動起動設定確認

```bash
systemctl status squid 
```

* 下記協調項目の通りに enable と active が表示されれば自動起動設定完了
 * Loaded: loaded (/usr/lib/systemd/system/squid.service; __enabled__; vendor preset: disabled)
 * Active: __active (running)__ since 木 2016-05-05 14:01:29 JST; 8s ago
activerecord notes

```rb
Loading development environment (Rails 3.1.1.rc1)
1.9.3-p551 :001 > ActiveRecord::Base.connection.current_database
   (9.8ms)  SELECT DATABASE() as db
 => "cm_prod"
```

```rb
1.9.3-p551 :010 > ActiveRecord::Base.connection.execute("show tables;").to_a.flatten
```
プロパティを持つ関数をリテラルで書けるのか？

関数`f`を以下のシグネチャで定義したとき、

```ts
const f: { (args: any): any, prop: any };
```

関数`f`をリテラルで書く方法はないのだろうか？

```ts
const f: { (args: any): any, prop?: any } = (args) => 'result';
f.prop = 'prop';
```

今はこれで書いているけどつらい。
自己署名証明書の作成

# 秘密鍵の作成
- 鍵長には、2048bit以上のものを使用することが推奨されているため、2048bitを指定

`openssl genrsa -out server.key 2048`
# CSRの作成
`openssl req -new -key server.key -out server.csr`
# 証明書の作成
- 一般的な形式となるX.509で作成するため、コマンドの種類に「x509」を指定
- 証明書の有効期限を日単位で指定、ここでは3650日(約10年)
- 署名アルゴリズムにSHA-256を使用

`openssl x509 -days 3650 -sha256 -req -in server.csr -signkey server.key -out server.crt`
/Users/user/.gradle/を消した時にビルドが通らない

#原因

Charles起動してたから…


#環境
Mac OS X ElCapitan 10.11.1
Android Studio 1.4、2.0、2.1で全部動かなくなった

#事象

http://qiita.com/u_one/items/48a5ed73340974d6dbc3
上記参考に/Users/user/.gradle/を消した時にjcenter等に通信が行かなくなった
下記ビルドしようとした時のログ

```
* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugCompile'.
   > Could not resolve com.squareup.okhttp:okhttp:2.7.0.
     Required by:
         TestProjectAndroid:app:unspecified
      > Could not resolve com.squareup.okhttp:okhttp:2.7.0.
         > Could not get resource 'https://jcenter.bintray.com/com/squareup/okhttp/okhttp/2.7.0/okhttp-2.7.0.pom'.
            > Could not GET 'https://jcenter.bintray.com/com/squareup/okhttp/okhttp/2.7.0/okhttp-2.7.0.pom'.
               > peer not authenticated
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
```

peer not authenticatedと言われてるのでSSLエラーらしい…下記コマンドでSSL確かめてみるとATSにひっかかってるっぽい

```shell-session
nscurl --ats-diagnostics --verbose https://jcenter.bintray.com/
```

nscurl --ats-diagnosticsでATS検証したらCharles挟んでるとエラー出ました
Charles落としたら全部PASSになってうまく行きました
.gradleつくるのにいろいろダウンロードしてきたらCharles起動してても大丈夫みたいです
nscurl --ats-diagnosticsはコマンドなのでCharlesの証明書挟むとエラーが出たけど、システムにインストールしたらそんなことないかも？未検証
Djangoのテンプレート変数が不正だった場合に例外をあげたりログを出したり

djangoのテンプレートエンジンは寛容なので、オブジェクトに存在しない関数や変数を呼び出しても例外をあげません。そういった場合に、そこには例外の代わりに空文字をあてがってレンダリングをしてくれます。

これは本番環境ではありがたい挙動のことがおおいのですが、開発環境ではエラーになってくれたほうがうれしくもあります。また、本番環境でもエラーにまではならなくともログを出せたりしたほうがいいはずです。

django1.8までは下記の方法で動いてくれていたのですが、それ以降では設定方法が変わっています
[stackoverflow.com:show-undefined-variable-errors-in-django-templates](http://stackoverflow.com/questions/4300442/show-undefined-variable-errors-in-django-templates)


settings.pyの `TEMPLATES.OPTIONS.string_if_invalid`に値を設定するようになりました。
[docs.djangoproject.com:How invalid variables are handled](https://docs.djangoproject.com/ja/1.9/ref/templates/api/#invalid-template-variables)


ここには「存在しないテンプレート変数にアクセスしてしまった際になにを表示するか」を指定します。基本的には文字列の設定が期待されており、`%s`を入れておくと「アクセスされた(存在しない)変数名」が見れます。

ここに下記のような設定を行うと「存在しないテンプレート変数にアクセスした際」の挙動が定義できるようになります

settings.py

```python
class InvalidString(str):
    # "%s is ok" % undefined  :文字列フォーマット操作に際して__mod__が呼ばれる
    def __mod__(self, other):
        msg = "Undefined variable or unknown value for: %s" % other
        if TEST or IS_LOCAL:
            # 開発環境の場合は例外
            from django.template.base import TemplateSyntaxError
            raise TemplateSyntaxError(msg)
        else:
            # 本番っぽかったらログ出力
            import logging
            logger = logging.getLogger('strange')
            logger.info(msg)


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
            ],
            'string_if_invalid': InvalidString("%s"),  # ここに設定
        },
    },
]
```

`__mod__`は通常intっぽいもので剰余を求められた際の挙動を書くところですが、
文字列っぽいもので定義すると文字列フォーマット操作の際に呼ばれることになります。
この場合は`other`にアクセスされたけど存在しない変数名が入ってきて呼ばれます
serfクラスタネットワークにアプリケーションサーバが増減したらLB(Nginx)の割り振り先を増やしたり、減らしたりするserf用イベントハンドラ書いた

[GWに一人さみしくDockerとSerfと戯れてみた(๑´ڡ`๑)](http://qiita.com/shinofara/items/ebc81d40b04241d5a824) の続きです。

```/usr/local/src/python/handler.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from serf_master import SerfHandler, SerfHandlerProxy
from jinja2 import Environment, FileSystemLoader
import logging
import sys 
import bsddb
import json
import subprocess
import os


class AppHandler(SerfHandler):
    def member_join(self):
        # nginx.confのテンプレート取得
        env = Environment(loader=FileSystemLoader('/usr/local/src/python/', encoding='utf8'))
        tpl = env.get_template('nginx.tpl.conf')
        
        # ip管理用配列
        ips = []
        db=bsddb.hashopen('hashtest.db','c')

        try:
          dbips = json.loads(db["ips"])
          for ip in  dbips:
              ips.append(ip)
        except:
          print "no cache"

　      # 追加されたagent情報は標準入力で来るので（改行コード区切り）
        for line in iter(sys.stdin.readline, ""):
            print line
            agent = line.split("\t")
            node = agent[0] #node
            ip = agent[1] #node
            role = agent[2] #node
　　　　
　　　　　　　# この時app roleに追加された場合、追加
            if role == "app":
                ips.append(ip)

        db["ips"] = json.dumps(ips)
        db.sync()

　　　　　# テンプレートから書き出すデータを生成
        html = tpl.render({'backends':ips})

        # nginxに読み込ませるconfファイルを作成
        f = open("/etc/nginx/conf.d/proxy.conf", "w")
        f.write(html)
        f.close()
        
        # Nginxを再起動
        cmd = 'supervisorctl restart nginx'
        ret  =  subprocess.check_output( cmd.split(" ") )
        print ret

if __name__ == '__main__':
    handler = SerfHandlerProxy()

    # 存在するappとdefaultのみ許可される（Roleごとのハンドラを登録）
    handler.register('default', AppHandler())
    handler.run()
```

実際に書いた[handler.py](https://github.com/shinofara/serf/blob/dbb46c60a24dede36b5546f6ff611131d9b4636a/docker/nginx/python/handler.py)

そして、この時の`nginx.tpl.conf`はこちら

```nginx.tpl.conf
upstream backend {
  {% for backend in backends %}
    server {{ backend }}:9000;
  {% endfor %}
}
server {
    listen   80;

    location / {
        proxy_set_header Host $host;
        proxy_pass  http://backend/cgi-bin/index.py;
        proxy_redirect   default;
        break;
    }

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP $remote_addr;
}
```

`html = tpl.render({'backends':ips})` で、`upsteam` の箇所が色々書き換わるイメージ

これで、app roleに追加があった場合、nginxはかってに`upstream`を書き換えて再起動までやっちゃいます。
冒頭で増減と書きましたが、体力の関係で削除は飛ばしました。

### 終わり

全ソースコードは
https://github.com/shinofara/serf/tree/dbb46c60a24dede36b5546f6ff611131d9b4636a

Dockerとかも全部コミコミ版説明は
http://shinofara.hateblo.jp/entry/2016/05/05/124019
においてます。
オブジェクトファイルのSDK、Deployment Targetを確認する

OS X、iOS、watchOS、tvOSなどのライブラリのSDKやDeployment Targetは`otool`を使って確認できる。

## `otool`コマンド

```shell-session
$ man otool
...
       -l     Display the load commands.
...
```

## 今回確認するロードコマンド
1. OS X
    * `cmd LC_VERSION_MIN_MACOSX`
2. iOS
    * `cmd LC_VERSION_MIN_IOS`
3. watchOS
    * `cmd LC_VERSION_MIN_WATCHOS`
4. tvOS
    * `cmd LC_VERSION_MIN_TVOS`

## サンプル 1
下記の例では、MacOSX10.11.sdk、Deployment Targetが10.11で作成されたバイナリであることがわかる。

```shell-session
$ otool -l `which ls`
...
Load command 9
      cmd LC_VERSION_MIN_MACOSX
  cmdsize 16
  version 10.11
      sdk 10.11
...
```

* version: Deployment Target
* sdk: SDK

## サンプル 2
以前に作成したiOS Deployment Targetが5.0のライブラリをXcode 7.3でコンパイルしたとき、以下の警告が表示された。

```
ld: warning: object file (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/lib/darwin/libclang_rt.ios.a(chkstk.S.o)) was built for newer iOS version (6.0) than being linked (5.0)
```

そこで`libclang_rt.ios.a`のDeployment Targetを確認した。

```shell-session
$ otool -l /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/lib/darwin/libclang_rt.ios.a
...
Load command 1
      cmd LC_VERSION_MIN_IPHONEOS
  cmdsize 16
  version 6.0
      sdk n/a
...
```

するとオブジェクトファイルの個数分、ロードコマンドが表示されるが、いずれもiOS Deployment Targetが6.0であることがわかる。
PHPを例外安全にするためのイディオム

(例外安全ネタでもう少し長い記事が書きたいんだけど、思いつきだけまとめておく)

PHPにはアトミックでない関数が結構ある。本来1つの処理だったものが複数に分かれているような関数。終了する方の関数を呼ばずにいると、変な状態のままになってしまう。

* fopen/fclose
* flock(LOCK_EX)/flock(LOCK_UN)
* PDO::beginTransaction / PDO::commit / PDO::rollback
* ob_start / ob_get_clean

こういったものは気をつけて書かないと終了の関数だけが実行されず、例外安全を破ってしまう。

どうすれば「気をつけて書いている」ことになるのか考えてみた。

## finallyを都度書く

finallyを使えば、例外が起きても終了処理が呼ばれる。とりあえず、これで例外安全にはなる。

```php
ob_start();
try {
    // 例外が起きるかもしれない関数を色々呼び出す
    doSomething();
    doSomething2();
    $stdout = ob_get_contents();
} finally {
    ob_get_clean();
}
```

しかし都度finallyを書くのは避けるべきだと思う。
ライブラリの使用者にfinallyの利用を強制すると、あちこちにtry ~ finallyブロックが散乱してしまい、コードが汚くなる。もう少し工夫が欲しい。

## finallyを無名関数ブロックでまとめる

こういう時、無名関数のブロックを使ってまとめるとfinallyを乱発しなくて良くなる。

```php
function ob(callable $fn) {
    try {
        ob_start();
        $fn();
        return ob_get_contents();
    } finally {
        ob_end_clean();
    }
}
```

使い方はこんなイメージ。

```php
$html = ob(function(){
    require 'header.php';
    require 'template1.php';
    require 'footer.php';
});
```

header.phpやtemplate1.phpで例外が発生した場合、`$html`には何もセットされないかもしれないが、ob_start()で始まったバッファリングは閉じることができる。


## RAII

デストラクタとローカル変数を使って確実に終了処理を呼ぶやり方をRAII (Resource Acquisition Is Initialization)と言う。主にC++でのお作法だが、PHPはガーベージコレクションが参照カウンタなので真似することができる。
デストラクタはPHP側で書くならクラスにしか設定できない。RAIIを使うためには何でもクラス化することが求められる。

```php
// プログラム終了時には必ず自分を消すファイル
class TmpObject extends SplFileObject
{
    protected $filename;
    function __construct($filename, $open_mode = 'w', $use_include_path = false, resource $context = null)
    {
        $this->filename = $filename;
        parent::__construct($filename, $open_mode, $use_include_path, $context);
    }
    function __destruct() {
        unlink($this->filename);
    }
    //...
}
```

fopen/fcloseのようなファイルの関数はSplFileObjectをベースにしておくと、わざわざクラス化しなくても例外安全になる。こういう意味でも生でfopen/fcloseを使うのは可能な限り避けたほうが良い。


# 使い分けの考察

ob_get_cleanのように終了処理の結果が必要になる場合はRAIIでまとめることができない。finallyと無名関数ブロックを使うとエレガントである。

ただし、PHPで無名関数を使うと、関連する箇所のタイプヒントが全部`callable`になってしまい、コードが分かりにくくなりがちだ。

RAIIを基本にして、どうしようもないときだけfinallyを使う。そういう温度感がいいのではないだろうか。
policy.xmlが使えない古いImageMagickでImageTragickを回避する (2)

第一話は[こちら](http://qiita.com/vaporoid/items/8ca56b0e4a40429d5a7e)。

## SVGは大丈夫なの？

[ImageTragick](https://imagetragick.com/)のPoCは、ImageMagickのSVG解析器でしか動かないようだ。CentOS 5のImageMagickは`--with-rsvg`付きでビルドされている。つまり、大丈夫なんじゃないかな？

## RedHatの緩和策微妙じゃない？

[ImageMagick Filtering Vulnerability - CVE-2016-3714](https://access.redhat.com/security/vulnerabilities/2296071)のResolveのMitigationのことだよね。うん、これは微妙だ。RHEL 5では使えないし、明示的に`HTTP`と`FTP`を禁止している理由が判らない。私がコードを眺めた限りでは、`HTTP`と`FTP`は`URL`が提供しているようだ。やれやれ。

【二〇一六年五月六日追記】

日本時間の五月五日の昼に更新されて、`TEXT`, `LABEL`というコーダと、`@*`というパスが禁止されたようだ。気持ちは判らないでもない。

日本時間の五月五日の夜に更新されて、RHEL 5はWill Not Fixになったようだ。RHEL 5のMitigationはコーダの共有リンクライブラリをリネームすることらしい。まあ、そうなるよね。
Facebookページの投稿をTwitterアカウントと連携してツイートをしました。

Facebookページの投稿をTwitterアカウントからツイートしました。
ページやTwitterアカウントの運用が楽になるかもしれません。

# 準備
## ツイートを流したいFacebookページを用意
ツイートを流したいFacebookページです。
https://www.facebook.com/pugiemonn
よろしければいいねをお願いします(☝ ՞ਊ ՞)

## Facebookページと連携するTwiiterアカウントを用意を用意
Twitterのアカウントを用意しました。
https://twitter.com/pugiemonn_com
よろしければフォローをお願いします(☝ ՞ਊ ՞)

# FacebookページとTwitterを連携
Facebookのtwitter連携用のページにアクセスします。
http://www.facebook.com/twitter/

緑のボタンの下にある、**FacebooｋページをTwitterとリンク** をタップします。
<img width="592" alt="スクリーンショット 2016-05-05 10.36.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/905e1892-46c0-fbdb-0fb8-1bf7c9efa4f3.png">

ページ一覧が表示されます。ここでは **pugiemonn.com** というページと連携したいので、**Twitterとリンク**をタップします。
<img width="586" alt="Twitterとリンクをタップ" src="https://qiita-image-store.s3.amazonaws.com/0/1624/6d22e6a8-08a2-7262-27a0-60603bad80c9.png">
連携はこれだけで完了です。

さらに、Facebookには投稿のtypeがいくつもあるので、連携する投稿タイプを選択できます。
<img width="588" alt="投稿タイプの選択" src="https://qiita-image-store.s3.amazonaws.com/0/1624/44b08b38-2567-e1af-6378-143252e1d85a.png">

表示を確認すると、**pugiemonn.com**というページが**Twitterとリンク済み**と表示されています。

<img width="636" alt="Twitterとリンク済み" src="https://qiita-image-store.s3.amazonaws.com/0/1624/d3c75e8f-1392-2131-1233-cbee854e9480.png">

設定完了です。

# Facebookページに投稿するとツイートする
Facebookページに投稿しました。
https://www.facebook.com/pugiemonn/posts/1101534309869284

実際にツイートされました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Facebookのツイートテスト</p>&mdash; pugiemonn_com (@pugiemonn_com) <a href="https://twitter.com/pugiemonn_com/status/728038727079993344">2016年5月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 感想
ちゃんとツイートできました。やったね(☝ ՞ਊ ՞)

Twitterの投稿をFacebookページに流した場合は、twitterから来たと表示でわかるのですが、Facebookページからの投稿がTwitterに表示された場合は、Twitterがクライアントを表示しないため、どこから投稿されたのかがわかりません。

# 関連
TwitterのツイートをFacebookページに流す場合
http://qiita.com/pugiemonn/items/dd80751586c7c0367393
エイリアスの情報を取得する


エイリアスの参照先を出力するコマンドがみつからない。
適当につくった。 

* https://github.com/eiel/ResolveAlias/releases



# もっと詳しく

Macのエイリアスで、参照先をコマンドから探す方法を探したがみつからない。
ファイルの情報を見る方法としては`GetFileInfo`コマンドがあったがせいぜいエイリアスであることぐらいしかわからない。
そしてGetFileInfoはdeplicatedのようだ。

```
$ GetFileInfo /hoge2.txt
file: "/hoge2.txt"
type: "alis"
creator: "MACS"
attributes: Avbstclinmedz
created: 05/04/2016 20:13:23
modified: 05/04/2016 20:13:23
```

`alis`は`alias`でなく`alis`と出力された。

CocoaのAPIでは[
+ URLByResolvingAliasFileAtURL:options:error:
](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/occ/clm/NSURL/URLByResolvingAliasFileAtURL:options:error:)で解決できる。

エイリアス自体は中身がBookmarkのようなので、
[
+ bookmarkDataWithContentsOfURL:error:](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/occ/clm/NSURL/bookmarkDataWithContentsOfURL:error:)経由でも取得できるもよう。

```
$ od -ch /hoge2.txt | head
0000000    b   o   o   k  \0  \0  \0  \0   m   a   r   k  \0  \0  \0  \0
```

先頭の数バイトにはbookmarkと書かれていた。

適当につくってみた。

```swift
import Foundation

func resolveAliasFile(_ url: URL) throws -> URL? {

    var isAliasOfAny: AnyObject?

    try (url as NSURL).getResourceValue(&isAliasOfAny, forKey: URLResourceKey.isAliasFileKey)

    switch isAliasOfAny {
    case let isAlias as Bool:
        if isAlias {
            return try URL(resolvingAliasFileAt: url, options: NSURL.BookmarkResolutionOptions())
        }
    default:
        return nil
    }

    return nil
}
```

```
$ ./ResolveAlias /hoge2.txt
hoge.txt
```

エイリアスはなるべく使わずSymLinkを使う方が幸せそうです。
gitリポジトリにコミットして別のユーザが取得してもエイリアスとしては使えませんでした。

# 参考文献

http://stackoverflow.com/questions/33348653/getting-alias-path-of-file-in-swift
TwitterのツイートをFacebookページに流す連携をしました。

TwitterからツイートをしてFacebookページに流しました。
この連携ができると、ページの運用が楽になるかもしれませんね。

# 準備
## ツイートを流したいFacebookページを用意
ツイートを流したいFacebookページです。
https://www.facebook.com/pugiemonn
よろしければいいねをお願いします(☝ ՞ਊ ՞)

## Facebookページと連携するTwiiterアカウントを用意を用意
Twitterのアカウントを用意しました。
https://twitter.com/pugiemonn_com
よろしければフォローをお願いします(☝ ՞ਊ ՞)

準備ができたらはじめましょう。

# Twitterの連携ページからFacebookページを連携
Twitterのアプリ連携ページにアクセスします。
https://twitter.com/settings/applications

Twitterのアプリの連携から、 **Facebookと連携する** をタップします。
<img width="599" alt="Twitterのアプリの連携ページからFaceboookと連携するをタップ" src="https://qiita-image-store.s3.amazonaws.com/0/1624/e7be50a4-501a-f6c7-811a-6d458e0f9211.png">
上記の**Facebookと連携する**ボタンはうまく表示されないケースもありました。
ブラウザリロードやログインログアウトなどを試すと表示されました。

あなたのページヘの投稿を**許可**というリンクを押します。

<img width="602" alt="Facebookとの連携BOXから許可を選択" src="https://qiita-image-store.s3.amazonaws.com/0/1624/bb00ca9b-5d9f-12b0-4a38-7826f14e8105.png">

モーダルが立ち上がり、TwitterがFacebookページの管理を求めていますと表示されるので、**OK**をタップします。

<img width="501" alt="Twitterがページの管理を求める" src="https://qiita-image-store.s3.amazonaws.com/0/1624/0b67847c-1d3a-6699-0ca9-aaa8ad25c973.png">

新しく、**Facebookページに投稿する**というチェックボックスとセレクトメニューができています。
セレクトメニューから連携したいページを選択します。

<img width="599" alt="Twitterと連携するFacebookページを選択" src="https://qiita-image-store.s3.amazonaws.com/0/1624/0b584be6-a5f6-6f46-003e-0f7b651b9b28.png">

# TwitterからツイートしてFacebookページに投稿されるか連携の確認
Twitterからツイートします。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Twitterから投稿です(☝ ՞ਊ ՞)</p>&mdash; pugiemonn_com (@pugiemonn_com) <a href="https://twitter.com/pugiemonn_com/status/728045549090275328">2016年5月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Twitterから投稿されたFacebookページの投稿です。
<img width="496" alt="Twitterから投稿されたFacebookページの投稿" src="https://qiita-image-store.s3.amazonaws.com/0/1624/ef392c06-dc40-5aef-d2cf-c13c3ccb1b81.png">
URL : https://www.facebook.com/pugiemonn/posts/1101543866534995

やりました。連携できました(☝ ՞ਊ ՞)

# 関連
Facebookページの投稿をTwitterからツイートする場合
http://qiita.com/pugiemonn/items/6a89e9fdd6a07cfe122f
nodenv を使って macOS に Node.js の環境を構築する

[nodenv](https://github.com/nodenv/nodenv) という Node.js のバージョンマネージャを使う。 Node.js のバージョンマネージャとしては [creationix/nvm](https://github.com/creationix/nvm) やら [hokaccha/nodebrew](https://github.com/hokaccha/nodebrew) などがある。どれも使いやすいので好みで選んで問題ないが、 nodenv は ruby のバージョンマネージャである [rbenv/rbenv](https://github.com/rbenv/rbenv) のクローンであり同じコマンド設計なので、 rbenv や pyenv や plenv に慣れている・合わせたい人にオススメである。

## nodenv をインストールする

nodenv をホームディレクトリの `.nodenv` にクローンする。

```sh
$ git clone git://github.com/nodenv/nodenv.git ~/.nodenv
```

## nodenv にパスを通す

zsh であれば `.zprofile` とか、bash であれば `.bash_profile` とか。

```sh
$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(nodenv init -)"' >> ~/.bash_profile
```

つまり、以下の設定が記述されていれば OK である。

```
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
```

シェルを再起動すると `nodenv` が使えるようになる。

## node-build をインストールする

[nodenv/node-build](https://github.com/nodenv/node-build) という nodenv のプラグインをインストールすることで、 `nodenv install` と `nodenv uninstall` が使えるようになる。ホームディレクトリの `.nodenv` 配下に `plugins` フォルダがあるので、その中にクローンする。

```sh
$ git clone https://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build
```

プラグインのロードのため、シェルの再起動もとい nodenv の再ロード（`nodenv init`）が必要。

## node-build-update-defs をインストールする

[nodenv/node-build-update-defs](https://github.com/nodenv/node-build-update-defs) という nodenv のプラグインをインストールすることで、 `nodenv update-version-defs` が使えるようになる。ホームディレクトリの `.nodenv` 配下に `plugins` フォルダがあるので、その中にクローンする。

```sh
$ git clone https://github.com/nodenv/node-build-update-defs.git ~/.nodenv/plugins/node-build-update-defs
```

プラグインのロードのため、シェルの再起動もとい nodenv の再ロード（ `nodenv init` ）が必要である。このコマンドを実行すると、インストール可能な Node.js をアップデートできる。

```sh
$ nodenv update-version-defs
Checking for new nodejs versions
14.8.0 written
```

## nodenv で Node.js をインストールする

以下のようにバージョンを指定して Node.js をインストール。

```sh
$ nodenv install 14.8.0
$ nodenv install 12.18.0
```

すると、 `~/.nodenv/versions/` 配下にインストールしてきた Node.js が配置される。インストールしてきた後は shim のリフレッシュをしておく。

```sh
$ nodenv rehash
```

## 使う Node.js を指定する

あとは、実際に使う Node.js を指定する。グローバルに指定したいのであれば、 `nodenv global` を。ローカルで指定したいのであれば `nodenv local` を使う。 `nodenv local` を実行すると、カレントディレクトリに `.node-version` というファイルが作成され、そこに指定したバージョンが書かれている。これによって、そのプロジェクトでは `.node-version` に書かれたバージョンを参照するようになる。

```sh
$ nodenv global 14.8.0
$ nodenv local 14.8.0
```

指定したあとに、パスが `.nodenv` 配下の node を向いていればOK。

```sh
$ which node
# /Users/1000ch/.nodenv/shims/node
```

## Node.js をアンインストールする

`nodenv` を使ってインストールした Node.js は、以下のようにしてアンインストールする。

```sh
$ nodenv uninstall 14.8.0
```

そのままですね。
文字数によるボタンの非活性制御

# 何がしたい
UITextFieldに文字が入力されていない場合、Saveボタンを非活性にします。


# 実現方法

```swift
// saveボタン
@IBOutlet weak var save: UIBarButtonItem!

// UITextFieldが編集されると呼ばれるデリゲートメソッド
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    var textLength: Int;

    // （UITextField の文字数 - カット、ペースト、デリートされた文字数）+ キーボードから入力された文字数
    textLength = ( textField.text!.characters.count - range.length ) + string.characters.count;
    
    // UITextFieldの文字数が０より多い場合、saveボタン活性化
    if (textLength > 0) {
        save.enabled = true
    } else {
        save.enabled = false
    }
    return true
}
```

# 所感
例のごとく、もっといいやり方があるのかなと思います。
もしご存知の方いらっしゃったらご指摘くださいませ m(_ _)m
printを使って標準エラー出力へ出力


* swift 2.2
* Xcode 7.3

```swift
class StandardErrorOutputStream: OutputStreamType {
    func write(string: String) {
        let stderr = NSFileHandle.fileHandleWithStandardError()
        if let odata = string.dataUsingEncoding(NSUTF8StringEncoding) {
            stderr.writeData(odata)
        }
    }
}

var standardError = StandardErrorOutputStream()
print("stderr", toStream: &standardError)
```

NSDataへの変更で失敗することがあるのかよく知らないけど、失敗するとつらそう。
遊びで気軽に出力するならlibcのfputs使うほうが楽そう。

```swift
fputs("stderr", stderr)
```

場合によっては`import Darwin`が必要になるかもしれないが、どんなときに必要かは調べていない。


# 参考文献

* http://qiita.com/m_yukio/items/033fa3ba94539ffb4e8b
* http://stackoverflow.com/questions/24041554/how-can-i-output-to-stderr-with-swift
新しいブラウザ「vivaldi」をインストールしてみた

Chromiumベースの新しいブラウザが話題になっているようなのでインストールしてみました。

## インストール
Vivaldiの公式からインストールできます。
[https://vivaldi.com](https://vivaldi.com)


## いいなと思った機能
### Tab Tiling
Macに追加されたSplit Viewのような機能がブラウザ上で実現できます。
これで
「右側に参考資料を表示しながらブログを書く」
が実現できます。

こんな感じ。左がqiita、右がVivaldiの公式。
![スクリーンショット 2016-05-05 10.47.51.png](https://qiita-image-store.s3.amazonaws.com/0/84307/9f3c128c-4c22-5761-3ea2-28fe5720ab8b.png)

Windowsだとウィンドウを端に持っていくと画面半分に表示してくれますが、MacだとEl CapitanになるまでSplit Viewの機能がありませんでした。

この機能をブラウザ上でやってくれます。
ちなみに3つ以上でもできますし、左右や上下、マス目状に並べることもできます。
今回は6つのタブを並べてみました。

こんな感じ。（左右）
![スクリーンショット 2016-05-05 10.55.32.png](https://qiita-image-store.s3.amazonaws.com/0/84307/7cc4aedf-7a45-232b-39e6-d28d5153ded8.png)

こんな感じ。（上下）
![スクリーンショット 2016-05-05 10.55.53.png](https://qiita-image-store.s3.amazonaws.com/0/84307/895c89e1-2375-014b-cab4-38d1244803c5.png)

こんな感じ。（マス目）
![スクリーンショット 2016-05-05 10.56.00.png](https://qiita-image-store.s3.amazonaws.com/0/84307/8764ff43-2550-2542-2d3f-9e6373508e88.png)

### Chromeの機能
Chromiumを基に作られているので、Google Chromeでできている機能が使えます。
…と謳っているようですが、今のところ動く拡張機能を見つけられませんでした。

**※注意**
2016/05/05時点ではChromecastへのキャストはできませんでした。

とはいえ、履歴やダウンロード一覧はchromeのURLでアクセス可能です。

```lang:URL
chrome://history
chrome://downloads
```
これらは同様にVivaldiとしてもアクセス可能です。

```lang:URL
vivaldi://history
vivaldi://downloads
```
## 参考にしたサイト
[このサイト](http://brian.hatenablog.jp/entry/try-vivaldi)にすごく詳しく書かれているので参考にされてはいかがでしょうか。
Android Studio2.1でnew ProjectしてもJavaやGroovyのプロジェクトしか作れない問題

#事象

環境
2016/5/5の時点
Mac OS ElCapitan 10.11.1
Android Studio2.1

Android Studio2.1をAndroid Studio_1.4.appなどと共存させてインストールした
新規でAndroid Project作ろうと思ったところ下記しか出てこない

<img width="500" alt="スクリーンショット 2016-05-05 10.53.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/a727167e-41a1-f8c6-e957-cd68f67e44a2.png">


#解決法

設定でAndroid Supportがオフになってた？のでオンにして再起動

<img width="500" alt="スクリーンショット 2016-05-05 10.53.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/20351d33-f415-e979-89f5-89c81a374549.png">

無事new Android Projectできました。
alloca関数

C言語で動的なサイズのメモリ確保が必要となれば、典型的には`malloc`と`free`の出番ですが、`alloca`というものもあります。

# C言語での変数の寿命
オブジェクト指向な言語の多くでは、ガベージコレクタが入っているので、「オブジェクトの寿命」≒「オブジェクトへの参照が存在する間」ということになります。これに対して、C言語（やC++）では、ガベージコレクタのような高度な仕組みはないので、変数の寿命は次の2つのどちらかになります。そして、[C11で加わった可変長配列](http://qiita.com/raccy/items/bfcb62086c5f027d57b6)を別として、配列を確保するときもサイズは固定のしか取れません。

* 自動変数…スコープに入ったところで変数が用意され、スコープを抜けたところで解放される
* 静的変数・外部変数…プログラムの開始から終了まで存在し続ける

これらに当てはまらない操作をしようと思えば、ライブラリ関数を使ってポインタ経由で使うほかありません。

# allocaとは
ふつう、C言語で動的確保をしようと思えば`malloc`～`free`の流れですが、標準関数ではないものの多くの環境に`alloca`、あるいは`_alloca`という関数があります。この関数の特徴としては、「メモリ領域をスタックに取る」ということがあります。そのため、

* 使い終わった後の`free`の必要がない（というより、してはならない）
* スコープを抜ければ自動で解放される
 * 返り値としてこのメモリ領域へのポインタを**返してはいけない**
* オーバーヘッドが少ない
* アセンブラで埋め込み展開されるような環境もある（`alloca`関数へのポインタを取れない）
* 巨大な領域を取るとスタックオーバーフローで死ぬ

というような特徴があります。

この前使った場面では、実行時までサイズが決まらない配列を確保する必要があったのですが、その配列自体は外からアクセスする必要がなく、そして処理全体に対する`malloc`のオーバーヘッドがかなりのものになる、という状況だったので、「必要な長さが小さな時には`alloca`に切り替える」ようにしたところ、3割程度高速化した、ということがありました。
Macでgperftoolsを使ってCPUプロファイルを取得すると関数名が表示されない

Google製の速いmallocを提供するgperftoolsというツールがある。
https://github.com/gperftools/gperftools

このツールにはheap-checker, heap-profiler, cpu-profilerも含まれており、メモリ使用量、メモリリークのチェック、CPUプロファイルの取得なども行うことができる。

Mac上で通常の手順でCPUプロファイルを取得すると、関数のアドレスだけが表示され関数名が表示されないという問題がある。その問題の回避手順を示す。

# 参考情報

gperftoolsについて

- https://github.com/gperftools/gperftools
- https://gperftools.googlecode.com/git/doc/cpuprofile.html
- [[プロファイル]プログラムで時間が掛かっている場所を特定する(google-perftool)](http://qiita.com/kmikmy/items/672efc5e2cde4826bbc7)

# 環境

テストした環境

- MacOSX 10.10
- clang 7.0.0
- gperftools 2.4
    - homebrewでインストールした。

# 問題

gperftoolsでCPUプロファイルを取る際の通常の手順で`-lprofiler`をつけて、プロファイルを取りたいコードをビルドし、環境変数`CPUPROFILE`を設定してコードを実行する。
実行した結果は`pprof`コマンドで確認できる。

```
g++ test.cpp -lprofiler
env CPUPROFILE=test.prof ./a.out
pprof --text ./a.out test.prof
```

すると出力が

```
Using local file ./a.out.
Using local file test.prof.
Total: 195 samples
      80  41.0%  41.0%       80  41.0% 0x000000010a625f54
      49  25.1%  66.2%       49  25.1% 0x000000010a625f62
      28  14.4%  80.5%       28  14.4% 0x000000010a625f5a
      20  10.3%  90.8%       20  10.3% 0x000000010a625f66
      15   7.7%  98.5%       15   7.7% 0x000000010a625f4c
       3   1.5% 100.0%        3   1.5% 0x000000010a625f74
```

のようになり、関数のアドレスは表示されるが関数名が表示されない。どこがボトルネックになっているのかわからない。

# 原因と回避方法

関連する情報が以下のページにあった。

- http://catid.mechafetus.com/news/news.php?view=330
- http://stackoverflow.com/questions/10562280/line-number-in-google-perftools-cpu-profiler-on-macosx

まとめると、Mac上ではASLR(address space layout randomization)というセキュリティ上の機能が使用されているため。
この機能はmoduleをロードするとき、ランダムなアドレスに読み込まれる。

回避するにはリンク時に `-Wl,-no_pie` というオプションをつける。

```
g++ test.cpp -lprofiler -Wl,-no_pie
```

すると表示が、

```
Using local file ./a.out.
Using local file test.prof.
Total: 196 samples
     196 100.0% 100.0%      196 100.0% myfunc
```

となり、関数名が表示されるようになった。

## 関連情報

MacでCPUプロファイルを取りたい場合、Xcode付属のInstrumentsを使う方法もある。
http://qiita.com/yohm13/items/450fbae1ee0aebe1261e
[Swift] ストーリーボード上でプロパティ指定可能なUIパーツの作り方(UITextField拡張)

# 概要

フォーカス時に背景色が変わるUITextFieldを作ってみました。
背景色はストーリーボードで指定できるようにしています。

# 動作イメージ
![FocusColorTest.gif](https://qiita-image-store.s3.amazonaws.com/0/122917/590f2d33-7302-16e7-d331-0026daf1af29.gif)

# 開発環境

Xcode7.3

# コード

## 1. UITextField拡張クラスの作成

UITextFieldを継承したクラスを作成します。

```UITextFieldCustom.swift
import UIKit

@IBDesignable
class UITextFieldCustom: UITextField, UITextFieldDelegate {
    
    @IBInspectable var focusBkColor: UIColor?

    private var defaultBkColor: UIColor?

    func textFieldDidBeginEditing(textField: UITextField) {
        if focusBkColor == nil {
            print("Error: Set focusBkColor")
            return
        }
        defaultBkColor = self.backgroundColor
        self.backgroundColor = focusBkColor
    }
    
    func textFieldDidEndEditing(textField: UITextField) {
        self.backgroundColor = defaultBkColor
    }

}
```

## 2. ストーリーボード

UITextFieldを配置し、Identity InspectorのClassに上記UITextField拡張クラスを指定します。
<img width="1119" alt="Screen1.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/7abb78a8-1f66-4572-33c0-5c24658a5bc6.png">

UITextField拡張クラスのコードに`@IBInspectable var focusBkColor: UIColor?`の記述をすることで、Attribute InspectorにFocus Bk Colorというプロパティが出現します。
<img width="309" alt="Screen2.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/82f1c5f4-4dbd-ea8f-2e22-8ba64464416f.png">
このプロパティにて、フォーカス時の背景色を指定できるようにしてみました。

## 3. ViewController

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textFieldCustom1: UITextFieldCustom!
    @IBOutlet weak var textFieldCustom2: UITextFieldCustom!
    @IBOutlet weak var textFieldCustom3: UITextFieldCustom!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textFieldCustom1.delegate = textFieldCustom1
        textFieldCustom2.delegate = textFieldCustom2
        textFieldCustom3.delegate = textFieldCustom3
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}
```

# ソースファル

https://github.com/y-some/FocusColorTest
Bluemixで立ち上げたアプリに固定IPを付与する

休日にBluemixでLINEのBOTを作って遊んでたのですが、固定IP関連でつまづいたので備忘録的に投稿します。

BOT自体の実装はほぼ[こちら](http://qiita.com/Enta/items/45d5295e023e24e9ff0b#_reference-789d9411d6006770b005)のコピペなので割愛します。
リンク先の記事ではHerokuを使ってます。

# そもそも何で固定IPが必要か

LINE BOT作成時にはLINE側のコンソールでどこからのアクセスなら許可するかIPアドレスで指定する必要があります。
知らないサーバから勝手にアクセスされると困りますからね。

![スクリーンショット 2016-05-05 7.55.35.png](https://qiita-image-store.s3.amazonaws.com/0/116434/d676a0f1-afc7-30ea-b380-3be171dc26f2.png)

LINE BOTに限らず、GoogleのAPIや、確かDropboxあたりも開発用のコンソールで固定IPでどこからアクセスするか予め指定しておく必要があります。

## PaaSゆえのめんどくささ

AWSのEC2とかなら簡単にサーバに固定IPを付与できるのですが、BluemixやHerokuではそうはいきません。
Herokuに関しては上記リンク先を参照いただくとして、
Bluemixでは単純に固定IPを付与することはできません(Dockerのコンテナを使えばいけるそうですが、あまり調べられていません)。
[この記事](http://dotnsf.blog.jp/archives/1055632771.html)にIPの調べ方が記載されていますが、Bluemixで作成したアプリのIPはデプロイの度に変わるので、少なくとも開発段階では現実的とは言えないでしょう。

# Staticaを使う

そこで、Bluemixから利用できるStaticaというサービスを使って擬似的に固定IPを付与します。
予め断っておくと、厳密には固定IPを付与しているのではなく、IP固定のサーバを別に用意して、Bluemixからそこをプロキシして外部にアクセスするようにするというイメージです。

使い始めるにはダッシュボードから「サービスまたは APIの追加」を選択すると、利用可能なサービスの一覧が出ますので、その中からStaticaを探して選択するだけです。

Starterプランですと250リクエスト/月かつ帯域100MBまでなら無料です。
個人で趣味で利用する分には問題ないかと思います。

準備が完了するとダッシュボードにStaticaの情報が追加されます。

サイドバーに「サービス」->[Statica]の表示が出ますのでそこからStaticaのダッシュボードを見れます。

![スクリーンショット 2016-05-05 8.23.41.png](https://qiita-image-store.s3.amazonaws.com/0/116434/bde1d1b6-54e7-a564-ae41-58721dddd747.png)

「Your Static IPs are XX.XX.XX.XX & YY.YY.YY.YY」と書かれているので、それをコピーしてLINEなりGoogleなりの開発用のコンソールに貼り付けましょう。

LINEに関してはCIDR記法でサブネットマスクを記述する必要がありますが、24で大丈夫そうです。
ex.)52.0.214.38/24 

## アプリからアクセスする

最後に、アプリからAPIにアクセスする際にStaticaを経由する方法ですが、前述の通り環境変数に入っているのでそれを使います。
LINEのAPIにアクセスするならこんな感じかと

だいぶ端折ってるのでこのままコピペするのは勘弁してください。

```js
var request = require('request'); //requestモジュールを使用

//ヘッダーを定義
var headers = {
    "Content-Type" : 'application/json; charset=UTF-8',
    "X-Line-ChannelID" : channelID,
    "X-Line-ChannelSecret" : channelSecret,
    "X-Line-Trusted-User-With-ACL" : MID
};

var vcap_services = JSON.parse(process.env.VCAP_SERVICES);　　//Bluemixのサービス関係の環境変数を取得
var proxyURL = vcap_services['statica'][0].credentials.STATICA_URL; //Staticaの固定アドレスを取得

var data = {
    "to": [to_address],
    "toChannel": 1383378250, //固定
    "eventType":'140177271400161403', //固定
    "content": {
        "messageNotified": 0,
        "messages": []
    }
};

var options = {
    url: 'https://trialbot-api.line.me/v1/events',
    proxy: proxyURL,　//Staticaのアドレスをプロキシに設定する
    headers: headers,
    json: true,
    body: data
};

request.post(options, function(error, response, body){
    if (!error && response.statusCode == 200) {
        console.log('success');
    } else {
        console.log('error: '+ JSON.stringify(response));
    }
});

```

しかしBluemixで便利ですね。
gitのリポジトリにプッシュしたら勝手にデプロイしてくれるところまでこんなに簡単に設定できるだなんて。

# 参考

- [Nodejs+LINE BOTでレストラン検索](http://qiita.com/Enta/items/45d5295e023e24e9ff0b#_reference-789d9411d6006770b005)
- [LINE Bot を IBM Bluemix で作る](http://dotnsf.blog.jp/archives/1055632771.html)
- [Statica でサーバー間プロクシーを実現する](http://dotnsf.blog.jp/archives/1055712263.html)
コンピュータ囲碁の作成　ランダム打ちの実装

#コンピュータ囲碁
・コンピュータ囲碁の作成メモ。
・ランダム打ちの実装　(原始モンテカルロ囲碁ではない)
・前回のコメントを参考に２次元配列で実装　

前回　[コンピュータ囲碁の作成](http://qiita.com/simanezumi1989/items/107ffa3960ba70d9fd15)

#結果画像
![スクリーンショット 2016-05-05 07.39.18.png](https://qiita-image-store.s3.amazonaws.com/0/67439/de8e4665-8e53-494d-26f1-6db7c342dd50.png)

打った石の色 [場所]
結果

を描画する
#ソースコード

```py
# -*- coding:utf-8 -*-
import random

# データ
BOARD_SIZE = 9				# 碁盤の大きさ
WIDTH_SIZE = BOARD_SIZE + 2 # 盤外を含めた碁盤の横幅 11

# 盤上の種類
NONE,BLACK,WHITE,WALL = 0,1,2,3
STONE = ("・","🔴 ","⚪️ ")

# 碁盤描画
def draw(board):
	print " "," ".join("%2d"%x for x in range(1,BOARD_SIZE+1))
	for y in range(1,BOARD_SIZE+1):
		print "%2d"%y, " ".join(STONE[data] for data in board[y][1:-1])

#石を打つ
def move(board,z,color):
	board[z[0]][z[1]] = color

# 盤上の空の場所を配列で取得
def getNonePosition(board):
	array = []
	for y in range(1,BOARD_SIZE+1):
		for x in range(1,BOARD_SIZE+1):
			if board[y][x] == NONE:
				array.append([y,x])
	return array

def main():
	# 碁盤
	board = [[NONE]*WIDTH_SIZE for i in range(WIDTH_SIZE)]
	# 枠の作成
	for i in range(WIDTH_SIZE):
		board[0][i] = board[-1][i] = board[i][0] = board[i][-1] = WALL
	# 先手
	color = BLACK

	# ゲーム開始
	while(1):
		# 候補を探す
		preMove = getNonePosition(board)
		l = len(preMove)
		if l == 0:
			break
		z = preMove[random.randint(0,l-1)]	# ランダム打ち
		
		move(board,z,color)		# 打つ
		print STONE[color],z	# 描画
		draw(board)
		color = 3 - color		# 色を交代

if __name__ == '__main__':
	main()
```


##github
https://github.com/Tsunehiko511/python_Go_origin
master：１次元配列
branch：２次元配列
#参考図書
<a  href="http://www.amazon.co.jp/gp/product/4320123271/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4320123271&linkCode=as2&tag=simanezumi104-22">コンピュータ囲碁 ―モンテカルロ法の理論と実践―</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=simanezumi104-22&l=as2&o=9&a=4320123271" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
[メモ] RaspberryPi へ シリアル接続時の画面サイズとか変更(USB-UARTケーブルでPCから)

\# うまい方法あったら、コメントください.

## 問題点
Raspberry PiにUSB-UARTで接続すると、コンソールの表示がいまいち。

- 色
- 80x24のサイズ固定
![1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/40a824c4-2b4b-b8c0-b345-f3055b1a1242.png)


## 改善方法
- 色: `export TERM=xterm-256color; source ~/.bashrc`
![2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/7f295a53-50a9-164a-6b9b-df9b07fbf720.png)


- サイズ: PCのコンソールサイズを変えて、自動で対応はできないが、以下のスクリプトで、現在のサイズに合わせてくれる

    ```txt:ダウンロード
wget https://raw.githubusercontent.com/akkana/scripts/master/termsize
chmod +x termsize
```
    ```
pi@raspberrypi:~ $ ./temsize
...
Reset the terminal to 43 rows 103 cols
pi@raspberrypi:~ $
```
![3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/5bc6c1af-51ee-3a4b-a15c-053a2bce29be.png)

    - 参考: [Telling your Raspberry Pi that your terminal is bigger than 24 lines](http://shallowsky.com/blog/tags/embedded/)
    - `byobu` 上での変更はだめっぽい。一度、抜けて(`CTRL-a d`)、 `./termsize`で設定する。

 

## 使っている環境
- Raspberry Pi 2 Model B
- Raspbian Jessie Lite ( 2016-03-18-raspbian-jessie-lite.img )
- PC: Windows 7 (64ビット)
- TeraTerm ( https://en.osdn.jp/projects/ttssh2/releases/ )
- PL2303HX(ぱちもん?)のUSB-UARTケーブル


```py3:termsize
#!/usr/bin/env python

# Get the current size of the terminal window, and set stty size accordingly.
# A replacement for xterm's resize program, with no X dependency.
# Useful when logged in over a serial line.
# Copyright 2013 by Akkana Peck -- share and enjoy under the GPL v2 or later.

import os, sys
import fcntl
import posix
import struct
import time
import re
import termios
import select

tty = open('/dev/tty', 'r+')
tty.write('\033[7\033[r\033[999;999H\033[6n')
tty.flush()

fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = oldterm[:]
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while True:
        r, w, e = select.select([fd], [], [])
        if r:
            output = sys.stdin.read()
            break
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

rows, cols = map(int, re.findall(r'\d+', output))

fcntl.ioctl(fd, termios.TIOCSWINSZ,
            struct.pack("HHHH", rows, cols, 0, 0))

print "\nReset the terminal to", rows, "rows", cols, "cols"
```
さくらのレンタルサーバでImageTragickのPoCを動かなくする

## 結論

<div class="alert alert-warning">
<b>160516追記</b><br>
公式に以下の情報が出ていました。<br>
<a href="http://support.sakura.ad.jp/mainte/mainteentry.php?id=19093">ImageMagick の脆弱性対策について (CVE-2016-3714)｜さくらインターネット公式サポートサイト</a><br>
<br>
→ 確認したところ、`/usr/local/etc/ImageMagick/policy.xml` に下記と同じ内容が追記されていましたので、以下の個別ユーザーごとの対応は不要となったと思われます。
</div>


`~/.magick/` というディレクトリを作り、そこに `policy.xml` を置く[^1]。

```xml:policy.xml
<policymap>
  <policy domain="coder" rights="none" pattern="EPHEMERAL" />
  <policy domain="coder" rights="none" pattern="URL" />
  <policy domain="coder" rights="none" pattern="HTTPS" />
  <policy domain="coder" rights="none" pattern="MVG" />
  <policy domain="coder" rights="none" pattern="MSL" />
  <policy domain="coder" rights="none" pattern="TEXT" />
  <policy domain="coder" rights="none" pattern="SHOW" />
  <policy domain="coder" rights="none" pattern="WIN" />
  <policy domain="coder" rights="none" pattern="PLT" />
</policymap>
```


## 補足

ImageMagick の設定ファイルの設置場所はドキュメントには下記のように記載されている[^2]。

>
```
$MAGICK_CONFIGURE_PATH
$PREFIX/etc/ImageMagick-7 
$PREFIX/share/ImageMagick-7 
$XDG_CACHE_HOME/ImageMagick
$HOME/.config/ImageMagick
<client path>/etc/ImageMagick
```

レンタルサーバーでは自分のホームディレクトリ以下しか触れないので、上記 `~/.config/ImageMagick` を試したが、さくらのレンタルサーバでは機能しなかった。
上記の設定ファイルの場所は ImageMagick の 6.8.8-8 あたり（？）で変更されたもののようで、それ以前は `~/.magick/` だった[^3]。
さくらのレンタルサーバにインストールされている ImageMagick のバージョンは 6.8.0-7。

## 参考

- [ImageTragick](https://imagetragick.com/)
- [ImageMagickの脆弱性(CVE-2016-3714他)についてまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20160504/1462352882)
- [Remote code execution vulnerability in ImageMagick | Hacker News](https://news.ycombinator.com/item?id=11623694)


[^1]: `policy.xml` による回避策は、右の投稿より。 ~~http://www.openwall.com/lists/oss-security/2016/05/03/18~~ https://imagetragick.com/#policy （2016/5/5修正）
[^2]: [ImageMagick: Resources](https://www.imagemagick.org/script/resources.php#configure)
[^3]: この点についてドキュメントされたものが見当たらない。GitHubのコミット履歴より。 https://github.com/ImageMagick/ImageMagick/commit/9f3b4fc30a52337aa9322eddcbd6699868f0d92f#diff-bca98816f556b73fe46b75571a2264cfL800
プロキシ環境下でcronを使って定期的に日付を合わせる


cronもシェルスクリプトもあまり馴染みがなかったので．．

## 環境
CentOS 7

## お題
定期的(毎日0:00)に時間を合わせたい
プロキシ環境下で，ntpを動作させるのが難しかったので，[NTPを使わずに時刻を合わせるワンライナー（Proxy環境下でも安心）](http://qiita.com/pankona/items/258fed78c168918a8ad2)を参考にさせて頂きました．

### 1. シェルスクリプトを書く

```sh:adjust_date.sh
#!/bin/sh
date -s "$(curl -x proxy.example:10000 -s --head http://www.google.co.jp | grep ^Date | cut -b 7-)"
```

スクリプトは[NTPを使わずに時刻を合わせるワンライナー（Proxy環境下でも安心）](http://qiita.com/pankona/items/258fed78c168918a8ad2)を参考にしました．

念のため，プロキシの記述を明示的に書きました
プロキシとそのポート番号は適当に書きましたので適時変更してください

一応cronを使わないで動くか確認してみましょう

```sh:確認
$ /root/adjust_date.sh
bash: /root/adjust_date.sh: 許可がありません
```

おっと．権限を付与するのを忘れてましたね．

```sh:権限付与
chmod u+x /root/adjust_date.sh
```

これで動きます．

### 2. crontab

`crontab -e`

```sh:crontab
0 0 * * * /root/adjust_date.sh
```

最小限しか書いていませんので，適時何か追加してください．

ちなみに日付とかの記述方法は

`分 時 日 月 曜`です．

今回は `0分 0時 いつでも いつでも　いつでも`って感じなので，毎日0:00ですよね

以上です．
PascalCase や camelCase などの名前付け規則の名称一覧

## はじめに

PascalCase や camelCase など、名前付け規則の名称を集めました。

※マイナーな名称になるほど定義が曖昧、もしくは人によって異なるのでご注意ください。

## 名称一覧

 * 単語の先頭は大文字、単語間の区切り文字は無し
   - CamelCase
   - CapitalizedWords / CapWords
   - PascalCase
   - StudlyCaps
   - UpperCamelCase
 * 最初の単語の先頭は小文字、それ以外の単語の先頭は大文字、単語間の区切り文字は無し
   - bumpyCase
   - camelCase
   - lowerCamelCase
 * 最初の単語の先頭は大文字、それ以外の単語の先頭は大文字、単語間を "_" で区切る
   - Kebabu-case
 * 全て小文字、単語間を "_" で区切る
   - snake_case
 * 全て大文字、単語間を "_" で区切る
   - SCREAMING_CASE
   - SCREAMING_SNAKE_CASE
   - UPPER_CASE
 * 全て小文字、単語間 "_" で区切る
   - chain-case
   - dash-case
   - hyphen-case
   - spinal-case

## 最後に

verylongname や VERYLONGNAME のような名前付け規則には名称はあるのでしょうか。ご存知の方がいらっしゃいましたら教えてください。
テクスチャアトラス画像を入れ子にする

こちらの記事と同じようなやつなんですが、
[ビットマップフォント画像を他とまとめて１ドローコールを目指す](http://qiita.com/harayoki/items/90652fab0b8859a9196d)

Starling(2.0で確認したがたぶん1.xも)では、アトラス画像(スプライトシート画像)の中にアトラス画像を入れ子で突っ込んでもうまく動作するのですね。

```sample.as
// アトラス画像（colorbars.pngを含む)
_assetManager.enqueueWithName('app:/assets/atlas.png');
// 全体アトラス設定
_assetManager.enqueueWithName('app:/assets/atlas.xml');
 // 入れ子にされてるアトラス画像の設定
_assetManager.enqueueWithName('app:/assets/colorbars.xml');
_assetManager.loadQueue(function(ratio:Number):void {
    if(ratio == 1) {
	// do something..
    }
});
```

![atlas.png](https://qiita-image-store.s3.amazonaws.com/0/8302/62903dc7-c80d-baa1-1e69-ab9e5a328059.png)
_atlas画像：atlas.png（colorbars.pngを含んでいる)_

<img src="https://qiita-image-store.s3.amazonaws.com/0/8302/843f1156-a7e9-09cc-5160-d52177be9d2f.png" width="32"> 
_atlas画像：colorbars.png_

```atlas.xml
<TextureAtlas imagePath="atlas.png" width="228" height="151">
    <SubTexture name="alphabet" x="151" y="1" width="76" height="78"/>
    <SubTexture name="colorbars" x="151" y="81" width="7" height="31" frameX="0" frameY="0" frameWidth="8" frameHeight="32"/>
    <SubTexture name="kana_only" x="1" y="1" width="148" height="149"/>
</TextureAtlas>
```

```colorbars.xml
<TextureAtlas name="colorbars" imagePath="colorbars.png">
  <!-- 一部の抜粋 -->
  <SubTexture name="color6" x="4" y="12" width="2" height="2"/>
  <SubTexture name="color5" x="0" y="16" width="2" height="2"/>
  <SubTexture name="color4" x="4" y="4" width="2" height="2"/>
  <SubTexture name="color3" x="4" y="8" width="2" height="2"/>
  <SubTexture name="color2" x="4" y="20" width="2" height="2"/>
  <SubTexture name="color1" x="4" y="28" width="2" height="2"/>
  <SubTexture name="color0" x="4" y="16" width="2" height="2"/>
</TextureAtlas>
```

これで、ばっちりcolorbars内のテクスチャが参照できます。

```sample.as
var texture:Texture = _assetManager.getTexture("color1");
```

別作業中に気づきました。パックをパックできるので、便利かもしれない。ドローコールもまとまる。
VirtualBoxをアップデートしたらHost-Only Ethernet AdapterのエラーでVagrantが起動しない

## WindowsのVirtualBoxをアップデートしたらVagrantが起動しない

Vagrantを起動するとこんなエラー

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 80 => 8080 (adapter 1)
    default: 22 => 2222 (adapter 1)
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["modifyvm", "a469359e-1c52-4348-9a5b-d95df0f5e50d", "--natpf1", "tcp8080,tcp,,8080,,80", "--natpf1", "tcp33306,tcp,,33306,,3306", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"]

Stderr: VBoxManage.exe: error: A NAT rule of this name already exists
VBoxManage.exe: error: Details: code E_INVALIDARG (0x80070057), component NATEngineWrap, interface INATEngine, callee IUnknown
VBoxManage.exe: error: Context: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1758 of file VBoxManageModifyVM.cpp
exit status 1
```

直接VirtualBoxを起動してOSを起動させてみると

```
Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter'
```

なにやらHost-Only Ethernet Adapterでエラーが出ている模様、

## アダプタの設定の変更でエラー解消

ネットワークと共有センター → アダプタ設定の変更 → VirtulBoxで使っているアダプタのプロパティを出す

![VirtualBox Host-Only Network](https://qiita-image-store.s3.amazonaws.com/0/3524/96173ed4-97de-a4f6-8bca-dfb992f00f90.png)

`VirtualBox NDIS6 Bridged Network Driver` のチェックがないのでこれを入れるとエラーが出なくりました。
php -S addr:port でお手軽 Web サーバ

```php -S addr:port [-t docroot]``` で Web サーバを立てることができます。-t オプションを省略すると、カレントディレクトリがドキュメントルートになります。

```
# 例: 7777 ポートで Web サーバを立てる
php -S localhost:7777

# 例: ドキュメントルートを指定する
php -S localhost:7777 -t /path/to/docroot
```

一瞬で Web サーバを立てなければならない、という状況で便利です。
Serial.printの挙動について調べてみた


加速度センサーから取ってきた値をシリアルモニタに表示するときに、ビット演算を使って2個のレジスタの値を合体させていました。

```cpp
x = readRegister(REG_X1) | (readRegister(REG_X2) << 8);
Serial.println(x, HEX);
```

1個目のレジスタが下位8ビット、2個目のレジスタが上位8ビットなので、2個目を8ビット左シフトさせてから合体させてやればいいだろうと。

こう書いていると、まれにおかしな値が出ることが。

```
38
47
FFFFFFF8  // ←？
FFFFFFF7  // ←？
```

センサーを動かしながら値を取っているので、大きく変動することはあると思うんですが、そもそも桁数がおかしい。


## 実験してみた

どうやら2個目のレジスタが``FF``とか``FE``あたりのときに発生しているらしく、シフト演算と関係ありそうなので実験してみました。

```cpp
int a = 255;                  // 0xFF
Serial.println(sizeof(int));  // => 2 つまりintは16ビット

Serial.println(a << 4, HEX);  // =>      FF0 ←わかる
Serial.println(a << 8, HEX);  // => FFFFFF00 ←？
Serial.println(a << 12, HEX); // => FFFFF000 ←？？
Serial.println(a << 16, HEX); // =>        0 ←わかる(あふれた)
```

``sizeof``で返ってくる値からも、intは16ビットと思われるので、``FFFFFF00``みたいな桁数はおかしい。


## 更に実験してみた

リファレンスに関係がありそうな記載があったので、更に実験してみました。

[<< (左シフト) >> (右シフト)](http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=785)

> 最上位ビットが1のxを右シフトするとき、結果はxの型に依存します。xがint型ならば最上位ビットは符号ビットですが、深遠な歴史的経緯に基づき、その符号ビットが右側にコピーされていきます。 

今回やってるのは **左シフト** なんだけど、何だか挙動が似てるぞ……！ 
というわけで、``unsigned int``でやってみました。

```cpp
unsigned int b = 255;
Serial.println(b << 4, HEX);  // =>  FF0
Serial.println(b << 8, HEX);  // => FF00
Serial.println(b << 12, HEX); // => F000
Serial.println(b << 16, HEX); // =>    0
Serial.println();
```

思った通りの動きになってる！！ 
けど、今回のとは関係ない気がする。``1``で埋められるのは右シフトの時ですし。


## 原因究明

もしかしたら``Serial.print``で表示するときに何かしているのでは？と思い、実装箇所を探してみました。(正直、探すのに一番時間かかった……。)

[Arduino/hardware/arduino/avr/cores/arduino/Print.cpp](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Print.cpp)

``` cpp:Print.cpp
size_t Print::print(int n, int base)
{
  return print((long) n, base);
}
```

``long``にキャストしてる！！ 
何だか分かってきたかも……。

つまり、こういうことだったみたいです。

1. ``int``の変数に *255* を入れる(16ビットintなので *0x00FF* になる)
2. 8ビット左シフトすると、 *0xFF00* になる
3. 普通の``int``は固定小数点数なので、最上位ビットが1だとマイナスの値になっちゃう( *-256* を表す)
4. ``long``にキャストしたときに、同じ-256を表すように隙間を1で埋められる
5. 16進表記すると *FFFFFF00* って表示される

分かってしまえば凄く単純で初歩的な事でした。


## 今回の教訓

* シフト演算するときは``unsigned int``にする
* ``int``や``long``のサイズが色々あることを意識する
BoostnoteでWebClipしてEvernoteを代替しよう

話はひどく単純です。

1. ブラウザでソースコードを表示する
2. ソースコードをコピーする
3. Boostnoteを"Markdown"モードにしてペーストする
4. 保存
5. HTMLが反映されWebページがそのまま保存できる！

たったこれだけの話。
EvernoteのWebClip機能(ブラウザの拡張プラグイン)のように手軽とは言えないけど、Wikiサイトや明らかに中をMarkdownで書いてると思われる技術ブログ(の特にその一部分)をクリップしたい時はかなり有効かと思います。


もともと、EvernoteでなんとかMarkdown使えないものかと色々探していたんですけどね、正直プログラマーにとってBoostnoteはかなり使えるんじゃないかと思います。
ぜひ一度触ってみていただきたい！（回し者じゃないョ）