OmniAICreator/Qiita-1.07M huggingface dataset:
Sierraでrmagickがインストールできない問題

rmagickをインストールしたら躓いたのでメモ

> 参考
[ImageMagick 7 with RMagick 2.16 on MacOS Sierra Can't find MagickWand.h](http://stackoverflow.com/questions/41647979/imagemagick-7-with-rmagick-2-16-on-macos-sierra-cant-find-magickwand-h)

## 躓いたところ

```bash
$ bundle
bundle
The git source `git://github.com/JangoSteve/remotipart.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
The git source `git://github.com/brainspec/enumerize.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.....
# 略

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

# エラーは略
An error occurred while installing rmagick (X.X.X), and Bundler cannot continue.
Make sure that `gem install rmagick -v 'X.X.X'` succeeds before bundling.
```

rmagickのインストールでつまづく。

言われたとおりに `rmagick` を入れてみる。

```bash
$ gem install rmagick
Building native extensions.  This could take a while...
ERROR:  Error installing rmagick:
	ERROR: Failed to build gem native extension.

#errorが起きてインストールできない。
```

## 解決策

今回予定していた動作をさせる環境では `imagemagick6` が必要だったらしく、まずはimagemagick6をbrewで入れる。

```bash
$ brew install imagemagick@6
```

`imagemagick@6` に `brew link` させる。

```bash
$ brew unlink imagemagick
$ brew link --force imagemagick@6
```

これで正常に `rmagick` が `gem` でいれることができ、その正常に `bundle` が通りました。
Vagrantチュートリアル(3)

前回からの続きで書いてます [< Vagrantチュートリアル(2) >](http://qiita.com/piyomarudayo/items/df8f27837e5cdfa2ebd0)

# Provisioning
立ち上げてログインするだけでも素晴らしいですが、
`vagrant up`するだけでより機能的な環境構築をする方法がvagrantにはあります

### ・Installing Apache
**`booststrap.sh`というファイルを作成します**

```booststrap.sh
#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
  rm -rf /var/www
  ln -fs /vagrant /var/www
fi
```

**VagrantFileを編集します**
作成したシェルを呼び出す設定を追加します

`config.vm.provision :shell, path: "bootstrap.sh"`

<img width="310" alt="スクリーンショット 2017-05-17 11.01.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/0fc98f65-70fd-c43f-bdea-8059b9642522.png"> → <img width="310" alt="スクリーンショット 2017-05-17 11.02.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/4e6352b7-e7c6-d67d-c4f3-6f083901ed27.png">

要するに`vagrant up`時に一緒にapacheもインストールするシェルを実行するようにしています

**vagrant up**
ここで注意ですがコマンドは以下のものになります
`vagrant reload --provision`

するとこんな感じでインストールがされているのがわかります
<img width="340" alt="スクリーンショット 2017-05-17 17.52.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/216ac26a-b046-ba49-a1fb-1647a208a6fc.png">

### Provision!
vagrantにログインをして
`vagrant ssh`

wgetコマンドで疎通確認しましょう
`wget -qO- 127.0.0.1`

<img width="630" alt="スクリーンショット 2017-05-17 17.59.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/8109/76ad3583-e19d-000f-cfec-bc8afb49d7cc.png">

確認できました
※ブラウザでも確認できます`192.168.33.10`と打てば見れるはずです

vagratnfileを使えば初期設定時に色々な含めることができて便利です
※ただ公式にはより複雑なものに関してはVagrantBoxとしてパッケージ化することが推奨されています - [Creating a Base Box](https://www.vagrantup.com/docs/boxes/base.html)



# あとがき
自分用に公式のチュートリアルをまとめてみようと思ったものです
詳細は公式また他にもわかりやすい記事は色々あるのでご参考に
[Vagrant公式](https://www.vagrantup.com/intro/index.html)
[ドットインストール](http://dotinstall.com/lessons/basic_vagrant)
SlackのIncoming Webhooksでメンションを飛ばす方法

# 前段

SlackのIncoming Webhooksでは text パラメーターに "`@channel` Hello" 等と書いてもそのままテキストになってしまい正しいメンションとならない。

# 記法

| 記法 | メンション |
|:---:|:---:|
|`<!here>`|`@here`|
|`<!channel>`|`@channel`|
|`<@user_id>`|`@ChiyodaTarou`|

# user_id の取得方法

ユーザープロフィールの中にある折りたたまれた部分を開いたところにある `Copy number ID` です。

まとめて取得したい場合は @gimKondo さんが書かれた [こちらの記事](https://qiita.com/gimKondo/items/99ba9b05d14a6b49df68)を参考にされると良いでしょう

![スクリーンショット 2018-08-28 15.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/134838/353b719a-d0ba-ccf4-fec7-558c76331b67.png)


# 例1

チャンネルの全員にソフトクリームくんがメンションで挨拶する

```bash:slack.sh
#!/bin/bash

PAYLOAD=`cat << EOS
    payload={
        "channel": "#general",
        "username": "softcream",
        "text": "<!channel> Hello, channel!",
        "icon_emoji": ":poop:"
    }
EOS`

curl -X POST --data-urlencode "$PAYLOAD" https://hooks.slack.com/services/QWEERTY/YTREWQ/ASDFGHJKL
```

![14.png](https://qiita-image-store.s3.amazonaws.com/0/134838/d1e3fc5b-d321-0274-831a-912d06353d1b.png)

# 例2

attachmentsでも同様です

```shell-session:slack-attachments.sh
#!/bin/bash

PAYLOAD=`cat << EOS
    payload={
        "channel": "#general",
        "username": "softcream",
        "attachments": [{
            "color": "#0000FF",
            "title": "I am softcream",
            "text": "<!channel> Hello, channel!"
        }],
        "icon_emoji": ":poop:"
    }
EOS`

curl -X POST --data-urlencode "$PAYLOAD" https://hooks.slack.com/services/QWEERTY/YTREWQ/ASDFGHJKL
```

![スナップショット15.png](https://qiita-image-store.s3.amazonaws.com/0/134838/496bab2d-1f6b-91e4-5f99-b571fe28eaef.png)

# 補足

ソフトクリームは和製英語であり、英語では"soft serve ice cream"というそうです。
[参考資料](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%A0)
IntelliJ IDEA とか PHP Storm で起動時のメモリを増やしたりする設定のやりかた

## 発端
**[【メモ】IntelliJ IDEA 64bit版でメモリを増やして起動(Windows)](http://qiita.com/daichi87gi/items/76758586e35356f1ac05)という記事があるが、このやりかたは** 「インストーラが管理しているファイルを手動で編集する」という、「本来やってはいけないこと」を平然とやっていて **よろしくない** ので、 **[公式ドキュメントに書いてある、良さげなやりかた](https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties)** を書いておきます。

## やりかた
以下の手順で、安全に設定ファイルを作成・編集できます。

1. ` Help | Edit Custom VM Options` メニューから設定ファイルを開く。なかったら作られる
1. 開かれたファイルを自由に編集する

![Inmtellij_Help_EditCoustomVmOptions.png](https://qiita-image-store.s3.amazonaws.com/0/29233/d6e06b3e-ea78-8341-6b06-26c3d7b93e7d.png)

## Toolbox App を使ってる人のやりかた

> JetBrains謹製の Toolbox App を使っていれば、テキストファイルを編集しなくても設定→Maximum heap sizeで設定変更できます。EAP版の更新/安定版の同居やダウングレードもできるのでオススメです。
> 
> 当記事のコメントより引用: http://qiita.com/ndxbn/items/7c1b7c25aa33ef021841#comment-41ef9bbbb71bcef2c247

[JetBrains Toolbox App](https://www.jetbrains.com/toolbox/app/?fromMenu) からも設定できます。

![toolbox_app_01.png](https://qiita-image-store.s3.amazonaws.com/0/29233/41cb9cb2-1542-3779-ce99-b3aec5ba5994.png)
![toolbox_app_02.png](https://qiita-image-store.s3.amazonaws.com/0/29233/7acf7305-7f7a-6ea9-1a61-f3d025650868.png)
Electronアプリの開発テンプレート

# 前書き
今まで、ReactやReact+ReduxのElectron化について記事を作成してきましたが、
今回からはElectron単体での詳細な開発方法やElectronでアプリを作る際の流れや
実際に作ったアプリなどを紹介しつつ、記事を作成して行きます！

今回は最初ということで、**Electronアプリを作成する際の開発準備**をメインに記述して行きます。

# アプリケーション作成の準備
アプリケーションを作成するため、まずはディレクトリを作成します。
簡単に、好きな場所に作ってしまいましょう！

```bash
$ mkdir electron_app
$ cd electron_app
```

ディレクトリを作成したら、そこをプロジェクトフォルダにするため
npmの管理下に置きます。

```bash
$ npm init
```

色々聞かれますが、ほとんどデフォルトで問題ありません。

```bash
...
name: (electron_app) 
version: (1.0.0) 
description: electron first app
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
...
```

確認が来たら、yesを入力します。
これで、npmの管理下においてelectron_appのプロジェクトが作成されました。
ディレクトリ直下にpackage.jsonが作成されていればOKです。

```package.json
{
  "name": "electron_app",
  "version": "1.0.0",
  "description": "electron first app",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

それでは、できたプロジェクトに利用するライブラリを導入していきます。
もっとも必要なのはElectronなので、以下のコマンドを使って
npm経由でElectronをインストールします。

```bash
$ npm install electron@1.6.1 --save-dev
```

**--save-dev**をつけることでpackage.jsonに自動的に記述されます。

割と時間がかかる時があるので、のんびり待ちましょう〜

インストールが終わると、プロジェクト直下にnode_moduleフォルダが作成されます。
Electronには、いくつか依存ライブラリがあるのでそれも一緒にインストールされます。

インストールが完了し問題がなければ、ここで一旦Electronを起動してみます。

```bash
$ ./node_modules/.bin/electron
```

Electronが起動すれば、Electronのアプリを作成する準備は完了です！!

![electron_samp.png](https://qiita-image-store.s3.amazonaws.com/0/159013/51c11fc5-a12b-4821-20fb-6dc494408020.png)
お疲れ様でした！

# 後書き
最近は、create-react-appやAngularCLIなどのコマンド上で簡単にプロジェクトを作成できるものがありますが、
npm initで初期化して〜必要なライブラリを落として〜ディレクトリ考えて〜という流れをやってみるのも
なかなか面白いものです。

次回は、Electronアプリ構成の基本について紹介します。
そもそもIANAってなんだ

#Internet Assigned Numbers Authority
南カリフォルニア大学情報科学研究所のJon Postel教授が中心となって始めたプロジェクトグループの名称でした。
**インターネット資源**と呼ばれる**ドメイン名、IPアドレス、プロトコル番号**などの**管理**を行っていました。

2017年現在、管理は**国際非営利法人ICANN**に引き継がれ、**IANA**は**機能の名称**として使われています。
以前MIMEタイプについての記事を書いたときに教えて頂きました。
[Media Typesの一覧もあります。](https://www.iana.org/assignments/media-types/media-types.xhtml)

[IANA https://www.iana.org/](https://www.iana.org/)
Hark

#録音ネットワークの作成
[Harkクックブック  ](http://www.hark.jp/document/hark-cookbook-ja/subsec-LearningHARK-001.html)を参考に録音ネットワークを作成した。
作成したネットワークは以下のようになった。

![main.png](https://qiita-image-store.s3.amazonaws.com/0/165517/fecace59-018f-a914-2c50-030fcab1dc4e.png "MAIN(subnet)")



![main_loop.png](https://qiita-image-store.s3.amazonaws.com/0/165517/de91ce38-624c-6f10-ae41-d46bdbe15a99.png "MAIN_LOOP()iterator")
 

クックブックによると一部のパラメータ値を自分で変更する必要があると書かれていたので変更してみた。![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/165517/444663a5-4818-9801-5d5c-ccd5e53b4490.png)
MAX_ITERのパラメーター値を480、使用するデバイス名をTAMAO-03にそれぞれ変更した。
クックブックに書かれていた録音のための作業はこれだけだったので実行してみる。
しかし、Missing Parameter: MAX_ITER 
Given parameters are: 
C:\work\flowdesigner-0.9.1-hark\data-flow\src\UINode.cc line 232: Exception caught while creating node_Iterate_1 (type Iterate) 
C:\work\flowdesigner-0.9.1-hark\data-flow\src\UINetwork.cc line 559: Exception caught while building network MAIN_LOOP 
C:\work\flowdesigner-0.9.1-hark\data-flow\src\UINode.cc line 232: Exception caught while creating node_MAIN_LOOP_1 (type MAIN_LOOP) 
C:\work\flowdesigner-0.9.1-hark\data-flow\src\UINetwork.cc line 559: Exception caught while building network MAIN 
このようなエラーが発生し、録音することができなかった。
SQL で 年齢計算


# 2002年1月1日の1000日前は？

日付計算、表題はちゃんと暦のシステムを理解していれば計算できる。ユリウス日で計算すればカンタン。

しかしながら

- 2013年14月50日とかいう入力を修正して2014年4月1日にするようなシステム、
- 2015年6月7日13時34分55秒をまたぐと年カウントするとかのシステム
- タイムゾーンをまたぐ計算
- サマータイムってなんだっけ
- ...


このようなのになると、めんどくさいしテストが大変。

こういったものは既存の日付計算を利用するのが良い。SQL DBが入っていれば、これで計算することができるし日付の扱いはドキュメントに明示されている。

# Microsoft SQL Serverで年齢の計算

```

select round(
     (
        convert(int,(convert(varchar,getdate(),112)))-
        convert(int,convert(char,生年月日,112))
     )/10000,0,1
            ) as 年齢 from 個人データ

```
実は、これは日付計算使ってない。この程度ならSQL使わなくても簡単だけど、実例ということで。
tensorflowをインストールする。(だけ！)

こんにちは、pythonにtensorflowを入れると楽しい！と聞いたため、tensorflowをインストールしようとして５時間かかったため、この苦労を共有しようと思います。。

#環境
実施日　2017/5/12
インストールしてあるもの　python(3.6.0)←Anaconda経由でインストール

#目標
tensorflowをインストールしたい。

#問題点
コマンドプロンプトでtensorflowをインストールしようとした際に"Cloud not found a version that satisfies the requirement tensorflow..."のようなエラーが出る。
どうやら、tensorflowはpythonの2.7/3.4/3.5でないとインストールができないらしいです。

#解決策
そこで、違うバージョンのpythonが欲しい！と思い、仮想環境を作成することにしました。

conda create -n py35(名前です) python=3.5 anaconda

コード入力後に確認のような文章が出てくるのでyを押します。
作成した仮想環境はactivate py35 よりアクティブにすることが可能です。
Python の OCR パッケージについて教えて欲しいです。

Python の初心者です。
先輩たちにご教授願えると幸いです。

質問
1.Python で扱える OCR パッケージのうち、マニュアルが存在するもの（英語可）、あるいはネット上で実例が豊富な（検索でよく当たる）ものを教えて頂けないでしょうか。
2. また、精度の高いパッケージはどれでしょうか。フリーとシェアで教えてもらえると助かります。
3.扱い方を説明しているおすすめのサイトなどあれば教えて頂きたいです。

環境
OS: X Yosemite
Anaconda 4.3.1 (python 3.6.0)

やりたいこと
・jpeg ファイルからの英数字の認識

現状：
1. pytesseract をインストールする。
2. マニュアルを見つけられず（私の探し方が悪いだけな気がしますが。）、ネットから調べて書いてみる。=> エラーを返される。
3. 下記のような数字限定での読み取りはなんとか成功した。精度も悪くなかったが、数字だけ。。。
word_lines = pytesseract.image_to_string(img, config = "nobatch digits")
config 以降の数値のみ設定を消すとエラー。
4. 数字だけでは使えないため、pytesseract を python で動かすのではなく、元の tesseract をインストールして、mac のターミナル動かしてみた。
5. 動いたが今度は読み取り精度にかける。

宜しくお願いします。
やはりお前らのboundingRectWithSizeは間違っている

見つけたときあまりにも嬉しくて、それと同時にネットの情報に苛立ちを覚えたので、自分と同じ微妙なバグに悩まされている方が少しでも減ればと思い共有しときます。

iOSで描画せずにテキストの描画領域を得たい場合に利用する `NSString.boundingRectWithSize:options:attributes:context:
`ですが、戻り値`CGRect`の`height`はそのまま使うと`NSAttributedString`など属性付きの場合にズレが生じます。　通常の加工なしでは起きないのですが、実際のアプリでは装飾無しのプレーンなラベルだけのアプリなんてほぼないです。

受け取った`CGRect`は`ceil`で**切り上げ**してください。
Appleの [API Reference](https://developer.apple.com/reference/foundation/nsstring/1524729-boundingrectwithsize) にも書いてるのですが、
> This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must raise its value to the nearest higher integer using the ceil function.

Google大先生！
> このメソッドは、（返されるCGRectのサイズコンポーネント内の）分数サイズを返します。 返されたサイズをビューのサイズに使用するには、ceil関数を使用してその値を最も近いより高い整数に上げる必要があります。

実際に `ceil` で切り上げると、最後の1行が描画されない問題が解決しました。


### それでも`UILabel`でズレる場合（追記）
それでもズレるケースがありました。
その場合、`boundingRectWithSize` ではなく `UILabel.preferredMaxLayoutWidth` が古いサイズのままになっていることが原因で、実際の描画時の高さ計算がズレが生じて、 `boundingRectWithSize` とは異なる高さになってる場合があります。
laravel Echo + laravel Passport

Laravel Echoで認証を必要とするBroadcast（PrivateやPresence）を受け取る際に、SPAなどの環境ですと、認証はAPI経由（Laravel Passport）で行っていたりするケースもあると思います。
その場合は、以下を対応するとうまくいきます。

```Providers/BroadcastServiceProvider.php
Broadcast::routes(['middleware' => 'auth:api']);
```

```xxx.js
   // Laravel EchoのヘッダーにAuthヘッダーを付ける
   Echo.connector.pusher.config.auth.headers['Authorization'] = `Bearer ${token}`;

   Echo.join('chatroom')
      .listen('MessagePosted', e => console.log(e) });
```

Laravelでチャットを作る時は以下のYoutubeが参考になります
https://www.youtube.com/watch?v=iiBcOKYxd0Q
MacのFinderでWindowsみたいにファイルパス指定でディレクトリやファイルにアクセスしたい

# TL;DR

タイトルが全て。
例えば`/Users/luccafort/Pictures/YYYYmmdd`なディレクトリに保存されている写真をみたいとおもったときにFinderでやる手段がわからなくて困ったというだけの話。
定期的に忘れてはまたググってという感じでクソいので覚書として書いておく。

# 対象読者 or 前提条件 or 環境
- 前提条件
    - MacOS
- 対象読者
    - Mac初心者、Mac初級者
    - ググれない人、あるいはググらない人
    - 鳥頭な人
- 環境
    - MacOS
    - Finder

# 結論:

[【Mac】ターミナルで表示したパスの場所を一瞬で Finder で開く方法！](http://oki2a24.com/2014/01/17/open-finder-from-terminal-with-open-command-in-mac/)を読む。

## 実際に行うこと

Finderを開いた状態で`command + Shift + G`を押すとファイルパスを入力するスペースが表示されるのでそこにファイルパスを入力してEnter！でそのファイルパスやディレクトリにFinderで移動することができる。

# あとがき

Finderに対する不満というよりはWindowsのフォルダシステムがわかりやすくて改めてすげーな！って思いましたまる
Elasticsearchで1対多のデータを入れる時

画像とタグやメッセージとそのコメントなど１対多の関係があるデータをelasticsearchに入れて検索させたい場合、nestedを使うというメモ

# 主に使ったもの
Elasticsearch5
elasticsearch-rails

# indexの作成
nested　queryを使いたい場合、indexを作成する時はelasticsearch-railsを使って以下のように書きます。

```
    mapping _source: { enabled: true },
      _all: { enabled: true, analyzer: "kuromoji_analyzer" } do
      indexes :id,             type: 'long', index: 'not_analyzed'
      indexes :body,           type: 'string', analyzer: 'kuromoji_analyzer'
      indexes :comments, type: 'nested' do
        indexes :user_id,      type: 'long'
        indexes :message_id,   type: 'long'
        indexes :body,         type: 'string', analyzer: 'kuromoji_analyzer'
      end
      indexes :created_at,     type: 'date'
      indexes :updated_at,     type: 'date'
    end
```

こう書くことでcommentsのところが

```
"comments":{
  "type":"nested", "properties":{
                     "user_id":{"type":"long"},
                     "message_id":{"type":"long"},
                     "body":{"type":"string","analyzer":"kuromoji_analyzer"}
                   }
}
```
以下のようなindex定義でElasticsearchに登録されます。

# 検索する時のquery
例ばbodyとcomments.bodyの二つのカラムの中のどれかにキーワード検索したい場合、以下のように書くと検索できます。


```
{
  "query":{
    "bool":{
      "must":[
        {"term":{"school_id":1}}
      ],
      "should":[
        {
          "simple_query_string":{
            "query":""テスト投稿"",
            "fields":["body"],
            "default_operator":"and"
          }
        },
        {
          "nested":{   <<<<<<<< ここに注目
            "path":"comments",
            "query":{
              "simple_query_string":{
                "query":""テスト投稿"",
                "fields":["comments.body"],
                "default_operator":"and"
              }
            }
          }
        }
      ],
      "minimum_should_match":1
    }
  },
  "from":0,
  "size":10,
  "sort":[{"created_at":{"order":"desc"}}]
}
```

or検索になるので、shouldの中にbodyとcomments.bodyの検索queryを書いてます。で、どれか一方に必ずヒットするようにしたいにで、「minimum_should_match」を定義してます。

nestedを使うことで階層的なデータを格納し検索するのが、楽になります。
Xojo 使ってみる

# Xojoとは

マルチプラットフォームのIDE

- VBライクな感じでプログラム
- そのままWebアプリとして公開することもできる
- Windows/OSX/Linuxデスクトップアプリ作れる
- Webアプリ作れる
- iOSアプリも作成できる
- Androidには対応していないのが残念なところ

2021/01/22 追記：「そのままWebアプリとして公開することもできる」について。
2019版以前はデスクトップアプリとほぼおなじものをWebアプリとして作ることができたが、2020版においてXojoのWeb2.0フレームワーク移行に伴い使えるUIがかなり別物となっている。

# Raspberry Pi への対応

- Raspberry PiでWebアプリが作れる。
- リモートデバッグもできる


2020/02/29 修正
現在はRaspberryPiで動くデスクトップアプリなどが作れるようです。


## Raspberry Pi の既存の開発環境の問題

- Raspberry Pi でヘッドレスで使うライトなプログラミング環境が割とない。
- Raspberry Pi でデスクトップアプリを作成しても実用性は？
- Raspberry Pi のネットワーク環境を活かすにはWebアプリを動かすのがいいのでは？ UIはスマホで操作できる。
- しかしながらRaspberry Piに限らず現状WebアプリのRADはかなり少ない

こういうことを考えると、XojoでRaspberryPiのWebアプリを作るって結構革命的ではないかな。
Webアプリの教育用として最適ではないか。
それで学んだ知識や、RaspberryPiで作った試作品をスケールしてクラウドや大きなサーバで動かすという道が素敵。

## RaspberryPiへの対応が残念な件

しかしながら、以下のようなところで残念です。

- Raspberry Pi エディションで作成できるのはCLIのみ。
- Webアプリ開発するには￥58,000-してしまいます
- 開発には母艦PCが必要。RaspberryPi上でRADを動かして開発はできません。
- ということで、「やってみようかな」的なノリの入門はツラそう
- CLIプログラムしかできないのであればPythonで十分って感じがします。

2020/02/29追記
現在はRaspberryPiで動くデスクトップアプリが作れるようです。
開発は他のPC上でIDEを動かしてクロス開発ないしリモート開発となるようです。


# プログラム作り始めるまでの画面とかの紹介
最初に起動
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/3be1cffd-73b8-c2e0-747f-2cb3d3947616.png)
Webアプリを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/d62c95f7-e58c-d6f2-1333-9d8e358a3227.png)
アプリ名testとして進める
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/71c2b590-49d5-8f3c-2b37-825632e5f19f.png)

# 問題点
- 以下は2017r1.1での問題

## ListBox のカラムの横幅

- マウスで幅変更とかできない。

## 縦書き

- ラベルのフォントに @MS明朝 とか指定したけどダメ。

## 割と落ちる

- RAD開発環境が1日に数回落ちる。作成途中のコードは復元してくれてコードを失うことはなかったけど・・・

(2020/4/10追記)　2019r3.1において、落ちるのは比較的少なくなったものの、コード復元ができなくなっている。
(2021/1/21追記)　2019r3.2において、MS-Windows版の場合ほぼ落ちることはなくなったようだ。

## コードエディタ

- 括弧の対応がわかりずらい・・・何か操作方法があるのかも
- カーソル移動がわかりずらい・・・Windows環境のみ、矢印キーで動かしていると画面更新をさぼる。Linux環境だとこんなことはない。
- (2021/1/21追記)　Linux版2019r3.2において、日本語を含むコードの編集がまともにできない。
cf.,「Xojo IDE を Ubuntu 18.04 で動かしたときの日本語問題」
https://qiita.com/nanbuwks/items/b6eec25070661b73e3a2


## MS SQL Server への対応が残念な件
http://docs.xojo.com/index.php/MSSQLServerDatabase
ここを見ると対応してそうだけど・・・プラグインってどうやるんだっけ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/e20695d2-3a6a-5b19-1b44-5fb3a123c6c8.png)
プラグインはここにあったので、ワークスペースにドラッグドロップで登録されてみたい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/244cb64f-2eda-581f-0961-8eb2bcfebdfe.png)
コードを書いて実行すると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/c44ff287-a980-4c2a-b49d-c8120c52babe.png)

おや。単にダウンロードしたらいいだけかな、と思ったら

https://forum.xojo.com/21501-mssqlserverexample-db-connection-error/0

ここにあるように、闇は深そうだ。

代わりにODBCを設定した。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/860ff6e3-44c8-400f-6745-9d91e341c32a.png)

サンプルプログラムを書き換えたらOKになりました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/a396b3f9-8689-ef60-ced2-c4116f1d9a4c.png)



## MySQL への対応が残念な件

(2021/1/21追記)
MS-Windowsだと日本語カラム名が使えない
cf., 「Xojo + MySQL(MariaDB) で日本語カラム名」
https://qiita.com/nanbuwks/items/6d6da652e705d9d91bda
Linux のデバイスファイルに無理やり書き込む

私は /dev が苦手だ。どういう存在なのかあやふやで恐ろしい。苦手意識を克服するためにどうでも良い SD カードを壊してみる事にした。まず SD カードを挿入して unmount し、echo で無理やり書き込む。

    $ umount /dev/sdb1
    $ sudo sh -c 'echo "Hello World!\n" > /dev/sdb1'
    $ sudo head -c 32 /dev/sdb1
    Hello World!
    
    ? ??

SD カードの最初のパーティションに "Hello World!" を書き込んだり読んだりする事が出来た。次に、SD カード全体に書き込んでみる。

    $ sudo sh -c 'echo "Hello World!\n" > /dev/sdb'
    $ sudo head -c 32 /dev/sdb
    Hello World!
    
    ????|????!

こちらも問題なく(?) 読み書きが出来た。/dev/sdb を壊すと最初のパーティション /dev/sdb1 が壊れてしまうのではないかと思ったが、まだ読めた。

    $ sudo head -c 32 /dev/sdb1
    Hello World!
    
    ? ??

mount を試みると、めでたく /dev/sdb1 が壊れていることが分かった。

    $ sudo mount /dev/sdb1 /mnt
    NTFS signature is missing.
    Failed to mount '/dev/sdb1': Invalid argument
    The device '/dev/sdb1' doesn't seem to have a valid NTFS.
    Maybe the wrong device is used? Or the whole disk instead of a
    partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?

結論: SD カードにはファイルシステムを無視してデータを読み書き出来る事が分かった。chown で所有者を変えると一般ユーザでアクセス出来るので、何かに使えるかも。
Dictionaryを使用し文字列から値を取得する


Dictionaryを使用する機会があったので、メモとして

# Dictionary
参考：http://qiita.com/kwst/items/2cfd01b7f28daf0f495e

    Dictionary<string, 保持する値の型> dic = new Dictionary<string, 保持する値の型>

で宣言し

    dic.Add(string, 値);
で要素を追加することができる。

追加した要素は

    Debug.Log( dic[string] );
    
で取り出すことが可能。

# 使用する値を登録
例としてダメージを受ける部位とそのダメージを返すものを作成。

enum型で使用する値を定義

    enum damage
    {
        hit = 1,
        clean,
        critical,
        deadly
    }
    
enumの値をDictionaryに登録

    Dictionary<string, damage> dic = new Dictionary<string, damage>
    {
        { "head", deadly },
        { "neck", critical },
        { "body", hit },
        { "hand", clean },
        { "leg", clean },
    }

# 呼び出し
文字列を引数に取り、値を返すことが可能。

    public int (string hitPart ){
        switch( dic[hitPart] ){
        case hit:
            return 1;
        case clean:
            return 2;
        case critical:
            return 3;
        case deadly:
            return 100;
        }
        return 0;
    }

或いは
    
    int dgm = dic["head"]
    
のように使用できる。

damgeの値はenumを、ヒット場所の判定を変える場合はDictionaryの初期値を変更する。
Macのopenコマンドでファイルを開く

# はじめに
- MacはマウスでGUI操作するイメージが強いかもしれませんが、やはりキーボードで操作すると早いですよね
- 今回は、何かと重宝するopenコマンドについて簡単に紹介します

# openコマンド
- 引数に指定したファイルやフォルダ、URLなどを開くコマンドです
    - それだけです
- デフォルトでは、関連付けされたアプリでそれぞれ開いてくれます（アプリを指定することもできます）
    - フォルダならFinderのウィンドウ
    - KeynoteのファイルならKeynote
    - XcodeプロジェクトならXcode

```bash
open hello.txt
```

# 主なオプション（一部）

| オプション | 説明 |
|:--|:--|
| -a | アプリケーションを指定して開く |
| -e | TextEditで開く |
| -t | デフォルトに指定したテキストエディタで開く |
| -R, --reveal | ファイルを開くのではなく、Finderを開いて該当ファイルを選択 |
| -g, --background | 背面で開く（前面はTerminalのまま） |

# 例えば
## 深い場所にあるフォルダをFinderで開きたい

```bash
$ open abc/def/ghi/jkl
```

- Finderを開いてマウス操作で掘り下げてもいいですが、Terminalなどではtabでファイル名やフォルダ名の補完が効くので、目的の場所まで降りるのが圧倒的に速いです
- たとえば、上の例であれば `open a -> tab -> d -> tab -> g -> tab -> j -> tab` でいいですよね
    - 先頭文字が同じ名前のフォルダがないと仮定した場合
- とはいえ、Spotlightで最下層のフォルダ名を入力して探した方が速いかと思います
    - が、中間のフォルダ構造も確認しながら降りたい場合には、私はopenを使ってます
    - あと、Terminalを開いて作業してることが多いからというのもあります

## ブラウザを指定してWebページを開きたい

```bash
open -a /Applications/Google\ Chrome.app https://www.casareal.co.jp/
```

- Webページとか、ブラウザを選択して開きたい場面ってあると思います
    - 他にも、PowerPointのファイルだけどKeynoteで開きたいとか
- そんな場合に、役に立ちそうです

# 最後に
- Macを使い始めたばかりだったりすると、openコマンドは意外と知らなかったりすると思います
- エンジニアはTerminalで作業することが多いと思いますが、その時にファイルを開く場合にはとても楽です
- Spotlightはもちろんですが、openコマンドも便利なので、ぜひ使ってみてください
必要とされるコミュニティサイト

#プログラマー未満の人はどこに行けばいいのか

自分で調べ解決できる人がプログラマーの資質なのだろう

助けを必要としているのはそれが未熟な人達なのだ

熱意はコードの理解に向けるべきだ
Thymeleafでenumを参照する

```java:enum
package com.example;

public enum Months {
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}

```

```html:thymeleaf
<div th:if="${month == T(com.example.Months).JANUARY}">
    monthがJANUARYの場合に表示される
</div>
```

### 参考

- http://stackoverflow.com/questions/24937441/comparing-the-enum-constants-in-thymeleaf
- https://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-types
IPAの IMI 共通語彙基盤のデータ構造を可視化してみた

#出力結果
IMIコア語彙バージョン2.4.1 クラスレポート
 - liquid studio 版
https://yuutakasan.github.io/imi-class-report/Core241/liquidstudio/index.html
 - xs3p 版
https://yuutakasan.github.io/imi-class-report/Core241/xs3p/Core241.xsd.html#type_%E6%A6%82%E5%BF%B5%E5%9E%8B
※Github pageにあげてみました。（2017/05/18）
※コア語彙2.4.1にバージョンアップしました。

#背景
システム設計するとき皆さんどう考えてますか？

最近、社内でデータベース設計をごりごりやっているのだが、
正しくデータを分類して、データ形式を整えるのは非常に時間がかかる。
また、自分が考えた設計が他人に理解しやすいかもわからない。

他社とデータ連携したり、データを購入して取り込んだり、
そういうケースがある場合、データ構造の標準化をしなければいけないし、
きれいに設計できてないと、そもそもメンテナブルな設計にならないが、
どうすればいいのか、今までシステム設計の本読むとか勉強する以外指針がなかった。

#IMI 情報共有基盤　コア語彙

ここで出てくるのがIPAの語彙情報基盤だ。
語彙情報基盤では世界的なデータ交換仕様を元に、
クラスを用いてデータの標準的な構造を定義している。

データベース設計、クラス設計するときに以下を見ると
非常に洗練されていて便利。

##IMI共通語彙基盤　コア語彙 バージョン2.4.1
https://imi.go.jp/core/core241
![image.png](https://qiita-image-store.s3.amazonaws.com/0/19439/12ac1bac-511a-743d-5627-042136413511.png)

#利用についての課題

ただ、実務で使おうと思うと、複雑な継承関係を持つ
この資料だと誤読もするし、結構しんどい。

例えば法人型の場合、
　概念型 < 事物型 < 実体型 < 組織型 < 業務組織型 < 法人型
と継承関係を追っていかなければ、データ構造がわからない。

実際、昨日、法人型にIDプロパティがあるかわからなかった。
※IDプロパティは事物型にあるので、4階層さかのぼらないと理解できない。

#IMI 共通語彙基盤の可視化

そこで、ツールを使って語彙情報基盤の可視化を行ってみた。

これだと複雑な継承関係にある語彙がどういう構造か、どういう継承関係か一目でわかる。
![18556611_1541402135904209_604672997579763205_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/19439/3288e6f9-a2d6-f4fd-c1e9-d90f9b5a0e1d.jpeg)

また特定のクラスが何に継承されているのかも一目でわかる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/19439/7c3481b6-4c74-84d3-fee4-9b478f11f273.png)

IMIコア語彙バージョン2.4.1 クラスレポート
 - liquid studio 版
https://yuutakasan.github.io/imi-class-report/Core241/liquidstudio/index.html
 - xs3p 版
https://yuutakasan.github.io/imi-class-report/Core241/xs3p/Core241.xsd.html#type_%E6%A6%82%E5%BF%B5%E5%9E%8B


便利！

IMI使って、みんなでメンテナブルなクラス・データベース設計をしよう！
我が社の技術動向：.Net Coreが流行ってます

# 背景
元々我が社では、MicrosoftのVisualStudio中毒患者が多数在籍している関係もあり、

| サービス | ランタイム(言語) | OS(サーバ) |
|:-----------:|:------------:|:------------:|
| Webサービス|.NetFramework(C#) | WinServer|
| HTTP系のマイクロサービス| OpenJDK(JAVA) | LinuxServer |

という構成です。
VisualStudioとC#の組合せはかなり強力で**「開発効率LAMPの3倍」**が弊社では都市伝説的に語り継がれていますw

しかーし！　とある案件で、我が社のWebサービスをLinux Only環境でどーしても動かしたいという要望から・・・。
年明けに一念発起！　Webサービスを**「.Net Core」**への移植を決意し見事に完成♪

# .NetCore移植時の困り事

| 困り事 | 理由 |
|:-------:|:---------:|
| 書籍 | .NetFrameworkですら少ないので余計に少ない |
| Google先生 | 同上 |
| 日本語情報 | 同上 |

Microsoftさんがやる事でも無いんでしょうけど？　もっとコミュニティ含めて活発化するといいなぁと。

# 今後
Nginxとの相性もいいし（Webパック）、自分でWebサーバ内蔵できるし、今後はIISに頼らないカタチでのC#によるWebサービス開発を加速させるつもりです♪
Docker | DOCKER CLOUD のレポジトリにイメージを作成する

ここでは例として、既存レポジトリのイメージをそのまま、自分のレポジトリに push してみる。

# Docker clould に登録する

https://cloud.docker.com/ より。

# Docker clould にログインする

```
$ docker login
```

# レポジトリを作成する

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/2cb8ced7-e898-fdee-29a4-e1af084e66f0.png)


# 適当なイメージを pull してくる

```
$ docker pull alpine
```

# イメージに対してタグを付ける

```
$ docker tag [イメージ] [ユーザー名]/[レポジトリ名]:[タグ]
```

#### 例:

```
$ docker tag alpine yumainaura/alpine-copy:latest
```

( `:latest` は省略も出来る )

# イメージの確認

```bash
$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
alpine                   latest              02674b9cb179        6 days ago          3.99 MB
yumainaura/alpine-copy   latest              02674b9cb179        6 days ago          3.99 MB
```


# タグに対して push する

```
$ docker push [ユーザー名]/[レポジトリ名]:[タグ]
```

#### 例:

```
$ docker push yumainaura/alpine-copy:latest
```


# docker cloud で確認

反映されている。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/5f1a6786-6da8-2575-6c65-e27ff2f9a51a.png)

# pull の動作確認

## 手元のイメージを消してみる

```
$ docker rmi yumainaura/alpine-copy
```

## リモートからコンテナを走らせる

```
$ docker run yumainaura/alpine-copy echo 'hello world'
```

イメージを pull して実行してくれるのが分かる。

```
Unable to find image 'yumainaura/alpine-copy:latest' locally
latest: Pulling from yumainaura/alpine-copy
Digest: sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96
Status: Downloaded newer image for yumainaura/alpine-copy:latest
hello world
```

# 参考

- [Get Started, Part 2: Containers - Docker Documentation](https://docs.docker.com/get-started/part2/)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
手際よく作業するために知っておきたいvimコマンド50選

##vimとは
>Vimという名称は、オリジナルのviエディタに近づくことを目標として、開発当初Vi IMitation（viの模倣）の略とされていた。しかし、やがてviを超えることを目指してVi IMproved（viの改良）とされるようになり、今日ではオリジナルのviを大きく上回る機能を持つに至っている。
[参考wiki]https://ja.wikipedia.org/wiki/Vim

##vimには4種類のモードがある
- ノーマルモード
"ESC"でノーマルモードになる

- 編集モード
"i"で編集モードになる。(--insert)

- コマンドモード
ノーマルモードからコロン:を打つとなる。→戻る時は"ESC"

- ビジュアルモード
"v"でビジュアルモード（選択モード）になる

上記の4つは当たり前のように知って、使えるようになっておきましょう。
以下からは、より具体的な操作方法を見ていきます。

####【ファイルの保存】
:w → 変更点の保存（ノーマルモード→:w）
:w → ファイル名 →名前をつけて保存
:q → 終了
:q! → 変更点を無視して強制終了！
:e ファイル名 → 他のファイルを開く

ファイルの保存も基本中の基本ですね！

###【移動系コマンド】
これをそつなく扱えるようになると非常に手際よく作業できます。
gg → 一番上にカーソル
shift + g(G)→一番下にいく
ctrl + b →一画面上にいく
ctrl + f →一画面下にいく
w → 次の単語の始まりにカーソルがいく
b → 一つ前の単語の始まりにカーソルがいく
^ → 行頭へカーソル移動
$ → 行末へカーソル移動
 f + "文字" → 文字までジャンプ, ;で次にいく
% → 対応する括弧にジャンプ

###【選択系（ビジュアルモード）について】
v → 文字単位のビジュアルモード
shift  + v(V) → 行単位のビジュアルモード
ctrl + v →句形単位

#####<応用>
【全選択】
gg V G → ggで一番上に行って,Vで行単位のビジュアルモードになって→一番下までいく


###【カット、コピー、削除】
x →カット
dd → 行単位のカット消したい時は
数字dd → 複数行のカット
p → 貼り付け
yy → コピー

###【検索】
n → 下方向に検索
N → 上方向に検索
*→今カーソルがある位置の単語を下方向に検索
\#→今カーソルがある位置の単語を上方向に検索


###【置換】
:s/変更するもの/変更語のもの →でカーソルにあっている行を置換する
:s/変更するもの/変更語のもの/g →でカーソルにあっている行のもの全て置換する
:%s/変更するもの/変更後のもの/g →で全体の中で置換
:%s/変更するもの/変更後のもの/gc→のようにcを最後につけると置換する前に確認が入る

###【操作の取り消し】
これもよく使います。操作しながら覚えていきましょう。
u → 前の操作を取り消す
ctrl + r → 取り消しを取り消す

###【windowの分割】
いくつもターミナルやvimを開くことはよくあるので使えるとgood!
:sp（スプリット）→縦に分割する。上でhtml,、下でcssを編集したいなどするときに使う。
画面分割したら「ctrl + w」+ w →で画面を下に行く。

:vs→横に分割する。

###【タブの切り替え】
:tabnew →新規タブを開くことができる
:tabe （開くファイル）→で新しいタブで開くファイルも指定できる
gt→でタブを変えることができる
:tabcloseでtabを閉める
vim -p (ファイル名) (ファイル名)でファイル名の数だけタブを開いて
. （ピリオド）:直前の操作を繰り返す

###【インデントの調整】
= → インデントを揃える
「gg」→「 shift+v」→「 shift+g」→ 「=」で全ての文に対してインデントを揃える

###【補完機能】
ctrl + n → で、「session」と入力したいときに「se 」+ 「ctrl+n」でsessionと出てくる

###【短形選択】
ノーマルモード + 「ctrl + v」 +「shift + i」+ 「入力したい文字」で選択した文字列に一気に文字を挿入することができる。

###【テキストオブジェクト】
citとうつと単語が消えて挿入モードに入る

c /d /y → chnage (delete & insert)

i/a → 中身か全体か

t/"/)/] → tag

cit→タグの中身を消して挿入モード
cat→タグで囲われたとこ全部を決して挿入モード
di"→"で囲われた中身を消す

###【便利な設定を使う】
.vimrcに書いておくと良いですね。
:set number →行番号を表示
:set nonumber →行番号を非表示
:syntax on →コードに色をつける
:syntax off →コードの色をつけない
:set tabstop=数字 →タブの文字数を設定する
:set ignorecase →検索のときに使われるもので大文字小文字の場合分けをしなくて良いときに使う。
:set noignorcase →小文字だけと設定できる
windowsでTensorFlow その18

#概要
windowsでTensorFlowやってみた。
inception/5hでpyqtアプリ作って見た。

#写真
![hh.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/5fa9fb50-71d5-df02-2335-33e93793e047.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5

#ダウンロード
githubから、inception5h.zipを落とす。
imagenet_comp_graph_label_strings.txt
tensorflow_inception_graph.pb
を、取り出す。

#プログラムの手順
イベントは、ファイル選択。
cv2.imreadで画像を読み込む。
cv2.resizeでリサイズ、そしてreshapeする。
画像を表示する。
tensorflow_inception_graph.pbを読み込む。
inputに画像をくわせて、outputを得る。
resultが0.2以上なら、imagenet_comp_graph_label_strings.txtから
ラベルを取る。
ラベルを表示する。
以上
Qiita（とかブログとか）にPlantUMLで書いたUML図を貼れるようにChrome拡張機能を作った

はじめに
--------------------

先日こんな記事を書きました。

- [QiitaにUMLを載せられるようにPlantUMLつかってWebサービス作ろうと思ったら本家にあった話 - Qiita](http://qiita.com/ryskiwt/items/c6c0760b341b5a5fe560)

確かにコピーしてきて貼り付けてすれば表示されるんですが、なんどもやると面倒です。
勉強も兼ねてChrome拡張機能にまとめて公開したので、どうぞ使ってやってください。

- [UML anywhere - Chrome ウェブストア](https://chrome.google.com/webstore/detail/mcefidbiooofpmcanlmgcjiickpdehah)

READMEとかなんもないですが、コードはGitHubに公開しました。

- [ryskiwt/uml-anywhere](https://github.com/ryskiwt/uml-anywhere)

使い方
--------------------
- インストールするとChromeにボタンが表示されるようになります。（↓こんな感じ）
![名称未設定3.png](https://qiita-image-store.s3.amazonaws.com/0/111801/d98a7529-ca8d-264f-769a-e4773de9fc93.png)

- [PlantUML Web Server](http://www.plantuml.com/plantuml/uml) 以外のURLでボタンを押すと、[PlantUML Web Server](http://www.plantuml.com/plantuml/uml) を新しいタブで開きます。
- 開いた[PlantUML Web Server](http://www.plantuml.com/plantuml/uml) でUMLを記述して `submit` をクリックすると、URLが更新されます。
- この状態で再度ボタンを押すと、URLが下記のフォーマットでクリップボードにコピーされます。
    - `[![](http://www.plantuml.com/plantuml/svg/{SyfFKj2rKt3CoKnELR1Io4ZDoSa70000})](http://www.plantuml.com/plantuml/uml/{SyfFKj2rKt3CoKnELR1Io4ZDoSa70000})`
- あとはmarkdownがかけるところにペーストすればUMLが画像として貼り付きます。（↓こんな感じ）
[![](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuNhSkETnupO5NJk5nurDZvkw7ZVELB02idSyRkfztBo7oo4rBmMe3W00)](http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuNhSkETnupO5NJk5nurDZvkw7ZVELB02idSyRkfztBo7oo4rBmMe3W00)
- 画像には [PlantUML Web Server](http://www.plantuml.com/plantuml/uml) へのリンクが貼られているので（ここ重要！）、UMLを変更したい場合は、画像をクリックして[PlantUML Web Server](http://www.plantuml.com/plantuml/uml) へ飛んで修正後、再度ボタンをクリックしてURLをコピー、もとのURLと置き換えれば更新完了です。

おわりに
--------------------
気が向いたらコードとか解説します。
今日は一旦ここまで。

2017/09/29　追記
--------------------

おかげさまでじわりじわりとユーザーさんが増え、もうすぐ100人です。ありがとうございます。

<img width="984" alt="スクリーンショット 2017-09-29 15.16.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/e2afe3b1-ea9d-11f2-233b-7be924c68530.png">


2017/11/11 追記
--------------------
ユーザー100人越えましたー :tada:

- またまた @takasek さんに permission 設定がまずくなっている件GitHubでプルリク頂きまして、マージさせていただきました。
- あと、GitHubちゃんとREADME書いてMakefileも置いときました
- アイコンが未だにフリー素材でアレなので、どなたかアイコンとか作ってくださると喜びます...
コンポーネントとタイポグラフィの分離

コンポーネントに適用するスタイルを以下のように分けてみる。

* 配置 (position, float, margin 等)
* 構造 (width, height, padding 等)
* 見た目 (border, background, box-shadow 等)
* 文字 (font, color 等)
* その他 (display, content 等)

「配置・構造・見た目」はコンテナへの指定だけど、「文字」はコンテンツへの指定。ここを分離することで良いことが起きないだろうか。

> タイポグラフィ（英: typography）は、活字（あるいは一定の文字の形状を複製し反復使用して印刷するための媒体）を用い、それを適切に配列することで、印刷物における文字の体裁を整える技芸である。
(https://ja.wikipedia.org/wiki/タイポグラフィ)

コンポーネントが再利用性を想定するように、テキストスタイルもパターン化して用いたい。文書構造だけでなく、前後の関係や言いたい内容、見た目や配置先のスペースなどから派生することもある。
これをコンポーネントに点在させると管理しきれないし (そのために値を変数化する)、細かい指定の差はデザイナーじゃないと気づけない。

→ タイポグラフィのうち (全部は無理なので) ヒエラルキーを形づくるためのスタイルを別で管理して、カスタムデータ属性で指定してみたい。

※カスタムデータ属性を用いるのは、コンポーネント側のclassと衝突しないこと、テキスト要素の意味性 (見出しと段落だけでなく) を補強できること、単純に記述の見通しがよくなること、どうせ分離するならしっかり分けたい、などから。

## コンポーネントから分離する主なプロパティ

* font-family
* font-weight
* font-style
* font-size
* letter-spacing
* line-height

※color, text-alignなどはコンテナ側に残した方がいいかもしれない。この辺の精査は必要。

## 命名規則
[data-type="namespace-typename--modifier"]

※ECSSを参考にして名前空間を持たせた。

## 例

### HTML

    <div class="heroimg">
    	<div class="heroimg__content">
    		<h2 data-type="heroimg-title">LOREM IPSUM</h2>
    		<p data-type="heroimg-lead">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    		<a href="#" class="heroimg-button" data-type="button-label">Button</a>
    	</div>
    </div>

### Component CSS

    .heroimg { 
    	position: relative; width: 100%; height: 50vw; margin: 0 auto; 
    	background: #eee url(lorem.jpg) no-repeat center center; background-size: cover; }
    .heroimg__content { 
    	position: absolute; top: 50%; transform: translateY(-50%); width: 35%; 
    	margin-left: 5%; padding: 2em; background-color: rgba(0,0,0,0.8); color: #fff; }
    .heroimg-button { 
        display: inline-block; margin-top: 1.5em; padding: 0.5em 1.25em;
        border: 1px solid #fff; color: #fff; }

### Typography CSS

    [data-type="heroimg-title"] { 
        font-family: "Bold"; font-size: 2rem; line-height: 1.25; }
    [data-type="heroimg-lead"] { 
        font-family: "Thin"; font-size: 1.125rem; line-height: 1.75; letter-spacing: 0.05em; }
    [data-type="button-label"] { 
        font-size: 1rem; line-height: 1.25; }
GitLab CIの設定ファイルを手元でLintする

# GitLab CIの設定ファイルを手元でLintする
プライベートレポジトリ、CIツールが無料で使い放題ということで、最近GitHubからGitLabへお引越ししました。
https://gitlab.com/sei40kr
Travis CIからGitLab CIに引っ越すにあたって `travis lint` でできていた設定ファイルのLintがGitLabだとCLI上から行えなかったので、シェルスクリプトを書きました。
## 結論
`python`, `jq` がインストールされている必要があります。

```bash
#!/bin/sh

linter_api_url='https://gitlab.com/api/v4/ci/lint'

linter_dump_conf() {
  python -c "import json,sys;print(json.dumps({'content':sys.stdin.read()}))" < .gitlab-ci.yml
}

curl -sH 'Content-Type: application/json' "$linter_api_url" -d "$(linter_dump_conf)" | jq
```

これを `gitlab-ci-lint.sh` のような名前で、 `.gitlab-ci.yml` と同じディレクトリに設置します。
後は実行権限を与えて動かすだけ。

```bash
chmod +x gitlab-ci-lint.sh
./gitlab-ci-lint.sh
```
## 実行結果
![Screenshot](https://qiita-image-store.s3.amazonaws.com/0/102243/b653dead-3373-2df3-ddf4-9d0176ab0923.png)

## オマケ: Travis CIと比較したGitLab CI
* 標準機能は少ないですが、Dockerコンテナの知見やシェルの知識があれば細かくジョブを記述できます。Travis CIが grunt.js 寄りで、GitLab CIが gulp.js のようなイメージです。
* 流石にジョブの開始までが早いです。いかに並列実行でジョブを高速化させるかは腕の見せ所です。
nginx導入とAmon2が動くまで

[前回構築したAmon2](http://qiita.com/fucky21/items/3d27e45bcf0562d85e80)をnginxで動かしたいと思います。

## 環境
+ ubuntu 14.04

## 実行手順
最新のnginxをインストール
参考 : http://qiita.com/hiroq/items/420424bc500d89fd1cc8

```Bash
# (1) nginxサイトが配布するPGPキーを追加
curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

# (2) リポジトリを一覧に追加
sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"

# (3) アップデート後、nginxをインストール
sudo apt-get update
sudo apt-get install nginx
```

/etc/nginx.confに下記を追加

```BASH
$ sudo /etc/init.d/nginx stop
$ sudo vi /etc/nginx.conf

 41         location / {
 42         proxy_pass http://127.0.0.1:5000/;
 43             proxy_read_timeout 60;
 44         }
```

追加後、nginxの再起動

```BASH
$ sudo /etc/init.d/nginx start
```

ブラウザにアクセスして確認。
PHP Manual 読書会(2回目)(型)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回: [PHP Manual 読書会(1回目)(PHPタグ-コメント)](http://qiita.com/amesho/items/60af5cb866fa2e2329d3)

## [導入](http://php.net/manual/ja/language.types.intro.php)

### 4 種類のスカラー型

```php
<?php

# 1. 論理値 (boolean)
$bool = TRUE;
$bool = FALSE;

# 2. 整数 (integer)
$int = 1;

# 3. 浮動小数点数
$float = 12.33333;

# 4. 文字列 (string)
$str = "hello";
```

### 4 種類の複合型

```php
# 1. 配列 (array)
$ary = array(1,2)

# 2. オブジェクト (object)
class hoge
{
  function run()
  {
    echo "hoge\n";
  }
}

$obj = new hoge;

# 3. callable
function callback()
{
  echo "callback\n";
}

$cb = "callback";
$cb();

# 4. iterable
# http://php.net/manual/ja/language.types.iterable.php
# http://php.net/manual/ja/language.generators.syntax.php
# 関連箇所が多いのでそのときまで置きます
```

### 2 種類の特別な型

```php
# 1. リソース (resource)
## http://php.net/manual/ja/resource.php

$fp = fopen("aaaaa", "w");
echo get_resource_type($fp) . "\n";


# 2. NULL
## is_null() および unset()も参照したほうがいい
## 
$var = NULL;
```
const {}とvarの違いとは・・・



### 開発環境

+ node.js
+ Electron1.6.7



最近、node.jsを勉強しているのですが、こういった技術はすぐ仕様が変わるものでして、現在参考にしている参考書と既に仕様が違うところがちょいちょい出てきます。その中でも特にまいったのはElectronのIPCに関する箇所です。


どちらもWebView側に記述
参考書に載っていたのはこういった書き方。

```js:1
var ipc = require('ipc')
console.log(ipc('sync', 'ping'));

```

現在(1.6.7)はこれでないと動きません。

```js:2
const {ipcRenderer} = require('electron')
console.log(ipcRenderer('sync', 'ping'));

```

1は変数にセットしていますが、2は分割代入でelectronのオブジェクトの一つを呼び出しています。それを知らないとピンと来ない事になります。
（swiftではタプル、rubyでは多重代入という名前で実装されてたのに気づかなかった・・・）


[javascriptで波括弧を使ってconst値に分割代入](http://ushumpei.hatenablog.com/entry/2016/06/29/032906)
[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
[JavaScript の分割代入まとめ](http://d.hatena.ne.jp/mooz/20100729/p1)

ちなみにipcRendererとは何者なのかというとEventEmitterというnodeでのaddEventListenerを表現するものらしいです。

[ipcRenderer](https://electron.atom.io/docs/api/ipc-renderer/)

[Node書くならEventEmitterについて知っとくべし](http://qiita.com/yuku_t/items/d69d3a2c7dafa7d04e87)
以前と少し変わったApache2.4系のSSL証明書の設定

# 0. 環境
Apache 2.4.8以降

# 1. サーバ証明書発行まで

## サーバにて秘密鍵とCSRの作成
`openssl req -new -newkey rsa:2048 -nodes -keyout SITENAME.com.key -out SITENAME.com.csr`

-> その後、SSL証明書購入サイトで申請へ。
※SITENAME.comなどはドメインなどお好きなように変えてください。

# 2. サーバ証明書更新作業

## 届いた証明書

- AddTrustExternalCARoot.crt (ルート証明書)
- COMODORSAAddTrustCA.crt (中間証明書1)
- COMMODRSADomainValidationSecureServerCA.crt (中間証明書2)
- STAR_SITENAME_com.crt (サーバ証明書)

※今回のケースはcomod sslです。

## 本番用に証明書をまとめる

apache 2.4系ではSSLCertificateFile ディレクティブにサーバ証明書、中間証明書、ルート証明書をまとめて指定する必要があります。

### SITENAME.com.crt-ca-root.crt 
  `cat SITENAME.com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> SITENAME.com.crt-ca-root.crt`

◆内訳
- サーバ証明書: STAR_SITENAME_com.crt 
- 中間証明書1: COMMODRSADomainValidationSecureServerCA.crt
- 中間証明書2: COMODORSAAddTrustCA.crt 
- ルート証明書: AddTrustExternalCARoot.crt

※内訳の順のように、サーバ証明書、中間証明書、ルート証明書の順になるのが正しいです。

# その他本番への反映
※以下のような設定ですと、シンボリックリンクを張り直すだけで、ssl.confの修正は不要となります。

```conf:/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/current/SITENAME.com.crt-ca-root.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/current/SITENAME.com.key
```

◆秘密鍵、証明書ファイルの設置後、シンボリックリンクの貼り直し
`cd /etc/httpd/etc/httpd/conf.d/ssl/`
`unlink current`
`ln -s 2017.5.16/ current`

◆apacheの再起動前にシンタックスの確認
`httpd -t`

◆再起動
`service httpd restart`
`service httpd status`

# 参考
・apache 2.4におけるSSL証明書の設定http://qiita.com/bageljp@github/items/6b9876b7571852284ead
TwoWayGridViewではフォーカス時のselectorが効かないみたい

# TwoWayGridViewではフォーカス時のselectorが効かないみたい


古い技術のTipsです。
Androidで水平のGridViewを実現したい場合は「HorizontalGridView」を使えばいいけど、OSが古い場合はサードパティの「TwoWayGridView」を使うと思います。
ただこれを使うと、なぜか selector の一部が効かない。

具体的には

```xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item 
        android:state_focused="true"
        android:state_pressed="false">
        <shape>
            <solid android:color="@color/blue" />
        </shape>
    </item>
</selector>
```

というselectorを定義。この意味は `フォーカスが当たった時は背景を青色にする` であり、TwoWayGridViewのlistSelectorで定義したxmlをセットすればうまくいくはずが、なぜか青色にならずデフォルトの色のまま。
試しに単なる GridView に変更するとちゃんと適用される。
TwoWayGridViewは4年前くらいから開発も止まってるし改善は見込めない。

### ライブラリを直接変更
仕方がないので、TwoWayGridViewのクラスに直接変更を加えました。
関数` makeColumn(int startPos, int x, boolean flow)`でViewを作っているようなので、ここで生成しているviewに対して

```java
selectedView.setBackgroundColor(Color.argb(255,166,219,255)); // 任意の色に
```
のように、直接背景色をセットしました。もちろん、フォーカスが外れた場合は元に元します。

まあ、早くOSバージョンアップしろって話ですが。


TwoWayGridView
https://github.com/jess-anders/two-way-gridview
デザインパターン学習メモ：「Flyweight」

## このパターンの目的

GoF本より引用する。

> 多数の細かいオブジェクトを効率よくサポートするために共有を利用する。(P.207)

GoF本の例でいうと、文書エディタを作る際、ひとつひとつの文字までもオブジェクトとして実装すると、アプリケーションの柔軟性がもっとも細かいレベルに達する。

しかし、その反面オブジェクトの数が膨大になり、システムリソースが枯渇するおそれがある。

そこで、共有オブジェクトを使用する。

## 実装例

割愛する。

いつも参考にしている、『アジャイルソフトウェア開発の奥義』と『オブジェクト指向のこころ』に登場しないため。

オブジェクトの共有は問題を引き起こしやすいので、使用する機会もあまり無いと思う。

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一、吉田　和樹 監訳、SBクリエイティブ
Eclipse debug 起動時エラー 

# 事象

Eclipse で debugモードを起動しようとすると下記のようなエラーメッセージが発生し起動できませんでした。

※ 環境　macOS

```
ERROR: transport error 202: gethostbyname: unknown host
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:750]
```

ちなみに通常起動はできると言った状態です。

解決方法としては、`/etc/hosts`ファイルのlocalhost部分を`127.0.0.1 `以外コメントアウトするという方法。

**/etc/hosts**

```
127.0.0.1       localhost
255.255.255.255 broadcasthost
#::1     localhost
```

すこしはまったのでメモ。
GitHubのリポジトリ名変更方法

作ってからリポジトリ名が気に入らない時ってありますよね。
それを後から変更したときのメモ

## GitHub側の操作

```
GitHubの対象リポジトリ > Setting > Renameで変更
```

だけです。

## ローカル側の操作
対象ディレクトリ内の .git > configを開き

```
[remote "origin"]
	url = https://github.com/hisurga/hello-github.git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

を

```
[remote "origin"]
	url = https://github.com/hisurga/hello-gitHub2.git
	fetch = +refs/heads/*:refs/remotes/origin/*
```

に変更

以上です。簡単ですね。

反映されているか確認したい方は、何かしらの方法でリポジトリに問い合わせて
問題が起きなければオッケーです。
java8 メソッド参照

# 前書き

forEachの使用方法でラムダ式を用いた方法しか知らなかったのですが、メソッド参照「::」を用いた方法もあったのでメモ。

# メソッド参照

`クラス名（インスタンス）::メソッド名`

のように記述することで、メソッドの参照が可能

# forEach例

## メソッド参照

```java
list.forEach(System.out :: println);
```

## ラムダ式

```java
list.forEach(x -> System.out.println(x));
```

##  使用例

```java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {

        Main main = new Main();
        System.out.println("----No1----");
        main.test().forEach(main :: myPrint);
        System.out.println("----No2----");
        main.test().forEach(x -> main.myPrint(x));
        
    }
    
    public List<String> test(){
        List<String> list = new ArrayList<>();
        list.add("AA");
        list.add("BB");
        list.add("CC");
        list.add("DD");
        return list;
    }
    
    public void myPrint(String str){
        System.out.println(str);
    }
}


```

インスタンスの持つメソッドを呼び出す例ですが、実行結果はどちらも同じです。

## 実行結果

```
----No1----
AA
BB
CC
DD
----No2----
AA
BB
CC
DD
```
S2Container 自動バインディング

# 前書き

S2Containerを用いたソースコードを読んでいる時に、不明点があったのでメモ。

# 内容

## 登場人物

```
#インターフェース
aa.bb.cc.app.logic.SampleLogic;

#インターフェース実装クラス
aa.bb.cc.app.logic.impl.SampleLogicImpl

#処理クラス
aa.bb.cc.app.logic.impl.MainLogicImpl

#コンポーネント定義ファイル
sample.dicon
```

※名前は適当に変えています。
　
## 本題

**MainLogicImpl.java**

```java

@Binding
    private SampleLogic sampleLogic = null;

    (省略)

    sampleLogic.do();
```

このように処理クラスで、フィールドにインターフェースを定義したあとそのままメソッドを呼び出していたので、DIされているとは思いつつSeaserに詳しくなかったのでとりあえず調べました。

定義は、```sample.dicon```で行われていて、中身はこのようになってました。

**sample.dicon**

```java
	<component
		class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
		<property name="autoNaming">
			<component
				class="org.seasar.framework.container.autoregister.DefaultAutoNaming" />
		</property>
		<property name="instanceDef">
			@org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
		</property>
		<initMethod name="addClassPattern">
			<arg>"aa.bb.cc.app.logic.impl"</arg>
			<arg>".*Logic.*"</arg>
		</initMethod>
	</component>
```

ここでは、コンポーネントの自動登録の設定を記述しており、`"aa.bb.cc.app.logic.impl"`にある`".*Logic.*"`の正規表現を満たすファイルが登録されます。

ということなので登場人物である`aa.bb.cc.app.logic.impl.SampleLogicImpl`はコンポーネント登録の対象になります。

ここで今回重要になる仕様なのですが、

* 登録名は、登録されたコンポーネントのファイル名から、Implを除去した名前になります。

* プロパティの型がインターフェースの場合、 コンテナをその型で検索し、見つかったコンポーネントが設定されます。

ここで先ほどの処理クラスをみてみると

**MainLogicImpl.java**

```java

@Binding
    private SampleLogic sampleLogic = null;

    (省略)

    sampleLogic.do();
```

プロパティの型である```SampleLogic```がインターフェースなので、コンテナから```SampleLogicImpl```からImplが除去された```SampleLogic```で登録されている```aa.bb.cc.app.logic.impl.SampleLogicImpl```が設定されるということですね。


認識が間違っていたら申し訳ないですが、いったんこれで納得しました。


## 参考にさせていただいたサイト

* http://s2container.seasar.org/2.4/ja/DIContainer.html

* http://snowhiro.web.fc2.com/seasar2/seasar2_02_autoBinding.html
pyenv virtualenv 環境構築

# 前書き

pythonのバージョンを古い状態にして環境を構築する必要があった為、pyenvを利用。

その際の構築手順をメモ。

# pyenvのinstall

pyenv-installer を使用すれば一回でプラグインもまとめてインストールすることができるそうでこれにしてみました。
※デフォルトでホームディレクトリ配下にインストールされる。

```
curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
```

macの場合は下記コマンドでも良さそう。

```
brew install pyenv-virtualenv
```

# 環境変数の設定

```
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
if [[ -d $PYENV_ROOT ]];then
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi
```

ホームディレクトリ配下の.bashrc (or .bash_profile)に、インストール時のメッセージで出力された必要な設定を追記。

# python install

必要なversionを指定してインストール

```
pyenv install 2.7.8
```

すると下記にディレクトリが作成される。

```
~/.pyenv/versions/2.7.8/
```
　
# 開発用仮想環境を構築

```
pyenv virtualenv 2.7.8 [ENV名]

pyenv activate [ENV名]

#activate後、ターミナルが下記のような表示となる。

([ENV名]) [user@host ~]$ 

```

ここまでで仮想環境ができたので、後は`pip`コマンド等を用いて必要なモジュールをインストールして完了。


ディレクトリごとに、環境を構築できて切り替えも簡単なので大変使いやすい印象を受けました。
macOS OpenResty インストール方法

## OpenRestyのダウンロード

下記のリンクからダウンロード

https://openresty.org/en/download.html:title

## 解凍したディレクトリに移動

```
$ cd openresty-VERSION/
```

## 必要なpackageのインストール

```
$ brew update
$ brew install pcre openssl
```

## ./configureの実行

```
$ ./configure \
   --with-cc-opt="-I/usr/local/opt/openssl/include/ -I/usr/local/opt/pcre/include/" \
   --with-ld-opt="-L/usr/local/opt/openssl/lib/ -L/usr/local/opt/pcre/lib/" \
   -j8
```

##  最後にインストール

```
$ make
$ sudo make install
```

## 確認

下記のディレクトリが作成される。

```
/usr/local/openresty
```

## 起動

```
$ sudo /usr/local/openresty/nginx/sbin/nginx

or

$ sudo /usr/local/openresty/bin/openresty  （/usr/local/openresty/nginx/sbin/nginx へのシンボリックリンク）
```

※必要であれば起動シェル（~/.bashrc or ~/.bash_profile）に下記を追加
 
```export PATH=/usr/local/openresty/bin:$PATH```

　
これで```localhost```にアクセスすると、デフォルトのページが表示されます。

　
ざっくりメモ..。