OmniAICreator/Qiita-1.07M huggingface dataset:
【 Android アプリ開発 】全画面表示を行う方法 ( 通知バー非表示 )

#はじめに
Androidアプリを全画面表示にしたいのだが、プロジェクト初期設定(Activity)で、<font color="teal">__「Empty Activity」__</font>を選択しても、
通知バーが表示されるので、今回はこの通知バーまわりの設定をまとめて記述したいと思います。
(2017/05/15[Mon] 執筆)

プロジェクト初期設定時に選択した、```「Empty Activity」```。

![image.png (3.6 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/84eaa7fc-d650-46b9-a628-26a6cddd4d23.png)

###Empty Activityを使用してHello Worldした結果！

![image.png (9.5 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/50af8034-1160-47af-8fa4-bd8c0454bdea.png)

うーん、<font color="red">__「①ステータスバー」__</font>と<font color="red">__「②タイトルバー 」__</font>を非表示にしたい。

上記様々調べた結果、どうやらAndroidManifest.xmlを修正すれば良さそうです。

```AndroidManifest.xml
(変更前) android:theme="@style/AppTheme"
(変更後) android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
```

で、ステータスバーもタイトルバーも消えてくれるはずだが、、。

![image.png (25.7 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/c84296ad-f460-45c0-9ab6-5383304f6074.png)

><font color="black">__エラー内容__</font>
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme with this activity.
AppCompatを継承してるからそれに沿った記述方法をしてくれ！と怒られたので、
再度AppCompatとテーマについて調べてみた。

##MainActivityがAppCompatActivityを継承している場合の設定方法について

調べてみると、意外とあっさり全画面表示に変更できそうなので、
下記に手順を書き留めておく。

1. style.xmlを修正
2. AndroidManifest.xmlの修正
3. 実行

###具体的な修正箇所について
<hr>

####1. style.xmlを修正
```プロジェクト名``` > ```app``` > ```src``` > ```main``` > ```res``` > ```values``` > ```style.xml```

__(修正前)__

```style.xml
<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
```

__(修正後)__

```style.xml
<resources>
    <!-- Base application theme. -->
    <style name="Theme.AppCompat.Light.NoActionBar.FullScreen" parent="@style/Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- add Style -->
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
</resources>
```
<hr>
####2. AndroidManifest.xmlの修正
(変更前)

```AndroidManifest.xml
android:theme="@style/AppTheme"
```
↓
(変更後)

```AndroidManifest.xml
android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"
```
<hr>
####3. 実行(フルスクリーンでの動作を確認)

![image.png (61.1 kB)](https://img.esa.io/uploads/production/attachments/3505/2017/05/15/10862/a5b4d3ce-b13e-4aed-9ec0-37debbfbd379.png)

ステータスバーもタイトルバーも非表示にすることができました。

最後までお読みいただき、ありがとうございます。
もしよろしければ「いいね！」お願いします。
Rubyの配列の基礎の基礎を整理する

配列は、複数のデータを格納するもの。

#配列の作り方
配列の変数を用意して、値を格納する。

【例】変数nationsを用意して、値("Japan" "USA" "UK")を格納する

```ruby
nations = ["Japan", "USA", "UK"]
```
値には0からの添字が割り振られている。


#配列の要素を取り出す
変数nationsに格納した値を取り出したい。
取り出す時は「配列名[添字]」。

【例】変数nationsの2番目(つまり添字=1)の値を取り出す

```ruby
nations[1]
# => "USA"
```

#配列の要素の値を変更する
変数nationsに格納した値を変更したい。

【例】"UK"を"China"に変える

```ruby
nations[2] = "China"
puts nations[2]
# China
```


#配列に要素を追加する
変数nationsに要素を追加したい。

【例】"India"を追加する

```ruby
nations << "India"
puts nations[3]
# India
```
<<演算子(メソッド)は、配列の一番後ろに値を追加する。

##追加のもう一つのやり方
追加には、pushメソッドも使える。

```ruby
animals = ["horse", "cat", "dog"]
animals.push("monkey")
puts animals

# horse
# cat
# dog
# monkey
```

#配列の要素を削除する
```ruby
nations = ["Japan", "USA", "China", "India"]
nations.delete("USA")
puts nations


# Japan
# China
# India

```

#配列の値を一つずつ取り出す
配列の値を一つずつ取り出したい時は、eachメソッドを使う。

【例】配列の変数nationsの値を一つずつ取り出す

```ruby
# nations = ["Japan", "USA", "China", "India"]
nations.each do |nation|
  puts nation
end

# Japan
# USA
# China
# India
```


#ハッシュ(連想配列)は、「キー」と「値」の組み合わせからなる配列
配列の値には0からの添字が割り当てられているが、ハッシュ(連想配列)にはキーと値のをセットで格納し、取り出す際はキーを使って取り出すことができる

【例】連想配列を作る

```ruby
colors = {
  "white" => "白",
  "red"   => "赤",
  "blue"  => "青",
}

puts colors["white"]
# 白

```
Redmineのガントチャート画面でツリー表示のまま検索する

Redmineを触って１ヶ月の素人webエンジニアです。
Redmine良いですよね。
自分はリーダーではなくメンバーなのでその恩恵は少ししか感じられませんが。。。

使ってて感じたのがガントチャート画面で素早くツリー構造を保ったまま、検索できたら良いなと

## boookmarklet

ガントチャートで素早くツリー構造を保ったまま検索できるbookmarklet作りました
※検索ワードを' '(半角スペース)で区切ることで OR検索ができます。

https://github.com/amanoese/redmine-ganttchart-grep-bookmarklet

![image-gif](https://raw.githubusercontent.com/amanoese/redmine-ganttchart-grep-bookmarklet/images/gant-capture.gif)
## Install
下記のコードをbookmarkletとして登録する

```javascript:bookmaklet
javascript:(function(){ var urls = ['https://amanoese.github.io/redmine-ganttchart-grep-bookmarklet/src/index.js']; urls.forEach((url)=>{ let s = document.createElement('script'); s.src = url; document.head.appendChild(s); }); })();
```

## Usage
1. ガントチャート画面でbookmarkletを実行してくださいてください
2. 表示されるgrep:の検索ボックスにワードを入力する

## 説明とか
検索でフィルタリングする際に、親のツリーは消さないように残しています。検索ワードには引っかかっていない親のチケットは分かりやすく青色背景で表示しています。

チケット名またはツールチップの単語で検索をかけています。
正規表現は使えないです。半角スペースを挟むとOR検索ができます。

カテゴリの"担当者"などのワードで検索すると検索ではなく担当者名表示ようツールとしても使えます。
tensorflow 1.1.0の手動ビルドを試す（CPU拡張命令+XLAでどの程度高速化するか）

# tensorflow 1.1.0を試してみた
tensorflowに触れる機会があったので、ソースからのビルドを試してみた 
参考にしたページ: http://blog.amedama.jp/entry/2017/03/08/223308 
このページの手法ほぼそのままです 

## 環境
- MacBookPro 13inch 2015モデル
- Core i7
- tensorflow 1.1.0
- python 3.6.1

## 1.1.0リリースノートで気になったこと
- TensorFlow 1.1.0 will be the last time we release a binary with Mac GPU support. Going forward, we will stop testing on Mac GPU systems. We continue to welcome patches that maintain Mac GPU support, and we will try to keep the Mac GPU build working.

MacのGPUサポートしたバイナリ出すのこれが最期だって。

## ビルド時にやったこと(参考ページとの差分)
https://github.com/tensorflow/tensorflow/releases  
から1.1.0のtar.gzをダウンロード  

### configure  
- 1.1.0ではconfig=optで追加するオプションをconfigureで聞いてきます  
デフォルトのmarch=nativeでいいはず  
XLA just-in-time compiler も有効化してみる  

XLAはexperimental扱いです
ビルドは30分ほどで完了

## 計測
### march=native+XLA版
$ time python3 mnist_cnn.py 
real 23m23.336s 
user 63m39.019s 
sys  13m32.681s  
### pipで入るバイナリ
$ time python3 mnist_cnn.py 
real 34m48.798s 
user 110m22.508s 
sys  11m11.853s 
## 結論
一回しか測ってないので正確ではありませんが、処理時間が2/3ほどになりました 
CPUでいろいろ試す場合は自分でビルドする価値はあるかもです 

## おまけ:デスクトップで試してみた
- Ubuntu 16.04
- Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
- NVIDIA Geforce GTX 1050
- CUDA 8.0
- cudnn 5.1
- python 3.5.2
- pipでtensorflow-1.1.0のgpu版を導入

$ time python3 mnist_cnn.py 
real	2m21.907s 
user	1m57.300s 
sys	0m13.444s 

1万円ちょいで買える安GPUでも10倍速かったです
カレントディレクトリ内のファイル、ディレクトリをすべて削除する

```
$ rm -rf *
```
量が多い場合、Argument list too longが出てしまうケースがあるので、
以下を使用してます。

```
$ echo * | xarge rm -fr
```

参考

http://blog.nomadscafe.jp/archives/000331.html
UIViewをNavigationBarにaddSubviewしたい

# 概要
- NavigationController
- UIView
- NavigationBar
- addSubview
- Swift3
- Xcode8

# 説明

`NavigationController`をくっつけた`ViewController`があったとして`NavigationBar`に`UIView`を`addSubview`したいと思いました。

`UIView`の上に画面遷移のための`UIButton`を置いてたのですが画面遷移先まで最初の画面の`UIView`を`NavigationBar`に保持させたかったからです。



# 実装
```swift
 override func viewDidLoad() {
        super.viewDidLoad()

        let window = UIApplication.shared.keyWindow!

        //TopMenuはUIview
        window.addSubview(TopMenu);

```

# 参考

[Subview on top of window view in Swift](http://stackoverflow.com/questions/38540091/subview-on-top-of-window-view-in-swift)

[UIViewをNavigationBarにaddSubviewしたい](http://off.tokyo/blog/2017/05/15/uiview%E3%82%92navigationbar%E3%81%ABaddsubview%E3%81%97%E3%81%9F%E3%81%84/)
AnsibleでRubygemsを管理するRole


#はじめに
Rubygemsはgemコマンドでインストールしますが、当然ながらAnsibleにはそのモジュールがありません。

今回は、rbenvの環境でも使えるように、環境変数を使うためshellモジュールで実装します。
`gem install`はすでに導入済みのgemについて再度実行しても問題ありませんが、毎回実行されるのは非効率なので、`gem list`で導入済みかどうかを確認して、導入されていないものがある場合のみ実行するようにします。
また、バージョン指定/未指定に対応します。

#ポイント
- shellモジュールはデフォルトでは`~/.bash_profile`を読まないので、`bash -lc`で環境変数を読み込んでgemコマンドを実行する
- インストール時、バージョン指定/未指定でコマンドを分ける
- インストール判定時、バージョン指定があればバージョンまで確認
- 個々のインストール判定結果のうち、失敗をlistに追加していき、要素数をカウントして1件でも失敗があればインストールタスクを実行する
- インストールタスクの終了コードを見てretryを実施

#注意事項
shellモジュールで実装する都合上、アンインストールには対応していません。

#Sample

##ディレクトリ構成

```bash:ディレクトリ構成
├── roles
│   └── gems
│       └── tasks
│           └── main.yml
├── site.yml
└── vars
    └── vars.yml
```

##Role


```yaml:roles/gems/tasks/main.yml
---
- name: Check gems installed
  shell: >-
    bash -lc "gem list | grep {{ item.name }}
    {% if item.version is defined %}
     | grep '({{ item.version }}[).]'
    {%- endif -%}
     | wc -l"
  register: check_gem_install
  changed_when: False
  ignore_errors: yes
  check_mode: no
  with_items: "{{ my_vars.middlewares.gems | default([]) }}"

- name: Save Checking gems results
  set_fact:
    gem_chk: >-
      {%- set cnt = [] -%}
      {%- for i in check_gem_install.results -%}
      {%-   if i.stdout == "0" -%}
      {%-     set _ = cnt.append(i.stdout) -%}
      {%-   endif -%}
      {%- endfor -%}
      {{ cnt | length }}
  changed_when: False

- name: install gems
  shell: >-
    bash -lc "gem install {{ item.name }}
    {% if item.version is defined %}
     -v {{ item.version }}
    {%- endif %} --no-ri --no-rdoc"
  register: result
  until: result.rc == 0
  retries: 5
  delay: 10
  with_items: "{{ my_vars.middlewares.gems | default([]) }}"
  when: not ansible_check_mode and gem_chk != "0"
```

##vars

```yaml:vars/vars.yml
---
my_vars:
  middlewares:
    gems:
      - name: bundler    #バージョン指定なし
      - name: serverspec
        version: 2.38.1
      - name: builder
        version: 3.2.3
      - name: rspec_junit_formatter
        version: 0.2.3
```
##site.yml
```bash:site.yml
---
- hosts: targethost
  roles:
    - role: gems
  vars_files:
    - ./vars/vars.yml
```

#まとめ
shellモジュールやcommandモジュールを使う場合は、冪等性を担保するために色々と工夫が必要です。
ご参考になれば。
【Salesforce】スケジュールレポートの希望開始時刻に設定するとき制限が超えていても登録する方法

## 説明
ヘルプをみると1時間あたりに設定できるレポートの数には制限があります。
https://help.salesforce.com/articleView?id=rd_reports_limits.htm&language=ja&type=0

この制限を超えると、時間のプルダウンに対象の日付が表示されなくなります。

![Salesforce_スケジュールレポート.jpg](https://qiita-image-store.s3.amazonaws.com/0/171368/7661c5d1-c747-b88f-7732-91a016cb262e.jpeg)

ただし、ある方法を使うことで制限を超えてレポートの登録を行うことができます。
※2017年5月時点での情報となります。

## 登録方法
1.まだ制限がかかっていない状態で、登録画面を開く


2.別タブで登録画面を開いていく
※この段階ではまだ登録していないので、プルダウンから日付を選択することができます。

3.この状態で登録ボタンを押していけば、制限を超えて登録することが可能です。
Unityで国土地理院のデータを使って地形を作る

ほぼ以下のサイトを参照しただけだが、Unityで国土地理院のデータを使って地形を作ってみた。
初心者で所々わからないところがあったのでしたことをメモしておく。

[RIFTWORLD • 楽して地形づくり[Unityメモ壱]](http://rift-world.tumblr.com/post/90214256294/%E6%A5%BD%E3%81%97%E3%81%A6%E5%9C%B0%E5%BD%A2%E3%81%A5%E3%81%8F%E3%82%8Aunity%E3%83%A1%E3%83%A2%E5%A3%B1)
[実在の地形データをUnityで利用する - SSSSLIDE](http://sssslide.com/speakerdeck.com/warapuri/shi-zai-falsedi-xing-detawounitydeli-yong-suru)

## したこと

### 図形データの作成

* [各種資料｜基盤地図情報ダウンロードサービス](https://fgd.gsi.go.jp/download/documents.html)の最下部にある表示ソフトウェアをダウンロード
* [基盤地図情報ダウンロードサービス](https://fgd.gsi.go.jp/download/menu.php)の基盤地図情報 基本項目のファイル選択へを選ぶ。
 * 地域を選んだらダウンロードの際は全てをチェックしてまとめてダウンロードする。 
 * DEMでは5mメッシュが選ばれているのでそのままにしておく。
* ダウンロードした表示ソフトウェアを開く
* メニューの[ファイル] → [新規プロジェクト作成] でダウンロードしたファイルを解凍した中にあるzipを全て選択する。
* メニューの[設定] → [表示設定] → [DEM表示設定] → [連続段彩] で以下のように設定
![setting (1).png](https://qiita-image-store.s3.amazonaws.com/0/16768/c11a8e8e-706e-ed51-2753-f152bc21d0d9.png)
* メニューの[ファイル] → [表示画面を画像データとして保存] を選択し保存範囲を指定してbmpファイルに保存

### Unityでの読み込み

* Assets>Editorフォルダを作成し、[HeightmapFromTexture - Unify Community Wiki](http://wiki.unity3d.com/index.php/HeightmapFromTexture)にあるHeightmapFromTexture.js(Javascript)を中に配置する。
* 作成した地形データのbmpを[Import New Assets]で読み込み、[Inspector]の[Advanced]にある[Read/Write Enabled]にチェックを入れて[Apply]する。
* [hierarchy]で「Create] → [3D Object] → [Terrain]でTerrainを作成する。
* Importした地形データのbmpを選択しメニューの[Terran] → [HeightmapFromTexture]を選択する。
* 地形がTerrainに反映されるので設定でWidth、Length、Heightあたりを設定する。

![sakyu.png](https://qiita-image-store.s3.amazonaws.com/0/16768/1565a26a-0882-83f4-9cf9-24f40b67a203.png)
水を配置してみたり、テクスチャを設定してみてとりあえずそれっぽく。

### 表示ソフトウェア出力後のbmpファイルの加工について

*　表示ソフトウェアから出力したbmpファイルの一部を使おうと、gimpで加工してBMP出力したらHeightmapFromTextureで読み込めなかった。
*　ImageMagickの以下のようなconvertコマンドでBMP3に変換してからUnityに読み込むとHeightmapFromTextureが利用できた。

```
 convert input.bmp BMP3:output.BMP
```
波括弧(brace{})を使った文字列リテラル"外"での変数展開(変数のパース)について

# :bow: お詫び

[PhpStormでシングル・ダブルクォーテーションを変換するPHP 1Up! プラグイン - Qiita]

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/88a4e4e5-8f22-2b3b-5c28-8c3101efab17.png)

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/204c1e91-883c-0656-9d76-15431c6466bc.png)

>適切に分けることもできる。

**適切に分かれません。**
よく見ると背景色が変わって警告が出ている。

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論


そもそも`${hoge}`という書き方はない。…多分。
ただし、文字列リテラル内ではセーフ。

文字列リテラル外だと、

`{$hoge}`
はシンタックスエラー。
`${hoge}`
はhogeのみが解釈され、定数として扱われ、
`$定数の値`
という変数を探す。


# <i class="fa fa-code"></i> コード


```php

<?php

ini_set('display_error', 'On');
error_reporting(-1);

$hr = function() {
    static $i = 1;
    echo "\n\n" . $i++ . "\n-----\n";
};


$a = 'Z';

$hr();

echo "cb$a";

$hr();

echo "cb{$a}a";

$hr();

echo "cb${a}a";

$hr();

echo $a;

$hr();

echo ${a};

$hr();

//echo {$a}; //PHP Parse error:  syntax error, unexpected 'echo' (T_ECHO) in /tmp/brace.php on line 36



```

一部ネタバレしているが、
実行結果

```
1
-----
cbZ

2
-----
cbZa

3
-----
cbZa

4
-----
Z

5
-----
PHP Notice:  Use of undefined constant a - assumed 'a' in /tmp/brace.php on line 32
Z

6
-----


```

`${a}`は`a`が定数扱いとなり、未定義定数は変数名として扱われるPHPの親切機能により`$a`と解釈される？
`$$a`で`$Z`にはならないもよう？

```php




ini_set('display_error', 'On');
error_reporting(-1);

$a = 'Z';

define("a", '定数だよー！');

echo "\n";

echo ${a};

echo "\n";

```


```
PHP Notice:  Undefined variable: 定数だよー！ in /tmp/const.php on line 12
```

んんん？？

```php
<?php

ini_set('display_error', 'On');
error_reporting(-1);

$a = 'Z';

define("a", '定数だよー！');

$定数だよー！ = 'なんだよー！';

echo "\n";

echo ${a};

echo "\n";

```

```

なんだよー！
```


**なんだよー！**
どうして最初のコードで`Undefined variable`が出ないのだ！
冗長だからか！
そもそも間違った書き方だから知らん！



[PhpStormでシングル・ダブルクォーテーションを変換するPHP 1Up! プラグイン - Qiita]:http://qiita.com/khsk/items/e7ad5d15d600e5d90d76
UIViewの上に置いたUIButtonでPresentsViewControllerを呼び出す方法

# 環境

・Swift3
・Xcode8

# ぬえええええ！！！！！！ウイベウフォw


<img width="322" alt="スクリーンショット 2017-05-15 13.18.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/6135942c-6539-18bb-d4c2-d0c533a627d0.png">

上記のようにUIViewの上にUIButtonを置いてみればPresentsViewControllerを呼び出せず画面遷移ができません。困り果てました、最悪です。

# infoClick()関数を定義する

UIButtonのActionの中で`infoClick()`関数を呼び出してみてください。画面遷移ができます！

```swift

func infoClick()  {

        let storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil)
        let vc: CampainDetailView = storyboard.instantiateViewControllerWithIdentifier("campainDetailView") as! CampainDetailView
        let currentController = self.getCurrentViewController()
        currentController?.presentViewController(vc, animated: false, completion: nil)

    }
```

# この関数は、ルートビューコントローラーをクリエイトするぜ！

```swift
func getCurrentViewController() -> UIViewController? {

    if let rootController = UIApplication.sharedApplication().keyWindow?.rootViewController {
        var currentController: UIViewController! = rootController
        while( currentController.presentedViewController != nil ) {
            currentController = currentController.presentedViewController
        }
        return currentController
    }
    return nil

}
```

# 左右に遷移する

アプリっぽく左右に遷移させたければ下記のように書けばいいと思います。全ソースを載せておきます。

```swift
 @IBAction func SettingButton(_ sender: Any) {
        
        let storyboard: UIStoryboard = UIStoryboard (name: "Time", bundle: nil)
        
        let vc: TimeViewController = storyboard.instantiateViewController(withIdentifier: "Time") as! TimeViewController
        let currentController = self.getCurrentViewController()

        //右に遷移する
        let transition = CATransition()
        transition.duration = 0.5
        transition.type = kCATransitionPush
        
        //kCATransitionFromLeftにすれば左に遷移します
        transition.subtype = kCATransitionFromRight
        view.window!.layer.add(transition, forKey: kCATransition)
        currentController?.present(vc, animated: false, completion: nil)


    }
    
    func getCurrentViewController() -> UIViewController? {
        
        if let rootController = UIApplication.shared.keyWindow?.rootViewController {
            var currentController: UIViewController! = rootController
            while( currentController.presentedViewController != nil ) {
                currentController = currentController.presentedViewController
            }
            return currentController
        }
        return nil
        
    }

```

# 参考

[How can I call presentViewController in UIView class?](http://stackoverflow.com/questions/34649173/how-can-i-call-presentviewcontroller-in-uiview-class)

[Swift3 – PresentsViewControllerで左右に画面遷移する方法](http://off.tokyo/blog/2017/05/07/swift3-presentsviewcontroller%E3%81%A7%E5%B7%A6%E5%8F%B3%E3%81%AB%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

[UIViewの上に置いたUIButtonでPresentsViewControllerを呼び出す方法](http://off.tokyo/blog/2017/05/15/how-can-i-call-presentviewcontroller-in-uiview-class/)
Javaの勉強 - 6

# キーボード入力メッセージはprintの方が良さそう？
最初は文章の行末に改行を入れない状況が思い浮かばなかったので
printなんて使わないだろと思っていた。

でも、**シンプルな単語や数字**の入力を求めるとき
画面に表示するメッセージはprintlnよりprintを使った方が
見やすい気がした。

名前を入力するメッセージを表示させるとして
「println」を使うと

```
System.out.println("名前を入力してください > ");
s = br.readLine();  //キーボード入力
```
行末に改行が入るので

![pic005.jpg](https://qiita-image-store.s3.amazonaws.com/0/179949/9dcf2625-2dbd-f2ba-c8cf-0ddf9fdd0b8e.jpeg)

となる。
気にならない人もいるかもしれないけど、何となく気になる。
「print」を使うと

```
System.out.println("名前を入力してください > ");
s = br.readLine();  //キーボード入力
```

行末に改行が入らないので

![pic006.jpg](https://qiita-image-store.s3.amazonaws.com/0/179949/4a9bcb95-87c9-f5ec-b679-06413da58b3f.jpeg)

何となく、個人的にはこの方がおさまりがいい気がする。

入力情報が長くなるなら改行してた方がいいのかもしれないけれど
シンプルな単語や数字くらいの入力なら「print」でいいかなと。

■ 改行あり
![pic004.JPG](https://qiita-image-store.s3.amazonaws.com/0/179949/50f156cb-11c5-c080-e5d4-14c46b8e5006.jpeg)

■ 改行なし
![pic001.JPG](https://qiita-image-store.s3.amazonaws.com/0/179949/43ace648-2f35-1c83-6223-dfc77c5dd57e.jpeg)

ま、結局はどちらがいいかは人それぞれなんでしょうけど。

演習問題でキーボードからの入力をいくつかやっていて気になった
「print」と「println」でした。
[ASP.NET] 承認のログインページを動的に切り替える

## やりたいこと

https://garafu.blogspot.jp/2016/05/manage-aspnet-authorization.html
上記のURLの<属性で制御する方法>では、web.configに設定した

```
    <authentication mode="Forms">
      <forms loginUrl="/Account/Login" />
    </authentication>
```

この部分で静的にログインページのURLが決定してしまう。
これを動的に切り替えたい。

## やり方

* System.Web.Mvc.AuthorizeAttributeクラスのHandleUnauthorizedRequestメソッドをoverrideする
* HandleUnautholizedRequestメソッドの引数AuthorizationContextのインスタンスのResultプロパティにRedirectToResultクラスのインスタンスを格納する。
* 動的に設定したいコントローラ(controller)とアクション(action)はRouteValueDictionaryクラスのインスタンスを作成する際に指定する

```csharp

    public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            string controllerName; // 動的に変更したいログインページのコントローラ
            string actionName; // 動的に変更したいログインページのアクション
            if (isSmapho(filterContext.HttpContext.Request.UserAgent))
            {
                filterContext.Result = new RedirectToRouteResult
                    (
                        new System.Web.Routing.RouteValueDictionary(
                            new
                            {
                                controller = controllerName,
                                action = actionName,
                                returnUrl = HttpContext.Current.Request.Url
                            }
                        )
                    );
            }
        }
    }
```
上の例ではスマホからのアクセスかどうかでログイン先を動的に変更するようにしている。（スマホからのアクセスかどうかはisSmaphoメソッドで判定）

HandleUnauthorizedRequestメソッド：（https://msdn.microsoft.com/ja-jp/library/ee427992(v=vs.118).aspx）
AuthorizationContextクラス：(https://msdn.microsoft.com/ja-jp/library/system.web.mvc.authorizationcontext(v=vs.118).aspx)
RedirectToResultクラス：(https://msdn.microsoft.com/ja-jp/library/system.web.mvc.redirecttorouteresult(v=vs.118).aspx）
RouteValueDictionaryクラス：https://msdn.microsoft.com/ja-jp/library/system.web.routing.routevaluedictionary(v=vs.110).aspx
リモートリポジトリのbranchの名前をブラウザで簡単に変更する方法

リモートリポジトリのbranchの名前をブラウザで簡単に変更する方法
1.元のブランチを選んで表示させる
2.ブランチのボタンを押してテキストボックスを表示させる
3.新しいブランチ名を入力して新しいブランチ作成ボタンを押す。
4.古いブランチを、ゴミ箱ボタンを押して削除
以上。
List[Option[A]] の Option を剥がす

題名の通り。Option のリストから None を除外したい。
以下、3パターン (`worse`, `better`, `best`) 等価だが、当然 `worse` より `best` の方が良い。

```scala
val raw: List[Option[A]] = List(Some(a), None, Some(b), Some(c), None)

val worse: List[A] = {
    def splitOption(list: List[Option[A]]): List[A] = {
        list match {
            case Nil => Nil
            case Some(head) :: tail => head :: splitOption(tail)
            case None :: tail => splitOption(tail)
        }
    }
    splitOption(raw)
}

val better: List[A] = raw.flatMap(a => a)
val best: List[A] = raw.flatten
```
テストについての個人的まとめ

#この記事を書いた理由#
ITとはちょっと外れてしまいますが、自分の仕事のやり方を固めていくために教えられたこと、考えたことを記載していきます。

#流れ#
    1.システム概要を聞く
    2.テスト確認点を聞く
    3.システムのテスト箇所の仕様を特定する
    4.システムの使い方を聞く
    5.テスト仕様書を書く
        5-1.テスト概要を書く(テストの流れ図もあるとGOOD)
        5-2.テストサマリーを書く
        5-3.仕様書、ユーザーへのヒアリングで期待値を書く
        5-4.マトリクスを作成し、テストパターンを絞る
        5-5.テストデータを特定する
        5-6.テストエビデンスサンプルを作成する
        5-7.レビュー
        5-8.レビューの指摘反映
    6.テストをする
    7.QAを書く
    8.不具合が出たら指摘し、不具合管理表で管理する
    9.再テスト
    10.テスト結果レビュー
    11.レビュー指摘反映

#ブラックボックステスト#

| 事項       |       説明|備考|参照|
|:-----------------|:------------------|:------------------|:------------------|
|目的|仕様が実現されているかの確認|||
|実施フェーズ|単体テスト、結合テスト、システムテスト|||
|テスト仕様書作成条件|入力条件と出力結果が分かれば、マトリクスを作成できるので、テスト仕様書は作成可能|||
|流れ|1.入力条件と出力結果からマトリクスを作成<br>2.データパターンを作成<br>3.テストとしては入力条件と出力結果が一致することを確認<br>|||
|デメリット|中のロジックが間違っていても結果的に入力条件と出力結果が一致していれば、テストは通ること。|||
|参考|[デシジョンテーブル(マトリクス)の例](https://appkitbox.com/knowledge/test/20130912-134)<br>[ブラックボックステスト](http://www.itmedia.co.jp/im/articles/1111/07/news139.html)<br>|||

#ホワイトボックステスト#


| 事項       |       説明|備考|参照|
|:-----------------|:------------------|:------------------|:------------------|
|目的|経路(if文など)の網羅性を高め、品質を上げる、処理の仕方(置換処理、チェック処理など)を確認する|||
|実施フェーズ|単体テスト|||
|テスト仕様書作成条件|実装が終わったもしくは、プログラムをフローチャートで表した図が書かれている場合にテスト仕様書を作成可能|||
|流れ|1.フローチャートもしくはプログラムの条件分岐、処理の仕方(置換処理、チェック処理など)からマトリクスを作成<br>2.データパターンを作成<br>3.正しく分岐の通りにプログラムが動くことを確認する。 (正しく分岐を流れるかについては、分岐を通過とかデバッグログを仕込んで、その結果を確認すればよい)<br>|||
|デメリット|入出力が合っているかではなく、その経路が正しいことを確認するため、プログラム作成者、もしくはフローチャート作成者が仕様(入力条件、出力結果)を勘違いしている場合、テスト仕様書からは誤りを検出できない。<br>そのため、テスト実施者は出来るかどうかはともかくとしてシステムの仕様を理解し、誤りを検出できる必要がある。<br>また、テスト仕様書作成者は処理の仕方について、十分にプログラムを理解する必要があるため、作成難易度はブラックボックステストよりも高い。|||
|参考|[マトリクス/制御パターン](http://ameblo.jp/pictmaster/entry-10309906965.html)<br>[ホワイトボックステスト](http://www.itmedia.co.jp/im/articles/1111/07/news163.html)<br>|||


#参考リンク

[テストケース仕様を書いてみよう！！](http://quesqa.com/test_case_specification/)

[ソフトウェアテストの分類](https://ittechinf.wiki.zoho.com/ソフトウェアテストの分類.html#wite-box)

[網羅型のブラックボックス型技法](https://appkitbox.com/knowledge/test/20130912-134)

[見通しのよいテストの段階的詳細化の手法](http://www.jasst.jp/symposium/jasst13tokyo/pdf/A4-2.pdf)
Androidのビルド開始手順

Androidのビルド開始手順<br>
```
$ source build/envsetup.sh
$ export WITH_SU=true
$ lunch lineage_hlte-userdebug
$ breakfast hlte
$ make otatools
$ brunch hlte
```

ここで、
hlteはデバイス名の例で、samsung galaxy note 3を意味します。<br>
lineageはlineageOSのbuildリポジトリを
使用する場合です。<br>
詳細はbuild/envsetup.shの中を参照下さい。
また、この場合
device/samsung/hlte/lineage.mk
という名前のファイルに<br>
```
PRODUCT_DEVICE := hlte
PRODUCT_NAME := lineage_hlte
```
があるはずです。:v:<br>
GitHubのプライベートリポジトリをgit clone

## @hnakai0909 さんのコメントにある通り 2021年8月13日以降、ここに記載している方法は無効になりました。ご指摘ありがとうございます。対応方法は、コメントおよびそのリンクから到達できます。

プライベートリポジトリを、SSH鍵などを用意せず、コマンドラインだけで `git clone` する。

```
git clone https://{ユーザ名}@github.com/foo/bar.git
```
GItHubのパスワードを求められるので入力する。おしまい。

いったんcloneした後は、普通に `git pull` とかすれば、パスワードを求められるので入力すればＯＫ。

**とても実用的なコメントをいただいているので、コメントもご覧ください。**
Rails unique とindexの違い


## やりたかったこと

nameをuniqueにして、indexを貼り
高速でtagの情報を読み取りたかった。

## 疑問

下記の行のname_uniqueとname_indexが
[ridgepole](https://github.com/winebarrel/ridgepole) export 時にできたので
この違いはなにかと疑問に思った。


## 環境


Schemafileの作成方法は

[MysqlWork Branch](https://github.com/winebarrel/ridgepole) -> Mysql -> [ridgepole](https://github.com/winebarrel/ridgepole)　export



```ridgepole-schemafile
create_table "tags", id: :integer, unsigned: true, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.string "name", limit: 45, null: false
  t.datetime "updated_at", null: false
  t.datetime "created_at", null: false
  t.index ["name"], name: "name_UNIQUE", unique: true
  t.index ["name"], name: "name_index"
end
```

### Work banch



![スクリーンショット 2017-05-15 11.32.26.png](https://qiita-image-store.s3.amazonaws.com/0/70960/d56866f1-8cd1-f919-8d82-3ac9302f42de.png "スクリーンショット 2017-05-15 11.32.26.png")

![スクリーンショット 2017-05-15 11.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/70960/9442cd5f-32ce-4d3a-28eb-1cb675e594f1.png "スクリーンショット 2017-05-15 11.32.33.png")

### explain 

```
mysql> explain  select * from tags where name = 'vhtfdy'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tags
   partitions: NULL
         type: const
possible_keys: name_UNIQUE,name_index
          key: name_UNIQUE
      key_len: 137
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified
```

##　結論

explainの結果を見るとオプティマイザーは
`name_UNIQUE,name_index`の二つのindexを候補に出して、
`name_UNIQUE `を使用している。
そして `type`は `const`で最速である。

`name_index`使用した場合(下記参照)は

```

mysql> explain  select * from tags force index (name_index) where name = 'vhtfdy'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tags
   partitions: NULL
         type: ref
possible_keys: name_index
          key: name_index
      key_len: 137
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

ERROR:
No query specified

mysql>
```


`type`が`ref`になり、indexが効いているとは言えるが
`const`のほうが早いため、

**`name_index`は必要ない**
【Swift3.0】Alamofireで画像＆パラメータを送信

元々当記事のようなAlamofireで画像をPostする方法はQiitaにありますが、Swift3.0ではないので躓いたため知見として残します。

以下の記事を参考にしました。ありがとうございます。
[【Swift/php】Alamofireで画像upload&パラメータをPOST](http://qiita.com/hatch/items/229df19eecdc02dc2dee)

## ライブラリ

* Alamofire
* SwiftyJSON

## コード

```Swift:Sample.swift
Alamofire.upload(
    multipartFormData: { multipartFormData in
        // 送信する値の指定をここでします
        multipartFormData.append(data, withName: "test", fileName: "test.jpeg", mimeType: "image/jpeg")
        multipartFormData.append(sendSTR.data(using: String.Encoding.utf8)!, withName: "userId")
    },
    to: "http://~~~.com/image-upload/",
    encodingCompletion: { encodingResult in
        switch encodingResult {
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    // 成功
                    let responseData = response
                    print(responseData ?? "成功")
                }
            case .failure(let encodingError):
                // 失敗
                print(encodingError)
        }
    }
)
```

## 説明

### uploadメソッド
```Swift:Sample.swift
Alamofire.upload()
```

Alamofireで画像やファイルのアップロードをする際に使うメソッドです。
[公式: Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-multipart-form-data)

### パラメーターの設定

multipartFormDataの中で値を指定します。
下記は各パラメーターです。
画像でもテキストでも```multipartFormData.append```を使います。

### 画像

```Swift:Sample.swift
multipartFormData.append(data, withName: "test", fileName: "test.jpeg", mimeType: "image/jpeg")
```

* image
    * Data型で使用します。```UIImageJPEGRepresentation```などを使い、UIImageから変換しましょう。
* withName
    * サーバーで受け取る際使用する名前です。サーバー側と名前が一致するかか確認しましょう。
* fileName
    * ファイルの名前です。
* mimeType
    * ファイルのフォーマットが何か指定します。jpegであれば```"image/jpeg"```、pngであれば```"image/png"```などと指定します

画像は、「画像データ・名前・ファイルネーム・mimeType」を指定します。
これ全てが揃っていないとサーバー側が受け取ってくれない場合があるからです。

これを中途半端にファイルネームを送ってないせいでサーバーが認識してくれない問題に私は当たりました。ご注意ください。

### Text

```Swift:Sample.swift
multipartFormData.append(sendSTR.data(using: String.Encoding.utf8)!, withName: "userId")
```

* StringData
    * 第一引数でsendSTRという変数を指定しているところです。dataに変換するため、```data(using: String.Encoding.utf8)```というメソッドを使用します。
* withName
    * サーバーで受け取る際使用する名前です。サーバー側と名前が一致するか確認しましょう。

テキストを送る際は簡単です。名前が間違っていないか確認しましょう。

## 送り先の指定

```Swift:Sample.swift
to: "http://~~~.com/image-upload/"
```

toで、送り先URLの指定ができます。
送る際、**POST**になりますのでご注意ください。

## 終わりに

バージョンが変わると今まで使えていたコードが使えない。辛いです。
Bluemix Finance Services Investment Insights




#Blemix Finance Services

Bluemix　では Finnace Servicesが提供されています。
4月時点では、以下がCloud Foundry アプリからバインドできます。

<img width="400" alt="finservices.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/2d9c2938-73d2-c2b9-170b-5e974059afd0.png">


#Investment Insights Watson

Watson を活用した投資分析を考えています。

<img width="400" alt="Investment insights.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/afd1b5a1-37d8-af92-0f87-caacedec01d7.png">


# Morgan

Morgan はDow30に対してネガティブです。

<img width="364" alt="morgan.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/9065b3af-c76e-2ef3-4a62-825619d3113e.png">

# Wallmart

WallmartもDow30に対してネガティブです。


<img width="350" alt="wallmart.png" src="https://qiita-image-store.s3.amazonaws.com/0/94200/d9c65b35-665f-a996-f161-c885e90e0a6a.png">
sshのconfigで書いときたい設定

# sshのconfigで書いときたい設定

```vim ~/.ssh/config```

```
Host test
  HostName ip_addr
  User access_user
  IdentityFile ~/.ssh/public_key_name
  UseKeychain yes
  AddKeysToAgent yes
```
これぐらいは設定したい。
特に下2つの設定をすると、毎回パスフレーズを入力しなくて済むからオススメ。
mac os sierraでも動作確認済み

```
  UseKeychain yes
  AddKeysToAgent yes
```
Xamarin.FormsのTabbedPage + NavigationPageにMasterDetailPageでメニュー表示


各タブの内容が NavigationPage になっている TabbedPage に MasterDetailPage でメニューを表示させてみます。

## コード

```xml:XAML
<?xml version="1.0" encoding="UTF-8"?>
<MasterDetailPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:vm="clr-namespace:MyApp.Views"
    x:Class="MyApp.Views.MainPage">

    <MasterDetailPage.Master>
        <ContentPage Title="Master" BackgroundColor="Gray" Icon="menu.png">
            <Label Text="メニュー予定地" TextColor="White" VerticalOptions="Center" HorizontalOptions="Center" />
        </ContentPage>
    </MasterDetailPage.Master>

    <MasterDetailPage.Detail>
        <TabbedPage>
            <TabbedPage.Children>
                
                <NavigationPage Title="その1">
                    <x:Arguments>
                        <ContentPage Title="タブその1">
                            <Label Text="タブその1" VerticalOptions="Center" HorizontalOptions="Center" />
                        </ContentPage>
                    </x:Arguments>
                </NavigationPage>

                <NavigationPage Title="その2">
                    <x:Arguments>
                        <ContentPage Title="タブその2">
                            <Label Text="タブその2" VerticalOptions="Center" HorizontalOptions="Center" />
                        </ContentPage>
                    </x:Arguments>
                </NavigationPage>

            </TabbedPage.Children>
        </TabbedPage>
    </MasterDetailPage.Detail>
    
</MasterDetailPage>
```

```c#:コードビハインド
using Xamarin.Forms;

namespace MyApp.Views
{
    public partial class MainPage : MasterDetailPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }
}
```


## 結果

タブごと右にズレてくれました。

![master.png](https://qiita-image-store.s3.amazonaws.com/0/169798/31243736-2c89-9b08-e177-cdf37320693d.png "master.png")

<!--
![tab_1.png](https://qiita-image-store.s3.amazonaws.com/0/169798/d4c9b5b3-519c-1449-0333-12b4d79219cb.png "tab_1.png")

![tab_2.png](https://qiita-image-store.s3.amazonaws.com/0/169798/05ddb3f1-db6f-d7bf-dea6-1562f8ca3439.png "tab_2.png")
-->


MasterDetailPage.Detail の直下に NavigationPage を配置する必要があるのかな？と思いきや、
TabbedPage の中に配置した NavigationPage のナビゲーションバーからも Master が呼び出される模様。
NavigationPage の中に TabbedPage を配置するのは推奨されないらしいので助かります。


とりあえずは以上です。
react-native-mapsを導入できない問題(解決済み）

今swiftで作成しているアプリを、react nativeで作り直そうとしたところ、動作するところまでは行ったものの、マップを使うライブラリを利用したところ、エラーになって動かなくなってしまった。
https://github.com/airbnb/react-native-maps
ここを元に自分の環境にインストールしたところ、pod installのところでエラーになり、当然動かない。
https://github.com/airbnb/react-native-maps/issues/713
同じ状況の人も数多くおりますが、同じことを試しても動作せず。

次の案件はreact nativeでやろうと思っておりましたが、ハマりどころが多すぎてやる勇気がないです。
同じ状況の方がいらっしゃいましたら、教えてください。

追加：
手動で導入した方がいいというコメントをいただきまして、試したところ問題なく導入できました！
ありがとうございました！
Ubuntu 16.04 で SSD Crutial MX200 をチューンしてみた

ThinkPad X230 で SSD Crutial MX200 の組み合わせで使ってみた。

いろいろと問題が発生し、おかしいなーとあれこれ試してたのだが実は SSD の問題ではなく メモリーが1枚半差しとなっていたのが問題だった。

ここを直すと快調に。とはいえあれこれ調べたことを残しておきます。

# 症状

 - サスペンド復帰できないことが多い
 - バッテリ起動したり、サスペンドから復帰時にバッテリ駆動だと低パフォーマンス

# SSD が NCQ 対応してないのかな？
## 起動オプションの変更

 libata.force=noncq 

を grub.conf に記述　→　改善せず


# ファームがバグ？

https://askubuntu.com/questions/630357/why-is-my-crucial-m550-or-mx100-drive-so-slow-in-ubuntu
ここを参考に、Windowsマシンに繋いでファーム更新 → 改善せず


## hdparmで速度アップ

バッテリで起動した時は以下のようになる。

```
# hdparm -B /dev/sda

/dev/sda:
 APM_level	= 128

# hdparm -I /dev/sda | grep -i trim
	   *	Data Set Management TRIM supported (limit 8 blocks)
	   *	Deterministic read ZEROs after TRIM
# hdparm -Tt /dev/sda

/dev/sda:

 Timing cached reads:   10116 MB in  2.00 seconds = 5060.61 MB/sec
 Timing buffered disk reads: 266 MB in  3.01 seconds =  88.28 MB/sec
root@LATITUDE:~# 

```

とっても遅いのを、手動で設定

```
# hdparm -B254 /dev/sda

/dev/sda:
 setting Advanced Power Management level to 0xfe (254)
 APM_level	= 254
root@LATITUDE:~# hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   7406 MB in  2.00 seconds = 3704.00 MB/sec
 Timing buffered disk reads: 854 MB in  3.01 seconds = 284.14 MB/sec

```

かなり改善。しかしながらサスペンド復帰時にフリーズすることが多いのは相変わらず。→この後、メモリ半差しに気がついて修正→全快となりました。
tsvファイルの特定列の要素の種類と出現頻度を調べるコマンドメモ

参考:http://qiita.com/b4b4r07/items/8c1911092002d0b457a6

```bash
cat home.tsv  | awk -F"\t" 'BEGIN{OFS="\t"}{print $8}' | sort | uniq -c | sort -nr
```
awk便利だナァ
初めてのtry~catch

```java

public class Test {
	public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    int in_next = in.nextInt();
    System.out.println(in_next + "は無事通ったよ");
    in.close();
    }
}
```
上のような物を作り実行します。
コンソールに"ああ"などを入れて、入力するとエラーが起こります。
これにtry~catchを組み込むとどうなるか。

```java

public class Test {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		try{
			int in_next = in.nextInt(); 
			System.out.println(in_next + "は無事通ったよ");
			in.close();
		}
		catch(Exception e){
			System.out.println("エラーだよ"); 
            System.out.println(e);
		}
	}
}
```

図のようにしました。
まず、try文の中のことに挑戦をします。
そこで何らかのエラーが起こったらcatchに移行します。
スローされるとか言いますね。
catchの中にあるExceptionは例外という意味で、これは例外クラスです。
隣のeの中に例外内容が入ります。
実行して適当な文字を入れてみましょう。
エラー内容がコンソールにでましたね。
自分はjava.util.InputMismatchExceptionというのが出たので、同じエラーを
起こしたときにだけにcatchするように絞ってみる。

```java

import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		try{
			int in_next = in.nextInt();
			System.out.println(in_next + "は無事通ったよ");
			in.close();
		}
		catch(InputMismatchException e){
			System.out.println("エラーだよ");
			System.out.println(e);
		}
	}
}
```
catchは増やしてもよい。もう一個catchを書いても問題ない。
エラー別でメッセージを出しても良いだろう。
LTSV形式のApacheアクセスログのステータスが、ブラウザが返すステータスと同じじゃない問題

# ある日のアクセスログ

とある日のこと、Apacheのアクセスログを`tail`して見たところ、下記のようなログを発見しました。

```
status: 200
path: /hogehoge
```

あきらかに存在しないURLへのアクセスなのに**200ステータスがログに残っている…だと…。**
何かがおかしいと思い、原因を調査しました。

# 調査方法

まず実際に該当のアプリにアクセスし、存在しないパスにアクセスしてみます。アクセスしてみると、アプリ側で設定した「このページは存在しませんよ」的なエラーページが表示され、403エラーを返していることが確認できました。

そして、そのときのApacheのアクセスログを確認してみたのですが、やはりステータスは**200**となっています…。
アプリ側には問題なさそうなので、Apacheのログの設定に問題がありそうだと思い、調査しました。

ApacheのログをLTSV形式に変換するようLogFormatを設定していたため、おそらくそこに原因があると目星を付けたのです。

ApacheのログをLTSV形式に変換することのメリットについては、下記の記事などを参照していただければと思います。

[apacheのログファイルをltsv形式でより便利に！！ - Qiita](http://qiita.com/hit/items/3c4276db1d4427fcee7a)

# 原因はLTSV形式に変換しているLogFormatの記述でした

調査した結果、ltsv形式に変換しているLogFormatの設定の記述を変更することで、アプリが返すステータスコードをログに残すことができました！

もともとの設定は、下記のようにltsv形式に変換する時に、statusの値を **%s**に指定していたのですが、これを**%>s**にすることで解決しました。


```diff:httpd.conf
- LogFormat "status:%s\tsize:%b\treferer:%{Referer}i\tpath:%U……" apache-ltsv
+ LogFormat "status:%>s\tsize:%b\treferer:%{Referer}i\tpath:%U……" apache-ltsv
```

なぜ**%>s**にするとアプリが返すステータスコードになったのかというと、ltsv形式のログに整形する際、%sだと内部でリダイレクトされたリクエストは、元々の リクエストのステータスを返すそうです。

ブラウザが最終的に返すリクエストのステータスを返すのは、**%>s**だそうなので、こちらに修正することが解決することができました。

* %s
	* HTTPステータス。内部でリダイレクトが起きていたら最初のステータス
* %>s
	* リクエストに対して返すHTTPステータス

# 参考
[mod_log_config - Apache HTTP サーバ バージョン 2.2](https://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html)
[Apacheのログ出力の要点 - Qiita](http://qiita.com/ryounagaoka/items/e7782ab29ff9fbe8f891)
CLI上にgitリポジトリの状態を表示するプログラム

__※どうやらVirtualenvとの相性が悪いようです。__

CLI上にgitリポジトリの状態を表示するプログラムoh-my-gitについて紹介します。

#概要
このような形でgitリポジトリの状態を表示してくれます。
※一部不自然な点があるのは黒塗りしているためです。
![c8519725-7d82-0db2-00d6-eb465e65cf9c.png](https://qiita-image-store.s3.amazonaws.com/0/52291/0b57f65a-c73d-69d5-2e0f-86cbb18332a2.png)

#インストール方法
UbuntuでBashを使用する場合を想定しています。

1. `sudo apt install git`コマンドを実行し、gitをインストールします。
1. `git clone https://github.com/arialdomartini/oh-my-git.git ~/.oh-my-git`コマンドを実行し、oh-my-gitをcloneします。
2. `echo source ~/.oh-my-git/prompt.sh >> ~/.bashrc`コマンドを実行し、oh-my-gitのインストールを行います。
2. `cd /tmp`コマンドを実行し、tmpディレクトリに移動します。
3. `git clone -b patching-strategy http://github.com/gabrielelana/awesome-terminal-fonts`コマンドを実行し、awesome-terminal-fontsをcloneします。
4. `cd awesome-terminal-fonts`コマンドを実行し、cloneしたディレクトリに移動します。
6. `mkdir -p ~/.fonts`コマンドを実行し、フォント用のディレクトリを作成します。
7. `cp patched/*.ttf ~/.fonts`コマンドを実行し、cloneしたディレクトリ上のファイルをフォント用のディレクトリにコピーします。
8. `sudo fc-cache -fv ~/.fonts`コマンドを実行し、フォント情報を更新します。
9. 端末の設定から、フォントを`SourceCodePro+Powerline+Awesome Regular`に設定します。
10. 端末を再起動します。

#参考文献
* [arialdomartini/oh-my-git: An opinionated git prompt for bash and zsh](https://github.com/arialdomartini/oh-my-git)
* [リモートから特定のブランチを指定してcloneする - Qiita](https://qiita.com/icoxfog417/items/5776e0f0f758f0f0e48a)
[随時更新中]SwiftyJSON使用方法メモ

#### まず初めに必要なJSONのデータを変数に格納する  
`yourJsonData = JSON(data: yourData)`

#### JSON Item内の配列数返す
`yourJsonData["Items"].count`

#### JSON Item内の要素を返す
```swiftJsonItem.swift
yourJsonData["Items"][0][element1]
-> dataInElement1 //JSON型
```

ただしこれはJSON型なのでString型にしたい時は  

```swiftyJsonElementToString.swift
yourJsonData["Items"][0][element1].stringValue
-> dataInElement1 //String型
```

#### JSON Item内の要素を配列に入れる (今回はstring型で入れる)
```.swift
var jsonItemArray: [String] = []
var jsonItemData: [Double] = []

for var elementInArray in 0...x {
  jsonItemArray.append(yourJsonData["Items"][element]["element1"].stringValue)
  jsonItemData.append(yourJsonData["Items"][element]["element1"]["data1"].doubleValue)

}

print(type(of: jsonItemArray[0])) //-> String
print(type(of: jsonItemData[0])) //-> Double
```
Laravel 5.4にbarryvdh/laravel-corsを導入する


* https://github.com/barryvdh/laravel-cors

## 導入手順

### barryvdh/laravel-corsパッケージを取得

* composer requireでパッケージを取得する。

	``` bash:console
	cd (/your/laravel/project/path)
	composer require barryvdh/laravel-cors
	```

* config/app.phpを編集する

	``` php:config/app.php
	<?php
	
	return [
		// ...
		'providers'       => [
			// ...
			//barryvdh/laravel-cors
        	Barryvdh\Cors\ServiceProvider::class,
		],
		// ...
	
	];
	
	```

* middleware追加
	
	``` php:app/Http/Kernel.php
	// ...
	protected $middlewareGroups = [
		// ...
	    'api' => [
	        // ...
	        \Barryvdh\Cors\HandleCors::class,
	    ],
	];
	```

* 設定ファイル生成
	
	``` bash:console
	cd (/your/laravel/project/path)
	php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"
	```
SharePoint リスト情報を PowerShell を使って CSV で出力する

[ブログからの転載](http://1bed.allright.life/?p=2513)

体調も悪いので、リスト情報を CSV で出力してみようかと思い立ってサクッと

## サンプルコード
```ps1
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# 取得する SharePoint Online の URL
$url = 'https://<your tenant>/';

# ユーザー名
$user = '<your account>';

# パスワード
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString;

# SharePoint Online 認証情報
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure);

# SharePoint Client Context インスタンスを生成
$ctx= New-Object Microsoft.SharePoint.Client.ClientContext($url)
$ctx.Credentials = $credentials

## ここから処理
$ctx.Load($ctx.Web.Lists)
$ctx.ExecuteQuery();

$data = @()
for ($i=0; $i -lt $ctx.Web.lists.Count; $i++) {
    $t = $ctx.Web.lists[$i]
    if ($t.Hidden -eq $false -and $t.EntityTypeName.IndexOf("List") -ne -1) {
        $line = @{
            Title          = $t.Title;
            Id             = $t.Id;
            Name           = ($t.EntityTypeName.Substring(0, $t.EntityTypeName.IndexOf('List')));
            Path           = ("{0}/Lists/{1}" -f $t.ParentWebUrl.TrimEnd('/'), $t.EntityTypeName.Substring(0, $t.EntityTypeName.IndexOf('List')));
            ItemCount      = $t.ItemCount;
            ItemLastModify = $t.LastItemModifiedDate;
            ItemLastDelete = $t.LastItemDeletedDate;
            Created        = $t.Created;
        }
        $data += New-Object PSObject -Property $line
    }
}
$data | Export-Csv -LiteralPath "<output path>" -Encoding Default -notype
```

18 行目まではほぼおまじない。

27 行目で「Hidden ではなく、且つ、EntityTypeName に List という文字が入っているものにしています。
32 行目も含めてですが、ちゃんとするなら「List で終わっている」とやったほうがよさそうです。

41 行目で Export-Csv を使って出力しています。

## 考察
32 行目が本当にこれでいいのかが不明です。
リスト毎に RootFolder を Load して ServerRelativeUrl から割り出すのが正解な気がしています。

データー一括変更の元データーや、一括変更前後の確認などにこういうの使うだろうなー
APIバージョニングする時の対応方針4通り考えてみた

特に対応しなくてもいい場合もあると思うので一概には言えないですが、
APIに変更が入った際の対応方針を4通り考えてみました。(4通りと言いつつ3通りな気がするが気にしない)
前提として、これはウェブアプリケーションの場合なので、他のプラットフォームでは当てはまらないことも多々あると思います。
また、足りない観点などあればご教示いただけると嬉しいです。

![APIバージョンアップ時のフローチャート.png](https://qiita-image-store.s3.amazonaws.com/0/150569/3ae08909-5165-4a8a-7414-115b2b7dbce2.png)

① 古いAPIも残していくあなた
------------------------------
よくぞこの道を選びました。
この道を選んだ際に検討することは大きく以下の2点です。

1. どこまで対応するか
2. どうやってバージョン判定するか

###1.どこまで対応するか
対応すると言っても、リリースしてから全てのバージョンに対応するか、1つ前のバージョンだけ対応するかで大分変ってきます。
これは扱うアプリケーションにもよるんですが、基準としては「(ほぼ)全てのユーザが最新版に至るまでの期間に平均何回アップデートするか」
に依存するでしょう。
ただ、未来の要求なんて読めないことの方が多いし、1週間2週間もブラウザ上で同じアプリを開きっぱにするケースも考えづらいので、
とりあえず「最新のバージョンの一つ前だけ対応する」ようにして、一応それ以上のバージョンも対応できるような拡張性を用意しておくくらいの方針がいいんじゃないかと思います。

###2.どうやってバージョン判定するか
これは①だけでなく②、③でも必要なことですが、バージョンを判定する仕組みが必要になります。
これに関しては素敵な記事があったのでリンクを貼るのみにしておきます。

[api開発に失敗しないための情報収集まとめ](http://qiita.com/taiyop/items/78d3a0614be9be77ce41)
※`どんなバージョニング方法があるか`の項です

② 古いAPIは残さないが、なんとかリクエストは通すあなた
------------------------------
ユーザが実行途中に強制再読み込みされたら激しくイラつくようなユースケースがある際には、この道が有効かと思われます。

送られてきたリクエストとサーバー側のバージョンが食い違っている時に、
変更部分をダミーパラメータ追加してごまかしたり、返す時に不要な値を削ったり、
変更の内容には依存しますが、どう転んでもad hocな対応になるかとは思われます。

③ 古いAPIは残さず、ユーザに再読み込みを強いるあなた
------------------------------
私は最終的にこの道を選びました。

①の項で書いたバージョン判定の方法加え、再読み込みさせた際に必ず最新版を読み込ませる工夫を導入する必要があります。

私が作ったアプリケーションでは以下のように対応しました。

* HTMLはキャッシュさせず、再読み込みさせた際に必ず新しいもの取らせる
* CSSとJSはキャッシュさせるが、HTML内のリンクにバージョンを含んだクエリをくっつけて、更新した際には必ず新しいものを取得させる。

まずHTMLについてなんですが、前提として

* 私が作っているアプリはReactを用いたSPAのためHTML自体はCSSとJSを読み込むだけの非常に簡素(ファイルサイズが小さい)
* B to Bアプリケーションのためリクエスト数がそこまで大きくなりづらい

ということがあり、キャッシュを一切させないことによる性能への影響が少なく、単純にキャッシュを許容しないのが実装上シンプルでよいだろうと判断しました。

Cache-Controlに以下のプロパティを追加しました。

    must-revalidate, no-store, max-age=0, no-cache

ブラウザのキャッシュコントロールについては以下の記事が大変参考になりました。
[キャッシュについて整理してみた](http://qiita.com/karore/items/2dc6ab8347c940ea4648)

CSSとJSはそこそこファイルサイズ大きいのでキャッシュは効かせたいと思い、変更があった時だけ新しいものを取得させるようにしました。
具体的には以下のようにHTML内の各ファイルのリンクにバージョンを含んだクエリを追加しました。

```html
    <link rel="stylesheet" href="/static/css/style.css?version=1.0">
    <script src="/static/js/index.js?version=1.0"></script>
```
HTMLは常に最新なので、バージョンアップを忘れなければ(フラグじゃない)CSSとJSも新しいものが取得できるようになります。

④ 何もしないあなた
------------------------------
特にユーザ体験に影響がなければよいですが、もしユーザがユーザ視点で意味不明なサーバーエラーに巻き込まれる可能性がある場合は、なんらかAPIバージョニングの仕組みを検討した方がいいと思います。

おわりに
==============================
正直な話をすると先日初めて自分の作ったアプリがリリースされ、その後APIにバージョニング対策しないまま変更を入れてしまったんですよね。
お客様からクレームが来たという話は聞いていないですが、サーバーエラーを体験した人がいた場合は、
私の想像力不足でご迷惑おかけてしまい申し訳ない気持ちでいっぱいです。

初開発の人にとっては抜けがちな観点だと思うので、しっかり対策していきましょう！
自戒を込めて。
kivyの勉強再開

最近いろいろありすぎて手を付けられなかった。

勉強法とかもいろいろ探した結果・・・・

とりあえずサイトを巡ってつくったソースコードを書く。
（コピペじゃないよ！）

そしてわからない事がでてきたらそれを調べながら書いていく！！

・1回で理解しようとしない
・1回書いておわりにならない（その日に何十回も書くって意味ではなく、生涯を通して定着するまでって意味）
・1つのアプリがあったとして、それに時間をかけすぎない
・たくさんのコードにふれる

ちなみにkivyは最新バージョンがでてたのでアップデートしました。
環境としては
Windows10
Anaconda
メインは3.5系　一応3.6系も使えるようにしてる
kivy 1.10.0

今勉強に使わせていただいているのはここ

[Python Kivyの使い方① ～Kv Languageの基本～]
(http://qiita.com/dario_okazaki/items/7892b24fcfa787faface)

そしてさっそくつまづいた！

9．ボタンの追加　ってところがあるんだけど
そこのkvファイル

まず書いてみて、実行するとどうやらうまくいかない。
確認しても間違ってるところはない。
本当に間違ってないかコピペで確認。
やはり間違ってない。

エラー文を見てみる。
（なぜ最初に見なかったのか・・・・）

結果:TextWidgetが問題らしい。

調べたところWidgetだけで動くらしい。

```
その１TextWidget:

その２<TextWidget>:
    BoxLayout:
        orientation: 'vertical'
        size: root.size

        # ラベル
        Label:
            id: label1
            font_size: 68
            text: "Hello World"

        Button:
            id: button1
            text: "OK"
            font_size: 48
```

これの、その１とその２を消して

```
Widget:
    BoxLayout:
        orientation: 'vertical'
        size: root.size

        # ラベル
        Label:
            id: label1
            font_size: 68
            text: "Hello World"

        Button:
            id: button1
            text: "OK"
            font_size: 48

```
こう書き換えてみた。
上手くいった！

エラーメッセージとマニュアルと友達になることが大事。。
英語の勉強もちょびっとずつですがはじめました。

追記：
そしてまたつまづいてる。そのつぎの１０のやつがうまくいかない・・

追記２：
単純にkvファイルの書き間違えだったｗｗ