OmniAICreator/Qiita-1.07M huggingface dataset:
異なるHostnameでのアクセスを正しいHostnameへリダイレクトする(Django)

# 目的
* www.example.com というホスト名でアクセスして欲しい。異なる場合はリダイレクトしたい。

## case1
* IPアドレスでアクセスされた場合は望ましくないので、www.example.comにリダイレクトしたい。

## case2 (Heroku)
* Herokuでは、任意のカスタムドメインを指定することができます。
* ただし、カスタムドメインを適用してもオリジナルのHerokuDomainも有効のままになってしまいます。
* つまり、「example.herokuapp.com」のようなホスト名は常に有効なままになるのですが、このホスト名のアクセスは望ましくありません。
* [Herokuのドキュメント](https://devcenter.heroku.com/articles/custom-domains)では、アプリケーションでリダイレクトしてね、と記述があります。

# 対応方法
* lib/middleware.py を作成（ディレクトリ、ファイル名は任意です）

```py:lib/middleware.py
from django.http import HttpResponsePermanentRedirect
from django.conf import settings

class RedirectCorrectHostname(object):
    """
    redirects to correct hostname if requested hostname and settings.CORRECT_HOST does not match
    (at heroku domain redirects to custom domain)
    """
    def process_request(self, request):
        if not getattr(settings, 'CORRECT_HOST', None):
            return None
        if request.get_host() == settings.CORRECT_HOST:
            return None

        return HttpResponsePermanentRedirect(
            '{scheme}://{host}{path}'.format(scheme=request.scheme,
                                             host=settings.CORRECT_HOST,
                                             path=request.get_full_path()))
```
([Gistにもあります](https://gist.github.com/shinsaka/5fa7830108d9ebbd4f80774c237f6fc4))

* *projectame*/settings.py に上記middlewareを記述 (下記はlib/middleware.py とした場合の例)

```py:projectame/settings.py
MIDDLEWARE_CLASSES = [
    'lib.middleware.RedirectCorrectHostname',
...
```

* *projectame*/settings.py に期待するホスト名を設定

```py:projectame/settings.py
CORRECT_HOST = 'www.example.com'  # このホスト名以外のアクセスはリダイレクトする
```

# 確認
* curlで確認

```
$ curl --head http://10.0.0.1/test
HTTP/1.1 301 Moved Permanently
Location: http://www.example.com/test
...
```
Facebookアプリをlocalhost環境で動かすときのメモ

Facebookアプリをlocalhost環境で動かすときのメモ。[facebookアプリをlocalhostで動かしたいとき。](http://mcommit.hatenadiary.com/entry/2014/08/23/094924)を参考にさせていただきましたが、現在は多少違っていたので投稿。

2016/06/05 時点。

## 管理画面 > Facebookログイン > クライアントOAuth設定
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111801/11d5ab84-8ef3-bd9c-59cf-956d426bf39b.png)

有効なOAuthリダイレクトURIへ、実際に稼働させるURLに加えて `http://localhost:8080/` なんかを記載すれば動きました。
IPython Notebook + cairo でお絵かき

[cairo](https://www.cairographics.org/)でお絵かきする必要に迫られた。
IPython notebook上で結果を表示できれば試行錯誤が行い易い。

## やり方

以下の関数を最初に定義しておくだけ。

```py
import io
from IPython.display import Image

def surface_to_image(surface):
    buf = io.BytesIO()
    surface.write_to_png(buf)
    data = buf.getvalue()
    buf.close()
    return Image(data=data)
```

次のように使える

```py
import cairo
from IPython.display import display

surface=cairo.ImageSurface(cairo.FORMAT_ARGB32, 640, 480)
ctx = cairo.Context(surface)
ctx.set_line_width(1)
ctx.set_source_rgb(0.8,0,0)

ctx.move_to(320, 400)
ctx.curve_to(150, 300, 150, 170, 150, 170)
ctx.curve_to(150, 50, 320, 50, 320, 170)
ctx.curve_to(320, 50, 490, 50, 490, 170)
ctx.curve_to(490, 170, 490, 300, 320, 400)
ctx.fill()

display(surface_to_image(surface))
```

![heart.png](https://qiita-image-store.s3.amazonaws.com/0/39647/9ddbacac-3861-8615-30b9-377191845717.png)
bashrcとbash_profile

#ホームディレクトリに「.bashrc」や「.bash_profile」というファイルがあるが、、これは何？

と疑問を持った。
一言で、シェルが起動するときに実行される初期化ファイル。

シェルの役割として大きく二つ

1. ユーザーがコマンドを実行するためのコマンドライン環境を提供。ユーザーとOSの中枢であるカーネルとのインタフェースの役割を果たすこと。
2. ユーザーがログインを行った際に、環境を整えるためにさまざまなファイルを実行し、初期化を行うこと。今回疑問に思ったファイルはbash（Bourne Again SHell）が起動されるときに実行される。

###2番目の役割の際に初期化で使われるファイルが、bashrcとbash_profileらしい。

#bash起動時の初期化フロー

1. /etc/profileを実行
2. /etc/profileによって、/etc/profile.dディレクトリ配下のすべてのファイルを実行
3. ログインユーザーのホームディレクトリにある .bash_profileを実行
4. .bash_profileによって、.bashrcを実行
5. .bashrcによって、/etc/bashrcを実行

#bashrcとbash_profileの違い
.bash_profileはbashがログインシェルとして起動されたときにのみ実行されるが、
.bashrcはログイン時も含めbashが起動するたびに実行される点が違う。
なので、
###__.bash_profileにはユーザーがログイン時にのみ行う処理（設定）を記述する。__
###__.bashrcにはシェル変数や環境変数、エイリアスなどユーザー環境の基本となる設定を記述する。__

#sourceコマンド
上記テキストファイルは内容を変更しただけでは変更が反映されないので、ログアウトしなおすか、sourceコマンドを打つ。
```$ source .bash_profile```
これで変更が反映される。
ふりかえりするためにニャ（正しいとは言っていない）

# これは？

* お通夜みたいなふりかえりをよくするには、こういうマインドが必要なんジャマイカ？ということです

# 記事 概要と仮説

筆者周辺では「ふりかえりあるある」があるので、原因の発見のために「フィードバック制御」を用いる。
フィードバック制御における「ふりかえり」の前の「自分のタスク」実行にマインドを付加することで
「ふりかえり」が機能するようになるだろう。

という仮説です


# ふりかえりあるある

* やったことをただ書く
* 結局、何も変わらない

# フィードバック制御で考える

開発のシーンでは

* 「自分のタスク」に集中してしまう
* 結果、マインドは100%タスクに占有されて、ふりかえり時に何も材料がない状態になる

結果「ふりかえり」では、フィードバック回路の入力に影響がある信号が発生しない。

![FB.png](https://qiita-image-store.s3.amazonaws.com/0/106271/3fbf65d4-f8c8-975b-9d8e-7cc11e042de6.png)


# タスク実行時に持つマインド

フィードバック回路として機能したい場合は、「自分のタスク」実行時のマインドをタスクだけに集中せずに

* 現状の俯瞰 （少なくとも自分のレイヤーより上位レイヤー視点で考える）
* 理想形（いろんなプラクティスがあるので、近いものや本来プロジェクトを実行するならこういう形の認識）
* アイデア（普段からの学習、アドバイザー、メンター etc）

のものを考慮してタスクを実行すると、「ふりかえり」がいい感じになるだろう

![mind.png](https://qiita-image-store.s3.amazonaws.com/0/106271/bb4e4673-b963-4997-dd42-7abd15dce889.png)

というのが、仮説という話（終）

# まとめ

* スペック低め、マルチタスク難しいマンだと、そもそもふりかえりできないのでやる場合には、工夫が必要
* 教育機関でイテレータブルな思考は、試行していないので、若い時から訓練が必要

とにかく、ふりかえりの導入は難しい・・・（感想で終わる）

# 参考

* [第１７回すくすくスクラム　振り返りの基礎はこれだ！](http://www.slideshare.net/essence/20100728-4932855)
* [フィードバック制御](http://www.kairo-nyumon.com/control_feedback.html)
めざせpythonライブラリマスター （33）humanfriendly

#【ライブラリ説明】
　単位や日付の変換、タイマー、ユーザからの入力変換など多くのことが
　分かりやすくコーディングできる。

#【プログラム】
```py:humanfriendly.py
# -*- coding: utf-8 -*-

import humanfriendly

user_input = raw_input("Enter a readable file size: ")
# 16KBを入力

num_bytes = humanfriendly.parse_size(user_input)
print num_bytes
# Enter a readable file size: 16384

print "You entered:", humanfriendly.format_size(num_bytes)
# You entered: 16 KB
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/humanfriendly/1.43.1)
　[document](https://humanfriendly.readthedocs.io/en/latest/#)
PHP7,Laravel5.1で開発環境を整える

##概要
先日この環境を作ったので自分用のメモ。
phpbrewでPHP7を用意した上でLaravel5.1で開発環境を整えます。
自分の手元の環境ではPHP:7.0.6 + Laravel 5.1.xに。

##PHPの環境構築
nodebrewを利用していることもあり、phpbrewでPHP7の環境を整えます。
(phpenvは試してみたけどうまく動かなかったのもあり)

参考にしたのはこのあたり：
[MacでのPHP開発はphpbrewが非常に良い](http://www.karakaram.com/mac-install-phpbrew)

以下の手順でphpbrewをインストールします。
```
$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/phpbrew
$ phpbrew init
```


必要なパッケージが足りなそうな場合は都度homebrewから追加します。
例)
```
brew install libevent libjpeg libpng mcrypt libtool autoconf libxml2 lemon re2c
```
このあたりを入れたあとに足りなかったので幾つか入れた記憶が。
bisonのバージョンとかopensslのバージョンとかがうまくいかなかったりを解消した。

linkされていないものは--forceでリンクする
例)
```
brew link --force homebrew/versions/openssl101
```

PHPのバージョンを確認後にインストール

```
$ phpbrew known
Read local release list (last update: 2016-05-19 04:10:51 UTC).
You can run `phpbrew update` or `phpbrew known --update` to get a newer release list.
7.0: 7.0.6, 7.0.5, 7.0.4, 7.0.3, 7.0.2, 7.0.1, 7.0.0 ...
5.6: 5.6.21, 5.6.20, 5.6.19, 5.6.18, 5.6.17, 5.6.16, 5.6.15, 5.6.14 ...
5.5: 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31, 5.5.30, 5.5.29, 5.5.28 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...

$ phpbrew install 7.0.6
$ phpbrew use php-7.0.6
$ phpbrew list
* php-7.0.6
$ php -v
PHP 7.0.6 (cli) (built: May 19 2016 13:22:46) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

##composerの準備

composerが入っていない場合は使えるように準備しておく
```
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

##Laravelの準備

あとはコマンド一発で準備できるので準備する
```
composer create-project laravel/laravel --prefer-dist PROJECT-NAME 5.1
```

###確認
Laravelは[artisan](http://readouble.com/laravel/5/1/ja/artisan.html)というコマンドラインインターフェースを持っているので、php artisan serveでlocalhostでの確認ができる

```
$ php artisan serve
Laravel development server started on http://localhost:8000/
```

Laravel5の画面が出ていたら導入完了。
Ruby i++

#Rubyが i++ がない。


```ruby:main.rb
i=0
while i==50
	puts i
	i++
end
```

これだと、
main.rb:4: syntax error, unexpected keyword_end
とエラーが出てしまいます。
そして、調べてみたら、i++は、Rubyでは使えないらしいので、


```ruby:main.rb
i=0
while i==50
	puts i
	i=i+1
end
```
<追加>

他の書き方もあるそうです。
@844196 さん
@tamy0612 さん
ありがとうございます。

```ruby:main.rb
i = 0
while i <= 50
  p i
  i += 1
end
```
```ruby:main.rb
i = 0
while i <= 50
  p i
  i.succ
end
```

```ruby:main.rb
50.times do |i|
  puts i
end
```
```ruby:main.rb
1.upto(50) do |i|
  puts i
end
```
【ExcelVBA】Excel VBAでのXMLの扱い方

1. Excelで、Visual Basic for Applicationsを立ち上げる。
2. ツール(T) > 参照の追加(R) で、参照設定ウィンドウを開く。
3. 「Microsoft XML, v6.0」にチェックを入れ、OKボタンを押す。

XMLファイルを読み込む。

```vbnet
Set Doc = New MSXML2.DOMDocument60
Doc.Load("C:\test\books.xml")
```

XMLを保存する。

```vbnet
Set Doc = New MSXML2.DOMDocument60
Doc.Save("C:\test\output.xml")
```

要素は[`IXMLDOMElement`](https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.infopath.semitrust.ixmldomelement_members.aspx)型。要素を生成するには、[`IXMLDOMDocument`](https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.infopath.semitrust.ixmldomdocument_members.aspx)型の`createElement`メソッドを使用する。

```vbnet
Set Element = Doc.createElement("tagname")
```

XMLを解析するときに`selectSingleNode`、`selectNodes`、`getAttribute`、`Text`を使用し、XMLを構築するときに`createElement`、`Text`、`setAttribute`、`appendChild`を使用する。
Elmでの仮想DOMを体験する

サンプルのToDoリストを作成してみます。

```bash:
$ git clone https://github.com/evancz/elm-todomvc
$ cd elm-todomvc
$ npm i elm -g
$ elm-make Todo.elm --output elm.js
$ open index.html 
```

![](https://raw.githubusercontent.com/mba-hack/images/master/elm-html-todomvc.png)

速いです。あと、ソースである`Todo.elm`を見る限りでは割りとシンプルです、400行。そして、出力される`elm.js`は8000行にも及びます。

`./elm-stuff`を使うことで再利用も簡単になると思われます。
そもそもパスって何？

#~/.bashrcにパスを通す
###そもそもプログラミングどうこうの前に、パスを通すとか、そういうプログラマとしての基本的知識がないので致命的だと思い、調べた。

パス(PATH)は英語で「経路」という意味。経路というより、むしろ、コマンドを実行するプログラムのある場所と考えた方が良い。 楽にコマンドを実行するために、パスの設定をする事を「パスを通す」と言う。

たとえば /home/ubuntu/.phpenv/bin/phpenv というコマンドを phpenv とだけ入力して実行させるとする。この場合 phpenv というコマンドがある場所が /home/ubuntu/.phpenv/bin 。

　つまり、/home/ubuntu/.phpenv/bin にパスを通す（環境変数 PATH で指定）事で、【 phpenv 】と入力するだけで、実行することが出来るようになる。

この場合、~/.bashrcファイルに、
```export PATH="/home/ubuntu/.phpenv/bin:$PATH"
eval "$(phpenv init -)"```

と追記。

#パスが通っているかの確認
###「書いたところでどうやって確認するんだ...？」
こう、素人は即座に思う。
```$ echo $PATH
/home/ubuntu/.phpenv/shims:/home/ubuntu/.phpenv/bin:/home/ubuntu/.nvm/versions/node/v4.4.5/bin:/usr/local/rvm/gems/ruby-2.3.0/bin(以下省略)```
この場合

* /home/ubuntu/.phpenv/shims
* /home/ubuntu/.phpenv/bin
* /home/ubuntu/.nvm/versions/node/v4.4.5/bin
* /usr/local/rvm/gems/ruby-2.3.0/bin

にパスが通っていることになる。

こうやって~/.bashrcにどんどん追記していくことで、

2. いちいちブラウザで場所を調べる
3. そのディレクトリまで移動
4. フルパスをpwdで調べる
5. コピー
6. コマンドライン張り付け
7. 実行

というなんとも無様な6段階の手間が省ける。

知ったからにはどんどん使っていきたいです。
こういうの、ちゃんと身につけたい。
僕なりのフロントエンド開発環境2016年版v2

2017年版も書いた
http://qiita.com/koh110/items/05ce5ca04922493ba327

---
Node v6にアップデート直後に動かなくなった部分があったので、今後アップデートがあってもなるべく早く追いつけるように開発環境をアップデート
http://qiita.com/koh110/items/83cb29f8ecc2738ea8bb
https://github.com/koh110/minjsapp

# 目指すスタイル
なるべく複数の機能を統括的に含めたツールを使わない。
内部で使っているモジュールのバージョンアップがあっても、それをラッピングしているツールがアップデートされるまで、Node.jsのバージョンアップができないという事がある。
ex) node-sassがNode.js v6に対応したのに、pleeeaseが対応版のnode-sassに対応されない。
ex) pleeeaseが対応したのにgulp-pleeeaseが対応されない

特にgulpはgulpで使うためだけにgulp-pleeeaseなどのラッパーが存在している事が多く、そういったラッパーを使っていると作者のバージョンアップが遅れ、それに引きづられて自分の開発環境もアップデートでしづらくなる性質がある。

そこで、ツールを使う時はなるべく本体そのまま使う or ツールの本家本元がgulpのプラグインを提供している場合は使ってもよい、というスタイルでいこうと思う。

# gulp-pleeeaseをやめた
gulp-pleeease -> node-sass + autoprefixer (+ postcss)
先のスタイルに合わせて、gulp-pleeeaseをやめてそれぞれ欲しい機能に分離した。
やりたい事はsassのコンパイルをしてautoprefixerをかけたい。
gulp-pleeeaseというgulpで簡単に使えるプラグインが提供されていたから、pleeease楽でいいじゃんと思ってたけど、node-sass, autoprefixerのアップデートに追いつけていけなくなってそうだったので思い切ってばっさりと切り捨て。

## sassコンパイル
### before
見た目はすっきりしてる

```
gulp.task('sass', () => {
  return gulp.src('sass/*.scss')
    .pipe(pleeease({
      sass: true,
      minifier: false,
      out: 'style.css'
    }))
    .pipe(gulp.dest('dist'));
});
```

### after
promise使って書きたいけど依存関係を浅くするためにタスクの見た目の悪さは我慢

```
gulp.task('sass', (cb) => {
  sass.render({
    file: 'sass/entry.scss'
  }, (err, result) => {
    if (err) {
      return cb(err);
    }
    fs.writeFile('dist/style.css', result.css, (err) => {
      if (err) {
        return cb(err);
      }
      cb();
    });
  });
});
```

## autoprefixer
### before

```
gulp.task('prefixer', () => {
  const pleeease = require('gulp-pleeease');
  return gulp.src('style.css')
  .pipe(pleeease({
    autoprefixer: {
      browsers: [
        'last 1 versions',
        'ie >= 10',
        'safari >= 8',
        'ios >= 8',
        'android >= 4'
      ]
    },
    minifier: false
  }))
  .pipe(gulp.dest('dist'));
});
```

### after
autoprefixerを使うためにgulp-postcssの依存が増えた。
autoprefixerとpostcssとgulp-postcssの作者は一緒なので、autoprefixerのバージョンアップ時にはバージョンアップについていけると判断しこのモジュールは利用する事に決定。

```
gulp.task('styles', ['css', 'sass'], () => {
  const postcss = require('gulp-postcss');
  const autoprefixer = require('autoprefixer');
  return gulp.src('style.css')
  .pipe(postcss([autoprefixer({
    browsers: [
      'last 1 versions',
      'ie >= 10',
      'safari >= 8',
      'ios >= 8',
      'android >= 4'
    ]
  })]))
  .pipe(gulp.dest('dist'));
});
```
Amazon Linux上にPython3.5.2の環境を導入する

# 目的
* Amazon Linuxへ、システムに影響のないように、現時点で最新のPython3.5.2を導入します。
* コンパイルはインスタンススペックによりますが、5分ぐらいの作業です。
* （実際はAmazonLinuxに特化した部分はありません）

# 準備
* Amazon LinuxインスタンスをLaunchし、sshログインできるようにしておきます。

# 手順
## 必要パッケージをインストール
* ソースからビルドするので必要パッケージをインストールします。
* sqlite-develを入れておくと、ipythonのヒストリーを保持してくれます。

```
$ sudo easy_install virtualenv
$ sudo yum groupinstall 'Development tools'
$ sudo yum install openssl-devel
$ sudo yum install sqlite-devel
```

## virtualenvをインストール
* Python環境を切り替える仕組みとして使用する virtualenvをインストールします。
* これはAmazon Linux標準のPython2.7.x環境にインストールします。

```
$ sudo pip install virtualenv
```

## Python3.5.2をビルド
* ソースをダウンロードしてコンパイルします。
* インストール先はログインユーザーのホームディレクトリ内とします。

```
$ mkdir ~/src
$ cd ~/src
$ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
$ tar zxvf Python-3.5.2.tgz
$ cd Python-3.5.2
$ ./configure --prefix=$HOME/local
$ make
$ make install
```

## 環境切り替え設定
* ローカルPython環境を設定します。（最初だけ）
* 指定したディレクトリが新たに設定したPython環境のトップディレクトリになります。

```
$ virtualenv --python $HOME/local/bin/python3.5 ~/py352
```

## 切り替え確認
* virtualenvで作成されたactivateスクリプトを実行することでPython3.5.2に切り替わります。
* プロンプト先頭に環境を示す文字が追加されます。

```
$ source $HOME/py352/bin/activate
(py352)$ python --version
Python 3.5.2
```

* 元の環境(Python2.7.x)に戻る場合は下記コマンドを使用します。

```
(py352)$ deactivate
$ python --version
Python 2.7.10
```

## デフォルトでPython3.5.2にする
* ログイン時にPython3.5.2環境に切り替えるようにします。

```
$ echo 'source $HOME/py352/bin/activate' >> ~/.bash_profile
```

## 切り替えコマンドをaliasにしておく
* 頻繁に環境を行ったり来たりするとコマンドが面倒なのでalias設定しています。

```
$ echo 'alias p3="source $HOME/py352/bin/activate"' >> ~/.bash_profile
```
めざせpythonライブラリマスター （32）sql

#【ライブラリ説明】
　pythonでsql使えます

#【準備】
　（sqlite3が必要なのかな？）

#【プログラム】
```py:sql.py
# -*- coding: utf-8 -*-

import sqlite3
import sql

connection = sqlite3.connect(':memory:')
bliss = sql.SQL(connection)

bliss.run("CREATE TABLE contributors (firstname VARCHAR, lastname VARCHAR)")
bliss.run("INSERT INTO contributors VALUES (?, ?)", [('Andrew', 'Kuchling'),
                                                     ('James', 'Henstridge'),
                                                     ('Daniele', 'Varrazzo'),
                                                     ('Marc-Andre', 'Lemburg')])
                                                                                                          
print bliss.one("SELECT firstname FROM contributors WHERE lastname='Lemburg'")
# Marc-Andre

print bliss.all("SELECT firstname FROM contributors")
# [u'Andrew', u'James', u'Daniele', u'Marc-Andre']

print bliss.all("SELECT firstname, LENGTH(lastname) AS length FROM contributors")
'''
 [Record(firstname=u'Andrew', length=8),
  Record(firstname=u'James', length=10),
  Record(firstname=u'Daniele', length=8),
  Record(firstname=u'Marc-Andre', length=7)]
'''
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/sql/0.4.0)
　[github](https://github.com/3kwa/sql)
Windows10のPowerShellウインドウでsshを利用する

# Windows10でssh

## 使い方

ssh を実行する

```
ssh root@h192.168.10.1 -p 10022 -i identity_file
```

## ヘルプ

```
PS C:\Users\usrMoge> ssh
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port]
           [-Q cipher | cipher-auth | mac | kex | key]
           [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]
```

## 注意点

- サーバにつながらなくてもエラーが出ない
- SCP は使えないっぽい
- 文字化けについては https://news.mynavi.jp/itsearch/article/hardware/1119 を参照
- powershell の profile は https://technet.microsoft.com/ja-jp/library/ff461033.aspx?f=255&MSPPError=-2147217396

# 1時間使った感想

うーん、イマイチ。使いやすいように設定できた人がいたら教えて下さい・。・
【VBA】特定セルに任意値がある場合に特定行を非表示化してみる


ちょっと使っているツールに組み込みできないかなと思い、ちょっと検証してみる。

-

# 0.実現させたこと

ある特定のセル（例えば、A1セル）に「aiueo」という値が入っていた場合に、6行目の行を非表示化、ない場合は表示させるようにVBAを組み込みたい。

できれば、動的になるようにしたいが、とりあえず贅沢言わずにその動作ができるかどうかに注力する。

-

# 1.使うコマンド（関数）

下記のコマンド（関数）で実現することができそうな感じ。

````コマンド
★例）2行目を非表示

Rows(2).Hidden = True

★例）セルを指定して、そのセルがある行を非表示


Range("A1").EntireRow.Hidden = True

````

再度、表示したい場合はパラメータを `false` にする。

-

# 2.やってみる

テスト用にこんなExcelを作成してみる
![kobito.1465100294.976926.png](https://qiita-image-store.s3.amazonaws.com/0/33479/9299fc3e-a0c3-9d93-84a4-31c692955a5e.png "kobito.1465100294.976926.png")

試してみたいことは、
黄色に塗りつぶしている行と列を非表示・表示させること。

コードを書いてみる。

````コード（表示）
Sub sample_001()
    '7〜10行目を表示
    Rows("7:10").Hidden = False
    'Q〜U列を表示
    Columns("Q:U").Hidden = False

End Sub
````

````コード（非表示）
Sub sample_002()
    '7〜10行目を表示
    Rows("7:10").Hidden = True
    'Q〜U列を表示
    Columns("Q:U").Hidden = True

End Sub

````

![2016-06-05 13_24_08.gif](https://qiita-image-store.s3.amazonaws.com/0/33479/2a2a074c-038b-363d-ab06-04578747d7aa.gif "2016-06-05 13_24_08.gif")


動作確認ができたので、今度はA1セルに「aiueo」がある場合に非表示、ない場合に表示になるようにコードを書いてみる

````コード（A1セルの値によって表示制御）
Sub sample_003()

'変数定義
a1 = Range("A1").Value
a2 = "aiueo"

'A1セルの値によって表示制御
If a1 = a2 Then
    Rows("7:10").Hidden = True
    Columns("Q:U").Hidden = True
Else
    Rows("7:10").Hidden = False
    Columns("Q:U").Hidden = False
End If

End Sub

````

![vba_なし.gif](https://qiita-image-store.s3.amazonaws.com/0/33479/ee85afc9-88ee-a641-c8fd-69f92878aaf4.gif "vba_なし.gif")

![vba_あり.gif](https://qiita-image-store.s3.amazonaws.com/0/33479/cc1c329c-6e30-94df-0f12-7ea0e3e17059.gif "vba_あり.gif")
文字列のローカライズはextensionで

役に立つかどうかよくわからないTipsシリーズ

ローカライズが必要なアプリに
もろにこんな感じで書いてはいませんか?

```swift
let label = UILabel()
label.text = NSLocalizedString("thank you", comment: "")
```

こういうのを extension しておくのは大事

```swift
extension String {

    func localize(comment: String = "") -> String {
        return NSLocalizedString(self, comment: comment)
    }
}
```

そもそも `comment` って使う? 
必要にかられたことはないけど、必要なときもあるかもしれないから
省略可能な引数にしてしまいます

```swift
let label = UILabel()
label.text = "thank you".localize()
```

文字列に`.localize()`を付けるだけでローカライズ対応できました
Riotを使ってランダムの数値を作成する

React, Polymerなどと比較されるRiotを使ってみた。

公式で発表されている数値などによると、[Riot](https://github.com/riot)はミニマムで、かつ早いらしいです。

[Riot vs React & Polymer](http://riotjs.com/ja/compare/)

そして、コードの構造が言語ごとに分けて書き出せるため、非常に分かりやすい書き方ができます。

```html:
<example-tag>
  <p id="findMe">Do I even Exist?</p>
  <p>Is this real life?</p>
  <p>Or just fantasy?</p>

  <script>
  this.on('mount', function(){
    // Contexted jQuery
    $('p', this.root)

    // Contexted Query Selector
    this.root.querySelectorAll('p')
  })
  </script>
</example-tag>
```

http://riotjs.com/ja/guide/

次に、`example`を元に実際使ってみます。`webpack`でビルド, プレビューします。

```bash:
$ git clone https://github.com/riot/examples riot-examples
$ cd riot-examples/webpack
$ npm i
$ ./dev.sh

$ chromium http://localhost:3000/
```

内容は`Random number generator`です。ボタンクリックで作成します。

```bash:
$ npm i riot -g
$ cd app
$ riot logs.tag
$ riot random.tag
```
ハイパーターミナル > 132桁にする

```txt:動作環境
Windows XP
```

古いPCでRS-232C通信を見るときハイパーターミナルを使う場合がある。ハイパーターミナルは通常では80桁表示であるが、132桁にする方法があるようだ。

https://msdn.microsoft.com/ja-jp/library/cc737116(v=ws.10).aspx

- [プロパティ]にて「エミュレーション」をVT100にする
- 「ターミナルの設定」にて「132桁モードを使う」をチェックする
- ハイパーターミナルを起動しなおす

以上で132桁表示になっている。
Linux(LPIC)　※自分用メモ

**1章　Linuxの概要と、基本操作**
[1-1] Linuxとは何か？
[1-2] CPU、メモリ、ハードディスク
[1-3] 基本操作[１]（ディレクトリ移動、ファイル閲覧）
・pwdコマンド
・cdコマンド
・lsコマンド
・catコマンド
・相対パスと絶対パス
・catコマンド（パスを指定）

[1-4] 基本操作[２]（ファイル・ディレクトリの作成、コピー、削除）
・touch、mkdirコマンド
・cpコマンド
・mvコマンド
・rm、rmdirコマンド

[1-5] 練習問題
演習１
演習２
演習３
演習４

**2章　シェルと、コマンドの基本、他**
[2-1] シェルとは何か？
[2-2] シェルの基本操作と設定
・~（チルダ）
[2-3] シェル変数と環境変数
・変数の作成
[2-4] 環境変数path
・PATHを通す
[2-5] コマンドの実行
・複数コマンドの実行
[2-6] 引用符
・引用符
[2-7] コマンド履歴
[2-8] マニュアルの参照
・manコマンド
[2-9] ファイル操作コマンド
・基本的なファイル操作コマンド
[2-10] メタキャラクタの利用
・メタキャラクタ

**3章　パイプとリダイレクト、テキスト処理、他**
[3-1] 標準入出力
[3-2] パイプ
teeコマンド
[3-3] リダイレクト
リダイレクト（<）
リダイレクト（>、>>）
リダイレクト（2>、2>>）
リダイレクト（>&2、2>&1）
リダイレクト（<<）
演習
[3-4] テキスト処理フィルタ(1)
catコマンド・・・
nlコマンド・・・
odコマンド・・・
headコマンド・・・
tailコマンド・・・
cutコマンド・・・
joinコマンド・・・
pasteコマンド・・・
[3-5] テキスト処理フィルタ(2)
trコマンド(1)・・・
trコマンド(2)・・・
sortコマンド・・・
splitコマンド・・・
uniqコマンド・・・
prコマンド・・・
fmtコマンド・・・
[3-6] テキスト処理フィルタ(3)
unexpandコマンド・・・
expandコマンド・・・
wcコマンド・・・
xargsコマンド・・・
[3-7] 正規表現
[3-8] grepコマンド
grepコマンド(1)・・・
grepコマンド(2)・・・
[3-9] sedコマンド
sedコマンド・・・
[3-10] viエディタの基本
viエディタの使い方(1)
viエディタの使い方(2)
viエディタの使い方(3)
viエディタの使い方(4)
viエディタの使い方(5)

**4章　ファイルの圧縮・解凍、アーカイブ、アクセス権、他**
[4-1] ファイルの圧縮・解凍
ファイルの圧縮・解凍
[4-2] アーカイブの作成・展開
tarコマンド
cpioコマンド(1)
cpioコマンド(2)
ddコマンド
[4-3] 所有者とアクセス権
[4-4] 特殊なアクセス権
SUID
SGID
スティッキービット
[4-5] デフォルトのアクセス権
[4-6] 所有者・所有グループの変更
chownコマンド・・・
chgrpコマンド・・・
[4-7] ハードリンク、シンボリックリンク
ファイルのリンク・・・
ディレクトリのリンク・・・
[4-8] プロセスの監視
psコマンド・・・
[4-9] プロセスの終了
killコマンド・・・
killallコマンド・・・
[4-10] ジョブ管理
ジョブの制御・・・
ジョブの強制終了・・・
バックグランドジョブでの実行・・・
制御の演習・・・
nohupコマンド・・・
[4-11] コマンド実行時の優先度
niceコマンド・・・
reniceコマンド・・・

**5章　HDDの種類、パーティション、ファイルシステム、マウント、他**
[5-1] ハードディスクの種類
HDDの確認
[5-2] パーティションの種類と、管理コマンド
パーティションの作成
[5-3] ファイルシステムの作成、管理
ファイルシステムの作成
ファイルシステムのチェック
ファイルシステムの確認・変更
[5-4] ハードファイルシステムと、マウント
マウント(1)
マウント(2)
[5-5] ディスク容量の管理
dfコマンド
duコマンド
[5-6] クォータ
クォータ・・・一人のユーザが大量ファイルを作成すると、同じパーティション内の他のユーザやシステムに影響が出る。そのためユーザやグループ毎に「使用容量の上限を設定する」ことをクォータという。
[5-7] FHS
FHSの中身の確認
FHSとはLinuxのディレクトリ構造のこと。/bin、/sbin、/etcなど。
[5-8] ファイルの検索
ファイル検索コマンド

**6章　BIOS、デバイス情報の確認、システム起動の流れ、他**
[6-1] 基本的なシステムハードウェア
IOポート番号
IRQ番号
[6-2] デバイスの確認、デバイスドライバのロード
モジュールの追加や削除
[6-3] BIOSと、システムが起動する流れ
システム起動　※VMWARE
[6-4] ランレベル
ランレベルの確認・変更
[6-5] シャットダウンと再起動
shutdownコマンド

**7章　HDDのレイアウト設計、Debianパッケージ、RPMパッケージ、他**
[7-1] パーティションのレイアウト設計
[7-2] GRUBのインストール、設定
GRUB Legacyの設定
GRUB2の設定
ブートオプションの指定
[7-3] 共有ライブラリの確認
共有ライブラリの確認
[7-4] パッケージ管理
[7-5] dpkgコマンドを使ったパッケージ管理
dpkgコマンド
[7-6] APTツール
apt-getコマンド
apt-cacheコマンド
aptitudeコマンド
[7-7] rpmコマンドを用いたパッケージ管理
rpmコマンド
[7-8] YUMツール
yumコマンド
めざせpythonライブラリマスター （31）adipy

#【ライブラリ説明】
　微分ができる

#【準備】
　`pip install numpy`
　　上記コマンドを事前に実行
　`pip install matplotlib`
　　グラフを描くときはmatplotlibも必要

#【プログラム】
```py:adipy1.py
# -*- coding: utf-8 -*-

from adipy import ad, sin, adn

# adオブジェクト作成
x = ad(1.5)

# xの２乗をyに代入
y = x**2
print y
# ad(2.25, array([ 3.]))
# array([ 3.])の「3」はyを１回微分してｘを代入した値

# dy(1)/dx
print y.d(1)
# 3.0

z = x*sin(x**2)
print z
# ad(1.1671097953318819, array([-2.04870811]))

# dy(1)/dx
print z.d(1)
# -2.04870810536

# adnオブジェクト作成
# 第二引数の4は４回微分まで求める
x = adn(1.5, 4)

y = x**2
print y
# ad(2.25, array([ 3.,  2.,  0., -0.]))

# dy(２)/dx
print y.d(2)
# 2.0

z = x*sin(x**2)
print z
# ad(1.1671097953318819, array([  -2.04870811,  -16.15755076,  -20.34396265,  194.11618384]))

# dy(４)/dx
print z.d(4)
# 194.116183837
```


```py:adipy2.py
# -*- coding: utf-8 -*-

from adipy import adn, sin, taylorfunc
import matplotlib.pyplot as plt
import numpy as np

# adnオブジェクト作成
xAD = [adn(1.5, i) for i in xrange(1, 7)]

def z(x):
    return x*sin(x**2)

# グラフのx軸の範囲を設定
x = np.linspace(0.75, 2.25)
# 元の関数をActual Functionとしてラベル付けして描画
plt.plot(x, z(x), label='Actual Function')


for i in xrange(len(xAD)):
    # テイラー多項式を使用
    fz = taylorfunc(z(xAD[i]), at=xAD[i].nom)
    plt.plot(x, fz(x), label='Order %d Taylor'%(i+1))

# 関数のラベルの位置を設定
plt.legend(loc=0)
plt.show()
```
<img width="490" alt="graph.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/0ce1ac84-7398-2891-ed16-82637c9bbd72.png">

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/ADiPy/0.6.3)
　[github](https://github.com/tisimst/adipy)
MySQL インポートの進捗表示

いつも忘れてしまうのでメモ。

ご存知の通り、以下のようにするとターミナルはダンマリ。進捗不明、いつ終わるのだと・・・

```
mysql -uUSERNAME -p DATABASE < IMPORTDATA.sql
```

そういう時は、pvコマンドとパイプを組み合わせて以下のようにしてあげましょう。

```
pv IMPORTDATA.sql | mysql -uUSERNAME -p DATABASE
Enter password: 
630MiB 0:06:51 [ 716KiB/s] [=============>                          ] 14% ETA 0:39:37
```

パイプを使う場合ならpvが使えるので他にも応用がききますね。
SPINインストール手順

#概要
形式手法のツールの1つ CUIツールの [SPIN](http://spinroot.com/spin/whatispin.html) 及びGUIツールの iSpin のインストール手順をまとめる。

#前提条件
1. 環境
    2. Mint Linuxとする。（おそらくUbuntuでも同様の手順で可）
2. 必要なパッケージ  
   以下のパッケージが事前にインストールされていること。（Mint Linuxではデフォルトで入ってました。）
    3. [Tcl/Tk](http://www.tcl.tk/)
    4. gcc
5. SPINのバージョン
    6. Version 6.4とする。

#手順

##1. ダウンロード  
   [公式サイト](http://spinroot.com/spin/Src/index.html)から`Full distribution, with sources`の`spin***.tar.gz`ファイルをダウンロードし、適当なワーキングディレクトリ（以降では、`/home/work`とする）に保存する。

##2. SPINインストール
* インストール  
以下のシェルコマンドを実行する。

```bash:spin_install.sh
# ワーキングディレクトリに移動
cd /home/work

# 解凍
sudo gunzip *.tar.gz
sudo tar -xf *.tar

# ソースコードファイルに移動
sudo cd Spin/Src*

# ビルド
sudo make

# ビルドで生成した実行ファイルを配置
sudo cp spin /usr/local/bin
```

* 動作確認  
以下のコマンドを実行し、バージョン情報が表示されることを確認する。

```bash:spin_check.sh
spin -V
```

##3. iSpinインストール
* インストール  
以下のコマンドを実行し、iSpinをインストールする。

```bash:ispin_install.sh
# iSpinのディレクトリに移動する
cd /home/work/Spin/iSpin

# インストールシェルに実行権限付与
chmod 777 install.sh

# インストールシェルを実行
sudo ./install.sh
```

* 動作確認
以下のコマンドを実行し、iSpinのGUI画面が表示されることを確認する。

```ispin_check.sh
ispin
```

以上
Zybo > Link > Vivado design suite license

https://reference.digilentinc.com/zybo/refmanual

> The Vivado Design Suite license enables use of the Logic Analyzer tools, which accelerate debug and testing. This license is a 1 year, device-locked license, and will only work with the Z-7010 Zynq part on the ZYBO. After the license expires, any version of Vivado Design Suite that was released during this 1 year period can continue to be used indefinitely.

1年過ぎた後は順次更新していくのだろうか。

購入してからの1年間に出たVivadoのバージョンはそのまま使える、という意味かもしれない。
[Oracle]SQL*Plus で COLUMN FORMAT の設定を確認する

###### 実行例

```sql:
SQL> col
COLUMN   SERIAL# ON
FORMAT   999999

COLUMN   sid ON
FORMAT   99999

COLUMN   PROCESS ON
FORMAT   a10

COLUMN   OSUSER ON
FORMAT   a10

COLUMN   TERMINAL ON
FORMAT   a10
```

###### 参考

* [SQL*Plus ユーザーズ・ガイドおよびリファレンス リリース12.1 B71396-02](https://docs.oracle.com/cd/E57425_01/121/SQPUG/ch_twelve013.htm)

>現行のすべての列表示属性を表示するには、句を指定せずに、COLUMNを入力します。
Fortranで乱数を生成する

#乱数を生成
Fortranには簡易的な乱数を生成するための組み込み手続きがあります。

```fortran:rnd.f90
double precision :: rnd !スカラ,または配列
call random_number(rnd)
```
`random_number`は、0~1の範囲の乱数を生成します。`rnd`には、実数のスカラー、または配列を指定します。

しかし、このままだと実行する度に毎回同じ乱数の値の組み合わせが生成されます。これは、乱数生成に使われる初期値が、実行の度にリセットされるからです。

#乱数生成の初期値を変更する

この初期値の設定には、以下の組み込み手続きを使います。

```fortran:
call random_seed(size,put,get)
!size:初期値のサイズを取得
!put :初期値を入力
!get :初期値の取得
```
この初期値には配列が用いられ、そのサイズはコンパイラに依存します。(参照:[乱数発生の組み込み手続](http://www.nag-j.co.jp/fortran/tips/tips_RandomNumberInFortran.html))
#実行するたびに、異なる乱数を生成
乱数生成の初期値を、時間によって変更することで、簡易的な乱数を生成します。

```fortran:rnd.f90
double precision,intent(out) :: rnd
integer :: seedsize, i
integer, allocatable :: seed(:)

call random_seed(size=seedsize) !初期値のサイズを取得
allocate(seed(seedsize)) !配列の割り当て
do i = 1, seedsize
	call system_clock(count=seed(i)) !時間を取得
end do
call random_seed(put=seed(:)) !初期値を与える

do i = 1,10
	call random_number(rnd)
	write(*,*) rnd
end do
```

`call random_number(rnd)`を行う前に、`seed`を一度だけ与えておくことで、実行ごとに異なる乱数を呼び出すことができました。

以下の記事を参考にしました。
[fortran での擬似乱数生成](http://qiita.com/guilty_kaz/items/96b1f08cfe5e94b604de)
役に立つかどうかよくわからないTipsシリーズのまとめ

自分で書いた「役に立つかどうかよくわからないTipsシリーズ」の
目次を作っておきます

役に立つかどうかよくわからないけれど
お役に立てますかどうか

できるだけ増やしていきますよー

***
* [「SwiftでKotlinのapplyっぽいもの」を参考に・・・](http://qiita.com/nakau1/items/6fae911baf5f9c71584c)
* [文字列が許可された文字かどうかをNSCharacterSetで判定する](http://qiita.com/nakau1/items/32c9be34906e94603ff1)
* [文字列をPHPのsubstr関数風にSubstringする](http://qiita.com/nakau1/items/f3409347470eb0230917) :new: 
* [Stringの文字列長の取得はextensionでラップしておく](http://qiita.com/nakau1/items/4f2f39a6adbaa3ab4e2b)
* [NSLayoutConstraintをプログラムでシンプルに書く](http://qiita.com/nakau1/items/192e8054b966fc6fc79b)
* [親ビューをプロパティ化する](http://qiita.com/nakau1/items/b072db664ae1dd7f70a9)
* [UIButtonのタイトル文字をチラつかせず変更する + 便利プロパティ化](http://qiita.com/nakau1/items/8717c2f3d67c609d2604)
* [非同期のためのGCD処理を簡略化する](http://qiita.com/nakau1/items/3d9b90582613882237d5)
* [CGFloatをもっとシンプルに](http://qiita.com/nakau1/items/bac828533c7db6eacf78)
* [文字列のローカライズはextensionで](http://qiita.com/nakau1/items/2909cc605fa9bba94d81)
* [UIColorと16進整数・カラーコード文字列との相互変換](http://qiita.com/nakau1/items/43d814b0d18172d052fb)
IdeaVimのインサートモードでの範囲選択の挙動がおかしい



PycharmでIdeavimを使ってみたら、インサートモード上で範囲選択(shfit+カーソル移動)をしようとすると、挙動がおかしくて困っていたら、とある方が対策を教えてくれたのでメモしておく。

対策としては、`.ideavimrc`に以下の記述を追加しておくだけ。


```~/.ideavimrc

" SHIFT+カーソルキーで範囲選択（インサートモード）
inoremap <S-Left> <C-O>:action EditorLeftWithSelection<CR>
inoremap <S-Right> <C-O>:action EditorRightWithSelection<CR>
inoremap <S-Up> <C-O>:action EditorUpWithSelection<CR>
inoremap <S-Down> <C-O>:action EditorDownWithSelection<CR>

```

`.ideavimrc`をそもそも用意してなかったからどうせなんでいろいろ設定しようとしたけど、一番きいて欲しかった`iminsert=0`と`whichwrap`がきいてくれなかった＞＜

仕方ないから、ESC押してインサートモードから抜けて自動でIMEをオフにすることは、Google日本語入力側の設定でとりあえずやることに。
プレゼンやQiitaに投稿する記事のまとめ方についてググってみた

# Background
Qiitaを始めてみた。記事投稿するにあたり、どのような書き方が良いとされているのか調べてみた。

# Summary
- 基本（汎用目的）はSDS法
- 人に何かを教えたい時はPREP法
- 人に何かを承認させたい時はDESC法（ただし有り余るほど時間がある時限定）

Qiitaに書くなら、基本SDS法。しっかり調べてまとめを投稿する時はPREP法。プレゼンの時も同様。
DESC法は、正統だけど、忙しい人に対して使うと、最後まで説明させてもらえなさそう。
これを調べていて思ったけど、Background, Summary, Details (+References)(BSD法?)
が自分には合っていそう。

References...１つだけ読むなら
https://kanasys.com/essay/123

# Details

### 調べ方
たまたまヒットしたPREP法をもとに辿って行って、
SDS法、DESC法と繋がっていった。

### SDS (Summary, Details, Summary)法
用途　結論を早く伝える時に向いている。汎用。

- Summary （要約）
- Details （詳細）
- Summary （繰り返し）

### PREP(Point, Reason, Example, Point)法
用途　ストーリーを重視してじっくり説明したい時に使う
- Point　 （結論・主張）
- Reason　（理由）
- Example （例）
- Point　 （結論・主張の繰り返し）

### DESC（Describe Express Suggest Consequence）法
用途　人に何かを承認させたい時はDESC法（ただし有り余るほど時間がある時限定）

- Describe(描写)
- Express(表現)
- Suggest(提案)
- Consequence(結果)

# References
1. https://happylifestyle.com/9312
2. http://viral-community.com/writing/prep-3423/
3. https://kanasys.com/essay/123
世界の iOS カンファレンスまとめ

[自分のブログ](http://jpmartha.hatenablog.jp) でのメモにとどめておこうかと思いましたが、編集リクエストを受け付け可能な Qiita に投稿したほうが情報収集しやすいと考えました。

### 2016年

# 開催済み

| 日付 | 名称 | 開催国 | URL | スピーカー募集 |
|--:|:--|:--|:--|:--|
| 6月13日(月)〜16日(木) | AltConf 2016 | USA | http://altconf.com | あり |
| 7月8日(金) | CMD+U Conference | スペイン | http://www.cmduconf.com | - |
| 7月22日(金) | iOSDevCampDC 2016 | USA | http://iosdevcampdc.com | あり |
| 8月20日(土) | iOSDC 2016 | 日本 | https://iosdc.jp/2016/ | あり |
| 8月21日(日)〜24日(水) | 360iDev 2016 | USA | http://360idev.com | あり |
| 9月1日(木)〜2日(金) | try! Swift NYC | USA | http://www.tryswiftnyc.com | - |
| 9月5日(月)〜8日(木) | iOSDevUK 6 | イギリス | http://www.iosdevuk.com | - |
| 9月14日(水)〜16日(金) | NSSpain | スペイン | http://2016.nsspain.com | 〆 |
| 9月16日(金)〜17日(土) | Indie DevStock | USA | http://indiedevstock.com/ | - |
| 9月23日(金)〜24日(土) | FrenchKit | フランス | http://frenchkit.fr/ | 〆 |
| 10月1日(土)〜2日(日) | Functional Swift Conference 2016 | ハンガリー | http://2016.funswiftconf.com | - |
| 10月12日(水)〜14日(金) | #Pragma Conference 2016 | イタリア | http://pragmaconference.com | 〆 |
| 10月20日(木)〜21日(金) | iOS Conf SG - 2016 | シンガポール | http://iosconf.sg | - |
| 11月3日(木)〜4日(金) | Mobile Era 2016 | ノルウェー | http://mobileera.rocks | 〆 |
| 11月7日(月)〜8日(火) | Swift Summit San Francisco 2016 | USA | https://www.swiftsummit.com | 〆(https://www.swiftsummit.com/#cfp) |
| 11月10日(木)〜11日(金)| The Swift Alps | スイス |http://theswiftalps.com/| ? |
| 11月15日(火)〜16日(水) | do { iOS } | オランダ | http://do-ios.com | 〆 |

# 関連ブログ

- 『海外のカンファレンスに登壇する - 応募編 #potatotips』（[@shu223](https://twitter.com/shu223) さん）
  - http://d.hatena.ne.jp/shu223/20160420/1461152194
- 『ベルリンとロンドンのiOSカンファレンスで登壇した話 #UIKonf #iOSCon』（[@shu223](https://twitter.com/shu223) さん）
  - http://d.hatena.ne.jp/shu223/20160530/1464560722
- 『iOSDCで発表しました『海外のiOSカンファレンスに登壇する - 完全版』 #iOSDC』（[@shu223](https://twitter.com/shu223) さん）
  - http://d.hatena.ne.jp/shu223/20160822/1471822768
WordPressを安全に、そして簡単にアップグレードする方法


WordPressはインターネット上で運用する以上、セキュリティ対策として、常にWordPressを最新版にアップグレードすることは常識と言って良いだろう。
先日2016/05/06に、[最新版 Version 4.5.2](http://wpdocs.osdn.jp/Version_4.5.2)がリリースされたので、これを機にWordPressのアップグレード方法を示す。
以下に、一通りの方法がまとまっているので、まず読むことをオススメする。 
[WordPress のアップグレード/詳細](http://wpdocs.osdn.jp/WordPress_のアップグレード/詳細) 

要約すると、流れは以下の通り（筆者の場合）：
1.  データベースをバックアップ（-> クラウドを利用の場合、デフォルトでバックアップしていれば問題ない）
2.  全てのWordPressファイルをバックアップ（-> 普段からgitなどで構成管理していれば問題ない）
3.  全てのプラグインを無効化
4.  アップグレード作業（-> ファイルの差し替えで済む）
5.  できれば、プラグインもアップデートがあれば最新化
6.  全てのプラグインを有効化
7.  全てのWordPressファイルをバックアップ（-> gitで最新化）

ここでは、「4」が肝であるが、[WordPress のアップグレード/詳細](http://wpdocs.osdn.jp/WordPress_のアップグレード/詳細)の通り、 「削除する／してはいけないファイル一覧」に注意したい。
 「取り消し線が引かれたディレクトリ・ファイルは削除、それ以外は残します。必要なファイルを削除しないよう注意深く作業してください。」 とあるので、以下の通り行う。（※筆者の場合） 

※以下の削除とは、「新しいファイルとの差し替え」を意味する。

-    wordpressディレクトリ
	-   wp-admin/ - **削除**
	-   wp-content/
		- plugins/
            -   「プラグイン」- **使用しなくなったものがあれば削除**
            -   languages/ - **削除**
        -   themes/
            -   「デフォルトテーマ」 - **削除**
            -   「子テーマ」 - **残す** (※こんな時のため、アップグレードするのに、Wordpressは子テーマを使っていると楽である)
            -   index.php - **残す**
        -   index.php - **残す**
    -   wp-includes/ - **削除**
    -   wp-config.php - **残す**
    -   index.php - **削除**
    -   license.txt - **削除**
    -   readme.html - **削除**
    -   wp-activate.php - **削除**
    -   ... 以降、全ての「wp-◯◯」ファイル - **削除**
    -   xmlrpc.php - **削除**

アップグレードが完了したら、問題なく出来たかバージョンを確認しておく。（以下、参考） 
[WordPressバージョンの確認方法](http://viral-community.com/wordpress/wp-version-upgrade-5786/)

ちなみに、WordPressの主なセキュリティ対策については、以下に分かりやすくまとまっている。
[WordPressのセキュリティ対策でしておくべき11の項目](http://viral-community.com/wordpress/wordpress-security-1298/)
組込み / RTOS > データ項目を増やす > プログラムが途中から動かなくなる > メモリ破壊

```txt:動作環境
メモリ制限の厳しい組込み環境
```

## 症状の発生

```c
typedef struct {
   float valA;
   float valB;
   float valC;
} dataType_t;
```

上記のような構造体を定義しているとする。それを以下のように、「RTOSのとあるタスク内の関数で使用しているとする」

```
void funcSome(){
   dataType_t myData;
```

この状態で、「valD-valIを追加してください」と言われて追加するとする。

```c
typedef struct {
   float valA;
   float valB;
   float valC;
#if 1 // added
   float valD;
   float valE;
   float valF;
   float valG;
   float valH;
   float valI;
#endif
} dataType_t;
```

実行するとプログラムが途中から動かなくなる。

理由は以下の通り。

関連 [メモリの4領域](http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html)

RTOSのタスクにおいては、そのタスクに割り当てるメモリサイズを指定する(例: 256バイト)。タスク内で使用する関数(funcSome())の自動変数はそのメモリを消費して動く。

上記の例では`dataType_t myData;`として定義したmyDataはタスクで割当てたメモリ[スタック領域]を消費して動くが、項目数が増えた時に割当てたメモリサイズを超えてしまう場合がある。そうなるとメモリ破壊が生じてプログラムの動作が途中からおかしくなる。

## 対策

### static付加

1つの対策としては

```
void funcSome(){
   dataType_t myData;
```

を以下のようにする。

```
void funcSome(){
   static dataType_t myData;
```

staticをつけることで、[メモリの4領域](http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html)に記載の「スタック領域」の使用から「静的領域」での使用に変更する。


### タスク割当てメモリの増加

別の方法としてはタスク割当てメモリサイズを増やす、ということも考えられる。
dataType_t のサイズの増加分を増やす。

staticを付加するのか、タスク割当てメモリを増やすのかは、状況による。

## デバッグの難しさ

メモリ破壊が起きた時点は正常に動いている。
問題は破壊が起きた部分を読みだしてからの動作になるが、その発生を追うのは難しいように思う。

RTOSを使っていて、項目を増やしてから動作が途中で止まるようになった時、上記のような現象を疑うというのも一つの手と思われる。

こういう症状は一度経験すると再現した時に対策をすぐに思いつくが、一度も経験していない人にとっては「何が起きたか分からない」状態になり、数分のデバッグで済まなくなる。
Slack + Hubotでbotへの空リプに反応させる方法


Hubotで作成したbotに空リプ(@付きの名前だけの投稿、いわゆる空文字・空行に当たるのかな？)に反応させる方法を調べたので備忘録として書いておきます。

# 結論

- `robot.respond //, (res) ->` でbotに対してrespondされたメッセージ全てを判定
- `if ///^#{botName}$///.test(res.message.text)` で **@** + *bot名* + **:** + **半角スペース**を判定
  - つまりこれが空リプ判定

```coffeescript:airReply.coffee
module.exports = (robot) ->

  robot.respond //, (res) ->
    # いわゆる空リプ対応

    # 以下は環境変数からbot名を取得しようとした名残です
    # ローカルで試す場合はこっち
    #botName = process.env.HUBOT_SLACK_BOTNAME
    # 本番
    #botName = "@" + process.env.HUBOT_SLACK_BOTNAME + ": "
    
    # mobasol-chanというのがbot名です
    botName = "@mobasol-chan:" # 本当は固定値でなく設定値からとりたいがうまくいかないため
    if ///^#{botName}$///.test(res.message.text)
        if err
          res.send err
        if data
          res.send "空リプ送りましたね？"

```

以上。

# 解説

一応解説をしておきます。

## robot.respond //, (res) -> について

`robot.respond //, (res) ->` botに対する発言を取得できます。

下記みたいの↓
![スクリーンショット 2016-06-05 10.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/56178/18e3b8f9-1635-1ada-d5fd-b66d46555878.png "スクリーンショット 2016-06-05 10.00.36.png") 

![スクリーンショット 2016-06-05 10.04.09.png](https://qiita-image-store.s3.amazonaws.com/0/56178/319227b1-9293-8d5f-1ea9-bddf571c1886.png "スクリーンショット 2016-06-05 10.04.09.png")

ここで肝なのが正規表現を `//` にすることです。
最初は以下のように `^\s*$` として空行判定を入れて試していたのですがうまくいきませんでした。

```coffeescript:ダメなパターン
module.exports = (robot) ->

  robot.respond /^\s*$/, (res) ->
```

## res.message.textについて

次に `res.message.text` ですがこれは発言内容が入ってきます。

つまり **"@mobasol-chan: help"** とslackでbotに話しかければ **"@mobasol-chan: help"** が入り、
 **"@mobasol-chan: "** とbotに話しかければ **"@mobasol-chan: "** が入ってきます。

### 補足

ソースコメントに書いたのですが、ローカルで動かす時とSlack上で動かす時とで空リプのメッセージ形式が違うので注意が必要です。

ローカルで動かした場合の空リプは **"mobasol-chan"** となりSlack上の判定とずれてしまいます。
(Slack上の場合、bot名に **@** と **:** を追加しています)

```sh
HUBOT_SLACK_BOTNAME=mobasol-chan bin/hubot
mobasol-chan>
mobasol-chan> mobasol-chan
```

### 補足2

`yo hubot`コマンドにてhubtoを作成するとbin/hubotに固定のbot名が入るかと思います。
それではbot名の判定が固定値になってしまうので以下のように環境変数から設定するように変えています。
(ただ結局こちらの方法を取っていないのででやらなくてもairReply.coffeeは動く)

```diff
diff --git a/bin/hubot b/bin/hubot
index d8e1137..47a7db8 100755
--- a/bin/hubot
+++ b/bin/hubot
@@ -5,4 +5,4 @@ set -e
 npm install
 export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

-exec node_modules/.bin/hubot --name "mobasol-chan" "$@"
+exec node_modules/.bin/hubot --name $HUBOT_SLACK_BOTNAME "$@"
```

## if ///^#{botName}$///.test(res.message.text)について

正規表現を `//` にしているのでbotに対する全ての発言をハンドリングしてしまっています。

**"@mobasol-chan: "** のみ場合を空リプと言えるので 、`res.message.text` が **"@mobasol-chan: "** と一致するかを調べます。

バックスラッシュ三つの構文は[【CoffeeScript】正規表現リテラル内で変数を展開する](http://qiita.com/izumin5210/items/7c4302e1dd6886f32765)を参考にさせてもらいました。
(文字リテラルの変数展開)

## 出来ていないこと

本当は正解例にも書いたように `HUBOT_SLACK_BOTNAME` からbot名を取得したかったのですが、Slackで動かすとHUBOT_SLACK_BOTNAMEがundefinedになってしまったので断念(原因は調査してないです)
rsync / lsync note


#rsync daemon-mode
xinted or pure-daemon (initd, systemd).
http://www.jveweb.net/en/archives/2011/01/running-rsync-as-a-daemon.html
## Server-side permisstions
Default, server-side user set `nobody`. If you inherit file owner/group, set `gid/uid` @ `/etc/rsyncd.conf`.

## configure
[{hoge}] is module. All params set in specific module.

```:rsyncd.conf
log file = /var/log/rsync.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock

[tmp]
path = /tmp/sync
read only = false
timeout = 300
uid = root
gid = root

```

## client-side ops

Push
`sudo rsync -a [local-file/dir] rsync://[server-ip/host]/tmp`

`/tmp` is not absolute path. This is module name defined at severside-configure.
めざせpythonライブラリマスター （30）chronyk

#【ライブラリ説明】
　日時の操作ができる

#【プログラム】
```py:chronyk.py
# -*- coding: utf-8 -*-

from chronyk import Chronyk

t = Chronyk(1410531179.0)
t = Chronyk("May 2nd, 2016 12:51 am")
t = Chronyk("yesterday")
t = Chronyk("21. 8. 1976 23:18")
t = Chronyk("2 days and 30 hours ago")

print t.ctime()
# Thu Jun 02 05:45:10 2016
print t.timestamp()
# 1464813910.0
print t.timestring()
# 2016-06-02 06:45:10
print t.timestring("%Y-%m-%d")
# 2016-06-02
print t.relativestring()
# 3 days ago
print t.date()
# 2016-06-02
print t.datetime()
# 2016-06-02 05:45:10
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/Chronyk/1.0.1)
　[github](https://github.com/KoffeinFlummi/Chronyk)
めざせpythonライブラリマスター （29）table_printer

#【ライブラリ説明】
　辞書を見やすいテーブルにする

#【プログラム】
```py:table_printer.py
# -*- coding: utf-8 -*-

from table_printer import TablePrinter

fmt = [
  ('Title',         'title',        20, 'left'),
  ('Description',   'description',  20, 'right'),
]
data = [{'title': 'Hello', 'description': 'World'}]
totals = {'title': 'TOTAL', 'description': '1 title'}
print TablePrinter(fmt, sep='|', ul='=', tl='-', bl='_')(data, totals)
```

#【結果】
```text:table_printer.txt
--------------------|--------------------
Title               |         Description
====================|====================
Hello               |               World
====================|====================
TOTAL               |             1 title
____________________|____________________
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/table_printer/0.1.4)
　[github](https://github.com/agramian/table-printer)
SuperCSVメモ

## 特徴

SuperCSVはBeanマッピングができる

## 例1 csvファイルを読み込む

プロジェクト配下に以下を作成
/resources/sample.csv
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/33237/3afce3d6-75f8-3253-6848-3def774e3070.png)


```Main.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.supercsv.cellprocessor.constraint.NotNull;
import org.supercsv.cellprocessor.constraint.StrMinMax;
import org.supercsv.cellprocessor.constraint.StrRegEx;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

public class Main {
	static String CSV_FILENAME = System.getProperty("user.dir") + File.separator + "resources" + File.separator + "sample.csv";

	public static void main(String[] args) {
		try {
			ICsvBeanReader beanReader = new CsvBeanReader(new InputStreamReader(new FileInputStream(new File(CSV_FILENAME)), "SJIS"), CsvPreference.EXCEL_PREFERENCE);
			try {
				final String[] header = beanReader.getHeader(true);
				final CellProcessor[] processors = getProcessors();
				User user;
				while ((user = beanReader.read(User.class, header, processors)) != null) {
					System.out.println(
							String.format("行数=%s, user=[%s]", beanReader.getLineNumber(), user));
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

	}

	private static CellProcessor[] getProcessors() {
		final String emailRegex = "[a-z0-9\\._]+@[a-z0-9\\.]+"; // just an example, not very robust!
		StrRegEx.registerMessage(emailRegex, "must be a valid email address");

		final CellProcessor[] processors = new CellProcessor[] {
				new StrMinMax(6, 20), // id 6桁から２０桁の間
				new NotNull(), // name
				new StrRegEx(emailRegex) // email
		};

		return processors;
	}
}

```


```User.java
public class User {
	private String id;
	private String name;
	private String email;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String toString() {
		return "id=" + id + ",name=" + name;
	}
}

```

結果

```
行数=2, user=[id=123456,name=zakki]
行数=3, user=[id=895623,name=tom]

```
めざせpythonライブラリマスター （28）verbalexpressions

#【ライブラリ説明】
　難しい正規表現を取り扱いやすくします

#【プログラム】
```py:verbalexpressions.py
# -*- coding: utf-8 -*-

from verbalexpressions import VerEx
verbal_expression = VerEx()

tester = (verbal_expression.
            start_of_line().
            find('http').
            maybe('s').
            find('://').
            maybe('www.').
            anything_but(' ').
            end_of_line()
)

test_url = "https://www.google.com"

if tester.match(test_url):
    print "Valid URL"
    # Valid URL

print tester.source()
# ^(http)(s)?(\:\/\/)(www\.)?([^\ ]*)$
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/VerbalExpressions/0.0.1)
　[github](https://github.com/VerbalExpressions/PythonVerbalExpressions)
めざせpythonライブラリマスター （27）benchit

#【ライブラリ説明】
　ベンチマークテスト

#【プログラム】
```py:benchit.py
# -*- coding: utf-8 -*-

from benchit import BenchIt

b = BenchIt()

b.mark("Stuff Done")

for i in range(1,1000000):
    b.mark("In loop")
    pass  # more stuff done

b.mark("More stuff completed")
b.display()
```

#【結果】
```text:display
+----------------------+----------+------+--------+----------+---------+---------+
| Marker               | Method   | Line |  Loops | Avg Time | Runtime | Percent |
+----------------------+----------+------+--------+----------+---------+---------+
| Stuff Done           | <module> |    7 |      1 |  0.00000 | 0.00000 |    0.00 |
| In loop              | <module> |    9 | 999999 |  0.00000 | 1.47100 |   89.91 |
| More stuff completed | <module> |   12 |      1 |  0.01700 | 0.01700 |    1.04 |
+----------------------+----------+------+--------+----------+---------+---------+
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/bench-it/0.2.5)
　[github](https://github.com/scuml/benchit)
めざせpythonライブラリマスター （26）easyxml

#【ライブラリ説明】
　pythonでxml生成できる

#【インストール注意】
　`pip install -e git+git://github.com/5monkeys/easyxml.git@develop#egg=easyxml`
　　上記コマンドでインストールする

#【プログラム】
```py:easyxml.py
# -*- coding: utf-8 -*-

from easyxml import EasyXML

books = EasyXML('books')
books.book(title='Example A')
books.book.author(name='John Smith', age=57)
books.book.publisher(name='Publisher A')
books.book(title='Example B')
books.book.author(name='Jane Doe', age=30)
books.book.author(name='James Cutter', age=45)
books.book.publisher(name='Publisher B')
print str(books)
# <?xml version="1.0" ?><books><book title="Example A"><author age="57" name="John Smith"/><publisher name="Publisher A"/></book><book title="Example B"><author age="30" name="Jane Doe"/><author age="45" name="James Cutter"/><publisher name="Publisher B"/></book></books>
```

#【問題】
　出力したxmlが改行されてない・・・

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/easyxml/0.1.0)
　[github](https://github.com/5monkeys/easyxml/tree/develop)
[メモ] LinuxMint(Ubuntu)にwxPython3.xをインストールする

LinuxMint(Ubuntu)を使用していますが、aptだとwxpythonのvsersionが2.8.xまでしかインストールできません。
wxpython3.xのインストール方法のメモです。

 + 事前に必要なパッケージをapt-get install

```
$ sudo apt-get install dpkg-dev build-essential python2.7-dev libwebkitgk-dev libjpeg-dev ligtiff-dev libgtk2.0-dev libsdl-dev libgstreamer-plugin-base0.10-dev libnotify-dev freeglut3 freeglut3-dev
```

 + wxpython3.x のリポジトリをclone

```
$ git clone https://github/wxWidgets/Phoenix
```
 + Phoenixディレクトリで以下をを実行

```
$ cd Phoenix
$ git submodule init
$ git submodule update
$ sudo python build.py dox etg --nodoc sip build
```

 + 確認

```
$ python
>>> import wx
>>> wx.version()
'3.0.3 gtk2 (phoenix)'
```

今度はwxPythonでオセロを作ろうと思います。