OmniAICreator/Qiita-1.07M huggingface dataset:
楕円の円周上の x, y 座標を返す


## 楕円の円周上の x, y 座標を返す
```js

/**
 * 楕円の円周上の x, y 座標を返す
 *
 * @param  degree  角度
 * @param  radiusX  横半径
 * @param  radiusY  縦半径
 * @returns {}  x, y を含んだオブジェクト
 */
function getOvalPosition ( degree, radiusX, radiusY ) {
	var obj = {};
	
	// 0〜360未満に丸める
	degree = (degree % 360 + 360) % 360;
	
	// ラジアンに変換
	var radian = degree * (Math.PI / 180);
	var cos = Math.cos(radian);
	var sin = Math.sin(radian);
	
	obj.x = cos*radiusX;
	obj.y = sin*radiusY;
	
	return obj;
}

```



## 円周上の x, y 座標を返す
```js

/**
 * 円周上の x, y 座標を返す
 *
 * @param  degree  角度
 * @param  radius  半径
 * @returns {}  x, y を含んだオブジェクト
 */
function getCirclePosition ( degree, radius ) {
	var obj = {};
	
	// 0〜360未満に丸める
	degree = (degree % 360 + 360) % 360;
	
	// ラジアンに変換
	var radian = degree * (Math.PI / 180);
	var cos = Math.cos(radian);
	var sin = Math.sin(radian);
	
	obj.x = cos * radius;
	obj.y = sin * radius;
	
	return obj;
}

```

### 角度をラジアンに変換
```js
// ラジアン = 角度 * Math.PI / 180
var radian = degree * (Math.PI / 180);
```

### ラジアンを角度に変換
```js
// 角度 = ラジアン * 180 / Math.PI
var degree = radian * 180 / Math.PI
```
Start Developing iOS Apps. Swift Control Flow



#Control Flow

```
Control Frow Statement => 制御フロー文

Conditional Statement => 条件文

Loop Statement => 繰り返し文

If Statement => if文

Relational Operator => 関係演算子

Logical Operator => 論理演算子

If-else Statement => if-else文
```

Swiftには、二つのタイプの制御フロー文があります。
それは、条件文と繰り返し文です。

条件文は、「if」「switch」のような条件文で制御構造がtrueかもしくはfalseかを判定します。
繰り返し文は、Loops、つまり繰り返し文で、例えばfor-inやwhileのように複数回同じコードを実行処理します。


今回のif文では、定数numberの値 = 23とif文の条件と合致した値を出力します。

値は「23」なので、"The number is between 10 and 100"と出力されます。

```

let number = 23

if number < 10 {
    print("The number is small")
} else if number > 100 {
    print("The number is pretty big")
} else {
    pirnt("The number is between 10 and 100")
}
```

これらの文は「nested」つまり、入れ子構造にする事でより下記のコードのような高度な表現を可能にします。


```
for in文に関して(回数の決まった繰り返し)

for 要素を格納する定数 in 複数の要素を保持する変数or定数 {
     文
}
```

下記のコードでは、individualScoresに格納されている値をfor in文の定数scoreに代入します。
定数scoreに存在する全ての値をif文内部の条件で処理し終えるまで繰り返す処理します。

今回の値は「11」ですね



```
let individualScores = [75, 43, 103, 87, 12]

var teamScore = 0

for score in individualScores {
    if score > 50{
        teamScore += 3
    } else {
        tesmScore += 1
    }
}

print(teamScore)

```

##optional bindingに関して

Optional bindingをif文で扱うとある値がoptionalを含めているかを確認できます。

```
optional binding

if文やwhile文の条件で宣言され、optional型の変数を代入された変数は「非Optional型」になる
```

```
var optionalName: String? = "John Appleseed"

var greeting = "Hello"

if let name = optionalName {
    greeting = "Hello, \(name)"
}
```


Switch文はSwiftをとても強力します。なぜなら、この文は多くのデータを多種多様な比較に扱うための機能をサポートします。


```
簡単switch

switch 式 {
case 値1:
    //処理
case 値2:
    //処理
case 値3:
    //処理
default:
//処理
}
================
 
var color = "red"

switch color {
  case "red":
    println("とまれー！")

  case "yellow":
    println("注意！")

  case "blue":
    println("進めー")

default:
  println("故障中")
}  
        
                  
// とまれー!
```


```
let vegetable = "red pepper"

switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."

case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."

case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"

default:
    let vegetableComment = "Everything tastes good in soup."
}
   
```


##swift rangeに関して(範囲を表すオブジェクト)


```

//0->4の値をloopさせたいときの書き方

var firstForLoop = 0

for i in 0..<4 {
    firstForLoop += 1
}

print(firstForLoop)
```





```

//0->3の値をloopさせたいときの書き方

var secondForLoop = 0
for _ in 0...4 {
    secondForLoop += 1
}

print(secondForLoop)
```
意外と知らないGitのremoteの便利な使い方

https,git以外にもGitのリモートは指定出来ます。
例えば以下の様にマシン内のディレクトリを直接指定してリモートに登録する事だって出来ます。

```
# git-repoをカレントディレクトリにcloneして作成する方法
git clone --no-local ./git-repo ./git-repo2
# remoteを登録する方法
git remote add local-repo /path/to/git-repo
```

サーバに直接入ってレポジトリを直接編集したり、ブランチを切った場合、
作業中のレポジトリが使用されてしまうとまずい場合に、僕はこの方法を使ったりしています。

リモートとして稼働中のレポジトリを登録しているので、
複製先で編集してリモートにpushしたりすれば安心して作業に集中出来ます。

また、ローカル環境とサーバ内で環境が異なるので、サーバに入って直接編集しながら確認したいとき等に有効です。
c++ builder XE4, 10.2 Tokyo > InheritsFrom()の使用例 > if (pControl->InheritsFrom(__classid(TEdit)) ) {

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

コンポーネントのタイプを知る方法はhelpによると
> メモ： C++ では，ClassType メソッドのかわりに動的キャストまたは InheritsFrom メソッドを使用してください。
http://qiita.com/7of9/items/e9c6b360039be4605e6b

InheritsFrom()の使用例は以下のようなものだ

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	Memo1->Lines->Clear();

	String name;
	String msg;
	TControl *pControl;
	for(int idx=0; idx < this->ControlCount; idx++) {
		msg = L"";
		name = this->Controls[idx]->Name;
		pControl = this->Controls[idx];

		if (pControl->InheritsFrom(__classid(TEdit)) ) {
			msg = name + L" is TEdit";
		}

		if (msg.Length() > 0) {
            Memo1->Lines->Add(msg);
		}
	}
}
```

<hr>
動的キャストとInheritsFrom メソッドの対比については

http://www.borlandtalk.com/i-need-inheritsfrom-example-vt22663.html
>You should use dynamic_cast instead of InheritsFrom(): 
>

```cpp
if( dynamic_cast<TSomeTargetType>(SomeSourcePointer) != NULL ) 
// SomeSourcePointer is a TSomeTargetType instance... 
else 
// SomeSourcePointer is not a TSomeTargetType instance... 
```

>If you must use InheritsFrom(), then you need to use the __classid() 
>keyword: 

```cpp
if( SomeSourcePointer->InheritsFrom(__classid(TSomeTargetType)) ) 
// SomeSourcePointer does derive from TSomeTargetType... 
else 
// SomeSourcePointer does not derive from TSomeTargetType... 
```

どちらも同じくらいのコード長になる。
dynamic_castの方がより一般的なコードの気がする。(__classidというキーワードを知らなくてもいい、という点)
gulpの使い方


## インストール
グローバルにインストールする。

```
$ npm install --global gulp
```

ローカルにインストールする場合はこちら。

```
$ npm install --save-dev gulp
```

## 実行
実行する。

```
$ gulp
```

npm installしたディレクトリのgulpを使用したい場合はこちら。

```
$ (npm bin)/gulp
```


構文チェックする。

```
$ gulp lint
```

ビルドする。

```
$ gulp build
```
【RequireJS】使い方メモ


RequireJSの基本的な使い方をざっくりメモ。
RequireJSはモジュール化したファイルをいい感じに読み込んでくれるJSフレームワークで、機能ごとの管理がしやすくなり、単体テストもしやすくなる。

## Get started
まずは、公式サイトからファイルをダウンロード。
[requirejs.org](http://requirejs.org/docs/download.html#latest)

ダウンロードしたファイルをHTMLに読み込む。
require.jsを読み込んだscriptタグに`data-main`を付けてメインで読み込むファイルを指定する。

```html
<script src="js/require.min.js" data-main="js/main"></script>
```

## Example
モジュール化するには、以下の様にdefine()を使います。

```main.js
define(function() {
	console.log("ok");
});

```

依存関係のあるモジュールを読み込む場合は、以下の様に第一引数で読み込んで使用する事ができます。

```main.js
define([
	'modules/hoge',
	'modules/piyo'
], function(hoge, piyo) {
	
	hoge();
	piyo.init();

});
```

## Config file
各種オプションを設定ファイルに記述しておくことで、使いやすくなります。
requireというグローバル変数を定義し、そこにオプションを設定しています。  
[RequireJS CONFIGURATION OPTIONS](http://requirejs.org/docs/api.html#config)

```require_config.js
var require = {
  baseUrl: 'js',
  paths: {
    hoge: 'aaa/bbb/hoge'
  }
};
```

HTML側でrequire.jsを読み込み前に設定ファイルを読み込み

```index.html
<script src="js/require_config.js"></script>
<script src="js/require.min.js" data-main="js/main"></script>
```

main.js内のdefineをrequireに変更

```main.js
require([
	'modules/hoge',
	'modules/piyo'
], function(hoge, piyo) {
	
	hoge();
	piyo.init();

});
```

## コンパイル
RequireJSはHTML内のscriptタグの数は非常に少なく済みますが、実際には使用しているモジュール数分リクエストが飛んでいます。なので納品などの時にはモジュールファイルを一つにまとめてあげましょう。
r.jsというNode製のツールを使います。
[r.js README](https://github.com/jrburke/r.js)


__インストール__

```
npm install -g requirejs
```

__コンパイル__

```
r.js -o name=main out=main-built.js baseUrl=.
```

コンパイル時の設定をファイルに記述しておくこともできます。

```build.js
({
    baseUrl: "src/scripts/",
    name: "main",
    out: "dest/scripts/main.min.js"
})
```

__コンパイル__

```
r.js -o build.js
```
c++ builder > ClassType() > アプリケーションのコードでは、ClassTypeメソッドを使用しないでください > 動的キャストまたはInheritsFromメソッドを使用してください

```txt:動作確認
C++ Builder XE4
```

コンポーネントのタイプを知る方法をSOで質問していた。
http://stackoverflow.com/questions/33060775/how-to-know-the-control-is-tlabel

それに対する回答にて ClassType()使用を薦める回答があった。

ms-help://embarcadero.rs_xe4/libraries/System.TObject.ClassType.html
を見ると

> アプリケーションのコードでは，ClassType メソッドを使用しないでください。 
...
メモ：  C++ では，ClassType メソッドのかわりに動的キャストまたは InheritsFrom メソッドを使用してください。

という記載がある。

ClassType()でなく、Remy Lebeauさんの回答にある動的キャストかInheritsFrom()を使うのがいいのだろうか。
[バグ(?)] EclipseLink 2.5.2は、lambdaの中でManyToOneリレーションシップが動かない

# 前提

こんな感じのOneToMany/ManyToOneなエンティティがあったとします。
子エンティティ「STREET」は、ひとつの親エンティティ「CITY」を持ちます。

```text:
+-------+ (1)   (n) +--------+
| CITY  |-----------| STREET |
+-------+           +--------+
```

プログラムはこんな感じ（いろいろ略しています）。

```java:City.java
@Entity
class City {
  @OneToMany(mappedBy="city")
  private List<Street> streetList;
}
```

```java:Street.java
@Entity
class Street {
  @ManyToOne
  private City city;

  public City getCity() {
    return city;
  }
}
```

# 問題

子エンティティ「STREET」を取得し、lambdaの中で親エンティティ「CITY」を取得しようとしても、SQLは実行されず取得できません。

```java:Test.java
class Test {
  @PersistenceContext
  private EntityManager em;

  public void test {
    em.createQuery("SELECT s FROM Street s", Street.class)
      .getResultList()
      .stream()
      .forEach(x -> System.out.println(x.getCity().toString())); // ← ダメ
  }
```

# 原因

EclipsseLink 2.5.2のバグらしいです。2.6で直っています。

http://stackoverflow.com/questions/33151787/java-stream-with-jpa-one-to-manylazy-relation-not-working

つまりGlassfish 4.1はダメー :scream: 

# 回避策

## その1 ``@JoinFetch``をつける

子エンティティに``@JoinFetch``をつけて、あらかじめ親エンティティも取得します。

```java:Street.java
@Entity
class Street {
  @ManyToOne
  @JoinFetch             // ←追加
  private City city;

  public City getCity() {
    return city;
  }
}
```

## その2 lambdaを使わない

どうもEclipseLinkとlambdaは相性悪いですね。。。

----
2015.10.28 追記
文中しっかりスペルやら間違えていました。
× lamda
○ lambda
× Eclipse 2.5.2
○ EclipseLink 2.5.2

@laughter さん、 @tag1216 さん、編集リクエストありがとうございました。
@deaf_tadashi さんコメントありがとうございました。
ひらがなカタカナのみでできている単語と読み仮名を見分ける

自動的にひらがな・カタカナが入力されたら「読み仮名」そうでなければ「単語」と認識したいと思って作っていたら、ときどき「ひらがな＋カタカナ」だけで構成されている単語があることに気がつきました。（たとえば渋谷の「いかセンター」とか）

kuromojiでせっかく自動的にひらがなに統一していたのが仇になった...
でも、しかたないので「ひらがなカタカナだけが混ざっているものは単語」と認識するメソッドつくりました。もっと簡潔に書ける気がするけど^^;
メソッド名は「isIkasen」いかセンターですか？っていう直球の名前

```java:isIkasen
     static boolean isIkasen(String motoString){
       boolean res=true;
       boolean isHira=false;
       boolean switched=false;
       char code = motoString.charAt(0);
       if(code>=0x3041 && code<=0x3096){
       //ひらがなモード
           isHira=true;
       }else{
           if(code>=0x30a1 && code<=0x30fc){
           //ひらがな以外、カタカナかそれ以外
           isHira=false;
           }else{
               return false;
           }
       }
       for(int i=1;i<motoString.length();i++){
          code = motoString.charAt(i);
          if(code>=0x3041 && code<=0x3096 ){
              if(isHira==false){
                switched=true;
              }
              continue;
          }//ひらがなでひらがなモード
          if(code>=0x30a1 && code<=0x30fc){
              if(isHira){
                  switched=true;
              }
              continue;
            
          }//かたかなでかたかなモード
          res=false;
          break;
       }
       //変化してtrue(全部ひらがなかたかなの時だけtrue)
       return (res && switched);
   }
```
SQL*Plus DESCのSQLスクリプト


# 内容
SQL*Plusにて、`SET LINES 〜`を設定後にDESCコマンドを実行すると、結果のフォーマットが崩れてしまい、`SET LINES 80`を設定し直す必要がある。
めんどくさい。
SQLスクリプト`desc.sql`を作成し、

```sql:
SQL> @desc <テーブル名>
```

でフォーマットが崩れていないdescの結果を表示するようにしました。

# 使い方

``` sql:
SQL> set lines 1000
SQL> show lines
linesize 1000
SQL> @desc v$instance
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 INSTANCE_NUMBER                                    NUMBER
 INSTANCE_NAME                                      VARCHAR2(16)
 HOST_NAME                                          VARCHAR2(64)
 VERSION                                            VARCHAR2(17)
 STARTUP_TIME                                       DATE
 STATUS                                             VARCHAR2(12)
 PARALLEL                                           VARCHAR2(3)
 THREAD#                                            NUMBER
 ARCHIVER                                           VARCHAR2(7)
 LOG_SWITCH_WAIT                                    VARCHAR2(15)
 LOGINS                                             VARCHAR2(10)
 SHUTDOWN_PENDING                                   VARCHAR2(3)
 DATABASE_STATUS                                    VARCHAR2(17)
 INSTANCE_ROLE                                      VARCHAR2(18)
 ACTIVE_STATE                                       VARCHAR2(9)
 BLOCKED                                            VARCHAR2(3)

SQL> show lines
linesize 1000
```

# SQLスクリプト

「★」マークの部分は環境に合わせて設定する必要があります。

``` sql:
SET TERMOUT OFF

-- 一時ファイル名の設定
DEF _MY_TMPFILE_PATH_STORE = "/tmp/__desc_store.tmp"  --★

-- 環境設定の保存
STORE SET &_MY_TMPFILE_PATH_STORE REPLACE

SET TERMOUT ON

-- DESCの実行
set lines 80
desc &1

-- 環境設定の復元
SET TERMOUT OFF
@&_MY_TMPFILE_PATH_STORE
SET TERMOUT ON
```
【Chef】 ChefDKとknife-soloをインストール＆cook


１からchefをインストールすることになったので、メモ。
※今回はAmazon Linuxが対象です。


# ChefDK
まずはChefDKをインストール
今回はRed Hat Enterprise Linux 6をダウンロードしました。

```
wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.9.0-1.el6.x86_64.rpm

```

ダウンロード後は以下でインストール。

```
sudo rpm -Uvh chefdk-0.2.0-2.el6.x86_64.rpm
```

インストールが完了したら以下を~/.bashrcに記述してパスを通します。

```~/.bashrc
# chef
export PATH=/opt/chefdk/embedded/bin:$PATH
```

これでChefDKのインストールと実行準備は完了です。

# knife-solo
リモート環境のCookを実行したいので、knife-soloもインストールします。
まず事前準備としてruby-develをインストール。

```
$ sudo yum -y install ruby-devel
```

※ruby-develがインストールされていないと以下のエラーが出ます。

```
Building native extensions.  This could take a while...
ERROR:  Error installing bson_ext:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h


Gem files will remain installed in /home/ec2-user/.gem/ruby/2.0/gems/bson_ext-1.10.2 for inspection.
Results logged to /home/ec2-user/.gem/ruby/2.0/gems/bson_ext-1.10.2/ext/cbson/gem_make.out
```

そしたらgemでknife-soloをインストール。

```
$ chef gem install knife-solo
```

>chefのgemを使って下さい。ChefDKインストールでgemsとknifeがインストールされており、パスを/opt/chefdkに通しているため、
>chef配下のgemでインストールしないと認識されません。

無事インストールが完了しました。

# Cookbook作成

以下コマンドでテンプレートを作成します。
※具体的な内容はいろんなサイトがあるので割愛します。

```
$ knife cookbook create cookbook名】 -o site-cookbooks
```

# Berkshelf

既にBerkshelfはインストールされているので、berksコマンドを実行します。

```
$ berks
```

するとBerksfile.lockができて、依存関係がロックされます。

次に以下コマンドを実行

```
$ berks vendor cookbooks/
```

これで依存関係のあるサードパーティーCookbookがインストールされます。

# Cook
さて、インストールも無事完了したのでknife solo cookを実行してみたら以下のメッセージが出ました。

```
Deprecated features used!
  Cannot specify both default and name_property together on property path of resource yum_globalconfig. Only one (name_property) will be obeyed. In Chef 13, this will become an error. at 1 location:
    - /tmp/solo/cookbooks-2/yum/resources/globalconfig.rb:76:in `class_from_file'
  version nil currently does not overwrite the value of version. This will change in Chef 13, and the value will be set to nil instead. Please change your code to explicitly accept nil using "property :version, [MyType, nil]", or stop setting this value to nil. at 3 locations:
    - /tmp/solo/cookbooks-2/python/recipes/pip.rb:52:in `block in from_file'
    - /tmp/solo/cookbooks-2/python/recipes/virtualenv.rb:25:in `block in from_file'
    - /tmp/solo/cookbooks-2/python/providers/pip.rb:98:in `load_current_resource'

```

調べてみたら、公式のgithubに以下issueを発見！！

>https://github.com/chef-cookbooks/yum/issues/140

要は対応しまっせ、気にしないでねみたいな感じでしょうか。


# あとがき
最近Docker（コンテナ）が話題に上がり、Chefはチョット下火な印象ですがやはりまだまだ便利ですので、
今後も利用＆トレースしていきたいと思います。
ActiveAdmin: Railsのプロジェクト名を「active_admin」にすると動かない。

# 問題

Rails に ActiveAdmin の gem を入れて。
`$ rails server` でサーバーを立ち上げようとしたら、エラーが起きた。

```
TypeError: superclass mismatch for class Application
```

# 解決

Rails のプロジェクト名が「active_admin」だったのが原因だった。
（テスト用にこんな名前をつけていた）

別のプロジェクト名ならOKだ。

```
$ rails new active_admin_test
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
プログラミングが勉強できるサービス

##チュートリアル動画を見て学ぶ形式

[the new boston](https://www.youtube.com/user/thenewboston/featured)
[ocw: MIT opencourseware](http://ocw.mit.edu/index.htm#)
[khanacademy](https://www.khanacademy.org/computing/computer-programming)
[alison](https://alison.com/learn/programming)
[codeschool](https://www.codeschool.com/)
[egghead.io](https://egghead.io/)
[schoo](https://schoo.jp/guest)
[thinkster](https://thinkster.io/)
[lynda](http://www.lynda.com)※有料
[Udamy](https://www.udemy.com/jp/)*有料

##実際にコードを書きながら勉強出来る形式
[codecademy](https://www.codecademy.com/)
[progate](http://prog-8.com)

##勉強会を探す
[dots](http://eventdots.jp)
他のサーヴィスのイベントも網羅してるので、Dotsが便利。
[connpass](http://connpass.com)
[zusaar](http://www.zusaar.com)
[doorkeeper](https://www.doorkeeper.jp)
コミュニティもさがせる
[SublimeText] 実行時の環境に合わせてRubyTestを実行する


SublimeTextのRubyTestプラグインの設定例です。

spring+binstubを使用しているプロジェクトの場合は、直下の`bin/rspec`を実行したい。そうじゃない場合は、`bundle exec rspec`を実行したいという場合の例。

```
{
  "run_rspec_command": "if [ -e bin/rspec ]; then bin/rspec {relative_path}; else bundle exec rspec {relative_path}; fi",
  "run_single_rspec_command": "if [ -e bin/rspec ]; then bin/rspec {relative_path}:{line_number}; else bundle exec rspec {relative_path}:{line_number}; fi"
}
```

なぜか`[ -e bin/rspec ] && bin/rspec {relative_path} || bundle exec rspec {relative_path}`という書き方だと、両コマンドとも実行されてしまった。ターミナル上ではちゃんと動くのに。。
$ bundle exec gem list の短縮形

`$ bundle list` で良い。 

(ただし、全く同じものではない)

# 解説

`$ bundle list` の方がちょっと詳しく表示してくれる。

Gem ファイルがこんな時。

```rb:Gemfile
gem 'gem_name', github: 'github_repository', branch: 'branch_name'
```

### $ bundle exec gem list の場合

```
gem_name (1.1.2)
```

### $ bundle list の場合

```
  * gem_name (1.1.2 336f479)
```

Git のコミットハッシュ (リビジョン) を表示してくれる。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
htaccessによるデバイス振り分け


#デバイスごとに振分けを行い、指定ディレクトリにリダイレクトさせる

###▼前提条件
(1) SPディレクトリが、PCディレクトリのサブディレクトリになっている。
（例）
　PCサイト : http://example.com/
　SPサイト : http://example.com/sp/

(2) 同一ページは同一のファイル名になっている。
（例）
　PCサイト : http://example.com/page01.html
　SPサイト : http://example.com/sp/page01.html

```lang:.htaccess
RewriteEngine on

RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ sp/$1 [R]
RewriteBase /

RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ $1 [R]
RewriteBase /
```

リクエストしたURLに /sp/ が含まれず（２行目）、
かつ、ユーザーエージェントにiPhone、Android等が含まれる場合（３行目）、
ファイル名の前に sp/ を足したURLに書き換える（４行目）。

リクエストしたURLに /sp/ が含まれ（６行目）、
かつ、ユーザーエージェントにiPhone、Android等が含まれない場合（７行目）、
URLから sp/ を取り除く（８行目）。

###URLをリライトする場合
PCサイトからSPサイトに転送する際、ブラウザ上のURLを変えず、PCサイトと同一のURLで遷移させる場合は、４行目および８行目末尾の [R] を [L] に書き換える。


###RewriteRule のオプション
[R]
強制的にリダイレクト
[L]
書き換えが行われたら終了 (Last) にする。
現在の書き換え後の URL が後続のルール によってそれ以上書き換えられることを防止する。
[F]
強制的にアクセス禁止
HTTP レスポンスの「403 : Forbidden」を返す。
[NC]
パターンについて、文字の大小を区別しない(No Case)。 つまり、"A-Z" と "a-z" は区別しない。


⇒　[htaccessによるPC・スマートフォンの振り分け転送](http://html-five.jp/195/)



#各デバイスとも同一URLで表示する場合

###▼ディレクトリ構成
/pc/ : PC用データ
/sp/ : SP用データ
※リソースデータは、それぞれのディレクトリ配下に格納され、別ディレクトリを参照しない前提。

###▼URL
/pc/ /sp/ はURLには含まれない。
それぞれ同階層に同一名のファイルが置かれていることが前提。
リンクのパスも /pc/ /sp/ は含まずに記述する。

##.htaccessの記述

```lang:.htaccess
RewriteEngine on
#ループ防止
RewriteCond %{REQUEST_URI} ^/(pc|sp)/
RewriteRule .* - [L]
#スマートフォン
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule  ^(.*)$ sp/$1  [L,NS]
#PC
RewriteRule  ^(.*)$ pc/$1  [L,NS]
RewriteBase /
```

/pc/ /sp/ の各ディレクトリ直下の.htaccessに以下を記述。

```lang:.htaccess
RewriteEngine off
```

⇒　[htaccessで、PC・スマートフォン・モバイルを同一URLで振り分けて転送する方法](http://html-five.jp/94/)
vmware > ホストとゲスト間のコピーができない > vmware toolsの入れ直し

```txt:動作環境
VMware Workstation 11.0.0 build-2305329
```

ゲスト間のコピーができない状態になっていた。

以下の対処もあるが、今回はvmware toolsを再インストールしたらできるようになった。
http://qiita.com/7of9/items/f91882ee4dfa16141708
Git コマンドまとめ(自分用)


後々追加予定

ステータス確認

```bash
git status
```

変更箇所をgitに追加

```bash
git add <file>...
```

変更箇所を全てgitに追加

```bash
git add .
```

git addしたファイルをcommit対象から除外する

```bash
git checkout -- <file>...
```

コミット

```bash
git commit
```

直前のコミットに上書きでコミットする

```bash
git commit --amend
```

プッシュ

```bash
git push
```

プル(し忘れに注意)

```bash
git pull
```

直前のコミットに戻す

```bash
git reset --hard HEAD
```
その前のコミットに戻す

```bash
git reset --hard HEAD^
git reset --hard HEAD^^
```

branch一覧表示

```bash
git branch
```

branch一覧表示(リモートも)

```bash
git branch -a
```

branch切替え

```bash
git checkout [branch_name]
```
branchをローカルにコピーして切替え

```bash
git checkout --track origin/[branch_name]
```

branchを作成して切替え

```bash
git checkout -b [branch_name]
```

作成したbranchをpushする

```bash
git push origin [branch_name]
```

直前のコミットと現状のdiffを取る

```bash
git diff
```

n個前のコミットとのdiffを取る

```bash
git diff HEAD~n
```

コミットAとコミットBのdiffを取る
```bash
git diff <コミットA> <コミットB>
```
Responsiveデザイン要点


現在サイトを作成する場合に当然の手法となっているレスポンシブデザインですが、表示ディスプレイサイズの多様化、解像度の多様化(retinaディスプレイ等)によりデザインの段階で考えておくべきことが多くなってきているので今一度ポイントを整理しようと思います。

#レスポンシブレイアウトの手法

レスポンシブデザインを考えるときにレイアウトを作る仕組みは主に以下の2つが考えられます。

- ％で指定
- メディアクエリで固定サイズを指定

# 最初に考えるレイアウトのベース
基本的にはカラムで分けていくレイアウト。
％でコンテンツ幅とマージン幅を100%から分割していき場合によってはメディアクエリを利用して変化させます。実際にレイアウト分割の考え方としてはGridレイアウトと言われるものが使われます。
こういうのはよく見ると思います。
![grid.png](https://qiita-image-store.s3.amazonaws.com/0/35271/9c105aa1-480e-c847-d92a-0eaf2799cefd.png)

##レスポンシブでのGrid
レスポンシブにおいてGridレイアウトは12分割、8分割など割り切りやすい数値になっていることが多いですが、これはメディアクエリによりコンテンツブロックの比率を切り替えるときに分けやすい為だと思います。
デザインを行うときに12分割、8分割をベースに考えることでレスポンシブ実装の負担がかなり減ります。

ちなみにPhotoshop CCであれば表示＞新しいガイドレイアウトの作成から簡単いプリセットを読み込むことができます。
ガイドをちゃんと引けてないのは論外です。

## 注意すること
画像のサイズを可変にする場合、画像のオリジナルサイズを超えて拡大されないようにする。
以下のCSSをかけると可変+オリジナルは超えない設定が出来ます。

```
CSS記述
width: auto;
max-width: 100%;
```

あと背景画像を可変にする場合自分はbackground-sizeもよく利用します。

```
##背景が指定された領域を覆う最小サイズになる
background-size:cover;
-webkit-background-size:cover;
```

ブラウザ対応は以下参考リンク
http://caniuse.com/#search=background-size

## 画像サイズ可変のデメリット
画像のサイズを可変するともちろん実サイズが割り切れなくなると画像サイズの解釈はブラウザ任せになる。
ここで幅と高さの縦横比率が1ピクセル単位でズレるのでボケる。これは仕方なく、嫌なら固定幅にするとか`overflow:hidden`でマスク表示させる方法を検討する。

ちなみに縦横ピクセル偶数にするとちょっとマシかも？

## メディアクエリで固定サイズを指定
上記のデメリットなどを避けたい場合などは固定サイズで指定する。
その場合メディアクエリで切った範囲ないで不自然な見え方がしないか必ず確認する。

# CSSの組み方 ~media queryについて~

## モバイルファーストか、PCファーストか
レイアウトのベースをモバイル基準で行くのか、PC基準で行くのか。
モバイルファーストで行う場合はIE8への対応としてRespond.jsを利用する。

## モバイルファーストの場合
min ~pxで切っていくその場合CSSの記述は大きな幅のCSSが上書きされて行くので、最終的に最大幅の止めたいpxでコンテンツをwrapしているpxを固定にする。（PCは逆）

```
#480px以下のスマホ表示はここに書く
...
@media only screen and (min-width: 480px) { ... }
@media only screen and (min-width: 768px) { ... }
@media only screen and (min-width: 950px) {.wrap{width:950px;}}

```

## mediaクエリの指定のバラエティ

`@media screen and (min-width:480px)`
480px以上

`@media screen and (max-width: 480px)`
480px以下

`@media screen and (min-width:768px) and ( max-width:1024px)`
768px以上、1024px以下

```
@media screen and (orientation:portrait) //縦
@media screen and (orientation:landscape) //横
```
デバイスの向き

```
@media screen and (-webkit-min-device-pixel-ratio:2)
```

デバイスのピクセル比。retinaディスプレイ時に利用する。
背景画像の切替などをここに記述することが多いです。
__ちなみにiphone6 plusはピクセル比:3です。__

# SVGについて
基本的に画像がぼけることが無い。
上記のretina対応うんぬんがいらないので積極的に使っていきましょう。
CCならPhotoshopからでもIllustratorからでも書き出し可能ですし、HTMLへの組み込みも基本imgタグを使うのでいいと思います。

##ブラウザ対応状況
img要素で使う場合=>IE8以下,Android 2.3以下非対応
参考リンク
http://2ndidea.com/svg/svg-fallbacks/

またimgタグを使ったSVGの利用の場合IEでは幅に加えて高さを指定しないとちゃんと指定サイズに表示されないことが確認できています。

# デザインカンプをどう作るのか
まずiphoneのサイズ一覧

| 機種 | 解像度 | 相対サイズ | 比率 |
|--------|--------|--------|--------|
|iPhone5/5s|640×1136|320×568|@2x|
|iPhone6|750×1334|375×667|@2x|
|iPhone6Plus|1242×2208|414×736|@3x|

現状では414サイズでキャンバス作成して、それぞれ3倍、2倍書き出しするってのが一番漏れがないです。3倍2倍書き出しはphotoshopの解像度変更で、画像の切り替えはretina.jsってのが便利です。

基本的にはiphon6 plusの解像度サイズの画像があればモバイルは事足りるという考えになるが、、、さすがに大きすぎな気もしてます、、、どういったフローと実装がベストかは模索中、、、

## フレームワークの選定
基本的には機能満載なもの、レイアウトのみのミニマムなもの3つくらい使えるようになっていれば問題ないかと。
お好みで。(途中)
CakePHP3での認証テーブルの変更

cakePHPでは認証に使うテーブルはデフォルトでは`users`になっていて、
たまに別テーブルを使いたい時がありますね。
え？無いですか？私はあったのでメモします

### 検証済みバージョン
Cakephp 3.1.3

## 解決策
変更したいテーブル名をMembersとすると
こんな感じでした。

```php:AppController.php
    public function beforeFilter(Event $event)
    {
        $this->Auth->config('authenticate', [
            'Form' => ['userModel' => 'Members'],
        ]);
    }
```

##未検証
他の解決策としては
個別に書くなら

```php:AppController.php
$this->Auth->config('authenticate', [
    'Basic' => ['userModel' => 'Members'],
    'Form' => ['userModel' => 'Members']
]);
```

まとめて書くなら

```php:AppController.php
$this->Auth->config('authenticate', [
    AuthComponent::ALL => ['userModel' => 'Members'],
    'Basic',
    'Form'
]);
```

らしいですが、未検証です。
あっていたらご報告お待ちしております。

### 参考サイト
[公式ドキュメント](http://book.cakephp.org/3.0/en/controllers/components/authentication.html)
Kobito早く連携機能を復活させてくれ

# 現在の状況

Kobitoから
[ファイル]->[ファイルを開く]でローカルファイルを開くと連携してくれる。

# 問題

ローカルファイルの保存場所を変更したので同期しなおしたいが、既存記事とファイルを連携できない。
ファイル開き直せば新しい記事ができてしまう。
Qiitaに投稿している記事をローカルファイルで編集できなくなってしまった。

# 何が言いたいか

はやく連動機能復活してください。。。
（いっそSQLite展開して連動直接入力してやろうかしら）
Rails4 で ActiveAdmin が bundle install 出来ない時の対処法


これじゃうまく動かない。

```rb:Gemfile
gem 'activeadmin'
```

[公式](http://activeadmin.info/docs/documentation.html)のとおりにやってもダメ。

```rb:Gemfile
# Gemfile in Rails >= 3.1
gem 'activeadmin'
gem 'sass-rails'
gem "meta_search", '>= 1.1.0.pre'
```

こうする。

```rb:Gemfile
gem 'activeadmin', github: 'activeadmin'
```

```
$ bundle install
```

できた！

# 問題

Rails のバージョンによっては、bundle install しようとするだけでエラーが出るようだ。
meta_search を削除しろと言われるが、よく分からなかった。

`
Your Gemfile requires gems that depend on each other, creating an infinite loop. Please remove gem 'meta_search' and
try again.
`


# 環境

- Rails 4.2.4
- ruby 2.2.3
- Bundler version 1.10.6
- `rails new` でプロジェクトを作ったばかりの状態

# 参考

- https://github.com/activeadmin/activeadmin/issues/3926



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
MosquittoをCentOSにインストールする手順

MosquittoをCentOSにインストールする際、毎回makeとかをしていて面倒だな、と思ってたのですが、Mosquittoのページを見てみると簡単にインストールする手順が乗っていたのでメモ。

参照：
http://mosquitto.org/download/


##### CentOS7
```shell-session:CentOS7
# wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo -O "/etc/yum.repos.d/Mosquitto.repo"
# yum install mosquitto mosquitto-clients
```

##### CentOS6
```shell-session:CentOS6
# wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6/home:oojah:mqtt.repo -O "/etc/yum.repos.d/Mosquitto.repo"
# yum install mosquitto mosquitto-clients
```

AWS IoTの確認もこれで簡単にできますね。
コマンドラインでAzureのデプロイ パッケージを作成する



msbuild.exe [ソリューションファイル or ] /t:publish /p:TargetProfile=クラウドプロジェクトのサービス構成;Configuration=ビルド構成

```
msbuild.exe aaa.sln /t:publish /p:TargetProfile=Development;Configuration=Debug
ApacheのVirtualDocumentRootでハマった

最近Chefが好きなaraiです。

Chefとは関係ないですが、ApacheのバーチャルホストでVirtualDocumentRootを使用して、ちょっとハマったのでメモです。

通常ドキュメントルートはこんな感じ。
`DocumentRoot /var/www/vhosts/example.jp/httpdocs`
バーチャルドキュメントルートは以下のように記述。
`VirtualDocumentRoot /var/www/vhosts/%0/httpdocs`

これで設定したら、色々とハマった。

## 問題①
PHPで以下のように、別ファイルをインクルードすると、ApacheのデフォルトDocumentRoot(/var/www/html)を見てしまい、エラーになる。

```php:index.php
                      :
  <?php include($_SERVER['DOCUMENT_ROOT'] . '/common/header.php'); ?>
                      :
```
### エラー内容
`include(/var/www/html/common/header.php): failed to open stream: No such file or directory in /var/www/vhosts/example.jp/httpdocs/index.php`
### 原因
PHPでサーバ環境変数 $_SERVER['DOCUMENT_ROOT'] がApacheのデフォルトDocumentRootを見てしまい、エラーになる。
### 解決方法
以下ファイルを作成し、Apache側でphp_admin_value auto_prepend_fileで読み込む。

```php:/etc/httpd/conf/vhosts/example_document_root.php
<?php
$_SERVER['DOCUMENT_ROOT'] = "/var/www/vhosts/example.jp/httpdocs";
?>
```
```apache:/etc/httpd/conf/vhosts/example.jp.conf
<VirtualHost *:80>
    VirtualDocumentRoot /var/www/vhosts/%0/httpdocs
    php_admin_value auto_prepend_file /etc/httpd/conf/vhosts/example_document_root.php
          :
          :
</VirtualHost>
```
※ 上記ファイルはhttpd.confよりIncludeしてます。
## 問題②
httpではなく、CLIからPHPを実行すると、PHP内に記述している、$_SERVER['DOCUMENT_ROOT']がApacheのデフォルトドキュメントルート(/var/www/html)を見てしまう。
### 原因
①同様、PHPでサーバ環境変数 $_SERVER['DOCUMENT_ROOT'] がApacheのデフォルトDocumentRootを見てしまい、エラーになる。
### 解決方法
PHPで以下のようにサーバ環境変数を書き換える。
`$_SERVER['DOCUMENT_ROOT'] = "/var/www/vhosts/example.jp/httpdocs";`
## 問題③
リライト先のドキュメントルートが変わる。
問題①、問題②を解決した状態で、以下のようなリライトを設定すると、問題①同様ドキュメントルートがApacheのデフォルトドキュメントルート(/var/www/html)になってしまう。

```apache:/etc/httpd/conf/vhosts/example.jp.conf
RewriteEngine on
RewriteRule ^(/|/index.php)$ /hoge/test.php
```
### 原因
ディレクトリディレクティブ外に記述すると、リライト先がApacheのデフォルトドキュメントルート(/var/www/html)を見てしまう。
### 解決方法
RewriteはDirectoryディレクティブの中に入れることで解決した。
#### 最終的なVirtualHost設定内容
```apache:/etc/httpd/conf/vhosts/example.jp.conf
<VirtualHost *:80>
    VirtualDocumentRoot /var/www/vhosts/%0/httpdocs
    php_admin_value auto_prepend_file /etc/httpd/conf/vhosts/example_document_root.php   #←サーバ変数書き換え
    ServerName   example.jp
    ServerAlias  www.example.jp
    ErrorLog /var/log/httpd/example.jp_error_log
    LogLevel warn
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %v" combined
    CustomLog /var/log/httpd/example.jp_access_log "combined"
    <Directory /var/www/vhosts/example.jp/httpdocs/>
        AllowOverride All
        DirectoryIndex index.php index.html index.htm

        RewriteEngine on    #←RewriteはDirectoryディレクティブの中で記述する
        RewriteRule ^(/|/index.php)$ /hoge/test.php
    </Directory>
</VirtualHost>
```
Python Scrapy でウェブサイトからデータを抽出する際の、xpathまとめ

Python のモジュール、[Scrapy](http://scrapy.org/)を用いれば、ウェブサイトのデータを、リンクを巡回しながら順次自動的に取得できます。

ウェブサイトから所望のデータを抽出するには、**欲しいデータの場所** を指定してあげなければなりません。

指定するものを[**セレクタ**](http://doc.scrapy.org/en/latest/topics/selectors.html)と呼びます。Scrapyではcssと、xpathの指定方法がありますが、今回はxpathのして方法について説明します。

##準備
Scrapyをpipでインストールします。

```py:commandline
$ pip install scrapy
```

##Scrapy Shell
Scrapy には、[Scrapy shell](http://doc.scrapy.org/en/latest/topics/shell.html)と呼ばれる、インタラクティブにデータ抽出を検証できるツールがあります。

```py:commandline
scrapy shell "http://hogehoge.com/hoge/page1"
```

のように指定すると、指定したページの情報が入った**response**というインスタンスを受け取った状態でpythonのインタラクティブシェルが立ち上がります。実際にスパイダー(クローラー)を開発する際も、このresponseインスタンスからデータを抽出していきます。

##実践
######responseのxpathメソッド
基本的に、このような構文でデータを抽出していきます。

```py:shell
>>> response.xpath('//title/text()')
    [<Selector (text) xpath=//title/text()>]
```

この例では、受け取ったhtml文章の中の、全てのtitleタグ(//title)の、本文(text())を抽出しています。ただし、このままですと上記のように、返り値はセレクタです。文字を得るには`.extract()`を用います。

```py:shell
>>> response.xpath('//title/text()').extract()
    [u'exsample title']
```

######抽出データの文字列化
抽出データはリストですので、配列指定などで文字列にします。

```py:shell
>>> response.xpath('//title/text()').extract()[0]
    u'exsample title'
```
ちなみにこの`u'文字列'`はユニコードという意味です。pythonでは文字列をユニコードで扱います。

複数のウェブサイトを巡回していると、指定したxpathがどこにも該当しない場合があります。その状態で上記のように配列の0番目 `response.xpath(hoge).extract[0]` を指定するとエラーとなりますので、これを回避するために

```py:shell
>>> item['hoge'] = response.xpath('//title/text()').extract_first()
```

などします。

また、得られた配列`[u'hoge1', u'hoge2', u'hoge3']`などを全て連結して文字列として得たければ

```py:shell
>>> extract_list = [u'hoge1', u'hoge2', u'hoge3']
>>> ''.join(extract_list)
    u'hoge1hoge2hoge3'
```

とやればできます。

##xpath集
| xpath      | 内容        |
|:-----------|:------------|
| //div       |  全てのdivタグ |
| //div[@class='aaa']     | 全ての、classに'aaa'を持つdivタグ |
| //div[@id='aaa']/text()    | 全ての、idが'aaa'のdivタグ -> の本文 |
| //a[text()='aaa']/@href | 全ての、本文が'aaa'のaタグ -> のhref属性値 |
| //div/tr | 全てのdiv -> 子要素のtrタグ |
| //table/tr/th[text()='price']/following-sibling::td[1]/text() | 全てのテーブル -> その行 -> priceというフィールド -> そのデータ要素のうち1番目 -> の本文 |

最後のtableに関するxpathは、ウェブページの表から、フィールドを指定(上記の場合はprice、金額の部分)して値を取ってこれるので便利です。
`td`の指定ですと、同じ行のtd要素をどんどんとってしまうので、`td[1]`として1番目を抜き出しています。`[1]`です。`[0]`じゃないです。
メモ import java.util.Random;

▪️

```java

//import java.util.Random;はimport java.util.*;でもいい
//import java.util.*;にしてしまうとjava.utilの全てのクラスが
//読み込まれてしまうのでメモリ消費が多くなるので推薦しない
import java.util.Random;

public class test46 {
	static String name;
	static int hp = 50;
	final static int MAX_HP = 50;
        //static final int MAX_HP = 50;でもいい

	static int mp = 10;
	final static int MAX_MP = 10;

	public static void main(String[] args) {

		name = "ねこ";
		selfAid();
		pray(4);

	}

	// void→何も戻さない場合はvoidを指定する
	public static void selfAid() {
		System.out.println(name + "はセルフエイドを唱えた！");
		hp = MAX_HP;
		mp -= 5;

		System.out.println("HPが最大まで回復した。");

	}

	// 整数を戻す時はpublic int メソッド名
	public static int pray(int sec) {
		System.out.println(name + "は" + sec + "秒間天に祈った!");
		// Randomクラスをインスタンス化
		int recover = new Random().nextInt(3) + sec;
		int recoverActual = Math.min(MAX_MP - mp, recover);
		mp += recoverActual;
		System.out.println("MPが" + recoverActual + "回復した。");
		return recoverActual;

	}
}
```

▪️
ねこはセルフエイドを唱えた！
HPが最大まで回復した。
ねこは4秒間天に祈った!
MPが4回復した。
mysqlの既存のテーブルに要素を追加して新しいテーブルを簡単に作る


意外に知られていないようなのでメモ。
すでにあるmysqlのテーブルにflagや新しいカラムを追加して別テーブルを作りたい。ということがたまにあります。
でも、その度に「えーっと、元のテーブルのスキーマはどんなんだっけ？」とみて新しいテーブルを作り、しかもカラムが足らなかったりしてエラーになって「ぎーっ」と叫んだりしてませんか？

##selectを使って新しいテーブルを作る

そんな時にmysqlではこんな書き方ができます

```SQL:query
create table newtbl
select * from motoTbl;
```

こうすると、mototblの中身がコピーされたnewtblが作られます。
もちろん、スキーマも全く同じ

##新しい要素も付け加えられる

とりあえず今あるデータはflg=0にしておきたい・・・
というような時にはこのように

```SQL:query
create table newTbl
select *,"0" as flag from motoTbl;
```

こうすると最後にflgという名前で新たに0が追加されます。
この場合"0"をしているのでスキーマはvarchar(1)になっていますが、1にすればintになります。

もちろん、このデータをあとからalter tableで変更もできますね。

```SQL:query
alter table newTbl change flag userid int;
```

これでもうスキーマ地獄ともおさらばです＾＾
WordPressのカスタムタクソノミー（分類）の扱い方

WordPressのカスタマイズで、カスタムタクソノミー（またはカスタム分類）は一番ややこしい要素のひとつです。ここでは、カスタムタクソノミー関連のテンプレートタグなどをまとめてみます。

## カスタムタクソノミーを追加する

カスタムタクソノミーを追加する場合、プラグインなどで追加することもできますが、functions.phpに次を記述するのが簡単です。

```lang:functions.php
    register_taxonomy('area', 'post', array(
        'labels' => array(
            'name' => '地域'
        )
    ));
```

最初のパラメーターでタクソノミー名を、2つめのパラメーターで対象のオブジェクトタイプを指定します。「post」で投稿、「page」に固定ページに追加されます。他にも、カスタムポストタイプやリビジョンなども指定できます。

- [関数リファレンス/register taxonomy - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_taxonomy)

## チェックボックスタイプにして、階層構造を有効にする

先の方法で追加すると、「タグ」のようにテキストフィールドで入力するタイプになります。

![2015-10-27_9-03-58.png](https://qiita-image-store.s3.amazonaws.com/0/3977/d71309b4-40d9-4437-1a29-3d51c5eb24c6.png)

3つめのパラメーターに「hierarchical」を追加すると、これを変更することができます。

```lang:functions.php
    register_taxonomy('area', 'post', array(
        'labels' => array(
            'name' => '地域'
        ),
        'hierarchical' => true
    ));
```

![2015-10-27_9-11-00.png](https://qiita-image-store.s3.amazonaws.com/0/3977/f1bf45ae-5bfd-7aa2-524e-e3211b37be1e.png)

## タクソノミーページを作る

作ったタクソノミーは、次のようなURLで一覧することができます。

> http://example.com/area/tokyo

この時、利用されるテンプレートファイルは以下の順で使われます。

1. taxonomy-area-tokyo.php
2. taxonomy-area.php
3. taxonomy.php
4. archive.php
5. index.php

## 選ばれたタクソノミー名などを取得する

タクソノミーページで、選ばれているタクソノミーの情報を取得するには、ファイルの先頭の方で次のように記述します。

```lang:PHP
$area = get_query_var('area'); // パラメーターからタクソノミー名を取得
$term = get_term_by('slug', $area, 'area'); // スラッグからタクソノミーの情報を取得

echo esc_html($term->name); // ラベルを表示する
```

「$term」には他にも次のような内容が格納されています。

- $term->term_id ... ID
- $term->slug ... スラッグ
- $term->description ... 説明文
- $term->parent ... 親タクソノミー

さらに親を取得する場合は、次のようにしましょう。

```lang:PHP
...
$parent = get_term($area->parent, 'area');
```

## 記事が属しているタクソノミーを表示する

記事の詳細ページ（single.php）などで、その記事が属しているタクソノミーを表示するのは、次のテンプレートタグが一番簡単です。

```lang:php
the_terms(get_the_ID(), 'area');
```

次のような HTMLが出力されます。

```lang:HTML

<a href="https://custompostype-taxonomy-h2ospace-1.c9.io/event/area/hokaido/" rel="tag">北海道</a>, <a href="https://custompostype-taxonomy-h2ospace-1.c9.io/event/area/tokyo/" rel="tag">東京</a>
```

HTMLを自由に加工したい場合は「get_the_terms」を使います。

```lang:PHP
$terms = the_terms(get_the_ID(), 'area');

foreach ($terms as $term):
  echo '<li><a href=".../<?php echo esc_attr($term->slug); ?>/"><?php echo esc_html($term->name); ?></a></li>';
endforeach;
```

## タクソノミーを判断する

ナビゲーションの処理などで、今表示されているタクソノミーがなにかを判断したい場合は、「is_tax」を使います（is_termは非推奨になりました）

```lang:PHP
<li class="nav<?php echo (is_tax('area', 'tokyo') ? ' active' : ''); ?>">東京</li>
```
windowsのターミナル（黒い画面のやつ）設定

**現在（2017/8）は、[Cmder mini](http://cmder.net/) を使用しております。**
**下記の内容はConemuをそのまま使用していた時点のものとなります。**

Git bashを[ConEmu](https://conemu.github.io/)で動かす。
ConEmuの設定で、デフォルトでGit Bashを開くようにししておくと、
ひとまずmacのターミナルでできることが大概出来るようになる。
また、より使いやすくすべく、下記の設定をした。

- view(pallettes) > Monokai
- Setting > Main > Main console font = Rounded M + 1m regular/Clear Type/Shiftjis
- Setting > Startup > Auto save/restore opened tabs = On
- Setting > Startup > Tasks = {Bash::Git bash}/Startup dir = （projectsがあるところ）

Cygwinはgitで困ったりするらしいので試していない。
[babun](http://babun.github.io/)も使ってみたかったけど、chromeでダウンロードしようとしたら警告出たのでやめておいた。
SSLになってもめげないリンクの書き方２つ


script src="http://"と直接指定していると、その後うっかりサイトがssl対応になってアクセスできなくなって、黙って死にエラーになることがある。
そんな残念なことを防ぐためのリンクの書き方２つ

##スキームを指定しない書き方
```html:スキーマレス
<script src="//www.laspands.com/js/sample.js"></script>
```
スキーマレス絶対URLというそうですよ。
これならhttpでもhttpsでもどちらでも自動的に呼び出し元と同じスキーマで呼び出されるようです

##ドキュメントルートを指定（自サイト）

もちろん、呼び出すのが自分のサイトの中ならドキュメントルートを指定しても良いです。

```html:ローカル
<script src="/js/sample.js"></script>
```

言わずもがなですがこの記述だと / の下にjsというディレクトリがあるという想定ですね。
もちろんjsだけではなくcssにもこの指定は使えるのでデザイナーさんへの指示をする時に覚えておくと後々幸せになれるかもしれません
Node.JSでModuleをun-requireする

## はじめに

Node.JSのアプリケーションを作成していて、mochaでユニットテストを書いている時に、requireした時に何かしら処理を実行しちゃうモジュールがありました。そのモジュールを対象にテストをする際、テストケースごとにrequireし直したいと思いました。普通に毎回requireしても、２回目はrequireされない（前の状態のまま）なので困りました。

## 結論

以下のようにafterEach内でun-requireすることができます。


```
describe('module', function() {

	var moduleName = 'path/to/module';
	var target = null;

	beforeEach(function() {
		target = require(moduleName);
	});

	afterEach(function() {
		var name = require.resolve(moduleName);
		delete require.cache[name];
	});

    it('method1', function (done) {
    });

    it('method2', function (done) {
    });

})
```
TabBarControllerのMoreを編集不可にする

ちょっと引っ掛かったのでメモ。

#標準

![標準](https://qiita-image-store.s3.amazonaws.com/0/18828/425ee2e1-5448-88bc-a8c0-db46adb066d3.png)
右上の`Edit`で編集できる。

#編集不可にする

```objc:TabBarController.m
self.customizableViewControllers = nil;
```

こうすれば`Edit`が消えて編集不可になる。
![編集不可](https://qiita-image-store.s3.amazonaws.com/0/18828/8479bf7a-9fa1-830f-7cfc-4b5b01a8054c.png)

#ただし！（ここで引っ掛かった）

`customizableViewControllers = nil`の後で`viewControllers`を変更すると`customizableViewControllers`が初期化されてしまう。
例えば、こんなことをすると、

```objc:TabBarController.m
//編集不可にする
self.customizableViewControllers = nil;
//ViewControllerを追加する
NSMutableArray *array = self.viewControllers.mutableCopy;
UIViewController *vc = UIViewController.new;
vc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemMostViewed tag:0];
[array addObject:vc];
self.viewControllers = array;
```

このありさま。
![このありさま](https://qiita-image-store.s3.amazonaws.com/0/18828/24297af3-ca2f-ce01-4522-a0694ae7ce93.png)

なので、順番を逆にする。

```objc:TabBarController.m
//ViewControllerを追加する
NSMutableArray *array = self.viewControllers.mutableCopy;
UIViewController *vc = UIViewController.new;
vc.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemMostViewed tag:0];
[array addObject:vc];
self.viewControllers = array;
//編集不可にする
self.customizableViewControllers = nil;
```

完璧。
![完璧](https://qiita-image-store.s3.amazonaws.com/0/18828/f9de3ed1-4992-6cfa-87f5-d852a6bc3fd3.png)
いかんともしがたい理由で、Emacs上にScala開発環境をさくっと作ります


melpaでpackageリポジトリからensimeをインストールします。

	M-x package-list-packages

.emacsでscalaモードとか色々を設定。

	; -- scala
	;; scala-mode2
	(require 'scala-mode2)
	(add-to-list 'auto-mode-alist '("\.sbt$" . scala-mode))
	;; ensime
	(require 'ensime)
	(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)

	(add-hook 'scala-mode-hook 'my-scala-mode-hook)
	(defun my-scala-mode-hook ()
	  (setq scala-indent:use-javadoc-style t))

次に、.ensimeファイル作成のために、.sbt配下のplugins.sbtをいじります。

	$ cd ~/.sbt/0.13/plugins
	$ vi plugins.sbt

以下の行を追加。

	addSbtPlugin("org.ensime" % "ensime-sbt" % "0.1.7")

開発用のプロジェクトディレクトリに移動して、以下を実行。

	$ sbt gen-ensime
	
これで準備完了。emacsから、diredとかでプロジェクトディレクトリへ移動し、

	M-x ensime

を叩くと、.ensimeファイルなどなどを作成してくれます。また、ivyやらmavenやらに接続して、ライブラリをいい感じに揃えてくれます。便利ですね―。
同じく、接続したensime-serverとやりとりすることで、M-.で Inplementationへジャンプしたりとか、etagsを彷彿とさせてくれます。
Chrome Developer Tools ショートカットキー

##起動
F12 or Ctrl+Shift+I
##要素モードの有効・無効の切り替え
Ctrl+Shift+C
##デバイスモードの有効・無効の切り替え
Ctrl+Shift+M
##ドックウィンドウの状態を切り替える
Ctrl+Shift+D
##Consoleドロワーの表示非表示を切り替える
Esc
##表示ちゅうのページの全ファイルを検索する
Ctrl+Shift+F
Coursera Machine Learningの課題をPythonで: ex3（ロジスティック回帰で手書き数字認識）

# はじめに
機械学習のイントロダクションとして世界一メジャーな存在となっているCoursera Machine Learning。Matlab/Octaveのプログラミング課題を勉強しがてらPythonで実装してみるシリーズ第3回です。

今回はex3の前半、ロジスティック回帰を用いて手書き数字を認識するタスク。データセットはMNISTのサブセットということで、20x20ピクセルのグレースケール画像が5000枚、これがMatlab/Octaveの.matというデータ形式で与えられています。
実は、scikit-learnには`fetch_mldata()`という関数があり、これでMNISTのデータ(28x28ピクセル、70000枚）をダウンロードすることもできます （→ こちらの記事参照：[多層パーセプトロンでMNISTの手書き数字認識](http://aidiary.hatenablog.com/entry/20140205/1391601418) ）が、今回は比較のために、上記の.matデータを利用することにします。

なお、ex3の後半はニューラルネットワークのforward propagation部分だけ作成するというちょっと中途半端な内容なので、割愛します。

### コード
データも整形されており、scikit-learnの`LogisticRegression`クラスを使うだけなので、シンプルなコードです。Matlabの.mat形式のデータは、Scipyの`scipy.io.loadmat()`関数を使って読み込むことができます。

```py:ex3.py
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import linear_model

# scipy.io.loadmat()を使ってmatlabデータを読み込み
data = scio.loadmat('ex3data1.mat')
X = data['X']  # X は 5000x400 行列
y = data['y'].ravel()  # y は 5000 x 1 行列、ravel()を使って5000次元ベクトルに変換

model = linear_model.LogisticRegression(penalty='l2', C=10.0) # モデルの定義
model.fit(X,y)    # 訓練データで学習
model.score(X,y)  # 訓練データでの正答率
```

実行すると、訓練データでの文字認識の正答率が0.96499999999999997 と表示されました。

### 機械学習的ポイント

正則化の強さを表すパラメータ$\lambda$はCourseraでは$\lambda=0.1$となっていました。前回の記事でもご紹介したとおり、`sklearn.linear_model.LogisticRegression`クラスでは正則化パラメータは$C$（$\lambda$の逆数に相当）で指定するため、今回は`C=10.0`としてモデルを定義しました。

結果、訓練データでの正答率は上記のように96.5%。Matlab/Octaveでの結果は94.9%だったので、ややオーバーフィット気味？理由はよくわかりません。

### その他ポイント

これだけだとあっさりしすぎなので、認識を間違えたデータを表示するコードも書いてみました。
上記モデルで学習すると、訓練データ5000のうち175を間違って判定します。このうちランダムで選んだ25個について、画像とともにラベル（どう間違えたか）を表示してみます。

```py:ex3-wrong.py
wrong_index = np.array(np.nonzero(np.array([model.predict(X) != y]).ravel())).ravel()
wrong_sample_index = np.random.randint(0,len(wrong_index),25)
fig = plt.figure()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.5, hspace=0.5)
for i in range(0,25):
    ax = fig.add_subplot(5,5,i+1)
    ax.axis('off')
    ax.imshow(X[wrong_index[wrong_sample_index[i]]].reshape(20,20).T, cmap = plt.get_cmap('gray'))
    ax.set_title(str(model.predict(X[wrong_index[wrong_sample_index[i]]])[0]))
plt.show()
```

* 1行目：`np.array([model.predict(X) != y])`で、認識を間違えたらTrue、正解したらFalseが入った行列(5000x1）を取り出します。それを`np.nonzero()`関数に入れると、Trueのデータのインデックスが入った行列が手に入ります。最終的にはベクトルで取り出したいので、`.ravel()`を2回使っています。
* 2行目：`wrong_sample_index`は、1行目で取り出した間違えたインデックスの入ったベクトル（この場合は175個）の中から、ランダムで25個取り出すために作成したインデックスです。
* 表示は`pyplot`の`subplot`を使って、5x5のサブプロットで表示します。
* `set_title`のところで、画像のタイトルとしてモデルがつけた（間違った）ラベルを表示します。ラベルは`model.predict(X[wrong_index[wrong_sample_index[1]]])`で取得しますが、1x1行列として返ってくるため、`[0]`をつけてスカラーとして取り出します。

結果はこのとおり。
![ex3-2.png](https://qiita-image-store.s3.amazonaws.com/0/96897/a39a12f7-65a1-bfe2-5e17-3520f69b2f4e.png)

4を9と間違えるとか、その逆とか、何となく納得できる間違いもありますが、そうでないのもありますね。まあ、何の特徴抽出もしないでただピクセルデータをロジスティック回帰しただけなので、こんなものなのかもしれません。それよりもややオーバーフィット気味かもしれませんので、Courseraでは後のモジュールで出てくる内容のCross Validationなどを用いて、適切な正則化パラメータ$C$を選んだほうがいいようです。
AWS CloudRoadShowまとめ2

株式会社しずおかオンライン 松永さん
株式会社ネイチャーズウェイ 吉田さん
株式会社バッファロー 牧さん

# 内容

## クラウドで実現する中小企業の情シスのあり方

株式会社ネイチャーズウェイ
名古屋化粧品メーカー

### 導入事例

ハードウェアの保守切れ（５年）
クラウドなので、「とりあえずやってみよう」
AWS導入支援ベンダー（システムサポート）

情シス２名のみ
クラウドにまかせてラクしたかった。（心配事を減らしたかった）
＝＞空いた時間でITを使ってどうビジネスをするかを考えることができる

## AWS利用実績

株式会社バッファロー

### 導入事例

ダウンロードサイト、パパの愛情ルータ、ダイナミックDNSサービス
バッファローのダウンロードサイトでウイルスが混入
CDNサービスをCloudFrontに変更

PCレスの時代に！？

プレミアムサポート（有償）
- 1:1のタイムリーなサポートチャンネル
- 経験豊富な技術サポートエンジニア
- 日本語での対応
- 24時間365日
Trusted Advisor（様々なことを相談できる）

## AWSをフル活用した地域情報の配信

株式会社しずおかオンライン
情報流通企業
まちぽ
しずおかAPPアワード

### 導入事例

スピード感や細かい仕様詰めはやりながらやる
WIFIを接続した際に訪日外国人むけにページをだす

インフラをAWS
ー＞サービス向上のほうに時間をさけるようになる
AWS CloudRoadShowまとめ1

# 企業ITを支えるAWSクラウドプラットフォームとre:Invent2015発表新サービス・機能Update

AWS ジャパン株式会社
瀧川さん

## 内容

11のリージョン、30のアベイラビリティゾーン
2014年 516の新サービス
2015年 それ以上の新サービス

IoT（Internet of Things）

例）ファイルサーバ構築
EC2＋EBS+S3
パートナー企業：fileforce, NetApp

- AWS Snowball

外部ストレージ発送による大容量データ転送サービス
-> 大容量データを高速にクラウド移行
※ USリージョンから提供開始

- AmazonWorkSpaces

フルマネージドサービス
様々な種類のデバイスからアクセスが可能
リモートワークが出来るきがする

- ビッグデータ・IoTの利用

【課題】
投資対効果を明確にできない
初期コストは抑えたい
インフラ準備に時間かかる

収集ー＞加工ー＞分析
（蓄積）

- AWSデータベースマイグレーションサービス

異なるDBをAWS DMSを用いて、違うDBにデータをマイグレーションする

- Amazon QuickSight

BIツールの1/10で実現できる

- AWS IoT

接続されたデバイスが簡単かつ安全にクラウドアプリケーションやその他デバイスとやり取りできるマネージド型クラウドプラットフォーム
Beacon

PoC
Selenium勉強会＠サイボウズ いったった


## Selenium Conference 2015 参加報告

サイボウズ 宮田さん

アジャイルアカデミー Selenium Boot Camp やりまぁす！（入門編）

### Selenium Conferenceとは？

Seleniumについてのカンファレンス。
USのポートランド。

チケットは早割あり！

1日目はワークショップ、2，3日目は通常セッション。
ビデオ公開されててスライドも9割方公開されてるらしい。

### 雰囲気

街がキレイで住みやすそうげ。
満員でSeleniumの雰囲気すごい！

Source Labs

ジョブボードで雇用募集してる。

業務でSelenium使ってる。
記録再生ツールとして使ってるセッションは1つしかなかった。
内容は辛いよって内容。

ビギナーって書いててもある程度知識ないとツラい

活発な議論されてた。

### 面白かったやつ

#### State of Union
WebDriverの生みの親Simon Stewartによるキーノート

WebDriverAgent → iOS要のWebDriverサーバー（シミュレーター）
アプリを横断してテスト可能
早い。安定する。

FBSimulatorControl
両方appiumに取り込まれそう。

#### Selenide: Cooncise UI Tests in Java

SeleniumのjQueryみたいなもん
Seleniumよりもビジネスロジックに集中できるようになる。

Java上でWebDriverをjQueryチックに書けてすげー便利そう。

プロファイラ機能もある。
時間かかるようになったときに見るようにすると良いかも知れん。

sendKeyは実行時けっこう遅いけど、パラメータでJavascriptじゃなくてJavaで入力するという怪しげなことをして早いらしい。

#### Distributed Automation Using Selenium Grid/ AWS/ Autoscaling

AWSでオートスケーリングなSelenium Gridを構築した話。
Expedia.

実行するGridはハイパフォーマンスで並列化→今度はJenkinsがボトルネックに。→Jenkinsを並列化→ハブのネットワーク帯域が問題に。。。

サイボウズでもSelenium Gridをクラウドに移行しようとしている。

### まとめ

良い刺激を受けた
資料はネットで手に入る。
一番のメリットはコミュニティでのコミュニケーション。

## テンプレートエンジンにMixer2を使うとSeleniumでのテストも楽になるかもねと言う話

ビズリーチ 渡辺さん

Mixer2 → Javaのテンプレエンジン

WebDrierと同じレベルの記述をテンプレート側でできる。

## SikuliX 知っていますか？

見た目の感覚で操作できる自動化ツール

小原さん

- どんな画面でも使える
- X-Windowのエミュレータ画面にも使える
- 画面操作の自動化に利用！
- Seleniumの連携ができる！
- 楽しさをみんなに伝えたい

見た目で判断する。

なんか簡単に使えてよさそう。
Sikuliをライブラリとして利用するといいんじゃないか。

決まった画像だったら次の操作を開始する、とか。

レイアウト崩れのチェックに使う。

SikuliXでできないこと

- 捜査の記録
- ブレークポイント
- 合否判定・テスト結果を見る

## 本当にメンテなぶるなSeleniumについて考えてみた

PageObject Design Pattern

一休.com 赤坂さん

### ここでのテストってなに？

**リグレッションテスト**

- 対象 ECサイトの予約
- 正常に予約・購入できること
- 手動でやるのはめんどくさい

Page Object Design Patternは手段の一つ。

リグレッションテストの自動化を長く続けることが大事。

#### 一休のリグレッションテスト事情

- 30ケースを8並列でJenkinsから実行
- 実行時間
	- 5-7分(本番)
	- 8-10分(ステージング)
- それぞれリリース時に実行
- 最低限のケースのみ作ってる

Page Objectで作ったら達成感に満ちあふれた
メンテできるのが自分だけ

#### どうしたか

- 全体に説明回した
- アウトプットした
- 開発のワークフローに入れた
- 丁寧にフォローする

説明するないよう

- WebDrierについて
- 実行方法
- Jenkinsからの実行方法
- ChatOps
- Q&A（具体的な修正例
- 修正時のドキュメント

これでは終わらない！
面テナー増えないだろう

定期的にアウトプットした

トラブルシューティング
たまにマニアックなやつ
基本的な内容

みんなの頭にすり込んでいった

自分でメンテしない！
グッとこらえる。
触ってもらうことで理解してもらう。

最後に

フォローは喜んでやる！
助けを求められたら喜んでやる。
→これはたしかに重要だと思う。
ペアプロみたいなこともした。
そして内容をアウトプットしてもらう。

Seleniumの輪が広がる！！！

#### まとめ

Page Objectは手段の一つ
大事なのはテスト自動化を長く運用すること
メンテナーは複数人いる

仲間を増やそう。

権威的になるのはよくない。

リグレッションテストあるある

失敗に敏感になりすぎる。

調べてみてみんなに聞いてみた。
反応なし。
チャットで聞いたのがよくなかった？

当事者意識低くないか？

エントリーを書いてみた

次起きたときにはみんなが反応してくれた

## KintoneでSelenium使った話

サーバーサイドJava24万行

Selenium1回チャレンジしたけどメンテ不能になった
大きなUI変更でほとんど動かなくなって放置

合計1000テストケース以上

QAが試験設計、PGが自動化
Java + WebDriver

新機能実装と同時に受け入れ試験を自動化している

メインブランチに変更が入る度に全てのテストが実行される
失敗したら晒し上げられる

Page Objectパターン
UI層の構造か必須

失敗時にスクリーンショット→リソース使いすぎるからやめた

コード品質を高めることが大事。

安定性を高めるためにリトライ
一定回数まで失敗したとき
Waitとかは入れないといけない

実行時間を高速化する
余計なテストを作らない
並列化する

docker-seleniumが用意されている。
UbuntuのChromeとFirefox

高速デプロイできる

GCPで動かしている

Github→Jenkins→GCP（Selenium Grid on Docker）→デプロイ
AtomでShift-JISのCSVデータをUTF-8に変換する


AtomでExcelで作成したCSVデータをUTF-8に変換した。

## パッケージのインストール
Preferences > Install > [ConvertToUTF8](https://atom.io/packages/convert-to-utf8)

## UTF-8に変換する
1. 対象のCSVデータをAtomで開く
2. Packages > ConvertToUTF8 > Japanese(Shift-JIS)
3. 保存する

これで完了！