OmniAICreator/Qiita-1.07M huggingface dataset:
連続する桁の数字で作る平方数


https://codeiq.jp/q/2941

- まず、入力が0/1なら1、4/9なら2が答えです。
- 入力値を2,3,5,6,7,8で試し割りしていきます。割り切れる場合かつ割った商が平方数でないなら、割った数を【配列】に入れて再帰します。
- 割り終わったら、【配列】の部分列が平方数になっていないかどうか調べます。

- かなり効率悪いと思います。C++でも最悪ケース0.5秒ほどかかってます。Rubyでは解けませんでした。

```cpp
#include <vector>
#include <set>
#include <cstdio>
using namespace std;
set<int>SQ;

int dfs(int n,vector<int> &a){
	if(n==1){
		int x=0;
		for(int i=0;i<a.size();i++){
			int y=1;
			for(int j=i;j<a.size();j++){
				y*=a[j];
				if(SQ.find(y)!=SQ.end())x++;
			}
		}
		return x==1;
	}
	int r=0;
	for(auto &i:{2,3,5,6,7,8}){
		if(n%i||SQ.find(n/i)!=SQ.end())continue;
		a.push_back(i);
		r+=dfs(n/i,a);
		a.pop_back();
	}
	return r;
}

int main(){
	for(int i=2;i<10000;i++)SQ.insert(i*i);
	int N;
	scanf("%d",&N);
	vector<int>v;
	printf("%d\n",N==0||N==1 ? 1 : N==4||N==9 ? 2 : dfs(N,v));
}
```
[Firebase]運用面における導入のポイント（利用料金、監視、セキュリティ）


## はじめに
FirebaseはmBaaSにカテゴライズされ、自前でWebサーバーをホスティングせずとも手軽にデータ管理を行うことができるGoogle製のクラウドサービスです。ソケット通信による双方向のリアルタイム参照／更新も魅力の1つとなります。

## 利用料金
プランは無料、月額固定（$25/month）、従量課金の3プランがあります。
https://firebase.google.com/pricing/
![利用料金](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609011.png)

###例）1レコードあたり100Byteとした場合
100Byte = ID（10Byte）+名前（20Byte）+住所（50Byte）+電話番号(10Byte)+ その他(10Byte)　

|  | 無料(SPARK) |月額$25(FLAME)|従量課金(BLAZE)| 
|:-----------|:------------:|:------------:|:------------:|
| 同時接続数 | 100|無制限|無制限|
| データ容量 | 約1,000万件|約2,500万件|約1,000万件|
| データ転送量 |約1億I/O |約2億I/O|約1,000万I/O|

※同時接続数の無制限の実態は10,000件まで
※データストレージ（ファイル等）、ホスティングコンテンツ、TestLabは割愛
※制限が超過する前にメールが配信される
※SPARK、FRAMEプランの場合、制限値が超過した場合はAPIのレスポンスにエラーが戻る
（自動的にスケールするわけではないため莫大に請求されることはない）
※以前までは使用量を監視する機能はなかったが2016年7月末にコンソール画面に使用状況タブが用意され可能となった

###料金支払い方法
[コンソール画面](https://console.firebase.google.com/)にログイン後に、左下のアップグレードから進むとクレジット登録画面に進みます。
※個人名などの情報は伏せています
![料金支払い方法](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609012.png)

##管理者の権限管理
Firebase用の[管理ページ](https://console.firebase.google.com/iam-admin/projects/)から管理者アカウントの追加/削除/ロールの変更などが可能です。
![管理者の権限管理](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609013.png)

##Firebaseの障害情報
Firebase自体は毎週7分程度のダウンタイムがあるようです。※[こちら](http://sssslide.com/speakerdeck.com/dddaisuke/sahasaitokarali-yong-surufirebase)のスライド参照しました
以下のページにて現在のfirebaseのステータス（障害情報）が確認できます。
https://status.firebase.google.com/

![障害情報](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609014.png)

##セキュリティ
データアクセスに関するセキュリティについて、基本的には全体、オブジェクト（DBのテーブル）単位、データ（DBのレコード）単位で指定が可能となります。
※考え方としてはオブジェクトのセキュリティは緩くして、レコード単位で絞っていくイメージです。

管理画面上ではJSON形式で指定します。
![セキュリティ](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609015.png)

基本的な概念として、firebaseのデータアクセスはアプリ（Webサイト）にログイン認証機能を設けて自分のデータのみ編集可能とし、他者のデータは閲覧のみまたはアクセス不可とするような考え方です。

ユーザー認証の仕組み、ユーザーデータ自体はfirebaseでも用意されております。
（Google、facebook、twitter、自前用、匿名などなど）

ログイン後はuidが割り振られ、先ほどのルールに記載することが可能です。
※以下はサンプルです。$uidとログイン後のuidが一致した場合のみ読み書きできるなど

```
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
```

管理画面など自前のサーバーから自由にアクセスしたい場合などは工夫が必要がそうです。
[サーバーサイドから利用するFirebase](https://speakerdeck.com/dddaisuke/sahasaitokarali-yong-surufirebase)


##その他（オフラインの挙動）
オフラインの挙動（[こちら](https://thinkit.co.jp/article/9451)から抜粋）

スマホやPCから書き込まれたデータはローカルストレージに保存された後、サーバに送信されます。このとき、もしネットワーク障害が発生してもデータはローカルに保存され、ネットワークが復帰次第サーバに送信されて通常のFirebase処理を継続します。
![オフライン](	
https://s3-ap-northeast-1.amazonaws.com/yrowqiita/1609016.png)
AppDelegateで、ポップアップを表示するメモ。


予め、**Main.storyboard**に、
ポップアップ用の**HintDialoViewController**クラスをもったViewControllerを用意しておき、
それのStoryboard IDに「**idHintDialoViewController**」と入れておく

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/16444f7d-d02e-9afa-08bd-b5c2fb3c17b8.png)

```swift:AppDelegate.swift

// 〜　省略 〜

// 何かのコールバックでポップアップ出す等(admob動画メディエーションの視聴完了等)
func hogeCallback(){
        stampDetailPopup(hoge_int)
}

// 〜　省略 〜

// 自作ダイアログ表示
func stampDetailPopup(stampId: Int){


        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("idHintDialogViewController") as! HintDialogViewController
        
        vc.stampId = stampId
        vc.view.alpha = 0.0
        
        // アニメーション
        UIView.animateWithDuration(0.3, delay: 0.0, options: .CurveEaseInOut, animations: {() -> Void in
            
            vc.view.alpha = 1.0 //透過度をアニメーションで変化
            
            }, completion: {(finished: Bool) -> Void in
                
        })
        

        // 重ねて表示
        self.window!.rootViewController?.addChildViewController(vc)
        self.window!.addSubview(vc.view!)
}

〜　省略 〜
```

これで、指定のViewControllerがポップアップで表示されるはず！

要はこれ、、、汗

```
self.window!.rootViewController?.addChildViewController(vc)
self.window!.addSubview(vc.view!)
```
Android fragement的生命周期

#把条目添加到动作栏
你的fragment们可以向activity的菜单（按Manu键时出现的东西）添加项，同时也可向动作栏（界面中顶部的那个区域）添加条目，这都需通过实现方法onCreateOptionManu()来完成。

你从fragment添加到菜单的任何条目，都会出现在现有菜单项之后。Fragment之后可以通过方法onOptionsItemSelected()来响应自己的菜单项被选择的事件。

你也可以在fragemnt中注册一个view来提供快捷菜单（上下文菜单）。当用户要打开快捷菜单时，fragment的onCreateContextMenu()方法会被调用。当用户选择其中一项时，fragemnt的onContextItemSelected()方法会被调用。

注：尽管你的fragment可以分别收到它所添加的菜单项的选中事件，但是activity才是第一个接收这些事件的家伙，只有当activity对某个事件置之不理时，fragment才能接收到这个事件，对于菜单和快捷菜单都是这样。

#处理fragement的生命周期
管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三种状态：

Resumed:

Fragment在一个运行中的activity中并且可见。

Paused:

另一个activity处于最顶层，但是fragment所在的activity并没有被完全覆盖（顶层的activity是半透明的或不占据整个屏幕）。

Stoped:

Fragment不可见。可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了。此状态的fragment仍然存在于内存中。

同样类似于activity，你可以把fragment的状态保存在一个Bundle中，在activity被recreated时就需用到这个东西。你可以在onSaveInstanceState()方法中保存状态并在onCreate()或onCreateView()或onActivityCreated()中恢复，关于更多的保存状态的信息，请参考Activitys章节。

Fragment与Activity的生命周期中最大的不同就是存储到后退栈中的过程。Activity是在停止时自动被系统压入停止栈，并且这个栈是被系统管理的；而fragment是被压入activity所管理的一个后退栈，并且只有你在删除fragment后并明确调用addToBackStack()方法时才被压入。

然而，管理fragment的生命周期与管理activity的生命周期极其相似。你所需要去思考的是activity的生命周期如何影响fragment的生命周期。

![image](https://qiita-image-store.s3.amazonaws.com/0/136263/3b4837eb-79dc-7ee6-e137-0b7ffb7ca888.png)
#协调与activity生命周期的关系
Activity直接影响它所包含的fragment的生命周期，所以对activity的某个生命周期方法的调用也会产生对fragment相同方法的调用。例如：当activity的onPause()方法被调用时，它所包含的所有的fragment们的onPause()方法都会被调用。

Fragment比activity还要多出几个生命周期回调方法，这些额外的方法是为了与activity的交互而设立，如下：

onAttach()

当fragment被加入到activity时调用（在这个方法中可以获得所在的activity）。

onCreateView()

当activity要得到fragment的layout时，调用此方法，fragment在其中创建自己的layout(界面)。

onActivityCreated()

当activity的onCreated()方法返回后调用此方法。

onDestroyView()

当fragment的layout被销毁时被调用。

onDetach()

当fragment被从activity中删掉时被调用。

一旦activity进入resumed状态（也就是running状态），你就可以自由地添加和删除fragment了。因此，只有当activity在resumed状态时，fragment的生命周期才能独立的运转，其它时候是依赖于activity的生命周期变化的。
[Unity]衝突判定


# 結果
![OnCollision_Result.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/49af96df-5a68-c7a7-8ae1-d2bda5abc9aa.gif "OnCollision_Result.gif")

# 前提
関数がわかること

# 手順
## 1. ステージ準備
1. SphereとCubeを作成
2. Cubeのscaleのxを5,zを5にする．
3. 高さを結果のように調節
4. SphereにRigidbodyをアタッチ

## 2. 衝突判定をする．
1. 以下のスクリプトを記述
2. スクリプトをSphereにアタッチ


```csharp
using UnityEngine;
using System.Collections;

public class BallScript : MonoBehaviour {

	// 追加する部分
	void OnCollisionEnter(Collision col){
		Debug.Log ("Hit!");
	}
}
```
vbacの改造


# vbac

http://qiita.com/matarillo/items/db205a8781ff530a48c8
で紹介されていたので愛用してます。

本当にありがとうございます。

# 改造に至る経緯

が、

* げ、binの方で更新してたのにcombineしてしまった…
* げげっ、srcの方で更新してたのにdecombineしてしまった…

というミスをちょくちょくやらかしていたのと、

* 毎回変更してないものをcombineやdecombineで更新するのもなぁ…

と気になってました。

そこで、「変更時刻をチェックして上書きしないようにしたらいいんじゃね？」ということで、慣れないWSHを弄ってみました。

## 免責

下記パッチの適用および使用はあくまでも自己責任でお願いします。
もっといい改造ができたら公開してくださいね。

## パッチ

```js
--- vbac.wsf.orig	Wed Jun 18 00:59:35 2014
+++ vbac.wsf	Thu Sep 01 17:35:14 2016
@@ -1015,6 +1015,26 @@
         var toPath  = fso.BuildPath(toDir, fso.GetFileName(fromPath));
         var office  = self.createOffice(fromPath);
         var param   = self.parameter;
+        // overwrite protection
+        var fromModified;
+        var toModified;
+        if (fso.FolderExists(fromPath)) {
+            fromModified = fso.GetFolder(fromPath).DateLastModified;
+        }
+        else if (fso.FileExists(fromPath)) {
+            fromModified = fso.GetFile(fromPath).DateLastModified;
+        }
+        if (fso.FolderExists(toPath)) {
+            toModified = fso.GetFolder(toPath).DateLastModified;
+        }
+        else if (fso.FileExists(toPath)) {
+            toModified = fso.GetFile(toPath).DateLastModified;
+        }
+        if (fromModified < toModified) {
+            println("Overwrite has blocked.");
+            println();
+            return;
+        }
         office[param.commandType](fromPath, toPath);
     });
 };
```

https://gist.github.com/acknpop/da17215af2b5d6c0add281f2d605975d
Qiita ユーザと Dropbox Paper の親和性は異常

# <i class="fa fa-dropbox"></i> Dropbox Paper
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/a9b71672-8ad8-bed8-68f6-ac47ace6ba5e.png)

　先日 Dropbox Paper がオープンベータとなり、招待制だったものが申請ベースで登録利用可能になりました。いまのところ無料です。よくあるオンラインのドキュメント共有・コラボレーション系のサービスですね。
https://www.dropbox.com/paper

- ドキュメントをオンラインで簡単に共有
- 複数人での更新、変更履歴もとれる　
- D&D で画像を挿入したり
- URL でドキュメントの一般公開したり

　ありがち＆今更な機能じゃないですか。Evernote も Google Docs もあるのにわざわざこれを使う必要もないな、、、と思っていたのですが、試しに使ってみると

# <i class="fa fa-dropbox"></i> Markdown が使える
> ![honban5.gif](https://qiita-image-store.s3.amazonaws.com/0/130874/82e38752-e939-b1eb-339e-9f0a21cae049.gif)

　**いつもの Markdown 記法がそのまま使えます。** しかもリアルタイムに装飾されるので Qiita のプレビューウィンドウに直接書いてるみたい。サクサク動くので編集がたのしい！
　Qiita で覚えたとおりに Markdown をいろいろ書いてみたところが次です、いい感じでしょ？！

> ![image](https://qiita-image-store.s3.amazonaws.com/0/130874/84963adf-8cd0-e730-bfe7-0bf0f7ce5144.png)

# <i class="fa fa-dropbox"></i> 今後の活用方法
　Markdown で記載したものはコピーした際に Markdown 形式でコピーされますので、そのまま Qiita にペーストできます。また、Markdown(.md) 形式か Word 形式でのエクスポート機能もあります。やり方によってはメモやTodoリストもこちらで管理できますね。
　Evernote でも類似の機能はありますが、こちらのほうがよりも忠実に Markdown なので Evernote のノートをすべて Paper に移してみました。Google Keep に置いていた ToDo リストも移したら一括で検索ができるようになりそうです。今後は Qiita の下書きを Paper で書いてみたりと、活用の幅が広がりそうです。

　特に Qiita ユーザの方、おすすめです！

## 追記
　試しに Qiita の[Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d
) の [.md](http://qiita.com/Qiita/items/c686397e4a0f4f11683d.md) をコピー＆ペーストしてみた結果がこちらです。すべての記法が Paper に対応しているわけではありません。

> ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/130874/cc25049f-4021-b822-c293-626f0b22eaba.png)


# <i class="fa fa-external-link"></i> 参考リンク
- [「Dropbox Paper」オープンベータ提供開始、Android/iOS/PCで共同編集できるドキュメント作成サービス -INTERNET Watch](http://internet.watch.impress.co.jp/docs/news/1013776.html)
- [Dropbox、高度な生産性ツール、Paperを予約受付中―Googleドキュメントに対決 | TechCrunch Japan](http://jp.techcrunch.com/2015/10/16/20151015dropbox-announces-paper-a-google-docs-competitor/)
Kali linux 2016.01 vboxでaptが使えない


Kali linuxでOVF提供されてるVirtualboxのイメージだと、
現在利用不可なAPTリポジトリが設定されている模様

以下のファイルをいじってリポジトリを変更する必要がある
(2016/09現在)

```/etc/apt/sources.list
deb http://repo.kali.org/kali kali-rolling main non-free contrib

deb-src http://repo.kali.org/kali kali-rolling main non-free contrib
```
ソフトウェアテスト の勉強用メモ 目次

# 目次

* [テストコードの始め方](http://qiita.com/inabe49/items/72250d9e8d5b869a91a0)
* [テストしやすいコード、しにくいコード](http://qiita.com/inabe49/items/6e3b1e02fd67a815e0c1)
* [Assert の使い方メモ](http://qiita.com/inabe49/items/5e62adfe4ff50a999b69)
* xUnit.net（.net のテスト ライブラリ）
    * [xUnit.net の使い方（基本編）](http://qiita.com/inabe49/items/2b8fa66885b0ea82798c)
    * [xUnit.net の使い方（Assert 編）](http://qiita.com/inabe49/private/f29f64ebf2c575970314)
    * [xUnit.net の使い方（ソースの指定）](http://qiita.com/inabe49/items/65da1f0c81bc67860e86)
    * [xUnit.net の使い方（Context）](http://qiita.com/inabe49/items/0dad7360a485c68e291e)
    * [xUnit.net の使い方（並列実行編）](http://qiita.com/inabe49/items/dd3bc053ba4865585d93)


# 参考資料

* [Home &gt; xUnit.net](http://xunit.github.io/)
* [xunit / xunit](https://github.com/xunit/xunit)
シェルに色属性のエスケープシーケンスを格納した変数群を導入するワンライナー

シェルの出力に色をつけるためには色属性のエスケープシーケンスという特殊な文字を出力するとよいです。

```shell-session
$ echo -e "\e[033mhello\e[m"
hello
```

上だと hello の出力が黄色になります。

ただ、この書き方を覚えるのは大変なので、Qiita でもみなさん工夫している記事が多く見つかります。

* [シェルスクリプトのechoで色を付けるための補助コード - Qiita](http://qiita.com/rita_cano_bika/items/b32e7b12e7a5c0ef68f6)
* [bashで16色表示するスクリプト用意しておくと便利 - Qiita](http://qiita.com/soramugi/items/46117274419665e601fa)
* [bashで256色表示するスクリプト用意しておくと便利 - Qiita](http://qiita.com/soramugi/items/ab82f30a5906851472cc)

類別してみると以下のようになります。

* 色属性のエスケープシーケンスを列挙して Bash の変数にあらかじめ入れる
* 他のプログラミング言語でライブラリを入れる
* 色付けを支援する外部コマンドを導入する

どの工夫も良い解法なのですが、もうちょっと何とかしたいと感じました。

* 色属性のエスケープシーケンスを列挙して Bash の変数にあらかじめ入れる
  * この変数群を用意するプログラムがそこそこ大きい（と言っても100行以下ですが）
  * 使い捨てみたいな感じで使うにはワンライナーくらいの素朴さにならないものか
* 他のプログラミング言語でライブラリを入れる
  * レガシー環境でそのプログラミング言語がない場合がある
  * ライブラリを自由に入れられない環境もある
  * ライブラリが外部コマンドを入れてくれるならいいものの、シェルスクリプトで色付けしたい場合にそのプログラミング言語のクラスライブラリだけ提供されると少々手間
* 色付けを支援する外部コマンドを導入する
  * 多種多様なサーバに入っていると、そこまで腰を据えて使うわけじゃないんだけど…と思う

あまりにも些細な不満かもしれませんが、問題意識は大事。

上の要望をまとめると

* Bash に色属性のカラーシーケンスに対応した変数を導入してくれるくらいでいい
* ワンライナーくらいになると嬉しい
* 他のプログラミング言語を使うとしても、ほぼどこにでもあると仮定できるもの

こんな感じです。

# 古い環境にもだいたい入っている Perl を利用する

そういえば、古今東西どの Linux ディストリビューションにも最初から入っているのが Perl で、2003年くらいの Perl 5.8 から **Term::ANSIColor** というコアモジュール（Perlインタプリタと同梱されて最初から使えるモジュール）があります。このモジュールは、まさにターミナルへの出力に色付けをするというもの。もちろん Term::ANSIColor も出力の色付けのために色属性のエスケープシーケンスを使っています。

Perl ではなく Bash シェルスクリプトを書く場合にも、この Term::ANSIColor が持っている色情報を活用できないものでしょうか。

というわけで書いてみました。

```shell-session
$ eval $( perl -MTerm::ANSIColor=:constants -E 'say qq($_="@{[ eval qq{$_} ]}") for @{$Term::ANSIColor::EXPORT_TAGS{constants}};' )
```

2003年リリースであるバージョン 5.8 以降の `perl` が使える環境だと、この一行で現在のシェルに `$RED` といった色属性のエスケープシーケンスを格納した変数群が用意されます。

現在のシェルから起動されるサブシェルやコマンドにも環境変数として渡して良い場合には `export` を付けます。

```shell-session
$ eval $( perl -MTerm::ANSIColor=:constants -E 'say qq(export $_="@{[ eval qq{$_} ]}") for @{$Term::ANSIColor::EXPORT_TAGS{constants}};' )
```

この `perl` ワンライナー自体は Term::ANSIColor から色名とその色属性のエスケープシーケンスの対を取り出してシェルの変数代入文を作って出力しています。それをシェルの `eval` を使って現在のシェルで評価しているだけです。実際にシェル `eval` を外して `perl` コマンドだけにするとわかりやすいです。

実際にどんな色変数を導入しているかは、以下で確認できます。下記の例では実際に色も付きます。

```shell-session

$ perl -MTerm::ANSIColor=:constants,colored -E 'say colored($_, lc $_) for @{$Term::ANSIColor::EXPORT_TAGS{constants}};'
CLEAR
RESET
BOLD
DARK
FAINT
ITALIC
UNDERLINE
UNDERSCORE
BLINK
REVERSE
CONCEALED
BLACK
RED
GREEN
YELLOW
BLUE
MAGENTA
CYAN
WHITE
ON_BLACK
ON_RED
ON_GREEN
ON_YELLOW
ON_BLUE
ON_MAGENTA
ON_CYAN
ON_WHITE
BRIGHT_BLACK
BRIGHT_RED
BRIGHT_GREEN
BRIGHT_YELLOW
BRIGHT_BLUE
BRIGHT_MAGENTA
BRIGHT_CYAN
BRIGHT_WHITE
ON_BRIGHT_BLACK
ON_BRIGHT_RED
ON_BRIGHT_GREEN
ON_BRIGHT_YELLOW
ON_BRIGHT_BLUE
ON_BRIGHT_MAGENTA
ON_BRIGHT_CYAN
ON_BRIGHT_WHITE
```

赤、青、黄色を表示して最後に色属性をリセットする場合、以下のように書けます。

```shell-session
$ echo "$RED 赤 $BLUE 青 $YELLOW 黄色 $RESET"
 赤  青  黄色 
```

![スクリーンショット 2016-09-01 20.26.01.png](https://qiita-image-store.s3.amazonaws.com/0/8760/5122aa85-951e-5dd9-1de9-2210fde7fee2.png)

もっとたくさんの種類の色を導入したい場合にも Term::ANSIColor が持っている情報を使うことができますが、ひとまず上記変数群がワンライナーで導入できるだけで嬉しい場面も多いでしょう。
.ebextensionsにマルチバイト文字があったら削除しましょう

# 今日起きたこと

ある時点を境にelastic beanstalkがインスタンス追加に失敗するようになりました。

/var/log/eb-activity.logを見たところ、

```
[2016-09-01T04:49:21.207Z] INFO  [2904]  - [Application deployment/StartupStage0/EbExtensionPreBuild/Infra-EmbeddedPreBuild] : Activity execution failed, because: 'ascii' codec can't encode characters in position 1011-1027: ordinal not in range(128) (ElasticBeanstalk::ExternalInvocationError)
```

というエラーが出ていました。

# 対応

- Activityの名前からして.ebextentionsが関係している
- エラーメッセージはどうやらpythonで非ascii文字が含まれたデータをasciiでデコードしたときに出るものらしい

という点から、.ebextensions以下のファイルに含まれていた日本語コメントを全て削除し、デプロイしなおしたところ復旧しました。

# amazonに問い合わせ

amazonに問い合わせたところ、以下のような内容でした(逐語的な転記は避けます)

- マルチバイト文字が.ebextensions以下のファイルに含まれている場合デプロイに失敗するように挙動が変わった
- 開発にフィードバックはするが対応は難しい

# releasenoteを確認

[こちら](https://aws.amazon.com/releasenotes/AWS-Elastic-Beanstalk)を確認したところ、該当するような記述は見当たりませんでした。

仕様なのか現象なのか微妙なところですが、こういった情報は是非もっと詳細に共有してほしいものです。

今回は不幸中の幸いで日中の営業時間内だったのですぐに対応できましたが、デプロイに関わるところなので、挙動がしれっと変更されて情報共有は問い合わせベースというのは不親切ではないかと思います。

# まとめ

- .ebextensions以下のファイルに日本語コメントがあったら削除しましょう
- コメントをどうしても描きたかったら英語かro-maji de kakimashou
- こういうことがあるとバグ推測力が上がるという圧倒的感謝
MySQL 5.7 - パーティションデータの退避（移動）パフォーマンス改善

# 概要
レコード数が少ない間は問題にならなかったけど、レコード数が多くなると
select insertでコピーするのは厳しくなってきたので、
EXCHANGE PARTITIONでパーティションデータを別テーブルに移動させてみました。
（古くなったデータをアーカイブするときに便利）

# 準備
## テーブル作成
中間テーブルとアーカイブ用テーブルを作成します。
中間テーブルは元テーブルとパーティション以外は同じ定義にしないとダメで、
アーカイブ用テーブルは移動元テーブルと同じ定義にします。

show create table で確認して移動元と同じ定義でテーブルを作ったけど、エラーが、、

```
Non matching attribute 'ROW_FORMAT' between partition and table
```
show table status likeでROW_FORMATを確認してみると異なってました。
create table or alter tableで移動元と同じROW_FORMATを指定してください。


# 処理
パーティションpをpartitioned_dataからpartitioned_data_archiveに移動させます。
### 中間テーブルを空にする

```sql
TRUNCATE TABLE no_partitioned_data_tmp;
```

### パーティションpをpartitioned_dataから中間テーブルに移動
```sql
ALTER TABLE partitioned_data 
EXCHANGE PARTITION p 
WITH TABLE no_partitioned_data_tmp 
WITHOUT VALIDATION;
```

### 中間テーブルのデータをpartitioned_data_archiveのパーティションpに移動
```sql
ALTER TABLE partitioned_data_archive 
EXCHANGE PARTITION p 
WITH TABLE no_partitioned_data_tmp 
WITHOUT VALIDATION;
```

### partitioned_dataのパーティションpを削除
```sql
ALTER TABLE partitioned_data DROP PARTITION p;
```

# 結果
30分程度掛かるパーティションデータの退避処理が5秒程度に改善されました。
MySQL5.7から EXCHANGE PARTITION のオプションで移動元テーブルの
データ検証を行わない WITHOUT VALIDATION が追加されてますので
範囲外のデータがないことが保証されてる場合はこちらを指定すると低コストで移動できます。

# 参考
- [詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド](https://books.google.co.jp/books?id=nY3iDAAAQBAJ&pg=PA257&lpg=PA257&dq=PARTITION+mysql+%E7%A7%BB%E5%8B%95&source=bl&ots=aYamLuBU6y&sig=KjmnXwQtZ3aEIaHzXPdhBcY_fMM&hl=ja&sa=X&ved=0ahUKEwiS1cfyyerOAhUEmpQKHZiCDV8Q6AEIUjAI#v=onepage&q=PARTITION%20mysql%20%E7%A7%BB%E5%8B%95&f=false)
- [漢(オトコ)のコンピュータ道: MySQL 5.6登場！！新機能速攻レビュー](http://nippondanji.blogspot.jp/2011/04/mysql-56.html)
- [MySQL 5.7の新機能完全リスト](https://yakst.com/ja/posts/3037)
Xamarin で Java.Lang.NoClassDefFoundError が発生した場合の対応例

Visual Studio 2015 の Xamarin で、Android アプリケーション作成中に、不可解な Java.Lang.NoClassDefFoundError が発生し、解消に至ったので、一例として共有します。

#現象
Android アプリの（エミュレーターにおける）デバッグ実行時に、Java.Lang.NoClassDefFoundError が発生。メッセージボックスには、コードから削除したはずのクラス名が表示されています。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/100206/aac51a8d-9e47-2202-79f4-50b8912ce8de.png)

ちなみにエミュレーターは、Visual Studio 付属？の emulator.exe / emilator-x86.exe で、Atom(x86) の Android 環境を再現させています。

#解決した方法
デバッグ用にアップロードされたエミュレーター上の開発中アプリケーションを、手操作でアンインストールしました。その次からは発生しなくなりました。

#試す価値がある／試した（けれども今回は違った）方法
消したはずのクラス名が例外の情報として表示されていたので、まだどこかに残っているのか？と思い、ソリューション全体からそのクラス名のテキスト検索（Visual Studio の検索機能）をしてみましたが、ひとつも見つかりません。

MainActivityのレイアウト表示までのみ有効にして、以降をすべてコメントアウト（MainActivity 以外のクラスは定義丸ごとコメントアウト）してみましたが、コメント中のコード行を示して NoClassDefFoundError 例外が発生しました。なんじゃこりゃぁ...

[StackOverflow](http://stackoverflow.com/questions/34567503/java-lang-noclassdeffounderror-issue-when-using-android-support-design-navigatio) さんには、「プロジェクト・ソリューションのクリーン -> binフォルダとobjフォルダを削除 -> ？ -> リビルド」の解決例も書かれていました。私の場合は、クリーンとbin/objフォルダ削除をしてみましたが、解決しませんでした。ちなみに「クリーン」は、（Xamarinプロジェクトだけなのかはわかりませんが）objフォルダの中身は消さないのですね。。

[IBM](https://www.ibm.com/developerworks/jp/java/library/j-dclp2/)やサイトにも情報がありますが、今回は非該当でした。
CSSでパラパラ漫画のように色を変更する方法

CSSでアニメーションをつけるとき、大抵滑らかな変化をつけると思いますが、パラパラ漫画のように、次の変化へ滑らかな変化が入らないときは、step-endが便利です。

```html:
<div id="hoge"></div>
```
```css:
#hoge{
	width:100px;
	height:100px;
	background-color: #da8f87;
	animation: parapara 12s step-end 0s infinite;
}

@keyframes parapara {
    8% { background-color: #aecece; }
   16% { background-color: #cbdcca; }
   25% { background-color: #d8a2c2; }
   33% { background-color: #6894ca; }
   41% { background-color: #6cabad; }
   50% { background-color: #f7b9ad; }
   58% { background-color: #e66081; }
   66% { background-color: #9598ba; }
   75% { background-color: #edd248; }
   83% { background-color: #f8c08a; }
   91% { background-color: #8ba7b3; }
}
```

背景色がパラパラと変化するdivタグができました。

参考：https://developer.mozilla.org/ja/docs/Web/CSS/timing-function
PostgreSQLのデータベースクラスタのサイズをSQLで確認する

どうやったら簡単に見れるっけ？というのがとっさに出てこなかったのでメモ！

以下の言葉（クエリ）を深く心に刻み込んだ。

```
SELECT pg_size_pretty(SUM(pg_database_size(datname))) AS cluster_size FROM pg_database;
```

# 実行例

```
postgres=# SELECT pg_size_pretty(SUM(pg_database_size(datname))) AS cluster_size FROM pg_database;
 cluster_size 
--------------
 171 MB
(1 row)
```

duコマンドの結果として比較しても、ちゃんと一致していることがわかります。

```
$ du -h $PGDATA/base
7.2M    data/base/1
7.0M    data/base/13289
157M    data/base/13294
171M    data/base
```

# 簡単に補足

* 実行ロールについて
一般ユーザでも実行可能です。

* [pg_size_pretty()](http://www.postgresql.jp/document/9.5/html/functions-admin.html)
引数で与えられたバイト数をサイズの単位を付けた書式に変換してくれるシステム管理関数。

* [pg_database_size()](http://www.postgresql.jp/document/9.5/html/functions-admin.html)
引数で与えられたデータベースが使用するディスク容量を返すシステム管理関数。


* [pg_database](http://www.postgresql.jp/document/9.5/html/functions-admin.html)
データベースの情報が格納されているシステムカタログ。
datname：データベースの名前

# 2016/9/10追記
本記事では、「データベースクラスタのサイズ＝テーブルのサイズ（\$PGDATA/base）」として記述しています。

「データベースクラスタ＝\$PGDATA」とする場合、PostgreSQLの設定によっては、ログファイルやWALファイルが$PGDATA配下に格納されるので本書の内容だけではクラスタのサイズを見積もることはできない点にご注意ください。
fluentdのpluginを入れる際の注意点

プラグインを入れる際下記のようなエラーになっていろいろ調べたけど最初わからなかった。
ruby/thread.hの行でエラーになってるっぽいのでちゃんとincludeされてないのかとか思ったけど実際は違って、
結局gccが足りなかったということだった。
別環境ではインストールできていたのでなぜなのか気づくのに時間かかった・・・。

```
Building native extensions.  This could take a while...
ERROR:  Error installing fluent-plugin-mysql_explain:
        ERROR: Failed to build gem native extension.

    /opt/td-agent/embedded/bin/ruby -r ./siteconf20160901-9025-102pzis.rb extconf.rb
checking for ruby/thread.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/opt/td-agent/embedded/bin/ruby
/opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:467:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:598:in `try_cpp'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1072:in `block in have_header'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:923:in `block in checking_for'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block (2 levels) in postpone'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:351:in `block in postpone'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:321:in `open'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:347:in `postpone'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:922:in `checking_for'
        from /opt/td-agent/embedded/lib/ruby/2.1.0/mkmf.rb:1071:in `have_header'
        from extconf.rb:16:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/mysql2-0.4.4 for inspection.
Results logged to /opt/td-agent/embedded/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0/mysql2-0.4.4/gem_make.out
```
Node.jsアプリをHerokuへデプロイ

毎回調べてしまうのでメモ。

#package.json作成
Herokuはこれをみて依存関係を知るので必要です。

```
$ npm init
```


#モジュールのインストール
モジュールのインストール時も気を付けなければなりません。
`--save` オプションをつけてpackage.jsonの依存関係に設定します。

```
$ npm install モジュール名 --save
```

#Herokuへログイン

```
$ heroku login
```


#Herokuアプリ作成

```
$ heroku create [アプリ名]
```


#Git初期化
```
$ git init
```

#.gitignore作成
公開したくないファイル(.envなど)を.gitignoreへ記入

#Procfile作成
起動するためのコマンドをここに記入

例えば

```node.js:Procfile
web: node app.js
```



#Git追加

```
$ git add . 
```


#Gitコミット

```
$ git commit -m "initial commit" 
```


#Gitレポジトリ登録

```
$ heroku git:remote -a アプリ名
```

#Gitプッシュ

```
$ git push heroku master
```


# *Herokuのログ確認
Herokuアプリ公開後、ログをみたいときは

```
$ heroku logs -t
```

ターミナル以外でもHerokuのダッシュボードのMore > View logsからでも確認できます。
mrubyをAndroid Studioのエミュレーターで動かすためのlibmruby.aを作る

# はじめに

Android x86なlibmruby.aができれば、Android Studioで高速なエミュレーターを使えるはずと思いやってみた。

# Android x86_64向けのlibmruby.aを作るには

toolchain :androidではダメ。

```rb
toolchain :android, {:arch => "x86_64",:platform => "android-21"}
```

と、archにx86_64の指定は当然ながら、platformの指定も必要。

これがないと、

stdint.hがないと怒られる。

# Android向けのクロスビルドの設定例

こんな感じで、libmruby.aをarmとx86_64向けに作れた。

```rb
MRuby::CrossBuild.new('android') do |conf|
    toolchain :android
    # include the default GEMs
    conf.gembox 'full-core'
end

MRuby::CrossBuild.new('android_x86') do |conf|
    toolchain :android, {:arch => "x86_64",:platform => "android-21"}

    # include the default GEMs
    conf.gembox 'full-core'
end
```

と、gemboxの指定も忘れずに。。（忘れてlibmaruby.a作って、mrb_load_stringのシンボル参照の解決できずにハマった。）


# 参考資料

- [mrubyのビルドシステムにAndroid用のビルドを対応させました - crimsonwoodsのブログ](http://crimsonwoods.hatenablog.com/entry/2013/03/15/012550)

# 関連記事

- [cordovaのプラグインを作ってkindle fireでmrubyを動かしてみた](https://abrakatabura.hatenablog.com/entry/2016/09/21/070123)
- [久しぶりにCordovaを動かしてみたら動かなかった](https://abrakatabura.hatenablog.com/entry/2017/07/29/072941)
Wake on LANしてみる

# Wake on LAN しない！！

Wake on LAN をしたいので MagicSend という古のツールを使っていたが、調子悪い。
起動するときはあるが、起動してくれない時もある。
NIC2枚刺しだと意図した方にパケットが飛んでくれていないのか？
ブロードキャストアドレスを指定しないと駄目なんじゃない？

で、MagicSend のコマンド引数はMACアドレスしか渡さない仕様になっている。ブロードキャストアドレスを指定したいのに。
MagicSend のソースコードを覗いてみるかぁ・・・と思ったらもうサイトクローズしちゃってんじゃん！！

# WOL するには Magic Packet を送る

以下のように、UDP で Magic Packet を送ると起動してくれます。
http://www.atmarkit.co.jp/ait/articles/0602/25/news014.html

# 他にもツールがあるけど、せっかくなので作ってみる

まぁ言語は何でも良いのだけど。

```csharp:program.cs
    class Program
    {
        static void Main(string[] args)
        {
            MagicPacket.Send(9, IPAddress.Parse("192.168.101.255"), new byte[]{0x12,0x34,0x56,0x78,0xab,0xcd});
        }
    }

    static class MagicPacket
    {
        static public void Send(int port, IPAddress broad, byte[] macAddress)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(stream);
            for (int i = 0; i < 6; i++)
            {
                writer.Write((byte)0xff);
            }
            for (int i = 0; i < 16; i++)
            {
                writer.Write(macAddress);
            }

            UdpClient client = new UdpClient();
            client.EnableBroadcast = true;
            client.Send(stream.ToArray(), (int)stream.Position, new IPEndPoint(broad, port));
        }
    }
```
自分がmarkdownでメモ書きするときはこうしてる

```html
<!DOCTYPE html><meta charset="utf-8"><title>markdown</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.8.2/marked.min.js"></script>
<script>onload=function(){b=document.body;b.innerHTML=marked(b.innerHTML);}</script>
```

この3行を先頭にコピペ、そのままmarkdownで書く。
htmlとして開くと、マークアップ状態で表示される。

業務だとマークダウン用エディタとかインストールできないんでこれでやってます。

~~...CDNすらアウトなら諦めてくれ~~
macports環境下でpythonzを使ってPython3をインストール


いろいろ細かいエラーが出て手こずったのだけれど，以下で行けた


```shell
$ sudo port install openssl libxml2 libexpat
$ pythonz install --configure="--with-system-expat CFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib" 3.5.2
```

出たエラー（検索用）
```
ImportError: No module named 'pyexpat'
make: *** [install] Error 1
```

```
ImportError: No module named pyexpat
```
raw.githubusercontent / dl.dropboxusercontentをHTMLレンダリングする


## 前説
- raw.githubusercontent.comからgithubリポジトリ内の生ファイルを閲覧できますが、HTMLがレンダリングされない問題があります。
- rawgitやgithackを使う方法もありますが、サーバー側の通信が増大する(結果レスポンスが重くなる)問題があります。
- これらのサービスはContent-Typeを書き換えているだけなので、クライアントサイドでできないかと考えてみたところ、拡張機能を用いることでできました。

## 方法
- Chromeにて、 https://github.com/cielavenir/ctouch/tree/master/cfix 配下を、「パッケージ化されていない拡張機能を読み込」んで下さい。
  - https://support.google.com/chrome/a/answer/2714278?hl=ja のステップ2が参考になると思います。
- (現状、WebStoreにて公開予定はありません)
  - (10/8に更新しましたので、お手数ですが再ダウンロードをお願いします)

## 課題
- なぜか、Content-Typeだけを指定すると化けます。リクエスト時にAccept-Encodingを空にする(すなわちgzipを無効にする)ことで直りますが、原因は不明です。

## あとがき
- 実際には、本記事は **10/3にDropboxのHTMLレンダリングが停止する** ことを受け、その対策として書かれたものです。
- 10/8: 実際にDropboxがHTMLレンダリング可能であることを確認しました。
MacのExcelが爆遅すぎて狂喜乱舞したら改善した


MacでOffice2011が爆遅すぎて死ねます。

Excelへの記入前にテキストで記述して、
セルにコピペ。

という意味のわからない手順で、遅いExcelに苛立たないようにしていました。

が。

限界。

過去に色々調べていましたが、
改善に至った対処はありませんでした。

ですが、ちょっとした情報を見つけ、少し改善しました。

## Fontの重複が問題らしい

Appleのコミュニティで、議論されていた。
https://discussionsjapan.apple.com/thread/10153975

### さっそくやってみた
---

Font Bookを開いて

![lodge000.png](https://qiita-image-store.s3.amazonaws.com/0/6311/0acf9851-c4c1-ddfe-5525-42adcce685cf.png "lodge000.png")

すべてのフォントを選択して

![lodge001.png](https://qiita-image-store.s3.amazonaws.com/0/6311/29d0df04-3dde-c3de-2379-4f8c04d586e3.png "lodge001.png")

フォントを検証する

![lodge002.png](https://qiita-image-store.s3.amazonaws.com/0/6311/4fc03bbb-2aed-d9bb-798e-6749ee4a034e.png "lodge002.png")

すると。。。
いくつかの問題が見つかります。

![lodge003.png](https://qiita-image-store.s3.amazonaws.com/0/6311/4a41aaa5-6016-16ae-5985-6ce502f78e3c.png "lodge003.png")

この時、Font Book上で重複しているフォントを除外してくれています。

最後に、~/Library/Caches でキャッシュを削除

![lodge004.png](https://qiita-image-store.s3.amazonaws.com/0/6311/c3285cb1-7a22-4f92-e2a3-320c0a13027f.png "lodge004.png")

再起動後、Excelのセル内の入力待ちが解消した！
（あくまでも少し）

ちょっとした気休め程度ですが、
やる価値はあるかもしれません。

最適化されることを望みます。

### まとめ

Excel爆発しろ
作業効率UP！？おすすめMac基本設定


Mac標準でそのまま使っている方へ、、、
初期設定から脱却を！！

## トラックパッド

マウス派のあなた！！
本当にそれでMacを使っているメリットを活かせていますか！？

以下のオススメ設定、騙されたと思って一ヶ月使ってみてください。
新しい世界が広がります。

### 特に押さえておきたい機能

3本指でテキストをタップ
→語彙を調べる

![mac001.png](https://qiita-image-store.s3.amazonaws.com/0/6311/f2962391-355a-e60c-6cd6-85c438c77a09.png "mac001.png")

標準の英和辞典や、Wikipediaの検索結果がポップアップで表れます。
辞書アプリの環境設定で辞書の種類は切り替え可能。
（英語のドキュメントにも活用）

3本指で移動
→アクティブウィンドウを操作
![mac002.png](https://qiita-image-store.s3.amazonaws.com/0/6311/db4310b9-fd5b-eeb3-b175-776e911a7f2d.png "mac002.png")

マウス派：右手をマウスに移動/ポインターを合わせる/ダブルクリック/移動（イライラ）
トラックパッド派：ポインターを合わせる/移動（スイスイ）

## Dock

画面下に並んでるやつです。
Macぽいですよね。
![mac003.png](https://qiita-image-store.s3.amazonaws.com/0/6311/437ed11f-22a1-a2f5-f3fa-c4a3fd670ada.png "mac003.png")

### オススメ設定

「Dockを自動的に隠す」：（画面を広く使える）
「ポイント時の拡大率は最大」：（選択しているアプリが認識しやすい）
![mac004.png](https://qiita-image-store.s3.amazonaws.com/0/6311/c8812155-8298-b0ea-7ed1-9b394d31e7dd.png "mac004.png")

セカンドディスプレイを利用している方は、アプリごとのディスプレイ割り当てが便利です。

オプション→ディスプレイ1 or 2 のデスクトップ
![mac005.png](https://qiita-image-store.s3.amazonaws.com/0/6311/e5112d02-0534-59a4-d192-af586a3c7ac8.png "mac005.png")

私はToggl Desktopをセカンドディスプレイの左下に常設しています。
（あまり邪魔にならなずに、でも存在を意識しやすい場所）

## Finder

Finderって昔はタブ管理するにはツールが必要でした。
今は標準機能になっています。

Finder→表示→タブバーを表示

すでに複数のウインドウを開いている場合、
ウインドウ → 全てのウインドウを結合
とすると、すっきり纏まります。

### オススメ設定

「フォルダを新規ウィンドウではなくタブで開く」：（1ウィンドウ内で完結させる）
![mac006.png](https://qiita-image-store.s3.amazonaws.com/0/6311/77438643-6278-a792-8ffd-4daff4bc86c0.png "mac006.png")

「サイドバーの表示項目」：（普段使わない/邪魔なもの はオフ）
![mac007.png](https://qiita-image-store.s3.amazonaws.com/0/6311/e37854b1-8ce3-10c7-f4e7-33d8855d9e90.png "mac007.png")

「すべてのファイル名拡張子を表示」：（性格的にずっと出ててほしい）
![mac008.png](https://qiita-image-store.s3.amazonaws.com/0/6311/49c9cc8b-9f3d-1375-a467-b023a0f0eeec.png "mac008.png")

表示→パスバーを表示：（階層移動が楽、ファイルの移動もできる）
![mac009.png](https://qiita-image-store.s3.amazonaws.com/0/6311/a40fec96-dcae-0f49-90b6-f40b9fad16ec.png "mac009.png")

## 番外編

ステータスバーが狭くなってきたら、
画面右上に表示されている「ユーザ名」を消してしまいましょう。
（基本的に自分のマシンなので、いちいち出している必要はない）

システム環境設定→ユーザとグループ→ログインオプション（鍵で変更可能）
「ファストユーザスイッチメニューを表示」をオフ
![mac010.png](https://qiita-image-store.s3.amazonaws.com/0/6311/6b691d55-b453-b1bd-02d4-9bf085b46f62.png "mac010.png")

## まとめ

人によって使いやすい/使いづらいはあると思いますが、
単に使いにくい！！という理由だけで使わないのは勿体無いです。

使われているには理由があります。
是非！使いづらければ使いやすい方法を探しましょう！ ^^
初めてのSlackで優越感に浸るための5つの準備


皆さんはSlackって使ったこと有りますか？
業務でSlackを利用しているチームもあるのかなと思います。

私のチームでは、最近、お客様とのコミュニケーションツールとして本格導入しました。

導入にあたり、他アプリとの連携などを試したり、
今まで突っ込んで使ったことがなかったのでより深く使ってみました。

今回は、超初心者の私がSlackを使って優越感に浸ることが出来た方法を紹介します。


## 俺色に染める

まず、Slackを好きな色にカスタマイズしましょう。

Preferencesをクリックすると
![Lodge_Slack_000.png](https://qiita-image-store.s3.amazonaws.com/0/6311/0713868a-14e5-e5c0-c426-76eab7047a28.png "Lodge_Slack_000.png")

SlackアプリのPreferencesが起動します。

Sidebar Theme を選択します。
![Lodge_Slack_001.png](https://qiita-image-store.s3.amazonaws.com/0/6311/77bf631c-9fb4-5852-d0f0-54c5db3cfdf0.png "Lodge_Slack_001.png")

幾つか、既にテーマがありますので、ここから自分に合ったテーマを選べます。
お好みのテーマがない場合、 CustomTheme で RGB 指定が可能です。
![Lodge_Slack_002.png](https://qiita-image-store.s3.amazonaws.com/0/6311/4aca4c01-07f5-50f3-6a6d-5e82635853aa.png "Lodge_Slack_002.png")

↑私は Mac のターミナルが好きなので、ターミナル風にしています。

[Slack Themes](http://slackthemes.net/#/afterglow)から、より多くのThemeから人が使ってないようなThemeを探してRGB設定できます。

## サッと投稿履歴を追いかける

Advanced Optionを選択します。

Input Option で Use ↑ and ↓ to cycle 〜 を選択します。
![Lodge_Slack_003.png](https://qiita-image-store.s3.amazonaws.com/0/6311/e2f041c1-5eae-dda9-4c30-4e56e5605521.png "Lodge_Slack_003.png")

そうすると、キーの上下でコマンド履歴を終えるようになります。
（その場合、Cmd+↑で自分の投稿した最新のコメントを編集できます）

同じコメントを秒速でageられます。
後述するスラッシュコマンドを秒速で再投入可能です。

## プライベートをきっちり分ける

Advanced Optionを選択します。

Channel List で List private channnels separately を選択します。
![Lodge_Slack_004.png](https://qiita-image-store.s3.amazonaws.com/0/6311/5b3e910a-cc69-9322-7f51-9fe28c8ccf2a.png "Lodge_Slack_004.png")

Slackの初期設定では、PrivateChannelと通常のChannelがごちゃまぜになります。
この設定をすると、スッキリ分けることができます。
（特によく使うChannelには、Starをつけることをおすすめします）

プライベートと仕事を切り分けられるのって素敵ですね。

## シンプルが一番

Message & Mediaを選択します。

Message Theme で Compact を選択します。
![Lodge_Slack_007.png](https://qiita-image-store.s3.amazonaws.com/0/6311/0274b476-a241-08da-1a74-3b972da3236d.png "Lodge_Slack_007.png")

Slackの初期設定では、ユーザのアイコンが表示されるのですが、
この設定をすると、アイコンが消えます。

アイコンが消えた分、メッセージの表示量が増えます。
ちょっとした拘りに優越感に浸れます。

## 忘れっぽい自分をサポートしてもらう

Slackには、スラッシュコマンドという「/（スラッシュ）+ hoge」で色んな事が実現できます。

例えば、「このChannelに誰いたかな？」と思うときには。
「/who」と入力します。
![Lodge_Slack_005.png](https://qiita-image-store.s3.amazonaws.com/0/6311/23faeeaf-4686-28cf-c675-35e6f2447ea6.png "Lodge_Slack_005.png")

補完されるので最高です。

botが自分の為だけに教えてくれます。
（Only visible to you というコメントが入っているのは他に人には見えません）

とりあえず「/（スラッシュ）」を入れてみましょう。
そこにあなたの知らない世界が広がります。
![Lodge_Slack_008.png](https://qiita-image-store.s3.amazonaws.com/0/6311/aedf5502-8f48-7df4-5395-da716cfba1d1.png "Lodge_Slack_008.png")

ほとんどのやりたいことはスラッシュコマンドで解決出来るような気がしてなりません。

## まとめ

まだ初歩の初歩ですが、スラッシュコマンドはやばそうなので覚えたいと思います。
何事も設定次第で使いやすさは倍増するので、是非いろいろと試したら良いと思います。

さよならSkype。
「CheatSheet」でMacアプリのショートカットを5秒で確認する


##インストール
下記URLからダウンロードし、解凍して起動する。
http://www.cheatsheetapp.com/CheatSheet/

アプリケーションフォルダに格納することをお勧めします。

## 設定
システム環境設定 -> セキュリティとプライバシー -> アクセシビリティ で、
CheatSheet.app にチェックをします。

##使い方
commandキーを3秒程度長押しするだけです。
ショートカット一覧が表示されます。

忘れやすい人にはピッタリ！
Ajaxでファイルダウンロードをしたかった

# やりたいこと

フロントからAjaxでExpressサーバーにアクセスして、ファイルをダウンロードしたい！

# できたコード

サーバーではバイナリを返して、フロントのJSでBlob作って、ObjectURL作って……みたいなことをしたのですが、うまく行かず。

結局以下の様なコードになりました。もうちょっとどうにかならないかね。。

[(全コードはこちらから)](https://github.com/nawada/express_example)

```js:front.js
dom.addEventListener('click', (e) => {
  e.preventDefault();

  var xhr = new XMLHttpRequest();
  xhr.open('get', '/file');
  xhr.onreadystatechange = () => {
    if(xhr.readyState !== 4 || xhr.status < 200 || xhr.status >= 400) return;

    var res = JSON.parse(xhr.responseText);
    var a = document.createElement('a');
    a.href = 'data:image/jpeg;base64,' + res['base64'];
    a.download = 'Image.jpg';
    document.body.appendChild(a);
    a.click();
    a.parentNode.removeChild(a);
  };
  xhr.send(null);
});
```

```js:server.js
router.get('/file', function(req, res, next) {
  const rs = fs.createReadStream(path.join(__dirname, '../public/images/image.jpg'));
  let data = [];
  rs.on('data', (c) => {
    data.push(c);
  });
  rs.on('end', () => {
    const buf = Buffer.concat(data);
    res.send({'base64': buf.toString('base64')});
  });
});
```
要素の高さを揃えるjsプラグイン


## プラグイン紹介

jQuery.match.height
https://github.com/liabru/jquery-match-height

## 使い方

「jquery.matchHeight-min.js」を読み込む

    <script src="./js/jquery.matchHeight-min.js"></script>

高さを揃えたい要素をjqueryのセレクタで指定する

    $(function(){
        // jquery.matchHeightで要素の高さを揃える
        $('.hoge').matchHeight();
    });

## 完成形

    <script src="./js/jquery.matchHeight-min.js"></script>
    <script>
        $(function(){
            $('.hoge').matchHeight();
        })
    </script>
スマホでアクセスした際に電話番号をタップで電話がかけられるようにする


    $(function(){
        var ua = navigator.userAgent;
        if(ua.indexOf('iPhone') > 0 && ua.indexOf('iPod') == -1 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0 && ua.indexOf('SC-01C') == -1 && ua.indexOf('A1_07') == -1 ){
            $('.telLink img').each(function(){
                var alt = $(this).attr('alt');
                $(this).wrap($('<a>').attr('href', 'tel:' + alt.replace(/-/g, '')));
            });
        }
    });
ハンバーガーメニューのドロワー


    $(function(){
        $('#spNavBtn').on('click', function() {
            $('.spNavClose').remove();
            $('.headerNav ul').append('<li class="spNavClose"><a href="#">閉じる</a></li>');
            $('.headerNav').slideToggle(200);
        });
        $(document).on('click', 'li.spNavClose', function() {
            $('.headerNav').slideToggle(200);
        });
    });
レスポンシブ対応の高速化


コツ：なるべく、jqueryオブジェクト（$(funciton(){});）の外側に条件分岐などのJavaScriptの記述を書くようにすること

    // window幅の取得
    var windowW = window.innerWidth;
    
    // 条件分岐
    if ( windowW >= 1025 ) {
        // 1025px以上の処理を記述
        $(function(){
    
        });
    } else {
        // 1024px以下の処理を記述
        $(function(){
    
        });    
    }
ライフハック

## iOSで寄った店をメモメモ

iOSのメモが機能強化されて結構アツい

- GoogleMapかApple Mapで検索
- 店ピンをタップ
- 共有でメモを選択

## iOSで気に入ったWebページをメモメモ

矩形で囲われて見やすい

- Safariで閲覧中右上の共有ボタン押下
- メモを選択
Pixi.js で Stage の touchEvent から position を取得する

悩んだのでメモ。

```js
var stage = new PIXI.Stage(0x000000);
stage.interactive = true;
stage.on("touchstart", function(event) {
    var touch_0 = event.data.originalEvent.changedTouches[0];
    var x = touch_0.globalX;
    var y = touch_0.globalY;
});
```

touch_0 の中身はこんなのが入ってる。

* globalX
* globalY
* identifier
* target (object)
* screenX
* screenY
* clientX
* clientY
* pageX
* pageY
* radiusX
* radiusY
* rotationAngle
* force

`target` 以外はnumber型で入っている。
CSSでデータマスキング

## 目的
ページ内容をマスキングをかけて、続きの読むへは会員登録などへ誘導

やり方
1. mask用のdivを用意して、グラデーションで透明度を変更
2. 会員登録ボタン用のdivを用意して、mask divの中に置く

サンプルはこちら
https://jsfiddle.net/yangchuntao/t4s74168/
2016-09-01 c++ builder > OnKeyDownイベント > Formにコンポーネントがある場合はKeyPreview=trueにすることでOnKeyDownイベントを認識する

```txt:動作環境
C++ Builder XE4
```

フォームのOnKeyDownのプログラムを試していた。

コンポーネントをまったく持たないフォーム単体の場合、OnKeyDownイベントを認識していた。
そのフォームにTMemoを足した後、OnKeyDownイベントを認識しなくなった。

以下の情報ではKeyPreviewプロパティをtrueにすることで、OnKeyDownイベントを認識するようだ。
参考 http://www.gesource.jp/weblog/?p=4581

KeyPreviewをtrueにしてからはTMemoがある状態でもOnKeyDownイベントを認識するようになった。

TMemoがない時にKeyPreview=falseでもOnKeyDownイベントを認識していた理由は未消化。
ridgepoleを使ってみた

Railsのmigrationを初めて学んだときは非常に面倒くさいと思った。
最近ではそれにも大分慣れてきたが、やはりridgepoleの方がずっと楽チンだ。特に開発初期でスキーマがコロコロ変わるときは。
しかしmigrationの方が優れているところもあると感じた。

- DBスキーマが最新になっているか確認しやすい
    - ridgepoleでも`--dry-run`して差分があるかで確認できるが…
- migrationしていないときは`PendingError`が出せる（migrationを忘れたまま起動してしまうことを防止できる）
- `CREATE FUNCTION`や`CREATE VIEW`にも対応している
- カラム名が何度変わっても追跡できる（ridgepoleでも`renamed_from:`という機能があるが、同じカラムが何度もリネームされた場合はどうなるんだろう？）
- ridgepoleはSchemafileにないテーブルをDROPしてしまう。しないようにするオプションが欲しい…

これはridgepoleとmigrationどちらでも同じだが(*1)、postgresでnullが入っているカラムにnot nullをつけようとすると`[ERROR] PG::NotNullViolation`になってしまうのはなんとかならないだろうか。
オプション指定により`UPDATE t SET col = 0 WHERE col IS NULL`みたいによしなに計らってくれればいいのにと思う。MySQLぐらいの適当さでいい。

*1 migrationでは下記のように一度NULL許可でカラムを追加したあと、NULL不許可に変更すれば問題ないらしい。

```
class AddUserToFoos < ActiveRecord::Migration
  def up
    add_column :foos, :user_id, :integer
    change_column :foos, :user_id, :integer, :null => false
  end
 
  def down
    remove_column :foos, :user_id
  end
end
```
JSF2.2 + Spring3.0 でカスタムViewScopeの同一画面判別方法

以前アメブロで公開した内容です。

JSF2.2 + Spring3.0の環境でViewScopeを使えるようにしてみました。
カスタムスコープを使用しています。

カスタムスコープの作成方法はこちらの記事を参考にさせて頂きました。
http://jarngreipr.blog106.fc2.com/blog-entry-7.html

こちらの記事通りの方法でViewScope自体は使えるようになるのですが、実際どういった時に「同一画面」と捉えれるのか？がよくわからなかったので、いろいろと試してみました。

### 何をもってして別画面と判断するのか？
viewIdというものを使用して判別しています。
JSF側で自動管理されているパラメータになります。
この値が変更されると、別の画面に変わったという判断になるようです。

### GET遷移の場合
`h:link`、`h:button`を使用した場合などのGET遷移の場合は常にviewIdが切り替わるようで、かならず別画面であるという判定が行われます。
まあ、これは想定内ですね。

### POST遷移の場合
`h:commandLink`、`h:commandButton`などでPOST遷移する場合。
ここ、ちょっと躓きましたが、結果以下のような形でした。

##### 遷移先Actionの戻り値がvoidの場合
viewIdの変更なし
##### 遷移先Actionの戻り値がStringの場合
Stringの内容によって変動
- `return null`　　　viewIdの変更なし
- `return outcome`　　　viewIdの変更あり


### まとめ
結論としては、ViewScope範囲内で画面再表示を実施したい場合は、かならずPOST遷移を使用し、値をnullで返却する、という形で収まりました。
よく考えれば当たり前のことな気はしますね・・・

ちなみに、似たような話で`f:viewAction`の「画面を初回表示した際にのみ」実施されるという「初回」の判断は何をもってしているのか？というのも調べたところ、こちらは完全にGET遷移かPOST遷移かだけで判断しているようです。
なので、 `return outcome`で別ページから遷移してきても、実行されません。
カスタムViewScopeと`f:viewAction`を併用する場合は、このあたり気を付けて実装する必要があると思われます。
明日からUnityのプロファイラを活用したくなりそうなスライドを作ってみた

<iframe src="//www.slideshare.net/slideshow/embed_code/key/Nvui6ki8VnxRnV" width="510" height="420" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/miokutani/unity-65578795" title="Unityプロファイラについて" target="_blank">Unityプロファイラについて</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/miokutani">Mio Ku-tani</a></strong> </div>

いろいろと足りない部分もありますが
プロファイラが使いたくなる人が増えるといいなぁ
Selenium, Phantomjs & BeautifulSoup4 

必要なパッケージのインストール

``` bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

$ sudo aptitude install phantomjs xvfb
$ pip install selenium pyvirtualdisplay
```



``` python
from selenium import webdriver
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
# <Display cmd_param=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', ' - snip -

driver = webdriver.PhantomJS()
driver.get("http://www.example.com)
type(driver.page_source)
# <class 'str'>

driver.page_source
# '<!DOCTYPE html><html itemscope="" itemtype="http://schema.org/Web - snip -

from bs4 import BeautifulSoup
soup = BeautifulSoup(driver.page_sourve)
i = [ {"href": x["href"], "text": x.string, "class": x._class } for x in soup.find_all("a") ]
print(i)
# [{'class': None, 'text': 'MENU', 'href': 'javascript:;'}, {'class': None, 'text': 'トップページ', 'href': '/'}, {'class': None, 'text': 'プラットフォーム', 'href': '/pf/'},  - snip -
```

現在(2016年9月)でも下記の問題があるので Ubuntu 16.04 で Phantomjs を使用する場合はパッケージからではなく通常の手順でインストールしたほうがいい
https://bugs.launchpad.net/ubuntu/+source/phantomjs/+bug/1578444
Vagrant などで、新しいbox を作る時、ヒストリーを空にする

# 概要

Vagrantで新しいboxを作るとかで、ヒストリーを空にしておきたい時がある

# 結論

```
export HISTSIZE=0
history -c
truncate -s 0 ~/.bash_history
```

現在のシェルのヒストリーも遡れなくなるので、
あとはshutdownか、rebootするような状況で使うと良いと思う
AWS上のインスタンス作成手順

AWS上のインスタンス作成手順をさくっとメモ


①AWSの登録
12ヶ月無料枠があるのでおすすめ

②VPCの作成
ホーム画面からネットワーキングのVPCを選択

左ダッシュボードからVPC＞VPCの作成＞以下の設定で作成
　ネームタグ：適当
CIDRブロック：適当なプライベートアドレスセグメント
　　　　　　　⇒サブネット作るので、一旦/16で作成
　テナンシー：デフォルト

③VPC内にサブネットを作成
左ダッシュボードからサブネット＞サブネットの作成＞以下の設定で作成
ネームタグ：適当
VPC：②で作成したVPCネームを指定
アベイラビリティゾーン：指定なし
CIDRブロック：②で作成したアドレスより小さいセグメント
　　　　　　　⇒/16より小さい/24で作成

④インターネットゲートウェイの作成
左ダッシュボードからインターネットゲートウェイ
＞インターネットゲートウェイの作成
ネームタグ：適当

作成後の状態がdetachedなため、②にアタッチする。
(上部ボタンから選択or右クリック)
状態がattachedになってVPCに②が表示される事を確認。
念のため作成したGWのIDをメモorコピーしとく。

⑤ルートテーブル追加
左ダッシュボードからルートテーブル
②で作ったVPCのルートテーブルを選択し、
分割された下のウインドウでルートタブを開く
編集＞別ルートの追加＞以下入力して保存
送信先：0.0.0.0/0
ターゲット：④で作成したGWを指定
※自動で補完されるはずだが、さっきコピーしたIDをペースト。

終了後に一旦AWSホームまで戻る。

⑥EC2インスタンスの作成
コンピューティングのEC2を選択
インスタンスの作成ボタンがあれば選択
なければ、左ダッシュボードからインスタンス＞インスタンスの作成
詳細は後で設定可能だが、各ステップを順番に設定する。
AMIの選択：OSは適当(今回はAmazonLinuxで作成)
インスタンスタイプ：t2.micro(無料枠)
インスタンスの設定：ネットワークとサブネットを指定、他デフォルト
ストレージ：デフォルトの設定のまま
インスタンスのタグ付け：なんか適当に入力
セキュリティグループ：識別しやすい名前と許可したい通信
　⇒デフォルトのSSHを許可、他は任意(ICMPとか)
確認後、インスタンスを作成
キーペアは新しく作成し、名前は適当
キーペアをダウンロードして保存しておく。
そのまま作成を継続。ちょっと待つ。
インスタンスの画面でrunningになってたらOK。

⑦パブリックIPでSSH接続
パブリックIPがアサインされているはず。
⑥でダウンロードしたキーを使ってSSH接続が可能。
Windowsの場合、ここで注意。
pemファイルではなくppkファイルに変換する必要あり。
puttygenツールを使ってppkファイルに変換。
詳しくはこちら。

●AWSのKeyPair　pemファイル をSSH接続用　ppkファイル に変換
http://www.machiiro.jp/2014/04/18/aws_puttygen/

WindowsからTeraTermでログインする場合。
ユーザ：ec2-user
RSA/DSA鍵を使うを選択し、保存したppkファイルを読み込む。

以上。
Stylesheetにバックスラッシュは要注意＼(^o^)／

「＼ほげほげ！／」←こういうやつ作りたくて、
ちょっとバックスラッシュに頼りたくて

````
.hoge:before {
  content: "\\";
}
.hoge:after {
  content: "/";
}
````

みたいな小癪なことをしようとしましたところ、
一部ブラウザにて、これ以降のスタイルを読み込まないような
（コメントアウトされちゃうような）
そんな雰囲気で表示が崩れました。

なので、

**スタイルシートでバックスラッシュは使わない。**

僕はそう決めました。


## 補足
そもそもなんでこんな小癪なことをしようとしたかというと、
バックスラッシュを使って`\(^o^)/`みたいな表示をしたかったからですが、
HTMLで書くとブラウザによって\\が¥になっちゃうみたいな恐れがあると思ったため
スタイルに仕込んでみたらどうなのよという次第でした。

結論としては全角の`＼`を使うことで対応しましたが、
半角バックスラッシュを使うベストプラクティスとしては

````
.hoge:before {
  content: "\005C";
  font-family: arial; # <- そもそも¥がないフォント
}
````
か

````
<span lang="en" style="font-family: arial;">&#x5c;</span>
````

とかなのでしょうか。
複数ブラウザ未検証。

Arialにするとちょっと日本語フォントに比べて小さくなってしまうので要調整。

逆に`¥`を使いたい場合は、明確な実体参照があるので

```
<p>&yen;5,000</p>
```

とかでおｋです。

## 参考
[バックスラッシュの表示テスト - CSSめも＠Palm84](http://www10.plala.or.jp/palm84/css_memo_font_backslash.html)

[文字参照_HTMLで文字化けを回避する | 龍樹の工房](http://biw.xii.jp/ref/ref_charRef.htm)
OpenStack noVNCコンソール画面で:コロンが打てないため、ログインできない問題の対処方法


# 概要：Overview

　OpenStack を導入して Horizon にアクセスしてデフォルトで登録されているイメージでインスタンス起動してコンソールにアクセスできた。
　でもインスタンス起動にしたイメージが「 CirrOS 」の場合、パスワードが「 cubswin:) 」となっており、「 : 」(コロン)や「 ) 」(かっこ閉じ)が入力できずログインできないために、悲しい思いをしている人が少なからずいると思います。

単純にEnglishの言語を追加すれば回避できます。

ご参考ください。

# 前提：precondition

* CirrOS を前提としています。
* Fuel で構築した OpenStack で動作確認しました。
* nova.conf は、下記の設定となっています。

```
[vnc]
keymap=en-us
```

* 設定方法は Windows10 をベースとしています。

# 手順：procedure

「地域と言語」の設定画面を開きます。
Windowsのスタートのボタンを押して「gengo」と打ち込み、Enterキーを押下しましょう。

![pic000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/9e72479f-6f2b-711e-bc05-7d226f76b5b5.jpeg)

「言語を追加」をクリックします。

![pic000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/61714dc5-2989-7c0e-87c5-2f6624ec1adb.jpeg)

「English」をクリックします。

![pic000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/15a1a8fd-7296-213e-b569-fb77f8922a9b.jpeg)

「English（United States）」をクリックします。

![pic000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/0db9b91f-3a49-22ee-1438-e502d3cfec16.jpeg)

English言語が追加されました。

![pic000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/176d3357-40b4-f5dd-a627-fdbecc9a49b5.jpeg)

English 言語を有効にしてみましょう。
[J]の表示の場合は、日本語が設定されている状態です。

![pic000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/53f62eba-9d89-1e9b-31f9-e61f07874e67.jpeg)

Englishを選択します。

![pic000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/e02c7470-a2ec-1943-454f-45681c3ca9c3.jpeg)

「ENG」と表示されれば設定されている状態です。

![pic000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/780deb2d-9af3-4409-6146-f0d3ac4f78e2.jpeg)

それでは、noVNCコンソールにアクセスして入力できるかチェックしてみましょう。
「:)」を打ち込むにはキーボードの 
Shiftキーを押したまま「;」を押下すると「:」コロンが打てます。
Shiftキーを押したまま「0」を押下すると「)」カッコ閉じが打てます。

![Slack for iOS Upload.jpg](https://qiita-image-store.s3.amazonaws.com/0/134498/cfcc42e9-0cbe-0398-4bb0-a9fcf9943eee.jpeg)

打ち込んでテスト。

![pic000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/134498/72713262-2f3a-0ee8-3aad-10ac95a30373.jpeg)

ログインできました☆
関数の引数に配列を受け渡すとき

#この記事で話したいこと
自作関数の引数に配列を指定したところ、要素数の受け渡しで引っかかったことがあったので、備忘録。


#目次
1.配列を渡す関数で起きた不具合事象

2.解決案


#Target
自分

#1.不具合事象
例えば、渡した配列を使って、和計算をするときなどに不具合が発生します。

```php

#include<stdio.h>
int func(int array[]);

int main()
{
     int array[] = {90,30,40};     
     int sum_array,num;

     num = sizeof(array)/sizeof(array[0]);
     printf("%d\n",num);
     sum_array = func(array[]);
     printf("%d\n",sum_array);
}

int func(int array[])
{
     int i, num, sum_array=0;
     num = sizeof(array)/sizeof(array[0]); 
     printf("%d\n",num);

     for(i = 0; i < num; i++){
          sum_array += array[i];
     }
     return sum_array;
}

```

```
3
2
-2069389
```

自作関数内の配列要素数がmain関数内で数えた要素数と違います。
いろいろ調べましたが、理由はいまいちわかりませんでした。

そもそもsizeof演算子に引っかかりました。。。
sizeof演算子は、配列の要素数を数えているのではなく、**バイト数を表示**しているらしい

#2.これで解決？

```php

#include<stdio.h>
int func(int array[], int num);

int main()
{
     int array[] = {90,30,40};     
     int sum_array,num;

     num = sizeof(array)/sizeof(array[0]);
     printf("%d\n",num);
     sum_array = func(array,num);
     printf("%d\n",sum_array);
}

int func(int array[], int num)
{
     int i, num, sum_array = 0;
      
     printf("%d\n",num);
     for(i = 0; i < num; i++){
          sum_array += array[i];
     }
     return sum_array;
}

```

```
3
3
160
```

関数に、要素数も渡してあげれば、配列の和を計算することができました。