OmniAICreator/Qiita-1.07M huggingface dataset:
【Windows版】本当に0からのReact Native環境構築

# はじめに

全てにおいて超初心者です。

フロントも弱く、新しい技術にも明るくない・・・
JavaScriptすら微妙。Reactも知らないのに
ReactNativeでスマホアプリが作りたいと思っています。

開発環境はWindows。
nodeすら入っていないPCからのスタートです。

---

# 本当に何も分からない

正直こんなレベルです。

* iOSもAndroidも作りたいけどどうやるの？
* iOSやるにはXCode必須なの？
* じゃあMac必須なの？
* Expo入れた方がいいの？
* エミュレータってキレイに立ち上がるの？

何にも分からないけど
とりあえず進めてみようかな。ということで、
まずは色々ググってました。

---

# ReactNativeサイトは分かりやすい

そんな情報ばかりが見つかりました。

[Getting Started](https://facebook.github.io/react-native/docs/getting-started.html]) 通りにやれば余裕でOK！みたいな・・・

でもしょっぱな `npm install -g create-react-native-app` から始まります。

そもそもnpmないし・・・という感じでした。

---

# とりあえずnode.js？

npmって？と思いながらも
たぶんnode.js入れれば打てるんだろうな～と思い
とりあえずnode.jsをインストール。[こちら](https://nodejs.org/en/download/)
Window64bitでした。

　　・
　　・
　　・

完了。

コマンドプロンプト上げて打ってみたら
`node --version`
`npm --version`
やっぱりnpmも入ってました (^^♪
よかった、よかった。

---

# さて

[Getting Started](https://facebook.github.io/react-native/docs/getting-started.html]) に戻る前に
ローカルディレクトリどうしようかな。。ということで
とりあえず適当なところにしておきます。

そしたら [Getting Started](https://facebook.github.io/react-native/docs/getting-started.html])  通りに

```
npm install -g create-react-native-app
create-react-native-app AwesomeProject　 ← ちょっと長い。
cd AwesomeProject
npm start
```
と打ってみました。

　　・
　　・
　　・

あれっ？
ExpoになってQRが出て来た・・・

あっ・・・
`create-react-native-app` は
Expo使ったものなのですね。

ローカルでExpoを立ち上げても
ファイアウォール？で通信が阻まれたりとかもあるので
できればエミュレータとかで
ローカル完結で確認したいのですが・・・

---

# というところで

もうちょっと調べながらやっていかないとダメですね・・・
超初心者記事ですみません。。

Expoでいいという方は
これだけでできてしまうのでしょう！

僕はもう少しローカル完結の道を模索して
また何か分かったら書くことにします (汗)

---

# 早速追記・・・・

### （2017/09/07 15:30）
純粋なReactNativeの場合はこっち？

```
npm install -g react-native-cli
react-native init {プロジェクト名}
cd {プロジェクト名}
npm start
```

### （2017/09/07 17:00）
とりあえずExpoの方はできました。

エミュレータも準備すればできるようですが
とりあえずReact Nativeのコードに慣れたいので
まずはExpoで進めておこうかと思います。

### （2017/09/27 17:00）
Expoで進めていたらiOSのアップデートで見事に壊れました！
ということで、ローカル完結の道を目指したところ、ようやくできました。
こちらの記事をご覧ください。
[【Windows】ReactNativeの開発のためAndroidシミュレータを立ち上げたい](https://qiita.com/courage-liberty/items/80a6b6afb56d0c141c2a)
データ連携関係の用語集

データ連携などの業務をする中で周りから聞こえてくる用語を自分なりにまとめてみました。
50音順での用語集のような。英語も日本語読みでの分類にしてます。
自分が書いた記事で出てくる用語を一覧にしてみました。ちょこちょこ更新していきます。
間違いがあったら指摘お願いします。。

##あ行
**Yellowfin**
Yellowfin社が生み出したBIツール。本社はオーストラリアだが日本にも支社があり日系企業でも取り入れられている。

**SSIS**
SQL Integration Server Serviceの略で、ETLツールの一つ。MicrosoftのSQL Serverの追加機能の一つ。

**ETL**
Extract Transform Loadの略。データの抽出（extract）、加工（Transform）、書き出し（Load）を行うツール。GUIで視覚的にもわかりやすいものもある。

**SI**
System Integratorの略でSIer(エスアイヤー)とも呼ばれる。基本的な業務は、顧客の業務にあったシステムを設計、開発、運用、保守・管理まで行う会社。多くの企業は、大規模であり、開発するシステム個々の機能を下請け企業に委託し、最終的な各機能の統合と問題がないかどうかをチェックするのがSIerの仕事。

**OAuth認証**
アプリケーション同士を連携させて動かすときに必要な認証、権限委譲のこと。本当のIDやパスワードを教える必要なく認証できる。例えば、FacebookとInstagramは連動して使うことができる（Instagramの投稿がFBでも同時にされるような）が、それぞれのアカウントを連携させるときにOAuth認証が使われる。FBのOAuth認証コードがInstagramで入力され認証される仕組みが裏であり、それにより連携できている。FBの登録パスワードなどをInstagramの連携の際に用いるとパスワードが外部に出るため漏洩の危険がある。
また、OAuth認証では、委譲できる範囲が決まっており先の例では写真とコメントだけ委譲すればパスワードなどの大切な情報（FBの投稿にかんけいないしね）を守ることができる。
**ODBC**
Microsoft社が生み出したデータべベースとプログラム間を行き来してくれるもの。Open DataBase Connectivityの略。データベース（DB）は、MySQLやSQLSeverなど色々な種類（ドイツ語、アラビア語みたいな）があるが、ODBCのおかげでその違いを意識せずDBを操作できる。RubyやRailsで作ったもののデータの口はこれだったりする。
##か行
**key-value型DB**
key-vakueストア(KVS)とも呼ばれる。NoSQLの一種で、データをkeyとvalueに紐づけて保存。一対一の関係で保存される。
**kintone**
サイボウズ社が提供しているクラウドサービスで、開発の知識がなくてもシステム開発ができるようにしている。業務アプリを直感的に作成できるようにしている。データベースとしても使える。
**GUI**
Graphical User Interfaceの略。UIの一つで大きな特徴は図形などのツールを多用していて、画面上で何がどこにあるのかが一目でわかるようになっている。
##さ行
**SaaS**
Software as a Serviceの略。ソフトウェアをWeb上で使えるもの。ソフトウェアは提供側のサーバーで動き、使いたい人はWebにアクセスしWeb上で操作するもの。自分のPCの容量は食わない。例えば、遊園地のようなもの。自分の家にあんな大きなアトラクションは置けないので、遊園地に行き（Webにアクセスし）、チケットを買い（使用料を払って）アトラクションで遊ぶ（サーバーが動かしているソフトウェアを使う）。
**JDBC**
Java DataBase Connectivityの略。Javaのアプリケーションがデータベースにアクセスする際に使うもの。ODBCと同じ、ただ言語が違う。
**Salesforce.com**
カリフォルニアに本社を置くCRM（顧客管理）のアプリケーションやプラットフォームを提供している。フォーブス誌では「世界で最も革新的な企業」ランキングで１位を獲得した。
##た行
**Driver**
基本的にODBC接続。自動で最新のDriverを使ってくれる。最新だからと言っていいわけではなく、バグなどが比較的ある。
**トランザクション**
処理の一貫性を保つために関連する処理をまとめて一つで管理する仕組み。例えば、別の二人がある同じ人にSkypeで電話しようとしたとき、同時に発信してもどちらか一方しか繋がらないようにする。
##な行
**NoSQL**
RDBMSとは反対のDBでSQLを使わないもの。例えば、JSONなど。
##は行
**Power BI**
Microsoft社が提供しているビジネス分析ツールで、BIはBusiness Intelligenceの略。特にこれはBIスイートと呼ばれていて、BIを開始するにあたって必要なものが一通り入っているもの。「これさえあればBIは大丈夫です」という感じ。

**Provider**
OLEDB接続。コードで指定したドライバーが固定で使われる。

**ベンダー**
vender。販売会社のことでITの分野ではソフトウェアを売っている会社をさすことが多い。
##ま行
**Azure**
本来はMicrosoft Azure。マイクロソフト社が開発したクラウド構築システムの実行環境の名前。MySQLとかのDBも含んでいると「Microsoft Windows Azure Platform」、略してAzure Platformとか呼ばれてる。これは3つからなっていて、Windows Azure（Azureのこと）、SOL Azure（データベース）、AppFabric（クライアント上の.NETと連携するためのやつ）
##や行

##ら行
**RDB**
リレーショナルデータベース(Relational DataBase)の略。表形式で保存されているデータベース。
**RDBMS**
リレーショナルデータベースマネジメントシステム(Relational DataBase Management System)の略。主にSQLを使って操作するデータベース。MySQLやOracleなど。
##わ行
[Rails] [小ネタ] インデックスの貼り忘れを教えてくれるRakeタスク

インデックスを貼った方が良いカラムを一発で抽出する方法はないか探していると良さげなGemを見つけたので紹介します。

# [plentz/lol_dba](https://github.com/plentz/lol_dba)

まずgemをインストールして、

```
$ gem install lol_dba
```

次のコマンドを実行すると・・・

```
$ lol_dba db:find_indexes

* TIP: if you have a problem with the index name('index name too long') you can solve with the :name option. Something like :name => 'my_index'.
* run `rails g migration AddMissingIndexes` and add the following content:


    class AddMissingIndexes < ActiveRecord::Migration
      def change
        add_index :users, :hoge_id
      end
    end
```

上記のように ` add_index :table_name, :column_id ` という形でインデックスを貼った方が良いものを出力してくれます！
あとは ` $ rails g migration AddMissingIndexes ` してコピペすればOKですね。

mysqlを使っているサービスで上記を実行したのですが、ソースをチラッと見た感じだと、mysql/sqlite/postgresのいずれでも大丈夫そうです。

https://github.com/plentz/lol_dba/blob/54cf692c25a8a694819952aeccf677d88450f824/lib/lol_dba.rb#L77


ブログにも書いてます |дﾟ)ﾁﾗｯ
http://tackeyy.com/blog/posts/Introduction-of-lol_dba
Google Drive上で特殊文字を含むファイル名のファイルを取得したい

# 概要
Google Driveにあるファイルについて、特殊文字を含むファイル名を持ったファイルがある場合にこれを取得できるようにします。特殊文字とは、例えばウムラウトのある文字（Ä, Ë, Ï など）やアキュート・アクセントのある文字（Á, É, Í など）、グレイヴ・アクセントのある文字（À, È, Ì など）、サーカムフレックスのある文字（Â, Ê, Î など）などです。

# 問題
例えばウムラウト（Ä, Ë, Ï）がファイル名に含まれていると、``DriveApp.getFilesByName("ファイル名")``を使ってファイルを取得しようとしても取得することができません。日本語のファイル名は``DriveApp.getFilesByName("ファイル名")``を使って問題なく取得することができます。

では検索してはどうかと思い、``title="ファイル名"``あるいは``name="ファイル名"``を試しましたが、うまくいきません。


# 解決方法
**クエリを``title=``ではなく、``title contains``をつかうことで特殊文字を含んだファイルを取得できることが分かりました。**

結果は単純なことだったですが、これに気付くのに少し時間を要してしまいましたので、もしも同様のことでお困りの方がおられるのならと思い、投稿させていただきました。

# サンプルスクリプト
サンプルとして、"ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"をファイル名としてスプレッドシートを作成し、このファイルを取得します。もちろん、``DriveApp.getFilesByName("ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ")``では取得することはできません。

~~~javascript
var files = DriveApp.getFilesByName("ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ");
~~~

の代わりに

~~~javascript
var files = DriveApp.searchFiles('title contains "ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"');
~~~

を使用します。

~~~javascript
var files = DriveApp.searchFiles('title contains "ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"');
while (files.hasNext()) {
    var file = files.next();
    Logger.log("id=%s, name=%s", file.getId(), file.getName())
}

>>> id=#####, name=ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ
~~~

無事に"ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"のファイルを取得することができました。

"ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"の文字列を含んだファイル名が１つしかない場合は、``var file = DriveApp.searchFiles('title contains "ÄÖÜÇÃÕÑÆŒØÞÁÉÍÓÚÝÀÈÌÒÙÂÊÎÔÛÄËÏÖÜ"').next();``で取得することができます。このクエリを使用することで、Drive APIでもファイルを取得することができます。このサンプルは、[Gist](https://gist.github.com/tanaikech/e74ead2537b7b3718fc824b6ca60a531)をご参照ください。
iphoneのフォトライブラリについての質問です

iphone3Gのフォトライブラリの写真をMacBookProへ移動させたいのですが、わかる方いらっしゃいますか？　

カメラロールはPCに繋げるとできるのですが、フォトライブラリの項目が出てきません。

色々調べてみたのですが、出てきませんでした。

宜しくお願いいたしいます。

＜補足＞
因みに、AnyTransなどのアプリは入れておらず、今から入れることも出来ません。
アプリを使わずにPCに取り込む方法があれば知りたいです。
C++ Builder XE4, 10.2 Tokyo > debug / testing > Tagプロパティ値を設定し忘れたコンポーネントを実行時に明示する

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

### 失敗する流れ

- 複数のTEdit型コンポーネントがある
- Tag値をXXX設定のレジスタ値として使う設計をした
- フォームのOnCreateでレジスタ値を設定しておく
    - !!ミス!!: 将来、コンポーネント追加時にTag設定を忘れる

ミスを防ぐには、設定し忘れたコンポーネントを明示すればいい。

### code

関連: [c++ builder > debug / testing > OnKeyPressイベントをセットし忘れたコンポーネントを明示する](http://qiita.com/7of9/items/59784e3398b8a966fa4b)
をベースに変更。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TEdit *Edit1;
	TEdit *Edit2;
	TEdit *Edit3;
	void __fastcall FormShow(TObject *Sender);
private:	// ユーザー宣言
	void __fastcall TForm1::debug_showTagNotSetTEdit();
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Edit1->Tag = 3;
	//Edit2->Tag = 1;
	Edit3->Tag = 4;
}
//---------------------------------------------------------------------------

static const int kTag_default = 0;

void __fastcall TForm1::debug_showTagNotSetTEdit()
{

	TComponent *ptarget;
    for(int idx = 0; idx < ComponentCount; idx++) {
        ptarget = this->Components[idx];
		if (dynamic_cast<TEdit *>(ptarget) == NULL) { // TEditのみチェック
			continue;
        }

		TEdit *edPtr = (TEdit *)ptarget;
		if (edPtr->Tag == kTag_default) {
			edPtr->Color = clLime;
			edPtr->Hint = L"Tag is not defined on constructor";
			edPtr->ShowHint = true;
		}
    }
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
	debug_showTagNotSetTEdit();
}
//---------------------------------------------------------------------------
```

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/468f4d79-be16-dada-5a3e-6b295805f810.png)

### TCheckBox

TCheckBoxの場合は色づけができない。
代わりに[Underlineを使う](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Graphics_TFont_Style.html)、など。

```cpp
cbPtr->Font->Style = TFontStyles() << fsBold << fsUnderline;
```

### 関連

[技術英語 > to make errors difficult to overlook](http://qiita.com/7of9/items/b428bcc0283b8565f4e1)

間違いを見つけやすいUIは良いUIだと思う。
Ruby | cancan でコンディションを与えた後に can? と聞く方法

# 検証

## 初期状態では何も権限を与えていないので false が返る

```rb
can? :read, SomeClass
# => false
```

## condition を指定して `id: 1` に対して権限を与えてやる

```rb
can :read, SomeClass, id: 1
```

## SomeClass クラスへの問いかけで true が返るようになる

```rb
can? :read, SomeClass
# => true
```

理由はこちらを参照: https://github.com/ryanb/cancan/wiki/Checking-Abilities

## だが can と同じ文法ではコンディションを指定して can? 出来ない ( condition指定は無視されている様子 )

```rb
can? :read, SomeClass, id: 1
# => true
can? :read, SomeClass, id: 2
# => true
```

## condition に対して can? と聞くには 、SomeClass のインスタンスを与えてやる

`id: 1` でだけ true が返るのが分かる。

```rb
can? :read, SomeClass.new(id: 1)
# => true
can? :read, SomeClass.new(id: 2)
# => false
```

# 環境

- cancancan (1.15.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Struts環境下で同一ロジックのアプリケーションを複数動かす

# はじめに
Struts環境下でActionごとに固定のパラメータを渡す方法について記載。

# 背景
Strutsフレームワークで構築された単一プロジェクト内にて、
ロジックが同一（で設定の切り替えがプロパティファイルの差し替え等で事足りるレベル）のアプリケーションを複数同時に動かしたいというユーザの追加要求に対応するため。

分かっていれば、最初からそういう構成にしていたのですが、
発覚したのが一通りテストまで終わったタイミングという・・・・・・

プロジェクトが単一のアプリケーションで構成されているのであれば、
プロジェクト単位で複数動かす方法で事足りるのですが、
元々複数の異なるアプリケーションが乗っかかっている上に、
複数動かしたいのはその中の一部のアプリケーションのみのため断念。

いっそ該当するロジックの部分だけコピーして複数作ってもいいのだけど、
何か修正するたびに修正コストが倍々になるのは避けたいし。

そこで、Struts-config.xmlにて、
actionタグごとのparameter属性でパラメータを渡すことが出来るので、
リンク元を複数に分け、踏んだリンクによって渡すパラメータを変える方法で実装することに。

# 実装方法
Actionはすべて同一

```xml:struts-config.xml
<action path="/linkA" type="com.hogehoge.xxxAction" parameter="AAA">
    （中略）
</action>

<action path="/linkB" type="com.hogehoge.xxxAction" parameter="BBB">
    （中略）
</action>

<action path="/linkC" type="com.hogehoge.xxxAction" parameter="CCC">
    （中略）
</action>
```

```java:com.hogehoge.xxxAction.java
String xxx = ActionMapping.getParameter();
session.setAttribute("_LINK_PARAM_", xxx);
```

あとは渡されたパラメータによって、
読み込むプロパティを変えたりする部分だけを実装すればOK。

# おわりに
最初から分かっていれば出口をその分用意するような実装が一番手っ取り早いのですが、
「複数」の数が決まってない場合、今後増えたり減ったりする可能性がある場合、などはこっちの方が楽な気がします。
Windows7 で GAE/Go の開発環境を構築する



# はじめに

* 仕事用 PC が Windows7 なので GAE/Go の開発環境を構築する苦行のメモ

# SDK をインストールする

* [Python2.7.5](https://www.python.org/download/releases/2.7.5/) をインストールする
  * 最新の Python だと dev_appserver.py を正常に実行できなかった
  * 環境変数 `Path` に `C:\Python27` を追加する
  * `C:\Python27\python.exe` のシンボリックリンクで `C:\Python27\python2` と `C:\Python27\python2.7` を作っておく
    * git for windows などを使って
* [Cloud SDK](https://cloud.google.com/sdk/?hl=ja)をインストールする
  * 環境変数 `Path` に `C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk.staging\bin` を追加する

# goapp コマンドを使えるようにする

* `gcloud components install app-engine-go` でインストール
* 環境変数 `Path` に `C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk.staging\platform\google_appengine` を追加する

# go1.8 環境で goapp コマンドを実行する

* goapp はデフォルトで 1.6 を使う
* GAE のアプリケーションディレクトリは以下なら app.yaml で `api_version: go1.8` とすれば自動で切り替わる
  * http://qiita.com/tenntenn/items/0b92fc089f8826fabaf1 に詳しい
* GAE のアプリケーションディレクトリ以外でも 1.8 を使いたかったのでとりあえず `C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk.staging\platform\google_appengine\goapp` の `GetGoRoot` 関数を改変して `# Default to the goroot for go1` というコメントの下の行の `return os.path.join(SDK_BASE, goroots.GOROOTS['go1'])` のバージョンを指定している部分を `go1.8` にしたらとりあえず常に go1.8 で動くようになった

# vendoring をする

* vendoring した環境で dev_appserver.py での開発サーバ起動や goapp でのテストは問題なく行えるが `gcloud app deploy` が正常に実行できない。1時間くらい検索したり試したりしてもどうにもできなかったのでとりあえず使っているライブラリは全部 `go get` でインストールしてしまった。
* `govendor fetch +out` とかで依存ライブラリの一括インストールしておいて `govendor list` からパースして `go get` する流れでとりあえずやっていく。

# おわりに

* Windows つらい Mac 使いたい
Djangoでソーシャルログインを設定する

概要：
Google+のログインを例としたソーシャルログインの設定を記述します。

[GitHubのページ](https://github.com/python-social-auth/social-app-django)
[ドキュメント](http://python-social-auth.readthedocs.io/en/latest/)

前提：
Djangoがインストールされていること


設定の手順：

下記コマンドでソーシャルログイン用のパッケージをインストール

```
pip install social-auth-app-django
```

下記コマンドでDBテーブルを作成する
```
./manage.py migrate
```

Djangoをインストールした時にできた設定ファイル(settings.py)に下記を追加していく

```
INSTALLED_APPS = [
    ・・・
    'social_django',
    ・・・
]
```

```
TEMPLATES = [
    {
    ・・・
        'OPTIONS': {
            'context_processors': [
                ・・・
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]
```

```
AUTHENTICATION_BACKENDS = (
    'social_core.backends.google.GoogleOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)
```

```
SOCIAL_AUTH_LOGIN_REDIRECT_URL = ログイン後の遷移先
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = クライアントID
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = クライアントシークレット
```

URLの設定をする

```
urlpatterns = [
    ・・・
    url('', include('social_django.urls', namespace='social')),
]
```

ソーシャルログインを設置したいテンプレートに下記を記述

```
<a href="{% url "social:begin" "google-oauth2" %}">Google+</a>
```

以上で、設置完了。
Vuexのstateを手短く初期化したいがうまく行かなかったお話し

## 環境
Vue 2.x, Vuex 2.3.1

## 課題
stateを初期化したい

``` js
// こんなstateがあるとして
const defaultState = {
  foo: 0,
  bar: 0
}

const mutations = {
  // 値を変えるぞ
  ['DO_SOMETHING'] (state) {
    state.foo = 99
    state.bar = 999
  },
  // お行儀よく初期化するぞ
  ['STATE_INIT'] (state) {
  state.foo = 0
  state.bar = 0
  }
}

export default {
  state: defaultState,
}
```

## storeを変更しよう
``` js
store.commit('DO_SOMETHING') // OK
```

## storeをリセットしよう
``` js
store.commit('STATE_INIT') // OK
```

## ではSTATE_INITを短くしてみよう
``` js
['STATE_INIT'] (state) {
  state = defaultState
}
```
defaultStateは参照渡しだから、`DO_SOMETHING` で汚染されてるので初期化にはならない。これは分かってる。

## ならば参照渡しを切って完全コピーしたものにしよう
``` js
[STATE_INIT] (state) {
  state = JSON.parse(JSON.stringify(defaultState))
}

export default {
  state: JSON.parse(JSON.stringify(defaultState)),
}
```
結果はダメ。

## lodashのcloneDeepはどうだ？
``` js
[STATE_INIT] (state) {
  state = cloneDeep(defaultState)
}

export default {
  state: cloneDeep(defaultState),
}
```
やっばりだめ

## 結論
```
// ここは Object.assign なら初期化できる！！！！！！
[STATE_INIT] (state) {
  Object.assign(state, defaultState)
}

// ここは JSON.stringify または cloneDeep どっちでもいい
export default {
  state: JSON.parse(JSON.stringify(defaultState)),
}
```
これでめでたく初期化できた。キモは `Object.assign`。
パワーポイントの図をepsにする

パワーポイントで図を作る

![pp1.png](https://qiita-image-store.s3.amazonaws.com/0/54240/80349e0b-fe37-b283-e515-1a38b55c89a8.png)

OpenOffice Draw に貼って、右クリック → 画像として保存

![pp2.png](https://qiita-image-store.s3.amazonaws.com/0/54240/577caa40-2a7d-e892-e7bd-343def8166ad.png)

ファイル形式にepsが選べる！楽しい！


----

図がおかしくなるときは、一度「変換＞多角形に変換」してから「変換＞メタデータに変換」するとうまくいくことがある
さくらエディタのタイプ別設定で詰まった話

#やりたい事
さくらエディタでCSSを編集しやすくしたい。

#顛末

###1. ダウンロード
以下のサイトよりzipファイルをDL→解凍。
http://d.hatena.ne.jp/momdo/20111124/p1
#####収録内容
**プロパティや値などの強調キーワード**
 CSSProp.kwd
 CSSProp_d.kwd
 CSSValue.kwd
 **カラーの定義ファイル**
 css3.col
**正規表現キーワードファイル**
 css3.rkw
**ライセンスファイル**
 LICENSE.txt
 LICENSE-APPLE.txt
**説明書**
 readme.txt

####2. 共通設定
1. さくらエディタ上部のメニューバーより`設定＞共通設定（Ctrl + 6）`の設定ダイアログより**『強調キーワード』**のタブを選択。
2. **セット追加**　セット名の入力（CSS）
3. **インポート**　先程DLしてきた.kwdファイルをインポート（３つとも１つのセットへ収録可）

####3. タイプ別設定
さくらエディタ上部のメニューバーより`設定＞タイプ別設定（Ctrl + 5）`を選択し以下のタブの設定を変更。
######スクリーン
『設定の名前』表示名を設定（CSS）
『ファイル拡張子』保存する際の拡張子を設定（css）
######カラー
『強調キーワード』を選択（CSS）
DLした『css3.col』をインポート
######正規表現キーワード
DLした『css3.rkw』をインポート
##動かない
以上の手順を行うのに私がつまづいた点をメモ程度に。
###キーワードをインポートしたのに動かない
単純にタイプ別設定を行っていないだいけ。
###キーワードファイル３つもあるけど…
上記では１つのセットに３つ入れてしまいましたが、キーワードファイル別にセットを作成してタイプ別設定のカラータブで強調キーワードを複数選択してあげた方がスマートだったのでは…
###正規表現ファイル
readmeを見たら拡張ツールが必要との事でバージョンも古いだろうし折角だから入れ直そうとしてアンインストール騒ぎにまで発展（後述）したもののインストーラ版には標準搭載という事で解決。
http://k-takata.o.oo7.jp/mysoft/bregonig.html
###アンインストール騒ぎ
コントロールパネルから何度アンインストールを試みるも『現在他で使用しています』という内容のダイアログが出てアンインストール出来ない。ファイルはもちろんフォルダを消してもだめ。
無理矢理新バージョンをインストールしようとしても同様にだめ。
結局、再起動で解決したものの『タスクマネージャー』を確認して動いている実行ファイルを削除すればいいだけじゃなかったのかと気付く。

##結論
要するに、説明はきちんと読みましょう。
というのが今回の教訓でした(´・ω・｀)
iPad対応アプリを開発するときに、UI周りで気をつけることをまとめてみた

iPad対応アプリを作成するときは、iPhoneメインのアプリと違って色々と考慮しておかないと厄介なことになる（なった）ので、メモっておきます。

iPad対応については、なんとなくしかやってきていないので、よくわかっていないのですが案件ではまったところをピックアップしています。


## 分割キーボード

キーボードを非固定モードにしていると、UITextView,Field系の呼ばれるdelegateメソッドが変わります。
http://qiita.com/reikubonaga/items/5df48be2d65838444373

・UIKeyboardWillShowNotification
・UIKeyboardWillHideNotification
に依存して実装をしていると、分割キーボード時に思わぬ動作不良が起きるかもしれないので気おつける必要があります。

## 外部キーボード

iPhoneでも使用できるが、ipadでは、外付けキーボードをを使用しているユーザーが多いと思うので、考慮した方がいいかもしれません。

## iPad Pro 12.9 10.5 対応

ぼけっとしていると忘れるので入れています。

## ActionSheet

何もしないと、iPadでUIAlertControllerのActionSheetを表示しようとするとクラッシュする
http://qiita.com/malt/items/8937d9b7fddb29f5764a


## 画面回転周り

iPhoneアプリだと、そこまで画面回転を考慮したりはしないですが、iPadアプリの場合は考慮しなければいけないことが多いです。
・popoverの表示位置がずれる
・autolayoutが崩れる
など、要チェックです。
C > Min, Maxどちらからセットするのが良いかの調査

```txt:動作環境
ideone (C)
```

[C++ Builder > TTrackBar > trap: Minプロパティへの代入が効かない](http://qiita.com/7of9/items/490b009a22ba4749206e)で気になった、Min値の設定が失敗する件。

どうすれば成功するか調べた。

### 対象のケース

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bc95fa34-21c6-e345-51be-d04e102f7a23.png)

上記の(1)-(5)のケースでMin設定、Max設定に失敗しないこと。

### code

上記のケースに対して、以下の順番で設定した場合の処理を実装してみた。

- Min設定
- Max設定

https://ideone.com/TzSeLZ

```c
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

enum {
   IDX_MIN = 0,
   IDX_MAX,
};

static int s_range[][2] = {
    { -10, -5 },
    {  -5,  2 },
    {   2,  7 },
    {   7, 15 },
    {  12, 20 }
};

// テスト用の初期設定値
static const int kDefaultMin = 0;
static const int kDefaultMax = 10;

bool setMin(int setMin, int *dstMin, int *dstMax);
bool setMax(int setMax, int *dstMin, int *dstMax);

void test_group_run(void)
{
    int amin, amax;
    int num = sizeof(s_range)/sizeof(s_range[0]);
    
    for(int idx=0; idx < num; idx++) {
        amin = kDefaultMin;
        amax = kDefaultMax;
        bool bf1 = setMin(s_range[idx][IDX_MIN], &amin, &amax);
        bool bf2 = setMax(s_range[idx][IDX_MAX], &amin, &amax);
        printf("idx%d: (SetMin, SetMax)=(%d, %d)\n", idx+1, bf1, bf2);
    }
}

int main(void) {
    test_group_run();
    return 0;
}

bool setMin(int setMin, int *dstMin, int *dstMax)
{
    if (setMin > *dstMax) {
        return false;
    }
    *dstMin = setMin;
    return true;
}
bool setMax(int setMax, int *dstMin, int *dstMax)
{
    if (setMax < *dstMin) {
        return false;
    }
    *dstMax = setMax;
    return true;
}
```

```txt:run
idx1: (SetMin, SetMax)=(1, 1)
idx2: (SetMin, SetMax)=(1, 1)
idx3: (SetMin, SetMax)=(1, 1)
idx4: (SetMin, SetMax)=(1, 1)
idx5: (SetMin, SetMax)=(0, 1)
```

### 分かったこと

「ケース5の場合だけMinの設定が失敗する」ということが分かった。

Min,Max値を設定する実装では「ケース5の場合だけMaxからセットする」で対応できるだろう。

SetMaxを先にした場合
https://ideone.com/K6OtdX

```txt:run
idx1: (SetMin, SetMax)=(1, 0)
idx2: (SetMin, SetMax)=(1, 1)
idx3: (SetMin, SetMax)=(1, 1)
idx4: (SetMin, SetMax)=(1, 1)
idx5: (SetMin, SetMax)=(1, 1)
```
中学三年生が卒業までにCで中学数学を網羅するお話

##中学三年生が卒業までにCで中学数学を網羅するお話
前回「連立方程式をCで実装する」がFacebookやLINEなどである程度の反響を呼んだので今まで作ってきたプログラムやこれから作るプログラムを「連載」という形でQiitaに掲載していきたいと思います。

##ザッと自己紹介
ペンネーム：ネプソン
年齢：中学三年生（平成29年度現在）
プログラミングスキル：swift,C
これから学ぶ予定の言語：PHP,Python,java

##なぜこのような目標を立てたのか？
swiftでiPhoneアプリを作り、「アプリ甲子園」という大会に作品提出をして受託開発（？）以外プログラムを組むことがあんまりなくなったので。
それと数学とプログラミングが好きだから。
それと、数学を好きになってほしいから。

##これからの予定
今までは基本的に興味のあることしかやっていなかったが目標を立ててしまったので「図形」をどうするかなどは後々発表します。
今は今まで作ってきたプログラムを掲載していきたいと思います。
CircleCIでPHPUnitのコードカバレッジを出力する

CircleCIでPHPUnitのコードカバレッジを表示します。

CircleCIには事前にxdebugが入っているので、xdebugのインストールについては何もしなくて良いです。

circle.ymlを以下のように設定してテスト実行時のコマンドを上書きします。

```yaml:circle.yml
test:
  override:
    - ./vendor/bin/phpunit --coverage-html=$CIRCLE_ARTIFACTS
```

テスト対象はphpunit.xmlで設定します。

```yaml:phpunit.xml
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    ---(中略)---
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
            <directory suffix=".php">./domain</directory>
            <directory suffix=".php">./infra</directory>
        </whitelist>
    </filter>
    ---(中略)---
</phpunit>
```


カバレッジの結果はArtifactsのタブから見ることができます。
<img width="1331" alt="スクリーンショット 2017-09-07 11.18.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/b92c27a9-1acb-c720-94a8-548d245510db.png">

結果はこんな感じで表示されます。

<img width="1156" alt="スクリーンショット 2017-09-07 11.22.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/47882/952b592d-2f82-63c0-31ef-12f1f1eaa851.png">
Oracle Database 12cのデータファイル移動機能を試す

Oracle Database 12c のオンラインファイル移動機能を試す

# データファイルの移動
Oracle Database のデータベースが管理するファイルには以下のような種類があります（Real Application Cluster環境ではもう少しあります）。

- 制御ファイル（初期化パラメーターcontrol_files）
- Redoログファイル（V\$LOGFILEビュー）
- データファイル（V\\$DATAFILEビュー、V$TEMPFILEビュー）
- ログファイル（ADRCIコマンド等）
- 各種設定ファイル（sqlnet.ora、listener.ora）

上記のうち、実際にテーブルやインデックスのデータが格納されるファイルがデータファイルです。データファイルは表領域（TABLESPACE）の一部です。
オブジェクトを作成するDDL（CREATE TABLE文、CREATE INDEX文）にはTABLESPACE句を指定してデータの保存場所を決定します。
ここではOracle Database 12cで表領域内のデータファイルを移動する方法について説明しています。

## Oracle Database 11gまでのデータファイルの移動
Oracle Database 11gまでのデータファイルの移動は、基本的に以下の手順で実行しました。

- 表領域をオフラインにする（ALTER TABLESPACE OFFLINE文）
- OSのコマンドを使ってデータファイルを移動する（mvコマンド、ASMCMDコマンド等）
- 制御ファイル内のデータファイルのパスを変更する（ALTER TABLESPACE RENAME DATAFILE文等）
- 表領域をオンラインにする（ALTER TABLESPACE ONLINE文）

この方法では、SYSTEM表領域のようにオフラインにできない表領域のデータファイルの変更はできません。また、OFFLINEにした表領域のオブジェクトにはアクセスできないため、SQLを発行できません。

## Oracle Database 12cのデータファイルの移動
Oracle Database 12c Release 1以降では、ALTER DATABASE MOVE DATAFILE文のみで、データファイルの移動を行うことができるようになりました。
OSのコマンドによる移動も不要です。この機能により、あまり使用されなくなったデータが格納された表領域を安価なストレージに移動する処理をオンライン状態で行うことができるようになりました。
下記の例ではSYSTEM表領域のデータファイルsystem01.dbfを、同じフォルダ内のsystem02.dbfに変更しています。

```
SQL> SELECT file_id, file_name FROM dba_data_files ;

   FILE_ID FILE_NAME
---------- --------------------------------------------------
         7 /u01/app/oracle/oradata/db1/users01.dbf
         4 /u01/app/oracle/oradata/db1/undotbs01.dbf
         1 /u01/app/oracle/oradata/db1/system01.dbf
         3 /u01/app/oracle/oradata/db1/sysaux01.dbf

SQL> ALTER DATABASE MOVE DATAFILE 1 TO '/u01/app/oracle/oradata/db1/system02.dbf' ;

Database altered.
```

## 内部的な動作
内部的には新しいファイルを作成して、データを移動し、リカバリ処理を行っています。このため一時的に同一サイズのデータファイルが２つ作成されます。
システムコールをトレースしてみると、サーバープロセス（oracle{SID}プロセス）が、ファイルの作成、データのコピー等、ログの出力等の処理を行っていることが分かります。
まず、新データファイルを作成し初期設定を行います。次に旧ファイルから1MB読み込み（pread）、新ファイルに1MB書き込み（pwrite）を繰り返しています。
次に制御ファイルに対してデータファイルのパスを更新します。最後に旧ファイルを削除して処理は完了です。
docker-compose コマンドメモ

# docker-compose コマンドメモ

docker-compose で開発を行うことになったのでコマンドまとめ

### 用語
- docker-compose.yml : docker-compose の設定ファイル


## コマンド - 見る系

### ps

コンテナ一覧の表示(存在確認)

```shell
$ docker-compose ps

# 停止時
   Name        Command      State     Ports
-------------------------------------------
sample-container   /sbin/init   Exit 137

# 起動時
   Name        Command     State           Ports
--------------------------------------------------------
sample-container   /sbin/init   Up      0.0.0.0:8443->443/tcp
```

### top

コンテナのプロセス情報の表示(起動確認)

```shell
$ docker-compose top

sample-container
PID    USER   TIME             COMMAND
-------------------------------------------------
1908   root   0:00   /sbin/init
2041   root   0:00   /sbin/udevd -d
2395   root   0:00   /sbin/mingetty /dev/tty[1-6]

```

## コマンド - 起動 - 停止

### start

サービスの起動

```shell
# 起動前の停止確認
$ docker-compose ps

   Name        Command      State     Ports
-------------------------------------------
sample-container   /sbin/init   Exit 137

$ docker-compose top

# 起動
$ docker-compose start
Starting sample-container ... done

# 起動確認
$ docker-compose ps

   Name        Command     State           Ports
--------------------------------------------------------
sample-container   /sbin/init   Up      0.0.0.0:8443->443/tcp

$ docker-compose top

sample-container
PID    USER   TIME             COMMAND
-------------------------------------------------
2575   root   0:00   /sbin/init
2692   root   0:00   /sbin/udevd -d
2968   root   0:00   /sbin/mingetty /dev/tty[1-6]

```

### stop

サービスの停止
```shell
# 停止
$ docker-compose stop
Stopping sample-container ... done

# 停止確認
$ docker-compose ps
   Name        Command      State     Ports
-------------------------------------------
sample-container   /sbin/init   Exit 137

$ docker-compose top

```

## コマンド - 作る - 消す

### up

コンテナの作成 + 起動

```shell
# 作成前のコンテナ確認
$ docker-compose ps

Name   Command   State   Ports
------------------------------

$ docker-compose top

# 作成
$ docker-compose up -d # コンテナの作成 + 起動 -d:バックグラウンド実行
Creating sample-container ...
Creating sample-container ... done

# コンテナ確認
$ docker-compose ps

   Name        Command     State           Ports
--------------------------------------------------------
sample-container   /sbin/init   Up      0.0.0.0:8443->443/tcp

$ docker-compose top

sample-container
PID    USER   TIME             COMMAND
-------------------------------------------------
3172   root   0:00   /sbin/init
3287   root   0:00   /sbin/udevd -d
3559   root   0:00   /sbin/mingetty /dev/tty[1-6]
```

### down

コンテナの削除

```shell
# コンテナ削除
$ docker-compose down

Stopping sample-container ... done
Removing sample-container ... done
Removing network docker_default

$ docker-compose ps

Name   Command   State   Ports
------------------------------

$ docker-compose top
```

#### docker-compose.yml の設定反映

```
$ docker-compose down
$ docker-compose up -d
```


#### 参考URL
http://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f
pandas DataFrame で、特定のカラム名、インデックス名を取得する方法

# カラム名が欲しい！

普通の人は、DataFrame を使っていて、特定のカラム名やインデックス名が欲しい！と思わないんですかね？
僕は、良く思います。

公式にAPI がなさげなので、たぶん邪道だと思いますが、
僕は、欲しいんです。
特定のカラム名やインデックス名が！

まあ、たぶん簡単すぎるからだれも書いてないんだと思いますけど。

# サンプルコード

## カラム名を取得
```
import pandas as pd
import numpy as np
a = np.array([i for i in range(100)]).reshape(10, 10)
c = 'abcdefghij'
d = 'klmnopqrst'
columns = [i for i in c]
index = [i for i in d]
df = pd.DataFrame(a, columns=columns, index=index)
```
で、今回のひな型が完成しました。

| | a| b|c |d|e |f|g |h |i|j|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|k|0|1|2|3|4|5|6|7|8|9|
|l|10|11|12|13|14|15|16|17|18|19|
|m|20|21|22|23|24|25|26|27|28|29|
|n|30|31|32|33|34|35|36|37|38|39|
|o|40|41|42|43|44|45|46|47|48|49|
|p|50|51|52|53|54|55|56|57|58|59|
|q|60|61|62|63|64|65|66|67|68|69|
|r|70|71|72|73|74|75|76|77|78|79|
|s|80|81|82|83|84|85|86|87|88|89|
|t|90|91|92|93|94|95|96|97|98|99|

今回は、デモとして、
df == 12 となるインデックス名、カラム名を取得したいと思います。

```
df12 = df[df == 12]
```
とすると、


||a|b|c|d|e|f|g|h|i|j|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|k|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|l|NaN|NaN|12.0|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|m|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|n|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|o|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|p|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|q|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|r|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|s|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|
|t|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|NaN|

が得られます。

この機構を使って、

```
df12.columns[df12[df == 12].any()]
```

とすれば、カラム名、

```
Index(['c'], dtype='object')
```
が得られます。

これが、該当するカラム名になります。


## インデックス名を取得

では、インデックス名の取得はどのようにすればよいのでしょうか？
普通に考えたら、

```
df12.index[df12[df == 12].any()]
```

で取得できそうです。

しかし、この作戦はうまくいきません。

```
df12[df == 12].any()
```
を実行してみるとわかりますが、

```
df12[df == 12].any() == 'c' (カラム名)
```

となってしまっているからです。

なので、

```
df12.index[df12[df == 12].any()]
```

の結果も

```
Index(['c'], dtype='object')
```

となってしまします。

困った。

が、こんな時こそ便利なのが、転置！

```
df12.index[df12[df == 12].T.any()]
```
で解決です。
`df12[df == 12].any()` でカラム名が取得できるので、
Index 名をカラム名にすべく転置してあげればよいのです。


これにて、目標達成。
めでたしめでたし。
ASUS Tinker Board: リアルタイムクロックモジュール(RTC DS3231)を使う

## 概要
[ラズパイで使ったことのある](http://qiita.com/mt08/items/2c471787054afcd5d6f7)、RTCモジュール DS3231 を、ASUS TinkerBoardで使ってみる。


## 環境
- TinkerOS debian 2.0.1 beta

    ```shell-session
linaro@linaro-alip:~$ uname -a
Linux linaro-alip 4.4.71+ #1 SMP Thu Aug 17 00:28:01 CST 2017 armv7l GNU/Linux
```

- DS3231 module (I2C)

## tl;dr
1. Kernel setting & Sync RTC

    ```bash
# Switch to 'root'
sudo -s
# Get files
wget https://raw.githubusercontent.com/mt08xx/files/master/TinkerBoard/kernel_module/lib/modules/4.4.71/kernel/drivers/rtc/rk3288-miniarm.dtb
wget https://raw.githubusercontent.com/mt08xx/files/master/TinkerBoard/kernel_module/lib/modules/4.4.71/kernel/drivers/rtc/rtc-ds1307.ko
# rk3288-miniarm.dtb : backup & copy
[ ! -e /boot/rk3288-miniarm.dtb.org ] && mv -v /boot/rk3288-miniarm.dtb  /boot/rk3288-miniarm.dtb.org
mv -v ./rk3288-miniarm.dtb  /boot/rk3288-miniarm.dtb 
# rtc-ds1307.ko
mkdir -p /lib/modules/4.4.71+/kernel/drivers/rtc/
mv -v ./rtc-ds1307.ko /lib/modules/4.4.71+/kernel/drivers/rtc/
#
depmod -a
# Reboot
sync && sleep 5 && reboot
# After reboot, you can see /dev/rtc1 .
```

    => `/dev/rtc1` が現れる

2. ファイルを4つ編集 / Edit 4 files.
    - `rtc0` => `rtc1`

        ```bash:/etc/default/hwclock
...
...
HCTOSYS_DEVICE=rtc1
```

        ```bash:/lib/udev/rules.d/85-hwclock.rules
KERNEL=="rtc1", RUN+="/lib/udev/hwclock-set $root/$name"
```

        ```bash:/lib/udev/rules.d/50-udev-default.rules
SUBSYSTEM=="rtc", KERNEL=="rtc1", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
```

    - Comment out

        ```bash:/lib/udev/hwclock-set
#if [ -e /run/systemd/system ] ; then
#    exit 0
#fi
```

3. RTCモジュールの時刻同期 / Sync time for RTC module

    ```bash
# Switch to 'root'
sudo -s
# Check Current RTC time.
hwclock --rtc=/dev/rtc1 --get
# Stop ntp service
systemctl stop ntp
# 
ntpdate -v time.nist.gov 
# Update RTC time : --systohc
hwclock --rtc=/dev/rtc1 -w
# Check Current RTC time again.
hwclock --rtc=/dev/rtc1 --get
#
# Reboot
reboot
```


## ビルド / build
1. Prepare Build Environment ( [cross](http://qiita.com/mt08/items/e8afe6de9e8a0bf1e89f) / [self](http://qiita.com/mt08/items/890a71d0b399ac1a9b49) ...they may need to be updated...)
2. `git clone --depth 1 -b linux4.4-rk3288 https://github.com/TinkerBoard/debian_kernel.git`
3. `drivers/rtc/rtc-ds1307.ko`

    ```bash:drivers/rtc/rtc-ds1307.ko
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- miniarm-rk3288_defconfig
echo "CONFIG_RTC_DRV_DS1307=m" >> .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
```


4. `arch/arm/boot/dts/rk3288-miniarm.dtb`

	```diff:arch/arm/boot/dts/rk3288-miniarm.dts
	diff --git a/arch/arm/boot/dts/rk3288-miniarm.dts b/arch/arm/boot/dts/rk3288-miniarm.dts
	index cf11a15..85e80c4 100755
	--- a/arch/arm/boot/dts/rk3288-miniarm.dts
	+++ b/arch/arm/boot/dts/rk3288-miniarm.dts
	@@ -589,6 +589,10 @@
					reg = <0x4c>;
					status = "disabled";
			};
	+        rtc: ds1307@68 {
	+                compatible = "dallas,ds1307";
	+                reg = <0x68>;
	+        };
	 };
	 &i2c3 {
	```


    ```bash:arch/arm/boot/dts/rk3288-miniarm.dtb
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
```
Microsoft Update に切り替えられないときの備忘録

Windows 7 を再インストールした際に、Office をインストールしたにもかかわらず、Microfost Update に切り替えることができなかった時の対応方法を備忘録としてメモ

Office がボリュームライセンスだったりすると、Office の更新オプションが表示されず、更新プログラムを手動で入れるというメンドクサイ事態に陥ることがあります。
そのような場合は Windows Update を Microsoft Update に切り替えます。
手順は「[Microsoft Update の利用手順 - Windows 7 の場合](https://www.microsoft.com/ja-jp/safety/protect/musteps_win7_1.aspx)」ですね。

たーだーし、IE の画面で「Microsoft Updateの使用条件に同意」のところが表示されずに、オーマーガーの事態に陥る場合があります。
このような場合は IE を起動し、メニューバーの [ ツール | 互換表示設定 ] を選択します。 ( メニューバーが表示されていないときは ALT + T か ALT + O を押す)
開いたダイアログで microsoft.com を追加すると、「同意」の箇所が表示されるようになり、Microsoft Update に切り替えることができるようになります。

![microsoftupdate.png](https://qiita-image-store.s3.amazonaws.com/0/164551/a77bccb7-382a-1234-4ab7-fc8a5bc5ca3b.png)
【Swift3】UITabBarのItemの画像をStoryboardで設定

## はじめに
UITabBarのItemに画像をStoryBoard上で設定するやり方を記述していきたいと思います

## 準備

* 画像用意(moon.png)

![moon.png](https://qiita-image-store.s3.amazonaws.com/0/153964/993451d5-61c0-fb87-4a6b-53233647d26b.png) 


* UITabBarControllerを用意

<img width="256" alt="tab.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/293b6f5e-8a47-4fdf-ba8e-e94362f7d71c.png">

## 手順

### 1.Tab Bar Item 設定

* `System Item`の部分を`Custom`に変更
* `Selected Image`の部分を任意の画像に変更

<img width="1020" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/8da2c469-f9f8-b491-8206-877a6533eda9.png">

しかしこのままでは、うまく反映されません

<img width="200" alt="iPhone1.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/37d3deb3-868f-0f3d-8bfa-7ad2aaf3ee95.png">

### 2.Bar Item 設定

* `Image`を先ほどの画像に変更

<img width="1020" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/fb02268e-2509-b627-b180-963fdca8dfaa.png">

これで、無事反映されます

ここの設定を忘れていて、僕は割と詰まってしまいました...

<img width="200" alt="iPhone2.png" src="https://qiita-image-store.s3.amazonaws.com/0/153964/75908ba6-453a-0dc9-e9ba-9fa852221043.png">

## おわりに

コードで設定するのもいいけど、できればStoryboardで出来るものはやりたいなぁ
と最近思ってます（笑）

今回のサンプルコードは[こちら](https://github.com/atsuo1203/tabBarTest/tree/master)にあります
C++ Builder > TTrackBar > trap: Minプロパティへの代入が効かない

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

### 症状

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ComCtrls.hpp>
#include "editex.h"
#include "numedit.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TTrackBar *TrackBar1;
	TEdit *Edit1;
	void __fastcall FormShow(TObject *Sender);
	void __fastcall TrackBar1Change(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "editex"
#pragma link "numedit"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	TrackBar1->Min = 30; // (1)
	TrackBar1->Max = 10000;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
	Edit1->Text = String(TrackBar1->Position);
}
//---------------------------------------------------------------------------
```

上記のコードにてTrackBar1のMinプロパティ値は30にはならない。

- 前提条件
    - フォームデザインで以下となっている
        - Min = 0
        - Max = 10

### 理由

Maxが10なので、Minを先に30にしようとすると代入が失敗する。

try, catchでもエラーとはならない。

先にMaxを設定して、Minを設定すると代入が成功する。

```cpp
void __fastcall TForm1::FormShow(TObject *Sender)
{
	//TrackBar1->Min = 30; // (1)
	TrackBar1->Max = 10000;
	TrackBar1->Min = 30; // (2)
}
```

しかしながら、(Min, Max) = (0, 10)
の設定に対して、(-10, -5)
を設定する場合は「先にMaxを設定して」は失敗する。

きちんと実装するには以下のような考慮が必要かもしれない~~（詳細は未確認)~~

- if setMax < defMin  # 例 (0, 10)に対して(-10, -5)設定
    - Min = setMin
    - Max = setMax
- if setMin > defMax  # 例 (0, 10)に対して(30, 10000)設定
    - Max = setMax
    - Min = setMin
- etc

(追記)
[C > Min, Maxどちらからセットするのが良いかの調査](http://qiita.com/7of9/items/ad8f9990b31882dd70ab#_reference-33252ac850cbb19e42b5)
にて確認した。

### TeeChartのグラフ

TeeChartのグラフでも同じ問題に遭遇したことがある。
pythonのMockで属性の指定方法あれこれ


属性の多いモックを作る機会があったので、属性の指定方法を調べてみました。
dictを展開して渡す3番目に紹介した方法が使い勝手が良さそうです。

# Mockのインスタンスの属性に値を代入する
単純な場合はこれでOK

```python
mock = Mock()
mock.hoge = "HOGE"
```

# Mockインスタンス生成時に引数で指定
引数で使用さているキーワード以外の属性をこの方法で設定できます。
引数の構成は[こちら](https://docs.python.jp/3/library/unittest.mock.html#unittest.mock.Mock)で確認できます。

```python
mock = Mock(hoge="HOGE")
```

# ↑の応用でオブジェクトを引数に渡して展開する方法
個人的にはこれが好み。特に数が増えた場合に見やすい気がする。

```python
mock = Mock(**{
  "hoge" : "HOGE"
})
```

# インスタンス生成後にconfigure_mockを使う

```python
mock = Mock()
mock.configure_mock(**{
  "hoge" : "HOGE"
})
```
FreeBSD 10.*-RELEASE で sc(4) から vt(4) に切り替えて日本語表示させてみる

#日本語フォントを持ってくる

```
# fetch -o/usr/share/vt/fonts/b16.fnt /http://people.freebsd.org/~emaste/newcons/b16.fnt
```
#起動時にフォントをロードするために rc.conf を書き換える

```
# sysrc -x font8x8
# sysrc -x font8x14
# sysrc font8x16=b16
```

#コンソールを vt(4) へ変更

```/boot/loader.conf
kern.vty=vt
```
あとは再起動すると日本語フォントでコンソールを操作できる

<ぼそ>日本語入力はそっちのけ</ぼそ>
最近知った sed で文字列内の特定箇所を取り出す方法

最近 sed の便利な機能を知ったので投稿しときます。
sed は文字列の変換や削除などで登場機会がよくあると思いますが、こんな使い方もあるんです。
それではいってみましょ～！

# コマンド
sed -e 's/.\*\\(.\*\\).\*/\1/'

バックスラッシュで囲んだ、括弧である、\\(.\*\\) で取り出したい部分を記述して、\1 で取り出したい部分を指定するカンジです。
ただの括弧だと、文字としての括弧と認識されてしまいます。
\\(.\*\\) はテンプレとして覚えてください。

## 例文
id コマンドの結果からある文字列を取り出す例文を以下に記載します。

1.ユーザ名のみ取り出したい場合

id | sed -e 's/uid=.\*(\\(.\*\\)).\*gid=.\*/\1/'

2.プライマリグループ名のみ取り出したい場合

id | sed -e 's/uid=.\*(\\(.\*\\)).\*gid=.\*(\\(.\*\\)).*/\2/'

date コマンドで YYYY を取り出すならこんな感じ。
date | sed -e 's/\\(.\*\\)年.\*/\\1/'

よかったら、使ってみてください。
Python | Jupyter > 事後解析デバッギング | pdb.post_mortem()

関連: [[Python]超便利なデバッグ](http://qiita.com/shinochin/items/377db82d6cc943b41495)

## Jupyterでの事後解析デバッギング

@ 科学技術計算のためのPython入門 -開発基礎、必須ライブラリ、高速化- by 中久喜 健司さん
p80


IPython (もしくはJupyter Notebook)を使えば「事後解析デバッギング」が可能とのこと。
「事後解析デバッギング」ではエラーが出てからdebugを走らせるという流れになる。

```
In [26]: run myscript.py
...
NameError: name 'z' is not defined
```

```
In [27]: debug
でデバッグ開始
```

プログラムを走らせてエラーに気づいた後でデバッグをする、という流れで作業ができそう。

## Pythonの事後解析デバッギング

https://docs.python.jp/3/library/pdb.html

> 事後解析デバッギングもサポートし、プログラムの制御下で呼び出すことができます。

Python自体で事後解析デバッギング可能ということだろうか?

### pdb.post_mortem()

https://docs.python.jp/3/library/pdb.html
> pdb.post_mortem(traceback=None)
> 与えられた traceback オブジェクトの事後解析デバッギングに入ります。

以下を見つけた。
https://stackoverflow.com/questions/242485/starting-python-debugger-automatically-on-error

試してみた。

```txt:動作環境
CentOS 6.8 (64bit)
httpd.x86_64 0:2.2.15-54.el6.centos
Python 2.6.6
```

```postdebug_170907.py
import pdb, traceback, sys

def addxy(x, y):
	return z

try:
	x, y = 3.141, 2.718
	z = addxy(x, y)
except:
	type, value, tb = sys.exc_info()
	traceback.print_exc()
	pdb.post_mortem(tb)
```

```
$ python postdebug_170907.py 
Traceback (most recent call last):
  File "postdebug_170907.py", line 8, in <module>
    z = addxy(x, y)
  File "postdebug_170907.py", line 4, in addxy
    return z
NameError: global name 'z' is not defined
> /home/wrf/WORK/PYTHON/postdebug_170907.py(4)addxy()
-> return z
(Pdb) p x
3.141
```

エラーが出た時点でpdbが起動し、p xなどのデバッグができるようだ。

`-m pdb`との使い分けは未消化。
openCVで効率的に大量画像を顔検出するためのtips

機械学習するためには、大量の教師データが必要です。これから始める方に参考になればと思い、人間の顔の教師データを作ってて感じたこと、反省点などを書き留めます。
大量画像処理は、記事「[openCVで複数画像ファイルから顔検出をして切り出し保存](http://qiita.com/FukuharaYohei/items/457737530264572f5a5b)」にあるコードを使っています。
openCVの基本に関しては記事「[【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)](http://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82)」を参照ください。
実行環境は下記のとおりです。
![00.ArchitectureopenCV.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/95b56a0b-91ad-1f57-ac13-326f1e0edf6e.jpeg)

# 感想
画像の大量教師データを作成するのは、とにかく面倒:sweat:
データサイエンティストと呼ばれる花形っぽい仕事の裏に「マエショリスト」と呼ばれる人がいると聞きました。その一端ではありますが、苦労を感じることができた気がします。とにかく手作業での時間がかかり地味です・・・

# 経験から得たTips

##1. プログラム実行、目視確認をできるだけ効率化する
プログラム実行、目視確認の流れをできるだけ効率化するために以下のことを実行しています。全体的には、下図のやり方で実施しています。
![00.HowTo.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/daf4e06f-3182-ba18-6f14-d0b72a6dbb0e.jpeg)

###1.1. 最初にサンプル実行して、detectMultiScaleのパラメータと画像の相性を理解しておく
ただ、闇雲に実行するのではなく計画を立てましょう。そのための情報をサンプル実行で取得します。筆者は、こんな感じでまとめていました。**学習済モデルとしては"alt"が誤検知が少なく**最も活用しました。
![10.sample_result.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/f2a38823-9bac-e008-ce6c-8b51d5633ca0.jpeg)

###1.2. 最初は誤検知率が低いパラメータから実行
まずは、誤検知率が低いパラメータでプログラム実行で顔検出をして、検出結果から目視で誤検知顔画像捨てる作業を少なくします。
###1.3. 検出した画像はフォルダ移動して分けておく
実際に正しい顔検出をしたらその画像は再度使う必要がないので別フォルダに置いておきます(図の「加工元画像(検知済)」フォルダ)。
###1.4. 検知率が高いパラメータで再実行
再度、顔検出を検知率が高いパラメータで実行します。元画像が十分にあるならば、このプロセス不要です。筆者は元画像が少なかったので、なんとか増やしたいと思い、この一連の作業を繰り返しました。

##2. openCVの顔検出率は60%から70%くらい
元画像や検出方法によりますが、だいたいopenCVの顔検出率は60%から70%くらいです。
筆者の場合、Bing Image Search APIを使って検出元画像を集めました([「PythonからBing Image Search API v5を呼び出して画像収集」](http://qiita.com/FukuharaYohei/items/6d0aefb16dd78eb03a08)参照)。
下記のその結果です。

|人|検出率|検索エンジン画像収集数|openCV顔検出画像数|備考|
|:--|:--|:--|:--|:--|
|柏木由紀|**66%**|871|578|パラメータを変えてかなり頑張ってこの程度|
|新垣結衣|**74%**|822|604|女優さんは、歌っている画像が少なくて検出率が高い？|
|松浦亜弥|**60%**|778|463|パラメータを変えなくて実行するとこの程度|
|モーニング娘。|**160%**|726|1645|1枚からたくさんの顔画像を取得できるので100%超え|

「[【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)](http://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82#%E5%88%A4%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%AE%E5%BC%B1%E7%82%B9)」記事で書いたとおり、openCVは傾きに弱いので、横向き画像だと検出してくれません。[Heroku + OpenCVで簡易顔検出API](http://memo.sugyan.com/entry/20151203/1449137219)に書かれているような角度を考慮した機能を実装していれば、かなり検出率があがったでしょうが、そこまでしませんでした。

##3. openCVののパラメータと検知率
openCVのdetectMultiScaleメソッドパラメータでは、scaleFactor, minNeighbors, minSize を変えて実行します。パラメータの実装は記事「[openCVの顔検出でパラメータを指定して手っ取り早く検出精度を高める](http://qiita.com/FukuharaYohei/items/116932920c99a5b73b32)」を参照ください。
**scaleFactor=1.2, minNeighbors=2, minSize=[50,50]が誤検知率が低くて優秀**でした。

##4. 顔検出をあきらめて画像水増しをする
OpenCVにこだわらず、教師データを増やすこともできます。その「こんな方法があるのか」と途中で気づいたのが画像加工による水増しです。「[画像の水増し方法をTensorFlowのコードから学ぶ](http://qiita.com/Hironsan/items/e20d0c01c95cb2e08b94)」の記事に方法が紹介されています。教師データ不足に悩まされたので、早めに気づければやれていたのに・・・
usericonをランダムで生成する

https://github.com/you88/room22

ここで今匿名掲示板を開発していてユーザーがサイトに来たら自動でアイコンが生成されるようにしたい。下記の流れで生成する仕組みを作る。

* ユーザー作成時に00から09までの数字を2つ付与
* 片方が背景色、片方にアイコンを設定し10パターン×10パターン計100パターン生成できるようにする
* 背景色はcssに値を渡すようにアイコンは画像をそれぞれお指定する

# ユーザー作成時にランダムな値を持たせる

* icon_id・・・iconの画像のid
* icon_color_id・・・背景色のid

をそれぞれuserテーブルに持たせる。

```ruby:application_controller.erb
  def createlogin
    if session[:user_id] == User.find_by(id:session[:user_id])
      @current_user = User.find_by(id:session[:user_id])
    else
      @current_icon_id = rand(0..9)
      @current_icon_color_id = rand(0..9)
      @current_user = User.new(icon_id: @current_icon_id,icon_color_id: @current_icon_color_id)
      @current_user.save
      session[:user_id] = @current_user.id
    end
  end
```

rand(0..9)で0から9の値をランダムで付与する。

# ハッシュでidを元にカラーコード、画像を表示

```ruby:show.html.erb
img_ids = { 0 => "icon_00.png", 1 => "icon_01.png", 2 => "icon_02.png",3 => "icon_03.png",4 => "icon_04.png",5 => "icon_05.png",6 => "icon_06.png",7 => "icon_07.png",8 => "icon_08.png",9 => "icon_09.png"}
@img_id = img_ids[@comments_user.icon_id]
color_ids = { 0 => "#3399FF", 1 => "#FFCC33", 2 => "#6666FF",3 => "#FF66CC",4 => "#3366CC",5 => "#FF0099",6 => "#339933",7 => "#CC33CC",8 => "#00CC00",9 => "#FFFF66"}
  @color_id = color_ids[@comments_user.icon_color_id]
```

これをすべてviewに記載。viewで書いた配列のcommentに対してidをそれぞれ取り出したいので。カラーコードはcssではなく、これもviewに。変数だったのでcssではなくviewに記載した。
Mastodon風マイクロブログホスティングサービス UZOMUZO(alpha)を開発しました

Scrum-Upプロジェクトのryo_gridです。

Mastodon風マイクロブログホスティングサービス UZOMUZO(alpha)をリリースしました。
http://uzomuzo.herokuapp.com/

![uzomuzo.png](https://qiita-image-store.s3.amazonaws.com/0/12325/293db1d8-bbbf-53ae-1a2c-9e5a75ad2655.png)

まだアルファ版で拙いところもありますが触ってもらえれば幸いです。

開発はScrum-Upプロジェクトという有志によるソフトウェア開発チームで協力して行いました(UZOMUZOチームはおおむね3名(プログラマx2、デザイナx1)。開発期間は各々可能な時間にまたーりと進めて一ヶ月弱というところでした。
https://scrum-up.github.io/

# 技術的な話など
WebフレームワークにはRuby on Rails 5を利用しました。
開発に参加した3名はそれぞれある程度経験はあったものの、ver1・2ごろの話だったので、いろいろ変わっていたのでそこの差異を理解するのに苦労しました。

運用はHerokuの無料枠で行っています。Herokuって無料枠でもDB(PostgreSQL)が使えるんですね！
驚きました。

チーム間のコラボレーションにはSlackとDeveo(githubの類似サービス)を利用しており、コード管理(git)やチケット管理はDeveoで行っています。どちらも無料で使えています。

無料でもここまで出来ちゃうというのは良い時代ですねえ。

個人情報は極力持ちたくなかった(責任の所在が不明になるし)というわけで、認証はGoogleアカウント認証でほぼいけるような作りにしてあります。

皆さんもチームでの趣味プロ開発してみませんか？
（ノウハウ集を近々まとめてqiitaに投稿する予定です。ご期待下さい）
ramdaのpipeとcompose

https://github.com/ramda/ramda

JavaScriptで関数型スタイルでプログラミングできるramdaは便利です。

よく使われる機能として`pipe`と`compose`があります。
両者の違いは、左から右に適用するか右から左に適用するかです。

```js
const R = require('ramda')

const calcCompose = R.compose(Math.abs, R.add(1), R.multiply(2))

const calcPipe = R.pipe(Math.abs, R.add(1), R.multiply(2))

calcCompose(-4)
// => 7

calcPipe(-4)
// => 10
```

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">ramdaのcomposeとpipeは言わずもがな便利で、R.pathや R.curryの便利さはわかるが、これをライブラリの依存にぶっこんでくるのはサイズ的に許しがたい <a href="https://t.co/8wUYV3S9Ad">pic.twitter.com/8wUYV3S9Ad</a></p>&mdash; 無職.js (@akameco) <a href="https://twitter.com/akameco/status/905395683909263360">September 6, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>