OmniAICreator/Qiita-1.07M huggingface dataset:
簡単にalt属性の抜けをチェックする方法

## 忘れがちなalt属性

HTMLをマークアップする際に、画像のalt属性ってついつい忘れてしまいますよね...。
しかし、SEO対策の意味でもアクセシビリティ担保の意味でもalt属性はもれなく書いておきたい。
というわけで、今日はシンプルなStyle要素を使ってalt属性の抜け漏れを簡単にチェックする方法を紹介します。

例えば下のような画像を使用したHTMLレイアウトがあるとき

```html:index.html
<html>
<body>
--省略--
  <div class="row">
    <div class="column">
      <img src="pathto/hoge.jpg" alt="画像1">
    </div>
    <div class="column">
      <img src="pathto/fuga.jpg">
    </div>
    <div class="column">
      <img src="pathto/wow.jpg" alt="画像3">
    </div>
  </div>
</body>
</html>
```
![Bootstrap · The world s most popular mobile first and responsive front end frameworks..png](https://qiita-image-store.s3.amazonaws.com/0/119598/ca9c540c-7559-db29-2c61-599ffb030617.png)

1枚目、3枚目の画像（img要素)にはちゃんとalt属性が入っていますが、2枚目の画像にはalt属性を入れ忘れています。
実際の制作においてはもっと画像の数は多くなりますので、ソースコード上で一つ一つ目視確認とか、なるべくやりたくない...っていうかそれ絶対見落としが発生するパターンですし。
そこで簡単なスタイルを指定して、これをチェックします。

## スタイルを指定してalt属性の抜けをチェック

```html:index.html
<html>
<body>
<style>
img:not([alt]){
    outline: 5px solid red;
}
</style>
--省略--
  <div class="row">
    <div class="column">
      <img src="pathto/hoge.jpg" alt="画像1">
    </div>
    <div class="column">
      <img src="pathto/fuga.jpg">
    </div>
    <div class="column">
      <img src="pathto/wow.jpg"alt="画像3">
    </div>
  </div>
</body>
</html>
```

![Bootstrap · The world s most popular mobile first and responsive front end framework..png](https://qiita-image-store.s3.amazonaws.com/0/119598/02015838-741a-f003-109f-ca60fd9ba681.png)
はい、altが抜けている画像を赤枠で囲むことが出来ました。
これを応用すればhref属性のないa要素や、type属性のないbutton要素などもチェック出来ますね。素晴らしい。
このHTMLチェックが、もっと簡単に出来るツールもあります。それが[Yahoo Debug CSSのChrome拡張機能](https://chrome.google.com/webstore/detail/yahoo-debug-css/mbakhigfcmlfmgeedeolgaiajpdnclpk)です。
でもこのくらい簡単なものなら自分用にカスタマイズして、一つのCSSにまとめておくほうが使いやすいかもです。
おこのみで！

# 参考資料

- [コーディングWebアクセシビリティ](https://www.borndigital.co.jp/book/5318.html)
- [debugCSS : (X)HTML debugging tool built with CSS](https://yahoo.github.io/debugCSS/)
OpenWRTをOSXでクロスコンパイルするときの注意点

OpenWRTのpackageにあるMakefileは腐っているので、クロスコンパイルすると.dylibが吐き出されることがある。
makeに`--target=linux`と入れてあげないと`.so`が生成されない。

ブチ切れ。
CentOS7へGCC4.9.3をインストール

# GCCについて
GCCとは、UNIXやLinux、Windowsなどで動作するフリーのコンパイラです。
現在、CentOS7のyumリポジトリでインストールできるGCCのバージョンは、`4.8`です。
今回は、新しいGCCのバージョン`4.9.3`をCentOSにインストールする方法について書きます。

# 開発環境
* OS: CentOS7.2

```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

# GCCのインストール
### 0.すでにGCCがインンストールされていたら削除する

```
$ yum list installed | grep gcc
$ sudo yum remove gcc libgcc
```
### 1.依存関係のあるライブラリをインストール

```
$ sudo yum install -y libmpc-devel mpfr-devel gmp-devel
```

### 2.gccのバージョン4.9.3をダウンロード・解凍

```
$ cd /tmp
$ curl -O ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-4.9.3/gcc-4.9.3.tar.bz2
$ tar xvfj gcc-4.9.3.tar.bz2
```

### 3.gccのビルド
ビルドにとても時間がかかります。

```
$ cd gcc-4.9.3
$ make -j 4
```
`make`（アプリケーションのビルド）は`-j`オプションをつけることで、プロセスを並列実行することができます。
今回は、最大ジョブ数に`4`を指定しました。
このオプションは、**ビルドを高速化できる一方で、ビルドが失敗したりする場合があるので注意**です。
失敗した場合は、再度実行しましょう。

### 4.gccのインストール

```
$ sudo make install
```

### 5. インストールできたことを確認

```
$ gcc --version
gcc (GCC) 4.9.3
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
EC2インスタンスで作業前にバックアップをとりましょう

EC2で作業するときに、yumアップデートなど不可逆な作業をする前には、
必ずAMIイメージをとってからやりましょう！

よく耳にします。

ただ、マネジメントコンソール派（ほとんどの人）は、
マネジメントコンソールからAMIを取得していると思います。

でも、その際に対象インスタンスを間違っていないか？
No Rebootのチェックは漏れてないか？
ヒヤヒヤします。

手作業はいつか事故りそうなのでスクリプト化しました。
<インスタンス名（TAG: Name）>_<タイムスタンプ>
の名前でAMIをno-rebootで取得します。

```bash:backup_me.sh

#!/bin/bash

instance_id=$(curl http://169.254.169.254/latest/meta-data/instance-id)

region=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')

instance_name=$(aws ec2 describe-tags --region ${region} --filters "Name=resource-id,Values=${instance_id}" | grep "Value" | awk '{print $2}' | sed -e "s/\"//" | sed -e "s/\",//")

date_str=$(date "+%Y%m%d%H%M%S")


ret=$(aws ec2 create-image --region ${region} --instance-id ${instance_id} --name ${instance_name}_${date_str} --description "created by backup-me" --no-reboot)

echo "${instance_id}'s ami backup created!"
echo $ret 
```

あえて、jqとか使わないようにしておいたので、AWS-CLIさえ入っていれば動くはず。

これで、yum updateも怖くない（?）

```
$ ./backup_me.sh
$ sudo yum update
```
marqueeを滑らかにする

## 参考

* [marquee（マーキー）講座(01) | テンプレートとアクセスアップのでめらら楽天日記 - 楽天ブログ](http://www.agr.hokudai.ac.jp/useful/TAG/b7_scrollSamp.htm)

## サンプル

* 指定がない場合は6ピクセルずつ動く。これがカクカクしている原因。

```html:3ピクセルずつ動く
<marquee behavior="scroll" direction="up" 
 scrolldelay="40" truespeed scrollamount="3">
速さは50/1000秒で3ピクセルづつ動きます
</marquee> 
```

```html:1ピクセルずつ動く(これが限界)
<marquee behavior="scroll" direction="up" 
 scrolldelay="40" truespeed scrollamount="1">
速さは50/1000秒で1ピクセルづつ動きます
</marquee> 
```

* scrolldelay を小さくするとスクロールする速度が早くなります。(指定がない場合: `85`)
Null Object パターンを使用して Model のデフォルト値設定を集約する

# 例

以下の 2 つの Model があるとします。

```app/models/user.rb
class User < ActiveRecord::Base
  has_one :setting, dependent: :destroy
end
```
```app/models/setting.rb
class Setting < ActiveRecord::Base
  belongs_to :user

  enum format: %i(plain markdown textile)
  enum notification: %i(none email push)
end
```

User は 0 件あるいは 1 件の Setting を持ちます。

```rb
user = User.find_by(name: '佐倉 杏子') #=> #<User>
user.setting #=> #<Setting>
user.setting.format #=> "markdown"
user.setting.notification #=> "email"

user = User.find_by(name: '美樹 さやか') #=> #<User>
user.setting #=> nil
```

ここで Setting の値を使用しているコードのことを考えてみます。

```rb
case user.setting.format
when 'plain'
  #　プレーンテキストを処理
when 'markdown'
  #　markdown 記法を処理
when 'textile'
  #　textile 記法を処理
end
```

上記の case 文では `user.setting` が nil のケースを考慮できていません。そのため以下の様に書き換えます。

```rb
case user.setting&.format || 'plain'
when 'plain'
  #　プレーンテキストを処理
when 'markdown'
  #　markdown 記法を処理
when 'textile'
  #　textile 記法を処理
end
```

Setting が存在しない場合、デフォルト値として 'plain' を指定するようにしました。

しかし、このアプローチでは `user.setting` を参照しているすべてのコードで同じような記述をしなければならないでしょう。DRY ではないし、そもそも呼び出し元で設定があるかないかを逐一調べたくはありません。 :disappointed_relieved: 

ここで便利なのが、デザインパターンの [Null Object パターン](http://www.hyuki.com/dp/dpinfo.html#NullObject) です。

空の Setting を表すクラスを定義し、そこにデフォルト値の設定を集約するのです。

``````app/models/setting/null.rb
class Setting
  class Null
    def format
      'plain'.freeze
    end

    def notification
      'none'.freeze
    end
  end
end
```

NullSetting というクラス名にしてもよかったんですが、そうすると `app/models` 直下がごちゃごちゃしそうなので Setting::Null というクラス名にしてみました。

そして User に `setting_or_missing` というメソッドを定義します。

```app/models/user.rb
class User < ActiveRecord::Base
  has_one :setting, dependent: :destroy

  def setting_or_missing
    setting || Setting::Null.new
  end
end
```

この `setting_or_missing` メソッドを使用すれば、呼び出し元は User が Setting を持っているか否かに関心を持たずに済みます。:blush:


```rb
case user.setting_or_missing.format
when 'plain'
  #　プレーンテキストを処理
when 'markdown'
  #　markdown 記法を処理
when 'textile'
  #　textile 記法を処理
end
``` 

# 参考

* [Rails Refactoring Example: Introduce Null Object](https://robots.thoughtbot.com/rails-refactoring-example-introduce-null-object)
* [How to apply Null object pattern for ActiveRecord associations?](https://forum.upcase.com/t/how-to-apply-null-object-pattern-for-activerecord-associations/2251)
    * `hoge_or_missing` というメソッド名はこの記事から拝借しました。
Cakephp3.2 CarbonからChronosに。dayOfWeekについて

CakePHP3 では日付時刻を扱うライブラリでCarbonが使われていましたが、
Cakephp3.2 以降、Chronosというライブラリに置き換えられています。

基本的には互換性があるのですが、日付を受け取って曜日をint型で返すプロパティ```dayOfWeek```
に差異がありましたので共有します。

- Carbon
[Carbon - GitHub](https://github.com/briannesbitt/Carbon/blob/ecc98cd7efcfc15058b20a5d49caa1e8ae5ab8a3/src/Carbon/Carbon.php#L37)

- Chronos
[cakephp/Chronos - GitHub](https://github.com/cakephp/chronos/blob/4e1dacba2e5e92283581c7fec195c652c9e99d09/src/Traits/MagicPropertyTrait.php#L44)

ISO-8601に準拠しているのは。 1 (for Monday) through 7 (for Sunday)のようです。

基本的には、```Time::SUNDAY```のように定数を使って比較を行うようにします。
```$obj->dayOfWeek % 7```で[0-6]に置換もできます。
Ubuntu 16.04でDwarf Fortressを動かす

Dwarf Fortressを動かそうとしたらパッケージが別途必要だったので。

[![Dwarf Fortress 2014 - 001: Let's Do This](http://img.youtube.com/vi/R8Fl4RJInp8/0.jpg)](https://www.youtube.com/watch?v=R8Fl4RJInp8)

## 参考

* [games - How do I run Dwarf Fortress? - Ask Ubuntu](http://askubuntu.com/questions/226613/how-do-i-run-dwarf-fortress)

## パッケージインストール

```bash:
sudo apt-get install \
  libc6-i386 \
  libsdl-image1.2:i386 \
  libgtk2.0-0:i386 \
  libglu1-mesa:i386 \
  libsdl-ttf2.0-0:i386 \
  libopenal1:i386
```

## Dwarf Fortress起動

* [download](http://www.bay12games.com/dwarves/index.html)し解凍。

```bash:
cd df_linux
./df
```

## 終了方法

なぜか終了できなかった。
xkillでkillした
vb.netでズンドコゲッター

#概要
paiza.ioのvb.netでズンドコゲッター作って見た。
#実際
https://paiza.io/projects/uY5WPWhSNo-P8fytYfYCGg
#サンプルコード
```
imports system.net
imports System.Text
imports System.io

public class compiler
    shared function Main as integer
        Dim i As Integer = 0
        Dim s As String
        do
            s = zundoko()
            if s = "ドコ" then
                Console.Write("ドコ　")
                if i = 4 then
                    exit do
                end if
                i = 0
            else
                Console.Write("ズン　")
                i = i + 1
            end if
        loop 
        Console.WriteLine ("キ・ヨ・シ！")
        return 0
    End function
    Public Shared function zundoko() As String
        dim wc as WebClient = new WebClient()
        dim st as Stream = wc.OpenRead("http://ohijs0.paas.jp-e1.cloudn-service.com/zundoko")
        dim enc as Encoding = Encoding.GetEncoding("utf-8")
        dim sr as StreamReader = new StreamReader(st, enc)
        dim html as string = sr.ReadToEnd()
        sr.Close()
        st.Close()
        return html
    End function
end class
```
tesseractでcaptcha認証の数字画像を解読するまで

AWS EC2にて。

１．必要なソフト入れる	

```bash:
 $ sudo yum install libtool libpng-devel libjpeg-devel libtiff-devel zlib-devel
 $ sudo yum install gcc*

leptonicaインストール (かならず1.71以上を入れる)
 $ wget http://www.leptonica.com/source/leptonica-1.73.tar.gz
 $ tar xzvf leptonica-1.73.tar.gz
 $ cd leptonica-1.73
 $ ./configure
 $ make
 $ sudo make install
```
２．tesseractをいれる
 https://github.com/tesseract-ocr/tesseract
 画面右上DOWNLOAD.zipからファイル落としてサーバにUL

```bash:  
$ tar xzvf tesse*.tar.gz
$ cd tess*
$ ./autogen.sh
$ export LIBLEPT_HEADERSDIR=/usr/local/include/leptonica
$ ./configure
$ make
$ sudo make install

辞書もいれる
$ wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.eng.tar.g
$ wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.jpn.tar.gz
日本語もDLしたけど数字しかよみとらないので英語だけ使う
$ tar zxvf tesseract-ocr-3.02.eng.tar.gz
.bash_profileに環境変数を入れておく
$ vi $HOME/.bash_profile
 + export TESSDATA_PREFIX=$HOME/tesseract-ocr/tessdata
```

３．本当はこのあと”学習”が必要らしいが、まず動かしてみる
$ tesseract <CAPTCHA画像> stdout
たまに間違えるけどおおむね正しい数値が出てきたのでもうこれでよしとする
Xcode7 実機デバッグ時のクラッシュエラーについて

初めて質問させていただきます。 
私は現在Xcode7を使用してアプリケーション開発をやっております。 
現在の状態はビルドが通り実機転送してデバッグを行う段階なのですが 
XcodeのRUNボタンを押下するとアプリケーションが一瞬だけ起動しエラーで落ちてしまいます。

エラーは下記画像の箇所にて起きているようです。
<img width="775" alt="スクリーンショット 2016-05-27 16.26.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/127358/147ec78f-4249-7ff0-210b-65b3ed076118.png">
エラーの中身はこのような感じです。
<img width="783" alt="スクリーンショット 2016-05-27 16.27.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/127358/b244eaab-110b-f9db-b3b6-e337736c8f5d.png">
エラーメッセージ
dyld: malformed mach-o: load commands size (16608) > 16384

下記のことを試してみましたがエラー内容に進展はありませんでした。 
・shift + option + clean 
・preference > Locations > Advanced > Unique→Custom[Relative to Workspace]へ変更 
・General > Deployment info > Deployment Targetの見直し 
・FrameworkのTargetMembershipをRequiredからOptionalへ変更

もし同じ症状で上記以外の方法で解決された方いらっしゃいましたら是非ともご教授いただきたいです。 
至らない点などありましたらコメントで聞いていただければ幸いです。

※追記 
OSXのバージョンは10.11です。
iOSのバージョンは9.3です。 
DerivedDataの中身を削除も試してみましたがエラー内容に変化はありませんでした。
クラッシュした際のバックトレースは下記画像です。
<img width="394" alt="スクリーンショット 2016-05-30 10.01.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/127358/d2ce53db-f0e6-dbe9-a04f-5a07fecfea0b.png">
[iOS]UIAlertControllerをSwiftyに扱うライブラリを書いた

# ライブラリ「SwiftyAlert」を作りました。

ライブラリなんか作ってみたいなーと思い、作ってみました。
- github: [simorgh3196/SwiftyAlert](https://github.com/simorgh3196/SwiftyAlert)
`Carthage`と`CocoaPods`対応しました。いつも使ってるばっかりだったので、こういう風に作っているのかと勉強になりました。
「SwiftyAlert」UIAlertControllerをSwiftyにメソッドチェーンで設定して、表示することができるマイクロライブラリです。
コード量超絶少ないです。
ライブラリ作成に関しては、「[Swiftでライブラリを公開する](http://blog.morizotter.com/2015/12/16/make-library-public-with-swift/)」を参考にさせてもらいました。


# 使い方
imporatする

``` swift:*.swift
import SwiftyAlert
```

- Alert

``` swift:*.swift
Alert(title: "Alert", message: "Simple Alert.")
    .addDefault("OK")
    .addCancel()
    .show(self)
```

- ActionSheet

``` swift:*.swift
Alert(title: "ActionSheet", message: "message", style: .ActionSheet)
    .addDefault("Take Photo") { print("take phote") }
    .addDefault("Open Library") { print("open library") }
    .addDestructive("Delete") { print("delete") }
    .addCancel()
    .show(self)
```

- with TextField

``` swift:*.swift
var idField: UITextField?
var passwordField: UITextField?
        
Alert(title: "Alert", message: "Alert with TextField.")
    .addDefault("Login") {
        print("Try Login.\nID:", idField?.text, "Password:", passwordField?.text)
    }
    .addTextField { textField in
        idField = textField
        textField.placeholder = "ID"
    }
    .addTextField { textField in
        passwordField = textField
        textField.placeholder = "Password"
    }
    .addCancel { print("Cancelled") }
    .show(self) { print("Completion") }

```

# 導入方法
`Carthage`と`CocoaPods`に対応しています。
どちらも導入済みとします。

## Carthage
`Cartfile`という名前のファイルを作成。
以下を追加。

``` txt:Cartfile
github "simorgh3196/SwiftyAlert"
```

上記を記述したら`carthage update`を実行

## CocoaPods
`pod init`を実行。
できたPodfileを編集。
target_nameは自分のものを利用。

``` txt:Podfile
platform :ios, '8.0'
use_frameworks!

target 'target_name' do
pod "SwiftyAlert", '~>0.1.0'
end
```

## Manual
`SwiftyAlert/Alert.swift`を自分のプロジェクトに追加(importは不要)
or
`SwiftyAlert.xcodeproj`を自分のプロジェクトに追加(import必要)

# 最後に
是非使ってみてください。
また、初めてのライブラリの公開のため、色々間違ってたり、コードに問題があるかも？？しれません。
プルリクやスター待ってます:)
日本国外からの悪意あるアクセスをIPを指定して遮断する

# 概要

運用しているWebサイトのアクセスログをみると，海外のサーバからひっきりなしに攻撃を受けていることに気づいたので，簡単な防御策を講じました．

具体的な方法は以下の通りです．

- アクセスログを読み込み，海外IPからのアクセスがあれば`iptables`でブロックするようなスクリプトを作成．
- そのとき，Googleなどの検索エンジンのクローラーはブロックしないように注意する．
- アクセスされた海外IPが新しいものか判断するために，過去ブロックしたIPはdenyIpファイルに保存しておく．
- `cron`で５分おきにスクリプトを走らせ，新たな海外IPからのアクセスがあればブロックリストに追加する．

アクセスされた時に即座に対応できる即時性はありませんが，素早く対策を講じることを優先しました．

# 開発環境

- CentOS 6.7


# 実装方法

スクリプトはPHPで書いています．

## 準備

### IPアドレスから国を取得するためのPHPモジュール（GeoIP）

[GeoIP](http://php.net/manual/ja/book.geoip.php)を使うのでサーバに導入．

```bash
# peclコマンドを使うので必要であればpearパッケージもインストール
$ yum install php-devel php-pear geoip geoip-devel
$ pecl install geoip

# モジュールを使えるようにするために/etc/php.iniに追加
extension=geoip.so
```

## アクセスログの形式

`ddd.ddd.ddd.ddd - - [24/Apr/2016:04:24:04 +0900] "POST /hoge HTTP/1.1" 200 fugafuga`

先頭にIPアドレスが記述してある形式とします．

## 実際のスクリプト

`cron`上で以下のように，引数にアクセスログのファイルを与えて，５分おきにスクリプトを走らせることを想定しています．

```bash:cron
*/5 * * * * php /path/to/denyForeignIp.php /path/to/access.log
```


```php:denyForeignIp.php
<?php
// 引数があるか確認
if (!isset($argv)) {
  echo "You need a argument of a access log.";
  exit();
}

// 除外するIPとホスト名（自分のIPや検索エンジンのクローラーは除外）
$excludeIp = array("ddd.ddd.ddd.ddd");
$excludeName = array("google", "msnbot");

// ログファイルからIPを全取得
$file = fopen($argv[1], "r");
$spamIp = array();
while ($line = fgets($file)) {
  $result = preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $line, $m);
  if (!$result) continue;

  // 除外対象のIPは取得しない
  $hostName = gethostbyaddr($m[0]);
  if (!in_array($m[0], $excludeIp))
    foreach ($excludeName as $value) {
      if (strpos($hostName, $value) === false)
        array_push($spamIp, $m[0]);
    }
}
$spamIp = array_unique($spamIp);
fclose($file);

// 外国IPのみを有害IPとする
foreach ($spamIp as $key => $value) {
  $countryCode = @geoip_country_code3_by_name($value);
  if ($countryCode === false) continue;

  if ($countryCode === "JPN") {
    unset($spamIp[$key]);
  }
}
$spamIp = array_values($spamIp);

// アクセスされた海外IPが新しいIPだったらiptablesに追加
foreach ($spamIp as $key => $value) {
  $existFlg = false;

  $denyIpFile = fopen("/path/to/denyIp", "w+");
  while ($denyIpLine = fgets($denyIpFile)) {
    $denyIpLine = str_replace(array("\r\n", "\r", "\n"), "", $denyIpLine);
    if ($value  === $denyIpLine) {
      $existFlg = true;
      break;
    }
  }

  if (!$existFlg) {
    fwrite($denyIpFile, $value.PHP_EOL);
    exec("iptables -A INPUT -s ".$value." -j DROP");
  }
  fclose($denyIpFile);
}

// ipteblesを保存
exec("/sbin/service iptables save");
```
OSSとOIVの関係

IBM Watson Summit 2016のあるセッションでLinux Foundation 日本ディレクタのLinux Foundation 福安徳晃さんの話がとても興味深かった。よく知られている事もふくめて備忘録：

**Linux Foundation**
 現在30以上のOSSプロジェクトがFoundationで推進されている
・Linux Kernel開発のために立ち上がったFoundationであるが、現在はOSS開発ノウハウ自体を様々な技術開発にも展開すべく活動を多角化
・空軍が使う用途で開発したリアルタイム機能を実は金融機関でも利用される事例がある
・つまりOSS開発の最大のメリットはマルチインダストリーが関与する事
・思わぬ機能が全く予想しなかった業界に適用される事がある

具体的には、US Navyの軍事機器向けに必要とされていたリアルタイム性の機能が、結果的に金融機関のトランザクション処理に非常に有効であった例がある。

OSS開発はマルチインダストリーでマルチファンクション。最近、OIV（オープンイノベーション）で外部の開発力やアイデアを活用することで自社の課題を解決し、これまでにない価値を生み出すことが特に大企業では求められている。これによって、これまで自社単独で進めていた研究開発を迅速かつ効率的に行えるということ。

[US Navy Builds a Stealth and Linux-Powered Zumwalt Class Destroyer](http://news.softpedia.com/news/US-Navy-Builds-a-Stealth-and-Linux-Powered-Zumwalt-Class-Destroyer-472247.shtml)

こう考えると、オープンイノベーションはマルチインダストリーで実現されるべきなのかもしれない。
Rubyから(Twitter経由で)Facebookに投稿

なんか良いGemはないかと探したんですが、乱立し過ぎててよく分かりません。

ちょっとずるい方法なんですが、Twitterを経由したら簡単でした。「設定」->「アプリ連携」と進んで、ツイートをFacebookの投稿に連動させます。あとは、twitterのgemを使って呟くだけ。

参考: RubyからTwitterに投稿する方法
http://www.lumber-mill.co.jp/notes/tips/141114_ruby.html

```
tc.update 'Twitter経由で投稿！'
```
CodeIgniter3でMODx RevolutionのAPIを利用する

## はじめに

CodeIgniter3 からMODx RevolutionのAPIを利用する方法についてまとめました。

## 実装方法

CodeIgniter側において、以下のライブラリファイルを作成します。
なお、MODx Revolution,CodeIgniter3はいずれもインストールされているものとします。

```php:application/libraries/Lib_modx.php
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$modx_dir = 'modxのインストールディレクトリ/';

require_once $modx_dir . 'config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';



class Lib_modx  {

    var $modx;
    
    public function __construct() {
       $this->modx = new modX();
       $this->modx->initialize('web');
       $this->modx->getService('error','error.modError', '', '');
       
    }
}
```

## APIへのアクセス例

### MODx上の特定のリソースのコンテンツ(content)を取得する(以下の場合はID=1のリソースを参照する)

```php:application/controller/Example.php
class Example extends CI_Controller {
	
	public function index() {
		$this->load->library('lib_modx');
		
		$page = $this->lib_modx->modx->getObject('modResource', 1);
		
		echo $page->get('content');
	}
	
}
```

### ID=1の子リソースのIDを取得する

```php:application/controller/Example.php
class Example extends CI_Controller {
	
	public function index() {
		$this->load->library('lib_modx');
		
		var_dump($this->lib_modx->modx->getChildIds(1));
	}
	
}
```

##ID=1の子リソースのオブジェクトを取得して配列で返す

```php:application/controller/Example.php
class Example extends CI_Controller {
	
	public function index() {
		$this->load->library('lib_modx');
		
		$query = $this->lib_modx->modx->newQuery('modResource');
		$query->where(array(
  			'published' => true,
  			'deleted' => false,
  			'id' => 1
		));
		
		$resources = $this->lib_modx->modx->getCollection('modResource',$query);
		
		foreach ($resources as $resource) {
			$resource_array = $resource->toArray();
			$result[] = $resource_array;
		}
		
		var_dump($result);
	}
	
}
```

## 参考サイト
- [MODx Docs / Revo2.0 -Loading MODx Externally](https://rtfm.modx.com/revolution/2.x/developing-in-modx/other-development-resources/loading-modx-externally)
- [MODx Docs / xPDO2.0](https://rtfm.modx.com/xpdo/2.x/)
CakePHP2、レンサバとかmod_rewriteも使えない時の設定

世の中、意外にmod_rewriteが使えない、というサーバーが多い。
app/webroot をドキュメントルートにする、なんて設定もできない訳で、もうまるごとFTPでアップして、さあ動作確認、となる。
で、今頃気がついたんだが、composerでcakephpを設定した場合には、cakephp直下に

    index.php
    .htaccess

が存在しないんだ。（これはzipでダウンロードした場合には含まれている。）
まるごとアップした場合はこれを作ってやらないとうまくいかない。
ということで、cakephpフォルダー直下に、（appフォルダーの上ね）

```php:index.php
<?php
define('APP_DIR', 'app');
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__));
define('WEBROOT_DIR', 'webroot');
define('WWW_ROOT', ROOT . DS . APP_DIR . DS . WEBROOT_DIR . DS);

require APP_DIR . DS . WEBROOT_DIR . DS . 'index.php';
```

を作る。mod_rewriteが使えない場合は、
app以下、app/webroot以下のhtaccessを削除して、core.phpの以下のコメントアウトを外す。

```php:app/Config/core.php
	//Configure::write('App.baseUrl', env('SCRIPT_NAME'));
```

で、/users/login ではなく、index.php/users/login を開く。
Falcon CORS



# Falcon CORS
There is a package for cors. But we can add CORS function very easily.

https://pypi.python.org/pypi/falcon-cors

### Use middleware and attach acess-control-allow-origin


```python

import falcon

class CORSMiddleware:
    def process_request(self, req, resp):
        resp.set_header('Access-Control-Allow-Origin', '*')

class Todo:
    def on_get(self, req, resp):
        resp.status = falcon.HTTP_200
        resp.body = '{"foo":"bar"}'

api = application = falcon.API(middleware=[CORSMiddleware()])
todo = Todo()

api.add_route('/todo', todo)
```



```
HTTP/1.1 200 OK
Connection: close
Date: Fri, 27 May 2016 07:14:46 GMT
Server: gunicorn/19.6.0
access-control-allow-origin: *
content-length: 13
content-type: application/json; charset=UTF-8

{
    "foo": "bar"
}
```
【初心者向け】gulp触るなら覚えておいたほうが良いコマンド3選＋α


# まずはこの3つを覚える！
下記の3つを覚えておくと、gulp触るには十分。

## ファイルの表示

```
ls
```

## 指定先のディレクトリに移動

```
cd [path]
```

## 現在いる場所を表示

```
pwd
```


# 黒い画面に慣れてきたら！

ファイル操作しだすと、下記も覚えておくと楽です。

## ディレクトリを作成する
```
mkdir [dir] 
```

## 空のファイルを作成する
```
touch [file]
```

## ファイルを移動する
```
mv [file][dir]
```

## ファイルをコピーする
```
cp [file][dir]
```

## ファイルを削除する
```
rm [file][dir]
```

こちらの記事もどうぞ。

【初心者向け】gulpをはじめる for Mac
http://qiita.com/kobatatakayuki/items/0dba599c5dfab12008c7

以上です。
Ruby で画像の向きを補正

ImageMagick の `convert -auto-orient`の挙動はやや不思議だ。EXIF 情報の Orientation 情報に従って、自動的に画像の向き(90度回転等）を補正してくれるはずなのに、なぜかそう動かない時がある。

そこで、`convert -auto-orient` 相当の動きを Ruby で書いてみた（要 ImageMagick)。Orientation は 1 〜 8 があるが、1はそのままの動きなので、問題ないとして、2,4,5,7 については、左右反転なので、あまりないと思って省いた。[Orientationの定義](http://qiita.com/mdew150/items/b95c1be24005aa6cf6b7)を思い浮かべればそれほど難しくなく書けるはず。`-strip` で EXIF 情報全体を削除している。

## コード

```rb
def orientation(path)
  `identify -format '%[EXIF:Orientation]' ${path}`.to_i
end

def auto_orient_options(path)
  case orientation(path)
  when 3 then "-rotate 180"
  when 6 then "-rotate 270"
  when 8 then "-rotate 90"
  end
end

def convert_auto_orient(path, new_path)
  system("convert #{auto_orient_options(path)} -strip '#{path}' '#{new_path}'")
end

convert_auto_orient("original.jpg", "reoriented.jpg")
```
DirCaster で かな漢字のタイトルなどをつかえるようにする。

# かな漢字のタイトルが表示されない

いまさらながら podcast しようとして mp3 ファイルをつくりました。
id3tagで タイトルなどを入力して ファイルを WEBサーバに転送しました。

podcast用のツールの DirCaster を インストールして 設定し、ブラウザで feedのURLへアクセスしたら タイトルが !? とかに なって せっかく 設定した文字が 表示されない。

#DirCasterを解析してみる
ソースを よんでみると ID3タグが lib_getid3を つかっていて データがとりだせているのは echo を はさんで みて りかいできた。

読み出したtitleなどの情報を `stripJunk()` という 関数で 文字を すててるのがわかりました。asciiの国の人は 7bitの 世界でいいかもしれないけど かな漢字をつかう私は それでは だめなので まずは この関数を呼ばないことにしました。

ID3のバージョンによって ファイルに 記録されている文字コードが UTF-16だったりUTF-8だったりするので いつもの `mb_convert_encoding()` をつかって UTF-8 に変換します。
`$this->title = mb_convert_encoding($tit, "UTF-8", "auto");`
この部分を修正しても まだ `&auml;&raquo;�&aelig;�&yen;&atilde;`な 出力になっていたのでほかにも なにか変換してるだろうとと探したところ
`title = htmlentities( $title );`と HTMLエンティティに 変換してるところを発見 かな漢字で この関数を つかってはいけないので 必要最低限の変換を行う`htmlspecialchars()` に修正しました。 （ mb_encode_numericentity() を使うほうが 良い可能性はありますが・・・出力の可読性重視で htmlspecialcharsにしました。）

そうしたところ ようやく期待通りに タイトルが 出力されるようになりました。

#FEEDがただしいかチェック
 [feedvalidator][link-1]で チェックしたところ サーバの報告とXMLの内容が 不一致になってると 指摘されたので ヘッダ出力を修正して キャラコードを UTF-8 と宣言しました。
`  header('Content-type: text/xml; charset=UTF-8', true);`

めでたしめでたし

[link-1]:http://www.feedvalidator.org/

追記(20170726)
ファイル名が 仮名漢字だと うまくいかないようです。

追記(2017/9/4)
PHPのバージョンによって htmlentitiesの エンコードパラメータの defaultが ちがうようで それが原因でした。 

`htmlentities($a)` と なっているところを `htmlentities($a,ENT_COMPAT,"UTF-8")` に変更しました。

追記(2017/9/12)
うまく ダウンロードできない ファイルが 存在したので URLの作り方を 再考察して

```
$url = $rootMP3URL."/". str_replace("%2F", "/",rawurlencode($filename));
```

と rawencode して / を 元に戻すようにしました。
monoでASP.NET APIがMissing Methodを吐く

単純に言っちゃうとHttpRequestBaseにGetBufferedInputStreamがない。
Mono 4.3.x系を入れると問題が解決するようだがMono 4.2.xでどうやって対応するか。
今回はPostハンドラをクイックハックした。

```csharp
#if MONO
        public string Post()
        {
            var buffer = HttpContext.Current.Request.BinaryRead(HttpContext.Current.Request.ContentLength);
            var jsonStr = System.Text.Encoding.ASCII.GetString(buffer);

            T parsed = JsonConvert.DeserializeObject<T>(jsonStr);
#else
        public string Post([FromBody]T parsed)
        {
#endif
```
PythonでREST APIをサクっと実装

勉強会でAPIについて学んだのでPythonで簡単なREST APIを実装してみました.
Pythonのインストール方法などは他で説明されているので割愛します．


# 環境
+ CentOS 7.0
+ Python 3.5.1
+ SQLite3 3.9.2

# モジュールのインストール
ウェブアプリケーションフレームワークのFlaskと
ORMのPeeweeをインストールします．

```
$ pip install flask
$ pip install peewee
```

# データのインポート
以下の様なデータをデータベースにインポートします．

```tsv:user.tsv
#userId     userCompany  	userDiscountRate
Us0ymuik	密林コンプライアンス印刷	46
Us77qmr2	西日本密林エンターテイメント	49
Usdj7ej1	密林ソリューション	18
Usjx15uh	横浜ヒュージハードソフト	7
Usqd7wpe	面本信金	1
Uswvrn3s	ゴールデンモービルソリューション	7
Us3h2d0a	ベンザソーシャルゲーミングソリューション	26
Usa4c2hm	ヴァーチャウェアソーシャルゲーミング産業	7
.
.
.
```


Peeweeでデータベースに接続してデータを登録します．

```python:import.py
# -*- coding: utf-8 -*-
import peewee

# データベースを指定
db = peewee.SqliteDatabase("data.db")

# ユーザーモデルを定義
class User(peewee.Model):
    userId = peewee.TextField()
    userCompany = peewee.TextField()
    userDiscountRate = peewee.IntegerField()

    class Meta:
        database = db

# ユーザーテーブル作成
User.create_table()

# tsvファイルを一行ずつ読み込んでタブで分割し，それぞれをデータベースに登録
for line in open("user.tsv", "r"):
    (userId, userCompany, userDiscountRate) = tuple(line[:-1].split("\t"))
    if userDiscountRate.isdigit(): # 一行目のコメント対応．
        User.create(userId = userId,
                    userCompany = userCompany,
                    userDiscountRate = int(userDiscountRate))
```

# APIの実装
<dl>
  <dt>API仕様</dt>
  <dd>機能：顧客情報の取得</dd>
  <dd>パス：Users/:userId</dd>
  <dd>メソッド：GET</dd>
</dl>

```python:api.py
# -*- coding: utf-8 -*-
from flask import Flask, jsonify, abort, make_response
import peewee
# import json

db = peewee.SqliteDatabase("data.db")

class User(peewee.Model):
    userId = peewee.TextField()
    userCompany = peewee.TextField()
    userDiscountRate = peewee.IntegerField()

    class Meta:
        database = db

api = Flask(__name__)

@api.route('/Users/<string:userId>', methods=['GET'])
def get_user(userId):
    try:
        user = User.get(User.userId == userId)
    except User.DoesNotExist:
        abort(404)

    result = {
        "result":True,
        "data":{
            "userId":user.userId,
            "userCompany":user.userCompany,
            "userDiscountRate":user.userDiscountRate
            }
        }

    return make_response(jsonify(result))
    # Unicodeにしたくない場合は↓
    # return make_response(json.dumps(result, ensure_ascii=False))

@api.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
    api.run(host='0.0.0.0', port=3000)
```

# 確認
```
$ curl -i http://0.0.0.0:3000/Users/Usdj7ej1
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 118
Server: Werkzeug/0.11.10 Python/3.5.1
Date: Fri, 27 May 2016 06:29:57 GMT

{"data": {"userCompany": "密林ソリューション", "userDiscountRate": 18, "userId": "Usdj7ej1"}, "result": true}%
```
【IDCFクラウド】cloudstack-apiで仮想マシンを作成する。

# はじめに
cloudstack-apiで仮想マシンの構築を行いたいと思います。

## 基本情報

ということで、今回は以下の情報をもとに仮想マシンのを作成を行います。

|項目　　　　　　　   |名前                           |
|----------|------------------------------|
|ゾーン　　　　　　　　　 |radian                        |
|インスタンス |light.S1                      |
|テンプレート |Ubuntu Server 14.04 LTS 64-bit|
|IP        |10.13.0.50                    |
|所属グループ|test                          |
|ホスト名    |test-name                     |
|ディスプレイ名|create-test                   |
|キーペア    |hogehoge                      |
## 事前確認
仮想マシンを作成する前にまず、現在IDCFクラウドでの稼働状況を確認しておきたいと思います。

```bash:コマンド
$ cloudstack-api listVirtualMachines -t name
```

```text:戻り値
no data found
```

現在、環境内には１台も仮想マシンが作成されていないため_no data found_となっています。


## 仮想マシンの作成
それでは仮想マシンを作成しましょう。

作成には`createInstanceGroup`を利用します。

```bash:コマンド
$ cloudstack-api deployVirtualMachine \
--zoneid a53ff3d3-042b-4cbd-ad16-494bb8d33e06 \
--serviceofferingid e01a9f32-55c4-4c0d-9b7c-d49a3ccfd3f6 \
--templateid 6eee3f7d-2193-4df7-81d5-bc2169ac3380 \
--ipaddress 10.13.0.50 \
--name test-host \
--keypair hogehoge \
--displayname create-test \
--group test
```

```text:戻り値
{
  "deployvirtualmachineresponse": {
    "id": "b1230e50-f75b-4343-8d6e-ca7a4efcf2b0",
    "jobid": "dee8c58d-069a-408a-98c3-03ea1e4e3c50"
  }
}
```
今回指定したオプションについての説明は以下のとおりです。

|オプション            |内容                        |
|-------------------|---------------------------|
|--zoneid           |ゾーン環境ID                 |
|--serviceofferingid|インスタンスID                |
|--templateid       |テンプレートのID               |
|--ipaddress        |IPアドレス                    |
|--name             |ホスト名                     |
|--keypair          |デフォルト(root)で利用するキーペア|
|--displayname      |コンソール画面で表示される名前    |
|--group            |仮想マシンが所属するグループ     |

簡単に説明すると、

- _ipaddress_オプションで仮想マシンに`10.13.0.50`のIPアドレスを付与
- SSHログインするために必要なデフォルトキーは`hogehoge`を配置
- _name_オプションでSSHログインした際に表示されるホスト名を`test-host`に設定

といった内容になります。

また、仮想マシンに直接影響はありませんが、

- _group_オプションで仮想マシンを`test`にグルーピング
- _diplayname_オプションでコンソール画面での表示を`create-test`に設定

を行っています。


## 確認

確認はコンソールおよびコマンドでも可能です。

- コンソール画面で確認
![cloudstack-api_createvm01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/39962077-6be0-39ff-bba7-87d00e4823b7.png)

<br>

- コマンドで確認

```bash:コマンド
$ cloudstack-api listVirtualMachines -t name,keypair,displayname,group
```

```text:戻り値
+-----------+----------+-------------+-------+
|    name   | keypair  | displayname | group |
+-----------+----------+-------------+-------+
| test-host | hogehoge | create-test | test  |
+-----------+----------+-------------+-------+
```


# おわりに

今回、仮想マシンを作成しましたが、このままではグローバルIPが無いため外部との通信ができません。
次回は仮想マシンをグローバルIPに付与するところをcloudstack-apiコマンドで行いたいと思います。
[>>【IDCFクラウド】cloudstack-apiで仮想マシンにパブリックIPを付与する。](http://qiita.com/kooohei/items/524c1d5b4e541c695c06)
【R】for文を使わず、順序の全通りを作る

## R言語で、for文を使わず、rep()で、順序の全通りを作る。

A = {3,1,0}
B = {1,0}
C = {3,0}
D = {1}
E = {3,1}
各集合から、素を一つ取り、全通りを作ろう。
###全通り

```
   a b c d e
1  3 1 3 1 3
2  3 1 3 1 1
3  3 1 0 1 3
4  3 1 0 1 1
5  3 0 3 1 3
6  3 0 3 1 1
7  3 0 0 1 3
8  3 0 0 1 1
9  1 1 3 1 3
10 1 1 3 1 1
11 1 1 0 1 3
12 1 1 0 1 1
13 1 0 3 1 3
14 1 0 3 1 1
15 1 0 0 1 3
16 1 0 0 1 1
17 0 1 3 1 3
18 0 1 3 1 1
19 0 1 0 1 3
20 0 1 0 1 1
21 0 0 3 1 3
22 0 0 3 1 1
23 0 0 0 1 3
24 0 0 0 1 1
```

###コード

```Perm.r
A <- c(3,1,0)
B <- c(1,0)
C <- c(3,0)
D <- c(1)
E <- c(3,1)
LEN <- length(A) * length(B) * length(C) * length(D) * length(E)

Perm <- cbind( rep( A, each = LEN / length(A), len = LEN ), 
               rep( B, each = LEN / ( length(A) * length(B) ), len = LEN ), 
               rep( C, each = LEN / ( length(A) * length(B) * length(C) ), len = LEN ), 
               rep( D, each = LEN / ( length(A) * length(B) * length(C) * length(D) ), len = LEN ),
               rep( E, each = LEN / ( length(A) * length(B) * length(C) * length(D) * length(E) ), len = LEN ) )
```
Unityで画面のスクリーンショットを撮る(Application.CaptureScreenshotじゃない方法)


最近リリースしたアプリ（[チャリで来た。カメラ](http://qiita.com/yedo/items/17473130654c640d8369)）で、画面のスクリーンショットを `Application.CaptureScreenshot` で取得してさらにその画像を加工する、ということを行ったのだが、もっと簡単な方法があったよ・・・(T_T)

# Unityでスクリーンショットを撮る方法
## [Application.CaptureScreenshot](http://docs.unity3d.com/jp/current/ScriptReference/Application.CaptureScreenshot.html)
一番オーソドックスな方法。**ファイル名を指定するだけでスクリーンショットをファイルに保存**する。
実際アプリで使ってみたけど、意外と使いづらい。

- パスではなくファイル名指定なので保存箇所が `Application.persistentdatapath` 1択
- 「ファイルに保存される」「保存終了時のコールバックがない」ので、完成した画像をすぐに使いたい場合は待ち処理を組む必要がある

## [Render Texture](http://docs.unity3d.com/ja/current/Manual/class-RenderTexture.html)
リアルタイムに更新可能なTexture「Render Texture」をTexture2Dとして取得する方法。
こっちの方が柔軟性はあるけど、Render Texture -> Texture2D への変換の手間や、uGUIと併用したりすると少し面倒。
ただ、この方法は**カメラで映してるものをTextureとして出力するので、レイヤー分けが可能で、表示オブジェクトの制御が出来たりする(自由度は一番高い)。**

## [Texture2D.ReadPixels](http://docs.unity3d.com/jp/current/ScriptReference/Texture2D.ReadPixels.html)
そしてこれ。

*スクリーン画面からテクスチャデータへと保存するためのピクセルデータを読み込みます*

これじゃんΣ(ﾟдﾟ;)！！
このメソッドがあることは知ってたけど、名前から予想出来なかったよ_|￣|○

```csharp:
IEnumerator LoadScreenshot()
{
    yield return new WaitForEndOfFrame();

    var texture = new Texture2D(Screen.width, Screen.height);
    texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    texture.Apply();
}

void OnPostRender()
{
    if(isCreate)
    {
        var texture = new Texture2D(Screen.width, Screen.height);
        texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
        texture.Apply();

        isCreate = false;
    }
}
```

**描画が完了してからでないとエラーが出る**ので、コルーチンで `yield return new WaitForEndOfFrame()` の後に処理するか、OnPostRender 内で行うと良い。

# 最後に
`Texture2D.ReadPixels`、静的メソッドでもないし、汎用的な名前だし、`Texture2D.SetPixels` と混同したりして、気づかなかった。。。
今までめっちゃメンドクサイことをしてたよ(´・ω・｀)ｼｮﾎﾞｰﾝ

# ※追記
Render Texture を Texture2D として取得する方法も、最終的には`Texture2D.ReadPixels` で読み込む形になるから、結局2通りって感じなのかな？テラシュールさんで「[RenderTextureをTexture2DにしてSpriteに使用する](http://tsubakit1.hateblo.jp/entry/2016/06/06/221919)」こんな方法も紹介されてたけど、あまり推奨してないようだし、素直に **単にスクショを撮りたい→Application.CaptureScreenshot**、**スクショを加工したい→Texture2D.ReadPixels**って形になるかと。
ipython_良いところmemo

python を使う上で、ipythonで使うと良いところみたなのを調べてみた

#print表示より綺麗に表示される

```
In [11]: print data
{0: 0.49613688816136836, 1: 0.7609762428923907, 2: 0.5700416376550185, 3: 0.175291194455094, 4: 0.41368352630708494, 5: 0.5873027452343913, 6: 0.09669836847661195}

In [12]: data
Out[12]:
{0: 0.49613688816136836,
 1: 0.7609762428923907,
 2: 0.5700416376550185,
 3: 0.175291194455094,
 4: 0.41368352630708494,
 5: 0.5873027452343913,
 6: 0.09669836847661195}
```

#タブ補完でlinaxのように使える

```
In [13]: an_apple =27

In [14]: an
an_apple  and       any
```

#イントロスペクション（？でそのデータの情報を見ることができる）
```

In [9]: b=[1,2,3]

In [10]: b?
Type:        list
String form: [1, 2, 3]
Length:      3
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items

#？？をつけるとその関数のソースコードがみれる

In [14]: def add_numbers(a,b):
   ....:     return a+b
   ....:

In [18]: add_numbers??
Type:        function
String form: <function add_numbers at 0x1077a32a8>
File:        /Users/ykitagaw/<ipython-input-14-a9946ee651b1>
Definition:  add_numbers(a, b)
Source:
def add_numbers(a,b):
    return a+b

```

#%runコマンド
```
%run test.py
```
runの後にファイル名を渡す。値もそのまま使える

#%paste、、、コピペでコードを貼る
```
#事前にコピーしておいてから
In [19]: %paste
for num in [4, 3, 12]:
  print "num = " + str(num)

## -- End pasted text --
num = 4
num = 3
num = 12

#自分で貼り付けるやり方もある
In [21]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for num in [4, 3, 12]:
:  print "num = " + str(num)
:<EOF>
num = 4
num = 3
num = 12
```
Navigation Barのボーダーを削除する

UINavigationControllerで作るとNavigation Barの下にボーダーが表示されてしまいました。

![Artboard.png](https://qiita-image-store.s3.amazonaws.com/0/7132/e1bed6de-d14a-91e7-f939-46dc74d8b1e6.png)

どうもストーリーボードからはうまく変更できないらしいので、コードで制御する。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 影を消すには両方必要
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
    }
}
```


## 消せた

<img width="487" alt="スクリーンショット 2016-05-27 14.31.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/0101bad2-03b3-b42f-da9d-959906f1d5da.png">
EC2インスタンスのコンソールスクリーンショット

2016/5/26
[EC2 Instance Console Screenshot](https://aws.amazon.com/jp/blogs/aws/ec2-instance-console-screenshot/)
インスタンスの状態をコンソールから可視化できる機能がリリースされています。
今まで、Windowsサーバ起動時にInstance State、Status Cecksが正常終了してもELBのヘルスチェック値通りにアタッチされないので不思議でしたが、この機能でサーバの状態を確認したところ、2/2 checks passedであっても起動途中であることがわかりました。

* Instance State,Checks
![ec2-console-screenshot1.JPG](https://qiita-image-store.s3.amazonaws.com/0/58788/0fb0c646-712f-1a67-dafc-ee9b6047f7bc.jpeg)

* EC2 Instance Console Screenshot
![ec2-console-screenshot0.JPG](https://qiita-image-store.s3.amazonaws.com/0/58788/da456a55-56f3-70cf-a9fd-0f90b08f53db.jpeg)

* 起動中
![ec2-console-screenshot2.JPG](https://qiita-image-store.s3.amazonaws.com/0/58788/5c713f48-18c7-e962-6b69-005267454555.jpeg)

* 起動完了
![ec2-console-screenshot3.JPG](https://qiita-image-store.s3.amazonaws.com/0/58788/d5df9044-60e3-10b5-d572-2c86e200d7f2.jpeg)
Ruby#SSLを利用したサーバーとクライアント

文字を大文字にするサーバー

```rb:server.rb
require 'socket'
require 'openssl'

include OpenSSL

ctx = SSL::SSLContext.new()
ctx.cert = X509::Certificate.new(File.read('server-cert.pem'))
ctx.key = PKey::RSA.new(File.read('server-key.pem'))
svr = TCPServer.new(4443)
serv = SSL::SSLServer.new(svr, ctx)

socket = serv.accept
text = socket.gets
socket.puts(text.upcase)
```

"hello"を送るだけのクライアント

```rb:client.rb
require 'socket'
require 'openssl'

include OpenSSL

soc = TCPSocket.new('localhost', 4443)
socket = SSL::SSLSocket.new(soc)
socket.connect

socket.puts("hello")
puts socket.gets
```

サーバー起動

```sh
$ ruby server.rb
```

クライアント実行

```sh
$ ruby client.rb
HELLO # helloが大文字になって帰って来ます
```

### おまけ: 秘密鍵とかを作るコマンド

```sh
$ openssl genrsa -out server-key.pem 1024
$ openssl req -new -key server-key.pem -out server-csr.pem
$ openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
```
親ビューをプロパティ化する

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

UIViewは`superview`プロパティで親ビューを取得できますが、読み取り専用です

```swift
extension UIView {
	
	public var parent: UIView? {
		get {
			return self.superview
		}
		set(v) {
			if let view = v {
				view.addSubview(self)
			} else {
				self.removeFromSuperview()
			}
		}
	}
}
```

本来のビューオブジェクト同士の所有権(オーナーシップ)の思想でいけば
間違ってるような気もしなくもないですが
このようなプロパティをひとつ作ると、親ビューの設定が楽になり、さらには取得もできるようになります

```swift
let button = UIButton()

self.view.addSubview(button)

button.removeFromSuperview()
```

という実装が

```swift
let button = UIButton()

button.parent = self.view

button.parent = nil
```

という感じで、同じ挙動をシンプルに実装できます
html 要素をdata 属性から取得した値を key としたオブジェクトにする

まあ簡単なことなんですが、最近良く使うので。
lodash とか使って書いてたけど（記述量はほぼ変わらない）、面倒なのでモジュール化して使ってる。

```js:ES2015
const getNamedElements = (elms, name) => {
  const obj = {};
  for(let i = 0; elms.length > i; i++) {
    const el = elms[i];
    obj[el.dataset[name]] = el;
  }
  return obj;
};

const elms = getNamedElements(document.getElementsByTagName('div'), 'name');

console.log(elms);  // {hoge: div, fuga: div, piyo: div}
```

```html:html
<div data-name="hoge"></div>
<div data-name="fuga"></div>
<div data-name="piyo"></div>
```
XmlPullParserからDocumentを作成する

AndroidにはXMLを読み込みながらストリーミング処理する[XmlPullParser](https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html) APIと、XML文書を全て読みこんでから処理する[DOM (Document)](https://developer.android.com/reference/org/w3c/dom/Document.html) APIがあります。
基本的には目的に応じて好きな方を使えばよいのですが、R.xmlリソースIDからXMLを取得する[Context.getResources().getXml()](https://developer.android.com/reference/android/content/res/Resources.html#getXml(int))はXmlPullParserしか取得できないため、そのままではDOM APIを用いて実装した処理に渡すことができません。そこで、XmlPullParserからDocumentを作成する処理を作りました。

```java
Document from(XmlPullParser parser) throws ParserConfigurationException, IOException, XmlPullParserException {
  Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

  Node parent = document;
  int type;

  while (true) {

    type = parser.next();
    if (type == XmlPullParser.END_DOCUMENT) break;

    switch (type) {
      // タグの開始
      case XmlPullParser.START_TAG:
        Element element = document.createElement(parser.getName());

        // 要素の属性を設定
        for (int i = 0; i < parser.getAttributeCount(); i++) {
          String attr = parser.getAttributeName(i);
          String value = parser.getAttributeValue(i);
          element.setAttribute(attr, value);
        }

        // 親に追加
        parent.appendChild(element);

        // 自分を親にする
        parent = element;
        break;

      // タグの終了
      case XmlPullParser.END_TAG:
        // 親の親が次の親
        parent = parent.getParentNode();
        break;
    }
  }

  return document;
}
```

DOMのAPIはAndroidではなく標準のJavaにも含まれているので、Android以外にも利用可能なXML処理を実装するのにはDOMのAPIを使った方が便利かもしれませんね。
wp-cronが使えない時に、独自で予約投稿を実装する

ErgoDoxを買ってうはうは普通のキーボードに戻れねーと思っている今日この頃。

とある案件で、脆弱性が～セキュリティが～とクライアントに言われてwp-cronを使えないことがありました。
でも予約投稿は欲しいです。わかりました勝手に作ってみます。

Apache: 2.4
PHP: 5.6
Mysql: 5.6
WordPress: 4.5.2

``` functions.php
/**
 * wp-cronの代わりに予約投稿をする
 */
function my_cron_future_post(){

  // wp_optionsの中からcronの情報を取得
  $option_cron = get_option('cron');
  $option_publish_post = array();

  // 取得したデータから「publish_future_post」の情報を配列に代入
  foreach( $option_cron as $key => $value ){
   if(!empty($value['publish_future_post'])){
     foreach( $value as $k => $hook ){
       foreach( $hook as $md5 => $args ){
         $option_publish_post[$key] = array(
           'hook' => $hook,
           'post_id' => $args['args'][0],
         );
       }
     }
   }
  }

  // 現在の時間と比較してcronが作動するはずの時間に実行
  $now = date_i18n("U");
  foreach( $option_publish_post as $publish_time => $value ){
    if( $now >= $publish_time ){
      $this_post = get_post($value['post_id']);
      if( $this_post->post_status == 'future' ){
        $post_arg = array(
          'ID' => $value['post_id'],
          'post_status' => 'publish'
        );
        // 記事の情報更新
        wp_update_post($post_arg);
        // cronのスケジュールから削除
        wp_unschedule_event($publish_time, $value['hook']);
      }
    }
  }

}
add_action('init', 'my_cron_future_post');
```

とても無理矢理感漂っています。
ちゃんと出来る人だったこんなことしないんだろうなー。勉強不足で泣けてきますね。

なにはともあれ、とりあえず動きました。めでたしめでたし。

それはそうと、ErgoDoxから戻れないと確信してしまったので、
１ヶ月の間に2台目を購入する暴挙に出ました。お疲れ様でした。
fetchと[]の違いを、try hash で知りました。

```
a = {name: 'taro'}

a.try(:[], :name)
```

という書き方を教わりました。

```
a.try(:fetch, :name)
```

でもいけます。けど。

```rb
pry(main)> a.try(:[], :email)
# => nil

pry(main)> a.try(:fetch, :email)
# KeyError: key not found: :email from /home/vagrant/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activesupport-4.1.8/lib/active_support/core_ext/object/try.rb:45:in `fetch'

#となりますので、fetchの場合は、以下のようにします。

pry(main)> a.try(:fetch, :email, nil)
=> nil
```


そもそも、`[]`がメソッドということですので、

```
a[:name]
# => "taro"

a.[] :name
# => "taro"
```

という風にかけるんですね。それで、fetchと[]が、keyの有無でちょっとだけ挙動が変わるということでございますね。

とにかく、勉強になりました。ありがとうございます。
bootswatchのインストール手順

私的メモ
今度もう少しわかりやすいように書き直す予定

実行環境
cloud9
rubyRails 4.2.5
ruby 2.3.0p0

##bootswatchのインストールの流れ

やる内容によって作業ルートが変わります。

**既存のapplication.htmlerbを使って1から作り上げていく用**
　1→2→3-1→4-1→5

**予めテーマで用意されたレイアウトをドンっと使う場合**
1→2→3-2→4-2→5

### 1. Gemへの追記

Gemfileに必要なものを追記する。

```lang:Gemfile
#bootswatch用
gem 'twitter-bootswatch-rails', :github => 'scottvrosenthal/twitter-bootswatch-rails'
gem 'therubyracer'
gem 'execjs'
```

からの
`bundle install`

`Important:You may need to add a javascript runtime to your Gemfile in order for bootstrap's LESS files to compile to CSS. `
と、表示されたら
`gem install execjs`とコンソールに打ち込む


### 2. boostwatchのインストール

下のコマンドを打っていく。
1つめのコマンド:[theme_name]の箇所は適用させたいbootswatchのテーマ


2つめのコマンドは、viewsのlayoutsに`[theme_name].html.erb`と生成される。
注1※これは、layoutフォルダに生成される、[theme_name].html.erbを、application.html.erbに代わり使用するためで、そのまま既存のapplication.html.erbを使用、もしくは1からレイアウトを自分で作り上げていく場合は不要。

3つめのコマンドは実行後、ファイルの上書きを聞かれるので「y」を入力

4つ目のコマンドは、scaffoldでモデルを作った人だけ。[RESOURCE_NAME]はscaffoldモデル名で、コマンド実行後はファイルの上書
き確認されるので「y」入力して許可する

```lang:Gemfile
>rails g bootswatch:install [theme_name]
>rails g bootswatch:layout [theme_name]
>rails g bootswatch:import [theme_name]
>rails g bootswatch:themed [RESOURCE_NAME]
```
例:rails g bootswatch:install journal

### 3-1. application.cssの変更 (既存application.html.erbを使う場合のみ)

注1.で述べたようにそのままapplication.html.erbを使用する場合にのみ行う。
これをしないと、application.html.erbでテーマが適用されない。

require_selfの後に3行目と4行目を追記。[theme_name]は選んだテーマ名に変更

```lang:application.css
 *
 *= require_self
 *= require [theme_name]/loader
 *= require [theme_name]/bootswatch
*/
```

例:require journal/bootswatch

*追記.application.cssでエラー「couldn't find file '[theme_name]/bootswatch' with type 'text/css'と表示されapplication.cssの[theme_name]を全部小文字にしたら治った.
年のために、application.jsも同じようにしたほうがいいのかな？*

### 4-1. application.jsの変更 (既存application.html.erbを使う場合のみ)

注1.で述べたようにそのままapplication.html.erbを使用する場合にのみ行う。
これをしないと、application.html.erbでテーマが適用されない。

application.jsを開いて以下、2行を追記。


```lang:application.js
//= require [theme_name]/loader
//= require [theme_name]/bootswatch
```

### 3-2. Applicationコントローラーの変更(layoutした人だけ)

これは、最初に`rails g bootswatch:layout [theme_name]`でlayoutを丸々作った人だけ行います

application_controller.rbに以下追記
layout '[theme_name]'


```lang:application.js
class ApplicationController < ActionController::Base
  # ...
  layout 'journal'
end
```

### 4-2. assetsの変更(layoutした人だけ)

config/initializers/assets.rbに最終仕上げとして2行最後に追記

Rails.application.config.assets.precompile += %w( [theme_name].css )
Rails.application.config.assets.precompile += %w( [theme_name].js )

```lang:assets.rb
.省略
.
Rails.application.config.assets.precompile += %w( journal.css )
Rails.application.config.assets.precompile += %w( journal.js )
```

### 5. 仕上げ
で、あとはサーバーの再起動で動くはず。2016年5月27日現在
Firefox Developers Conference 2015 in Tokyo

#イベントURL
http://www.mozilla.jp/events/devcon/2015/tokyo/

#講演資料リンク
##キーノートセッション
https://www.youtube.com/watch?v=bnBH5ibsk5M
##セッション 1
###鉄腕アニメーション！　Brian Birtles
http://people.mozilla.org/~bbirtles/pres/201511-astro-animation
https://www.youtube.com/watch?v=uyxq_HXK5nI
###Chrome Extensions から見る WebExtensions　田中 洋一郎
https://docs.google.com/presentation/d/1i7Lc1c3a9_v6qEKCNTNmzwsOYa0UDfzvDz87-xHM2YA/pub?start=false&loop=false&delayms=3000
https://www.youtube.com/watch?v=XnZhQv9xctc
##セッション 2
###Inspection & tweak: Firefox を使ったフロント開発　清水智公
http://www.slideshare.net/chikoski/20151114-devtools
https://www.youtube.com/watch?v=SURwejAobqE
###TV Optimized Web App　Luke Chang

##セッション 3
###Innovation of Web App architecture　Steve Chung

###Porting C/C++ code to Web　加藤 誠
https://docs.google.com/presentation/d/1liKVavDBbcg0w8izutvVopCWKGu5M7EJPvst1JlpN_s/edit#slide=id.p
https://www.youtube.com/watch?v=XKybZiNBSEY
##セッション 4
###The Web for Everyone - Let's fix it!　Karl Dubost
https://www.youtube.com/watch?v=pW2eWPQ09MI
###ES6 in Practice　佐藤 鉄平 (@teppeis)
http://www.slideshare.net/teppeis/es6-in-practice
https://www.youtube.com/watch?v=iuXC4HIJadY
##セッション 5
###Web 技術の今日とこれから：View Source Conference レポート　矢倉 眞隆
https://www.youtube.com/watch?v=UmkgC0rlGxU
###Embedded Web で加速する Web of Things　羽田野 太巳
https://www.youtube.com/watch?v=b-KuOukHszk

#参考
Mozilla Japan - YouTube
https://www.youtube.com/user/MozillaJP

以上
pip3でmysql-connectorをインストールする方法


PythonはPython3が出たばかりの頃にツールを作った程度のど素人ですが、お仕事で環境構築することになり、python3からmysql-connectorが参照できずにハマったのでメモ。

python(2.7.x)とpython3(3.4.x)がインストールされた環境で、pip listにはmysql-connector-pythonがありましたが、pip3 listには存在しない状態で、python3からは参照できないようでした。

## インストールできない

pip3にないなら、pip3でインストールすれば良いという事で…

```bash:Console
$ sudo pip3 install mysql-connector-python
```

下記のようなエラーでインストールできません

```
  Could not find a version that satisfies the requirement mysql-connector-python (from versions: )
No matching distribution found for mysql-connector-python
```


これはpython(2.x), pip用？

```
pip3 search mysql-connector
```

で表示されるのは…？

## インストールできる

pip3 searchで、すぐ下の行に出てきた下記をインストールしてみました。

```bash:Console
$ sudo pip3 install mysql-connector-python-rf
```

こちらは問題なくインストールできました。
rfが何かは不明ですが、別名で用意されているようでした。



## おまけ

stackoverflow.comでも困っている人の投稿がいくつかあり、下記の手順でも解決できました。

```bash:Console
$ echo https://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-2.1.3.tar.gz >> requirements.txt
$ sudo pip3 install -r ./requirements.txt
```

cf. http://stackoverflow.com/questions/34489271/i-cannot-install-mysql-connector-python-using-pip


## 補足
環境構築に関わった際、Flask + SQLAlchemy + MySQL な環境構築がうまくいっていない状態でした。