Windows Phoneアプリ制作からマーケットプレイス公開までを完全ガイド! 9

facebookへの投稿設定ページの実装

facebookへの投稿設定ページの実装

俳句の入力処理を実装する前に、facebookへの投稿設定機能を実装します。

ソリューションエクスプローラーのプロジェクト名を右クリックして表示される「追加/新しい項目」でPortrait Pageを追加します。名前は、Preferences.xamlとします。

投稿設定ページのデザイン(Preferences.xaml)

まず、MainPage.xaml同様、LayoutRootのGridのBackgroundに”#FFFFFFFA”を指定し、StackPanel部分をコメントアウトしておきます。

ツールボックスからImageコントロールを1個、TextBlockコントロールを4個、TextBoxコントロールを2個、Buttonコントロールを2個、ドラッグしてレイアウトします。

これらのコントロールに名前を付けて(図3)、Image のSourceには、アプリの小さいロゴを指定します。この小さいロゴは、他のページについても同じ場所にレイアウトします。

 図3:投稿設定ページにコントロールをレイアウトする(クリックで拡大)

図3のようにレイアウトした各コントロールのプロパティを調整し、完成したデザイン・コードは、リスト4になります。

リスト4 投稿設定ページのデザイン・コード(Preferences.xaml)

<phone:PhoneApplicationPage 
  x:Class="DailyHaiku_in_Japanese.Preferences"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
  xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  FontFamily="{StaticResource PhoneFontFamilyNormal}"
  FontSize="{StaticResource PhoneFontSizeNormal}"
  Foreground="{StaticResource PhoneForegroundBrush}"
  SupportedOrientations="Portrait" Orientation="Portrait"
  mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
  shell:SystemTray.IsVisible="True" Language="ja-JP">

  <!--LayoutRoot is the root grid where all page content is placed-->
  <Grid x:Name="LayoutRoot" Background="#FFFFFFFA">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
 
    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="15,0,15,0">
      <Image Height="60" HorizontalAlignment="Left" Margin="0,15,0,0" Name="HaikuLogo60px" Stretch="Fill" VerticalAlignment="Top" Width="60" Source="/DailyHaiku_in_Japanese;component/Image/HaikuLogo60px.png" />
      <TextBlock Height="50" HorizontalAlignment="Left" Margin="83,22,0,0" Name="Settings" Text="facebookへの投稿設定" VerticalAlignment="Top" Width="344" Foreground="#FF00004B" FontSize="32" TextAlignment="Center" />
 
      <TextBlock FontSize="22" Margin="0,100,0,592" Foreground="#FF333333" TextWrapping="Wrap">facebookへの投稿機能をお使いになるには、この設定が必要です。</TextBlock>
    
      <TextBlock FontSize="22" Margin="0,180,0,551" Foreground="#FF333333">facebook投稿時のタイトル</TextBlock>
      <TextBox HorizontalAlignment="Left" Margin="-9,210,0,311" Name="LinkTitleText" Text="一日一句" Width="468" BorderBrush="#FF00004B" Foreground="#FF333333" BorderThickness="1" Height="75" VerticalAlignment="Top" Padding="5" FontSize="24" />
      <TextBlock FontSize="22" Margin="0,300,0,0" Foreground="#FF333333" Height="66" VerticalAlignment="Top">タイトルからのリンク先のアドレス<LineBreak/>(句会のWebサイトやブログなどのURI)</TextBlock>
      <TextBox HorizontalAlignment="Left" Margin="-9,360,0,218" Name="LinkURIText" Text="http://www." Width="468" BorderBrush="#FF00004B" Foreground="#FF333333" BorderThickness="1" Height="75" VerticalAlignment="Top" Padding="5" FontSize="24" />
      <Button Content="投稿を設定" Style="{StaticResource SetPreferencesButtonStyle}"  Height="100" HorizontalAlignment="Left" Margin="100,450,0,0" Name="SetPreferencesButton" VerticalAlignment="Top" Width="100" Background="#FF00004B" IsEnabled="True" />
      <Button Content="投稿しない" Style="{StaticResource DelPreferencesButtonStyle}"  Height="100" HorizontalAlignment="Left" Margin="250,450,0,0" Name="DelPreferencesButton" VerticalAlignment="Top" Width="100" Background="Gainsboro" IsEnabled="True" Foreground="#FF00004B" BorderBrush="#FF00004B" BorderThickness="1" />
 
      <TextBlock FontSize="22" Margin="0,600,0,128" Foreground="#FF333333">※この設定は、いつでも変更できます。</TextBlock>
    </Grid>
  </Grid>
</phone:PhoneApplicationPage>

このページでレイアウトしたButtonコントロールのスタイル設定については、リスト5 のコードをApp.xaml内の要素の子として追加します。

リスト5  App.xaml内に追加する、「設定保存」「投稿不要」ボタンのスタイル設定(App.xaml)

    <Style x:Key="SetPreferencesButtonStyle" TargetType="Button">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">
            <Grid>
              <Image x:Name="SetPreferencesButtonImage" Source="/DailyHaiku_in_Japanese;component/Image/SetPreferencesButton.png" Stretch="Fill"/>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
    
    <Style x:Key="DelPreferencesButtonStyle" TargetType="Button">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">
            <Grid>
              <Image x:Name="DelPreferencesButtonImage" Source="/DailyHaiku_in_Japanese;component/Image/DelPreferencesButton.png" Stretch="Fill"/>
            </Grid>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

投稿設定ページのロジック(Preferences.xaml.vb)

この投稿設定ページでは、リスト6のようなXML形式の投稿設定ファイルを生成して、「DailyHaiku_Preferences」フォルダ内に「MyPreferences.xml」というファイル名で保存します。

設定が変更された時は、要素を追加し、「投稿不要」ボタンがタップされた時には、この設定ファイルを削除します。

このようなXMLデータの処理にLINQ to XML を使うため、「プロジェクト/参照の追加」からSystem.Xml.Linq を追加しておきます。 

リスト6  facebookへの投稿設定ファイル(MyPreferences.xml)の構造

<?xml version="1.0" encoding="utf-8"?>
<Preferences>
  <facebook>
    <Title>リンク先タイトル(句会の名称など)</Title>
    <LinkUri>リンク先URI(句会のWebサイトなど)</LinkUri>
  </facebook>
  ~<facebook>要素繰り返し~
</Preferences>

このページの処理は次のとおりです(リスト7)。

まず、ローカルストレージに設定ファイルを保存するためにSystem.IO.IsolatedStorage名前空間を、XMLデータを処理するためにSystem.Xml.Linq名前空間をインポートしておきます。

(1)設定ページがロードされた時の処理

この設定ページがロードされた時、設定ファイルの保存先となる「DailyHaiku_Preferences」フォルダがなければ生成しておきます。設定ファイルは、このフォルダ内に「MyPreferences.xml」というファイル名で保存させるようになります。
既に設定ファイルがある場合は、LINQ to XMLを用いて、前掲リスト6にある要素と<LinkUri>要素を取得して、TextBox内に表示しておきます。</p><h4>(2)「設定保存」ボタンがタップされた時の処理</h4><p>「設定保存」ボタンがタップされた時、入力ボックス内のデータをそれぞれ変数に代入しておきます。<br>リンク先URIのデータについては大まかな検証を行い、正しくない場合は入力ボックスの背景色を黄色にして注意を促します。入力されていない場合も、メッセージを表示します。<br>リンク先のタイトルが入力されている場合は、設定ファイルの生成処理を実行します。設定ファイルが存在しない場合は新規生成し、既にある場合は<facebook>要素を生成して追加します。<br>タイトルが入力されていない場合は、メッセージを表示します。</p><h4>(3)「投稿不要」ボタンがタップされた時の処理</h4><p>「投稿不要」ボタンがタップされた時、既存の設定ファイルがある場合は、これを削除します。削除できたら、リンク先のタイトルとURIをデフォルトの「一日一句」と「http://www.」に戻しておきます。</p><h4>リスト7 投稿設定ページのロジック・コード(Preferences.xaml.vb)</h4><pre class="brush: plain" type="syntaxhighlighter"><code class="hilightjs">Option Strict On Imports System.IO.IsolatedStorage Imports System.IO Imports System.Xml.Linq Partial Public Class Preferences Inherits PhoneApplicationPage Public Sub New() InitializeComponent() End Sub '●投稿の可否に関わらず使う変数 Dim Storage_Pre As IsolatedStorageFile Dim FilePath_Pre As String </code></pre><h4>(1)設定ページがロードされた時の処理</h4><pre class="brush: plain" type="syntaxhighlighter"><code class="hilightjs"> Private Sub Preferences_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Storage_Pre = IsolatedStorageFile.GetUserStoreForApplication '●「DailyHaiku_Preferences」フォルダがなければ生成する If Storage_Pre.DirectoryExists("DailyHaiku_Preferences") = False Then Storage_Pre.CreateDirectory("DailyHaiku_Preferences") End If '●設定ファイルは、「DailyHaiku_Preferences」フォルダ内の「MyPreferences.xml」とする FilePath_Pre = Path.Combine("DailyHaiku_Preferences", "MyPreferences.xml") '●設定ファイルがあれば、facebook要素のTitle要素とLinkUri要素を取得、TextBox内に表示 If Storage_Pre.FileExists(FilePath_Pre) = True Then Dim MyStream_Pre As IsolatedStorageFileStream = Storage_Pre.OpenFile(FilePath_Pre, FileMode.Open, FileAccess.Read) Dim Reader_Pre As StreamReader = New StreamReader(MyStream_Pre, System.Text.Encoding.UTF8) Dim ReadXmldoc_Pre As String = Reader_Pre.ReadToEnd Dim ItemDoc_Pre As XDocument = XDocument.Parse(ReadXmldoc_Pre) Reader_Pre.Close() MyStream_Pre.Close() Dim MyDataQuery_Pre As IEnumerable(Of XElement) = From c In ItemDoc_Pre.Descendants("facebook") Select c For Each MyResult_Pre In MyDataQuery_Pre LinkTitleText.Text = MyResult_Pre.<Title>.Value LinkURIText.Text = MyResult_Pre.<LinkUri>.Value Next End If End Sub </code></pre><h4>(2)「設定保存」ボタンがタップされた時の処理</h4><pre class="brush: plain" type="syntaxhighlighter"><code class="hilightjs"> Private Sub SetPreferencesButton_Tap(sender As System.Object, e As System.Windows.Input.GestureEventArgs) Handles SetPreferencesButton.Tap '●入力ボックス内データを、生成するXMLのテキストとする Dim LinkTitle As String = LinkTitleText.Text Dim LinkUri As String = LinkURIText.Text '●入力ボックス内データの検証。Uriの形式が正しくなければ、入力ボックスの背景色を黄色にして注意を促す If LinkUri <> String.Empty Then If System.Text.RegularExpressions.Regex.IsMatch(LinkUri, "(ht|f)tp(s?)\:\/\/([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", System.Text.RegularExpressions.RegexOptions.IgnoreCase) Then LinkURIText.Background = New SolidColorBrush(Colors.White) Else MessageBox.Show("正しいURIが指定されているかどうか確認してください。") LinkURIText.Background = New SolidColorBrush(Colors.Yellow) Exit Sub End If Else MessageBox.Show("投稿機能をご利用になるには、リンク先アドレスを入力する必要があります。") Exit Sub End If '●設定ファイルの生成。既存ファイルがない場合は新規生成し、既にある場合はfacebook要素を追加していく。 '●俳句の保存時には、最後のfacebook要素の内容を、最新設定として取得して、投稿する。 If LinkTitle <> String.Empty Then Try If Storage_Pre.FileExists(FilePath_Pre) = False Then Dim Xmldoc_Pre As XDocument = <?xml version="1.0" encoding="utf-8"?> <Preferences> <facebook> <Title><%= LinkTitle %></Title> <LinkUri><%= LinkUri %></LinkUri> </facebook> </Preferences> Using MyStream_Pre As IsolatedStorageFileStream = New IsolatedStorageFileStream(FilePath_Pre, FileMode.Create, FileAccess.Write, Storage_Pre) Xmldoc_Pre.Save(MyStream_Pre) MessageBox.Show("俳句保存時にfacebookに投稿できるようになりました。") End Using Else Dim AddStream_Pre As IsolatedStorageFileStream = Storage_Pre.OpenFile(FilePath_Pre, FileMode.Open, FileAccess.Read) Dim Reader_Pre As StreamReader = New StreamReader(AddStream_Pre) Dim ReadXmldoc_Pre As String = Reader_Pre.ReadToEnd Dim AddDoc_Pre As XElement = XElement.Parse(ReadXmldoc_Pre) Dim AddXml_Pre As XElement = <facebook> <Title><%= LinkTitle %></Title> <LinkUri><%= LinkUri %></LinkUri> </facebook> AddDoc_Pre.Add(AddXml_Pre) AddStream_Pre.Dispose() Using Stream_Pre As IsolatedStorageFileStream = New IsolatedStorageFileStream(FilePath_Pre, FileMode.Create, FileAccess.Write, Storage_Pre) If Storage_Pre.FileExists(FilePath_Pre) = True Then AddDoc_Pre.Save(Stream_Pre) Reader_Pre.Dispose() MessageBox.Show("facebookへの投稿方法を設定しました。") End If End Using End If Catch Exit Sub End Try Else '●必須のタイトルが空の場合は、メッセージを表示 MessageBox.Show("投稿機能をご利用になるには、タイトルとリンク先のアドレスの両方が必要です。") Exit Sub End If End Sub </code></pre><h4>(3)「投稿不要」ボタンがタップされた時の処理</h4><pre class="brush: plain" type="syntaxhighlighter"><code class="hilightjs"> Private Sub DelPreferencesButton_Tap(sender As System.Object, e As System.Windows.Input.GestureEventArgs) Handles DelPreferencesButton.Tap '●設定ファイルを削除。既存設定ファイルがある場合は、フォルダは残したままファイルを削除する If Storage_Pre.DirectoryExists("DailyHaiku_Preferences") = True And Storage_Pre.FileExists(FilePath_Pre) = True Then Dim MyStream_Pre As IsolatedStorageFileStream = Storage_Pre.OpenFile(FilePath_Pre, FileMode.Open, FileAccess.Read) Using Reader_Pre As StreamReader = New StreamReader(MyStream_Pre, System.Text.Encoding.UTF8) Dim DeleteDoc_Pre As String = Reader_Pre.ReadToEnd Dim DelXml_Pre As XElement = XElement.Parse(DeleteDoc_Pre) MyStream_Pre.Close() End Using Storage_Pre.DeleteFile(FilePath_Pre) LinkTitleText.Text = "一日一句" LinkURIText.Text = "http://www." MessageBox.Show("facebookへの投稿設定情報を削除しました。") Else MessageBox.Show("投稿情報は設定されていません。") End If End Sub End Class </code></pre></div><div class="field--name-field-restrict"><div><div class="paragraph paragraph--type--download paragraph--view-mode--default"><div class="field--name-field-download-entity"><div class="node node-download-links clearfix node--type-file-download node-10250 node--promoted node--view-mode-download-links"><div class="panels-container__content"><div class="member-content-title-download">「一日一句 投稿対応版 Ver.1.0」プロジェクトファイル</div><div class="bancho-thinkit-file-download-links"><div class="field--name-field-file">You don't have access to download this file.</div></div></div></div></div></div></div></div> <nav class="pager" role="navigation" aria-labelledby="pagination-heading"><h4 id="pagination-heading" class="visually-hidden">ページ送り</h4><div class="pager__item pager__item--action pager__item--previous"><a href="/story/2012/05/01/3525?page=0" title="前のページへ" rel="prev" class="pager__link pager__link--action-link"><span class="visually-hidden">前ページ</span></a></div><ul class="pager__items js-pager__items reset"><li class="pager__item pager__item--number"><a href="/story/2012/05/01/3525?page=0" title="Go to page 1" class="pager__link" data-page-chars="1"><span class="visually-hidden"> Page </span> 1 </a></li><li class="pager__item pager__item--active pager__item--number"><span title="カレントページ" aria-current="page" class="pager__link is-active" data-page-chars="1"><span class="visually-hidden"> Page </span> 2 </span></li><li class="pager__item pager__item--number"><a href="/story/2012/05/01/3525?page=2" title="Go to page 3" class="pager__link" data-page-chars="1"><span class="visually-hidden"> Page </span> 3 </a></li></ul><div class="pager__item pager__item--action pager__item--next"><a href="/story/2012/05/01/3525?page=2" title="次のページへ" rel="next" class="pager__link pager__link--action-link"><span class="visually-hidden">次ページ</span></a></div> </nav><div id="bancho-glossary-block-glist-1" class="keywords bancho-glossary-block-glist"><dl class="keywords__inner"><dt class="keywords__label"> この記事のキーワード <span class="hide-sp">:</span></dt><dd><ul class="keywords__list"><li class="keywords__list-item"><a href="/index%2ephp/g/facebook" class="first">#Facebook</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/windows%20phone">#Windows Phone</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA">#アプリ開発</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3">#スマートフォン</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97">#バージョンアップ</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/%E7%BF%BB%E8%A8%B3">#翻訳</a></li><li class="keywords__list-item"><a href="/index%2ephp/g/%E8%A8%AD%E8%A8%88%EF%BC%8F%E9%96%8B%E7%99%BA" class="last">#設計/開発</a></li></ul></dd></dl></div><div class="box__category"><ul class="--category --sp2col"><li><a href="/articles?article_category%5B4514%5D=4514" class="btn --line"><span>開発ツール <span class="category-num-articles"><span class="category-num-articles-num">863</span></span></span></a></li><li><a href="/articles?article_category%5B4518%5D=4518" class="btn --line"><span>モバイル <span class="category-num-articles"><span class="category-num-articles-num">250</span></span></span></a></li><li><a href="/articles?article_type%5B4529%5D=4529" class="btn --line"><span>技術解説 <span class="category-num-articles"><span class="category-num-articles-num">4,148</span></span></span></a></li></ul></div><div class="node"><div class="box--article --full --share02"><div class="article__item"> <span class="icon "></span><p class="icon__text">この記事をシェアしてください</p></div><div class="article__item"><ul class="list__share"><li> <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fthinkit.co.jp%2Fstory%2F2012%2F05%2F01%2F3525&t=%E7%BF%BB%E8%A8%B3%E3%81%A8%E3%80%81facebook%E3%81%B8%E3%81%AE%E6%8A%95%E7%A8%BF%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A3%85+%7C+Think+IT%EF%BC%88%E3%82%B7%E3%83%B3%E3%82%AF%E3%82%A4%E3%83%83%E3%83%88%EF%BC%89" title="" target="_blank" class="icon --iconMiddle --snsFB" ><span class="text--hidden">シェアする</span></a></li><li> <a href="https://twitter.com/intent/tweet?original_referer=&ref_src=&text=%E7%BF%BB%E8%A8%B3%E3%81%A8%E3%80%81facebook%E3%81%B8%E3%81%AE%E6%8A%95%E7%A8%BF%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A3%85+%7C+Think+IT%EF%BC%88%E3%82%B7%E3%83%B3%E3%82%AF%E3%82%A4%E3%83%83%E3%83%88%EF%BC%89&tw_p=tweetbutton&url=https%3A%2F%2Fthinkit.co.jp%2Fstory%2F2012%2F05%2F01%2F3525&lang=ja" title="この記事をX (Twitter) でポストする" target="_blank" class="icon --iconMiddle --snsX" ><span class="text--hidden">ポストする</span></a></li><li> <a href="http://b.hatena.ne.jp/add?mode=confirm&title=%E7%BF%BB%E8%A8%B3%E3%81%A8%E3%80%81facebook%E3%81%B8%E3%81%AE%E6%8A%95%E7%A8%BF%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A3%85+%7C+Think+IT%EF%BC%88%E3%82%B7%E3%83%B3%E3%82%AF%E3%82%A4%E3%83%83%E3%83%88%EF%BC%89&url=https%3A%2F%2Fthinkit.co.jp%2Fstory%2F2012%2F05%2F01%2F3525" title="このエントリーをはてなブックマークに追加" target="_blank" class="icon --iconMiddle --snsHB" ><span class="text--hidden">>ブクマする</span></a></li><li> <a href="https://note.mu/intent/post?url=https%3A%2F%2Fthinkit.co.jp%2Fstory%2F2012%2F05%2F01%2F3525&hashtags=Think%20IT" title="この記事に関してnoteで書く" target="_blank" class="icon --iconMiddle --snsNOTE" ><span class="text--hidden">noteで書く</span></a></li><li> <a href="https://www.google.com/preferences/source?q=thinkit.co.jp" title="Googleニュースの「優先するニュース提供元に追加」にThink ITを追加" target="_blank" class="icon --iconMiddle --snsGnewsPreferredSource" ><span>優先するニュース提供元にThink ITを追加</span></a></li></ul></div></div></div><div class="node-footer-fields"><div class="node-footer-fields"><div class="page-controller"><div class="page-controller--prev"><a href="/story/2012/04/27/3521"><p class="page-controller__head">前の記事</p><p class="page-controller__text">バージョンアップでFacebook投稿機能などを追加する</p> </a></div><div class="page-controller--next"><a href="/story/2012/05/02/3526"><p class="page-controller__head">次の記事</p><p class="page-controller__text">「一日一句」完結編 〜リスト選択とソート表示の実装〜</p> </a></div></div><div class="panels-container__content"></div><div class="panels-container__content --backnumber"><h2 class="block__title">バックナンバー</h2><div class="node view-bancho-backnumber view-display-block-node-footer js-view-dom-id-5fcbd2ab68d5343e934b133b5f1999777d87ebdc26bbbfaa8a9bbe3741682723"><div class="node node-teaser clearfix node--type-article node-3543 node--promoted node--view-mode-teaser"> <a href="/story/2012/05/21/3543" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> アプリ開発から公開までの疑問に答えるQ&A</h2><p class="date"><span class="datetimecreated" title="2012年5月21日 (月曜) 20:00">2012年5月21日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3543_main_7.png.avif?itok=vmHtGpXY 1x, /sites/default/files/styles/icon_200/public/main_images/3543_main_7.png.avif?itok=7SBAWCqX 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3543_main_7.png.avif?itok=7SBAWCqX 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3543_main_7.png.webp?itok=vmHtGpXY 1x, /sites/default/files/styles/icon_200/public/main_images/3543_main_7.png.webp?itok=7SBAWCqX 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3543_main_7.png.webp?itok=7SBAWCqX 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3543_main_7.png?itok=7SBAWCqX 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3543_main_7.png?itok=vmHtGpXY 1x, /sites/default/files/styles/icon_200/public/main_images/3543_main_7.png?itok=7SBAWCqX 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3543_main_7.png?itok=7SBAWCqX" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div><div class="node node-teaser clearfix node--type-article node-3538 node--promoted node--view-mode-teaser"> <a href="/story/2012/05/14/3538" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> センサーとサウンドの処理を組み込んでアプリを完成させる</h2><p class="date"><span class="datetimecreated" title="2012年5月14日 (月曜) 20:00">2012年5月14日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3538_main_7.png.avif?itok=YFAqK7BA 1x, /sites/default/files/styles/icon_200/public/main_images/3538_main_7.png.avif?itok=7RJloSJL 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3538_main_7.png.avif?itok=7RJloSJL 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3538_main_7.png.webp?itok=YFAqK7BA 1x, /sites/default/files/styles/icon_200/public/main_images/3538_main_7.png.webp?itok=7RJloSJL 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3538_main_7.png.webp?itok=7RJloSJL 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3538_main_7.png?itok=7RJloSJL 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3538_main_7.png?itok=YFAqK7BA 1x, /sites/default/files/styles/icon_200/public/main_images/3538_main_7.png?itok=7RJloSJL 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3538_main_7.png?itok=7RJloSJL" alt="" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div><div class="node node-teaser clearfix node--type-article node-3537 node--promoted node--view-mode-teaser"> <a href="/story/2012/05/07/3537" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> 海外向け公開は難しい?センサーとサウンドを使った新しいアプリ</h2><p class="date"><span class="datetimecreated" title="2012年5月7日 (月曜) 20:00">2012年5月7日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3537_main_7.png.avif?itok=VWLUEHq3 1x, /sites/default/files/styles/icon_200/public/main_images/3537_main_7.png.avif?itok=33LAGoDL 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3537_main_7.png.avif?itok=33LAGoDL 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3537_main_7.png.webp?itok=VWLUEHq3 1x, /sites/default/files/styles/icon_200/public/main_images/3537_main_7.png.webp?itok=33LAGoDL 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3537_main_7.png.webp?itok=33LAGoDL 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3537_main_7.png?itok=33LAGoDL 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3537_main_7.png?itok=VWLUEHq3 1x, /sites/default/files/styles/icon_200/public/main_images/3537_main_7.png?itok=33LAGoDL 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3537_main_7.png?itok=33LAGoDL" alt="" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div><div class="node node-teaser clearfix node--type-article node-3526 node--promoted node--view-mode-teaser"> <a href="/index%2ephp/story/2012/05/02/3526" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> 「一日一句」完結編 〜リスト選択とソート表示の実装〜</h2><p class="date"><span class="datetimecreated" title="2012年5月2日 (水曜) 20:00">2012年5月2日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3526_main_7.png.avif?itok=Y_Jbyarr 1x, /sites/default/files/styles/icon_200/public/main_images/3526_main_7.png.avif?itok=r9dNfZFa 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3526_main_7.png.avif?itok=r9dNfZFa 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3526_main_7.png.webp?itok=Y_Jbyarr 1x, /sites/default/files/styles/icon_200/public/main_images/3526_main_7.png.webp?itok=r9dNfZFa 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3526_main_7.png.webp?itok=r9dNfZFa 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3526_main_7.png?itok=r9dNfZFa 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3526_main_7.png?itok=Y_Jbyarr 1x, /sites/default/files/styles/icon_200/public/main_images/3526_main_7.png?itok=r9dNfZFa 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3526_main_7.png?itok=r9dNfZFa" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div><div class="node node-teaser clearfix node--type-article node-3525 node--promoted node--view-mode-teaser"> <a href="/story/2012/05/01/3525" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> 翻訳と、facebookへの投稿処理の実装</h2><p class="date"><span class="datetimecreated" title="2012年5月1日 (火曜) 20:00">2012年5月1日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3525_main_7.png.avif?itok=mAcmLiNF 1x, /sites/default/files/styles/icon_200/public/main_images/3525_main_7.png.avif?itok=SAcYPuNg 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3525_main_7.png.avif?itok=SAcYPuNg 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3525_main_7.png.webp?itok=mAcmLiNF 1x, /sites/default/files/styles/icon_200/public/main_images/3525_main_7.png.webp?itok=SAcYPuNg 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3525_main_7.png.webp?itok=SAcYPuNg 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3525_main_7.png?itok=SAcYPuNg 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3525_main_7.png?itok=mAcmLiNF 1x, /sites/default/files/styles/icon_200/public/main_images/3525_main_7.png?itok=SAcYPuNg 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3525_main_7.png?itok=SAcYPuNg" alt="" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div><div class="node node-teaser clearfix node--type-article node-3521 node--promoted node--view-mode-teaser"> <a href="/story/2012/04/27/3521" class="box--article --full --sub-heading"><div class="universal__item article__item --heading-aki-small"><h2> バージョンアップでFacebook投稿機能などを追加する</h2><p class="date"><span class="datetimecreated" title="2012年4月27日 (金曜) 20:00">2012年4月27日 20:00</span></p></div><div class="article__item"> <figure> <picture> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3521_main_7.png.avif?itok=AUMvLH8t 1x, /sites/default/files/styles/icon_200/public/main_images/3521_main_7.png.avif?itok=4m83gfcw 2x" media="(max-width: 480px)" type="image/avif" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3521_main_7.png.avif?itok=4m83gfcw 1x" media="(min-width: 480px)" type="image/avif" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3521_main_7.png.webp?itok=AUMvLH8t 1x, /sites/default/files/styles/icon_200/public/main_images/3521_main_7.png.webp?itok=4m83gfcw 2x" media="(max-width: 480px)" type="image/webp" width="100" height="53"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3521_main_7.png.webp?itok=4m83gfcw 1x" media="(min-width: 480px)" type="image/webp" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_200/public/main_images/3521_main_7.png?itok=4m83gfcw 1x" media="(min-width: 480px)" type="image/png" width="200" height="105"/> <source srcset="/sites/default/files/styles/icon_100/public/main_images/3521_main_7.png?itok=AUMvLH8t 1x, /sites/default/files/styles/icon_200/public/main_images/3521_main_7.png?itok=4m83gfcw 2x" media="(max-width: 480px)" type="image/png" width="100" height="53"/> <img loading="lazy" width="200" height="105" src="/sites/default/files/styles/icon_200/public/main_images/3521_main_7.png?itok=4m83gfcw" alt="" /> </picture></figure></div><ul class="universal__tagList list --theme reset"><li><span>開発ツール</span></li><li><span>モバイル</span></li><li><span>技術解説</span></li></ul> </a></div> <a href="/corner/5074" class="btn --line --aki-bottom-none"> <span class="icon --arrowR01"></span> バックナンバーをもっと見る </a></div></div><div class="panels-container__content"><div class="author"><h2>この記事の筆者</h2><div class="author__block node_author_profile_item profile-source--paragraphs--field_reffer_author_single node-profile-first node-profile-last"><div class="author__head"> <figure class="author__avatar"><div class="field--name-field-image"> <a href="/author/40" hreflang="und"> <picture> <source srcset="/sites/default/files/styles/photo_90/public/photo/PROJECT-KySS.jpg.avif?itok=7NiuXTTP 1x, /sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg.avif?itok=wokKaCe8 2x" media="(max-width: 480px)" type="image/avif" width="70" height="75"> <source srcset="/sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg.avif?itok=wokKaCe8 1x" media="(min-width: 480px)" type="image/avif" width="70" height="75"> <source srcset="/sites/default/files/styles/photo_90/public/photo/PROJECT-KySS.jpg.webp?itok=7NiuXTTP 1x, /sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg.webp?itok=wokKaCe8 2x" media="(max-width: 480px)" type="image/webp" width="70" height="75"> <source srcset="/sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg.webp?itok=wokKaCe8 1x" media="(min-width: 480px)" type="image/webp" width="70" height="75"> <source srcset="/sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg?itok=wokKaCe8 1x" media="(min-width: 480px)" type="image/jpeg" width="70" height="75"> <source srcset="/sites/default/files/styles/photo_90/public/photo/PROJECT-KySS.jpg?itok=7NiuXTTP 1x, /sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg?itok=wokKaCe8 2x" media="(max-width: 480px)" type="image/jpeg" width="70" height="75"> <img loading="lazy" width="70" height="75" src="/sites/default/files/styles/photo_180/public/photo/PROJECT-KySS.jpg?itok=wokKaCe8"> </picture></a></div> </figure><div class="author__outline"><div class="author__names"><p class="author__name"> <strong><span class="field--name-title">PROJECT KySS</span></strong></p><p class="author__title"></p></div></div></div><div class="author__detail"><div class="field--name-body"><p>四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。<a href="http://www.PROJECTKySS.NET/" target="_blank" rel="noopener">http://www.PROJECTKySS.NET/</a></p></div></div><div class="author__link yn-delete"> <a href="/author/40" class="btn --aki-bottom-none"><span class="field--name-title">PROJECT KySS</span>のプロフィールを見る</a></div></div></div></div><div class="panels-container__content"><div class="column --news view-bancho-author-node-list view-display-block-nodefooter js-view-dom-id-bbc788e4b2fd4d04ed9381ca39eec2504489df57749bd3a5c63bb5af19f85e08"></div></div><div class="panels-container__content --aki-small"><div class="node"><div class="box--article --full --share01"><div class="article__item"> <span class="icon --chara"></span><p class="icon__text">業界情報やナレッジが詰まったメルマガやソーシャルぜひご覧ください</p></div><div class="article__item"><ul class="list__share"><li> <a href="/member" target="_blank" class="icon --iconLarge --snsMail"><span class="text--hidden">メルマガ</span></a></li><li> <a href="https://www.facebook.com/thinkit.co.jp" target="_blank" class="icon --iconLarge --snsFB"><span class="text--hidden">Facebook</span></a></li><li> <a href="https://twitter.com/thinkitcojp" target="_blank" class="icon --iconLarge --snsX"><span class="text--hidden">X(エックス)</span></a></li><li> <a href="https://bsky.app/profile/" target="_blank" class="icon --iconLarge --snsBluesky"><span class="text--hidden">BlueSky</span></a></li><li> <a href="https://news.google.com/publications/CAAqKAgKIiJDQklTRXdnTWFnOEtEWFJvYVc1cmFYUXVZMjh1YW5Bb0FBUAE?hl=ja&gl=JP&ceid=JP%3Aja" target="_blank" class="icon --iconLarge --snsGoogleNews"><span class="text--hidden">Googleニュース</span></a></li><li> <a href="/rss.xml" target="_blank" class="icon --iconLarge --snsRSS"><span class="text--hidden">RSS</span></a></li></ul></div></div></div></div><div class="panels-container__content --aki-small"><p>Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。</p><a href="/member" style="display:block;text-align:center" class="aki-bottom2"><img alt="" src="/sites/default/files/btn-member.png" style="width: 300px; height: 100px;" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"></a></div><a class="follow-us-on-google-news" href="https://news.google.com/publications/CAAqKAgKIiJDQklTRXdnTWFnOEtEWFJvYVc1cmFYUXVZMjh1YW5Bb0FBUAE?hl=ja&gl=JP&ceid=JP%3Aja" target="_blank"><img src="/themes/custom/bancho_theme_base/assets/images/icon_google-news-follow-us-jp.svg" width="1165.7" height="279.5" alt="Follow us on Google news" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"></a></div></div></div></article></div></div><div class="panels-container__side"><div id="block-bancho-theme-thinkit-dfpprofirstrectangle" data-order-sp="2" class="panels-container__content --aki-none --insert-ad dfp-ad-wrapper-container"><div id="div-gpt-ad-1450940771091-1" style="max-width:min(100%, 300px) !important; overflow: hidden !important; height:300px" class="gpt-ad-container gpt-ad-container-bg"><script>(function(){ var googletag = window.googletag || {cmd: []}; googletag.cmd.push(function() { googletag .pubads() .addEventListener('slotResponseReceived', function(evt) { // いろんな枠のイベントが飛んでくるので自分のだけフィルタ if (evt.slot.getAdUnitPath() != '/49282802/ipc-thinkit/pc-all/rect01') { return; } document.getElementById('div-gpt-ad-1450940771091-1')?.classList?.add('dfp-ad-loaded'); }); googletag.display('div-gpt-ad-1450940771091-1'); }); })(); </script></div></div><div id="block-bancho-theme-thinkit-" data-order-sp="8" class="panels-container__content"><div class="articleCollect --ranking --tabs"><h2 class="articleCollect__title">人気記事トップ10</h2><div class="articleCollect__tab"><div class="articleCollect__tab-list"> <button type="button" class="reset articleCollect__tab-item js-tabTrigger" data-tab="tab1">昨日</button> <button type="button" class="reset articleCollect__tab-item js-tabTrigger js-active" data-tab="tab2">1週間</button> <button type="button" class="reset articleCollect__tab-item js-tabTrigger" data-tab="tab3">1か月</button></div></div><div class="articleCollect__list-wrapper js-tabTargets"><div class="articleCollect__list js-tabTarget" data-tab="tab1"><div class="view-bancho-popular view-display-block-widget-1day js-view-dom-id-66eadc6dacf5a8cd4a117ac752e862ab9a6eef2f92d432c9314a372c4b66eeb5"> <a href="/article/39535" class="articleCollect__item"> <span>「競合するAWSとGoogle Cloudが同じ接続仕様に乗った」――エクイニクスの「Fabric One」が示すマルチクラウド接続の現在地</span> </a> <a href="/article/39515" class="articleCollect__item"> <span>AIの書いた非同期処理は、なぜ実機で遅いのか</span> </a> <a href="/news/39502" class="articleCollect__item"> <span>「Ubuntu 26.04.1 LTS」リリース ─ 8月25日までのアップデートを反映</span> </a> <a href="/article/39528" class="articleCollect__item"> <span>検出された脆弱性のどれが本当に危ないのか──AIが自律的に攻撃を試し、悪用可能性まで検証する「Ostorlab」が国内提供開始</span> </a> <a href="/article/39511" class="articleCollect__item"> <span>「Kro」深掘り:定義の実体をCRDにするという選択</span> </a> <a href="/article/39491" class="articleCollect__item"> <span>「FAPI 2.0」に準拠した、よりセキュアな認可フローを「Keycloak」で実装しよう</span> </a> <a href="/news/39524" class="articleCollect__item"> <span>「Linux 7.2.3/7.1.13」などがリリース、Linux 7.1系列はEOLに</span> </a> <a href="/article/39497" class="articleCollect__item"> <span>Kaggleは「今いる場所で成長する」のに役立つ ー社内コンペ・育成制度・会場提供、DSが組織を動かすまで</span> </a> <a href="/reader-presents" class="articleCollect__item"> <span>数式なしでスラスラ読める機械学習の入門書!『じわじわわかる機械学習 データ分析・AIアルゴリズムのなかみ』を5名様にプレゼント!</span> </a> <a href="/news/39532" class="articleCollect__item"> <span>ライブLinuxシステム「Grml 2026.09」リリース ─ Linuxカーネル7.1.8を搭載</span> </a></div></div><div class="articleCollect__list js-tabTarget js-active" data-tab="tab2"><div class="view-bancho-popular view-display-block-widget-7days js-view-dom-id-167494bd919913aa80dbf521246b1b5461c6542261b56d5e070f39ff0579276b"> <a href="/article/39497" class="articleCollect__item"> <span>Kaggleは「今いる場所で成長する」のに役立つ ー社内コンペ・育成制度・会場提供、DSが組織を動かすまで</span> </a> <a href="/news/39502" class="articleCollect__item"> <span>「Ubuntu 26.04.1 LTS」リリース ─ 8月25日までのアップデートを反映</span> </a> <a href="/article/39493" class="articleCollect__item"> <span>【AIエージェント時代の新資格】AIエージェント・ストラテジストから見える「これから求められる人材」</span> </a> <a href="/article/39491" class="articleCollect__item"> <span>「FAPI 2.0」に準拠した、よりセキュアな認可フローを「Keycloak」で実装しよう</span> </a> <a href="/article/39506" class="articleCollect__item"> <span>「Protocol Buffers」からGoコードを自動生成 ー独自protocプラグイン開発と「1次ソース」の設計思想</span> </a> <a href="/article/39518" class="articleCollect__item"> <span>「エージェント型AIは今どこにいるのか」――Gartnerが示す2026年ハイプ・サイクル、フィジカルAIとともに「過度な期待」のピーク期</span> </a> <a href="/article/39494" class="articleCollect__item"> <span>PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望</span> </a> <a href="/article/39525" class="articleCollect__item"> <span>Meta Quest 3が120Hzを超える表示リフレッシュレートに対応、ネクシアエンターテインメント 4DGS技術を活用した映像生成サービス「NEXIA VIDEO」を開始 ほか</span> </a> <a href="/news/39524" class="articleCollect__item"> <span>「Linux 7.2.3/7.1.13」などがリリース、Linux 7.1系列はEOLに</span> </a> <a href="/article/39528" class="articleCollect__item"> <span>検出された脆弱性のどれが本当に危ないのか──AIが自律的に攻撃を試し、悪用可能性まで検証する「Ostorlab」が国内提供開始</span> </a></div></div><div class="articleCollect__list js-tabTarget" data-tab="tab3"><div class="view-bancho-popular view-display-block-widget-30days js-view-dom-id-7ec00d6ef4ffff5f19d6b9d8f84783d494d83ef0862f751f00170a4cbdcc70e7"> <a href="/news/39501" class="articleCollect__item"> <span>「Armbian 26.8」リリース ─ Linux 7.1と全面刷新したインストーラを採用</span> </a> <a href="/news/39448" class="articleCollect__item"> <span>「Linux Mint 22.3」、Linux 7.0搭載HWE ISOを公開</span> </a> <a href="/news/39502" class="articleCollect__item"> <span>「Ubuntu 26.04.1 LTS」リリース ─ 8月25日までのアップデートを反映</span> </a> <a href="/article/39425" class="articleCollect__item"> <span>Kaggleは「次の一歩へ踏み出す」のに役に立つ ー組み込み→画像AI→医療AI、3段階の越境が教えてくれたこと</span> </a> <a href="/news/39476" class="articleCollect__item"> <span>「GNU Linux-libre 7.2」リリース ─ AMD、Qualcomm、Intel関連ドライバのdeblob処理を更新</span> </a> <a href="/article/39497" class="articleCollect__item"> <span>Kaggleは「今いる場所で成長する」のに役立つ ー社内コンペ・育成制度・会場提供、DSが組織を動かすまで</span> </a> <a href="/reader-presents" class="articleCollect__item"> <span>数式なしでスラスラ読める機械学習の入門書!『じわじわわかる機械学習 データ分析・AIアルゴリズムのなかみ』を5名様にプレゼント!</span> </a> <a href="/news/39507" class="articleCollect__item"> <span>「ReactOS 0.4.16」リリース ─ GUIインストーラーと統合イメージを導入</span> </a> <a href="/news/39489" class="articleCollect__item"> <span>「GNU Emacs 31.1」リリース ─ Tree-sitter文法の自動インストールに対応</span> </a> <a href="/article/39470" class="articleCollect__item"> <span>「Proxmox VE」をインストールして仮想化基盤を立ち上げよう</span> </a></div></div></div> <a href="/popular" class="btn --line --aki-bottom-none"> <span class="icon --arrowR01"></span> 人気記事ランキングをもっと見る </a></div></div><div id="block-bancho-theme-thinkit-dfpprobadge1" data-order-sp="6" class="panels-container__content --aki-small dfp-ad-wrapper-container"></div><div id="block-bancho-theme-thinkit-dfpprobadge2" data-order-sp="6" class="panels-container__content --aki-small dfp-ad-wrapper-container"></div><div id="block-bancho-theme-thinkit-dfpprosecondrectangle" data-order-sp="6" class="panels-container__content --aki-small dfp-ad-wrapper-container"><div id="div-gpt-ad-1450940771091-2" style="max-width:min(100%, 300px) !important; overflow: hidden !important; height:300px" class="gpt-ad-container gpt-ad-container-bg"><script>(function(){ var googletag = window.googletag || {cmd: []}; googletag.cmd.push(function() { googletag .pubads() .addEventListener('slotResponseReceived', function(evt) { // いろんな枠のイベントが飛んでくるので自分のだけフィルタ if (evt.slot.getAdUnitPath() != '/49282802/ipc-thinkit/pc-all/rect02') { return; } document.getElementById('div-gpt-ad-1450940771091-2')?.classList?.add('dfp-ad-loaded'); }); googletag.display('div-gpt-ad-1450940771091-2'); }); })(); </script></div></div><div id="block-bancho-theme-thinkit-views-block-bancho-recent-articles-block-1" data-order-sp="5" class="panels-container__content --aki-small views-element-container block block-views block-views-block--bancho-recent-articles-block-1"><h2 class="articleCollect__title">新着記事</h2><div><div class="view-bancho-recent-articles view-display-block-1 js-view-dom-id-e5ff6776919f71c2c38764583e91928be4a2eaa6293fa36f8d3cb545b0ce3084"><div class="articleCollect__list"><a href="/article/39511" class="articleCollect__item"> <span><span class="field--name-title">「Kro」深掘り:定義の実体をCRDにするという選択</span></span> <span class="date"><span class="datetimecreated" title="2026年9月10日 (木曜) 6:30">6:30</span></span> </a><a href="/article/39535" class="articleCollect__item"> <span><span class="field--name-title">「競合するAWSとGoogle Cloudが同じ接続仕様に乗った」――エクイニクスの「Fabric One」が示すマルチクラウド接続の現在地</span></span> <span class="date"><span class="datetimecreated" title="2026年9月10日 (木曜) 6:00">6:00</span></span> </a><a href="/article/39515" class="articleCollect__item"> <span><span class="field--name-title">AIの書いた非同期処理は、なぜ実機で遅いのか</span></span> <span class="date"><span class="datetimecreated" title="2026年9月9日 (水曜) 6:30">9月9日 6:30</span></span> </a><a href="/article/39506" class="articleCollect__item"> <span><span class="field--name-title">「Protocol Buffers」からGoコードを自動生成 ー独自protocプラグイン開発と「1次ソース」の設計思想</span></span> <span class="date"><span class="datetimecreated" title="2026年9月9日 (水曜) 6:30">9月9日 6:30</span></span> </a><a href="/article/39509" class="articleCollect__item"> <span><span class="field--name-title">「イチゴと会話しろ」と言われたIT起業家が見つけた、農業の構造的課題</span></span> <span class="date"><span class="datetimecreated" title="2026年9月8日 (火曜) 6:30">9月8日 6:30</span></span> </a></div> <footer> <a href="/recent" class="btn --line --aki-bottom-none"> <span class="icon --arrowR01"></span> 新着記事をもっと見る </a> </footer></div></div></div><div id="block-bancho-theme-thinkit-views-block-bancho-ad-articles-block" data-order-sp="9" class="panels-container__content views-element-container block block-views block-views-block--bancho-ad-articles-block-sidebar"><div><div class="articleCollect view-bancho-ad-articles view-display-block-sidebar js-view-dom-id-01a4d1e239fc94705cb345f774520461bce79e637b4955583b6a16c331453554"> <header><h2 class="articleCollect__title"> <span>企画広告も役立つ情報バッチリ!</span> <span class="ad-icon">Sponsored</span></h2> </header><div class="articleCollect__list"><a href="/article/39494" class="articleCollect__item"> <span><span class="field--name-title">PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望</span></span> <span class="date"><span class="datetimecreated" title="2026年9月7日 (月曜) 6:30">9月7日 6:30</span></span> </a><a href="/article/39097" class="articleCollect__item"> <span><span class="field--name-title">機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携</span></span> <span class="date"><span class="datetimecreated" title="2026年4月14日 (火曜) 6:30">4月14日 6:30</span></span> </a><a href="/article/38870" class="articleCollect__item"> <span><span class="field--name-title">【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには</span></span> <span class="date"><span class="datetimecreated" title="2026年1月23日 (金曜) 6:30">1月23日 6:30</span></span> </a><a href="/article/38848" class="articleCollect__item"> <span><span class="field--name-title">【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは</span></span> <span class="date"><span class="datetimecreated" title="2026年1月15日 (木曜) 6:30">1月15日 6:30</span></span> </a><a href="/article/38800" class="articleCollect__item"> <span><span class="field--name-title">【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方</span></span> <span class="date"><span class="datetimecreated" title="2025年12月18日 (木曜) 6:30">2025年12月18日 6:30</span></span> </a><a href="/article/38699" class="articleCollect__item"> <span><span class="field--name-title">新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは?</span></span> <span class="date"><span class="datetimecreated" title="2025年11月28日 (金曜) 6:30">2025年11月28日 6:30</span></span> </a><a href="/article/38698" class="articleCollect__item"> <span><span class="field--name-title">IoTに生成AIを掛け合わせる「AI-driven IoT」で現場のIoTデータ活用を加速</span></span> <span class="date"><span class="datetimecreated" title="2025年11月26日 (水曜) 6:30">2025年11月26日 6:30</span></span> </a><a href="/article/38697" class="articleCollect__item"> <span><span class="field--name-title">アイレット、KDDIの属人化問題を生成AIアシスタントの精度を高め解消へ</span></span> <span class="date"><span class="datetimecreated" title="2025年11月21日 (金曜) 6:30">2025年11月21日 6:30</span></span> </a><a href="/article/38184" class="articleCollect__item"> <span><span class="field--name-title">「Grafana Cloud」の先進的ユーザーであるグリーが10年をかけて到達した「オブザーバービリティ」とは</span></span> <span class="date"><span class="datetimecreated" title="2025年5月15日 (木曜) 6:30">2025年5月15日 6:30</span></span> </a><a href="/article/38129" class="articleCollect__item"> <span><span class="field--name-title">Grafana Labs CTOのTom Wilkie氏インタビュー。スクラップアンドビルドから産まれた「トラブルシューティングの民主化」とは</span></span> <span class="date"><span class="datetimecreated" title="2025年4月21日 (月曜) 6:30">2025年4月21日 6:30</span></span> </a></div> <footer> <a href="/sponsored" class="btn --line --aki-bottom-none"> <span class="icon --arrowR01"></span> 企画広告記事をもっと見る </a> </footer></div></div></div><div id="block-bancho-theme-thinkit-dfpprothirdrectangle" data-order-sp="10" class="panels-container__content dfp-ad-wrapper-container"><div id="div-gpt-ad-1450940771091-3" style="max-width:min(100%, 300px) !important; overflow: hidden !important; height:300px" class="gpt-ad-container gpt-ad-container-bg"><script>(function(){ var googletag = window.googletag || {cmd: []}; googletag.cmd.push(function() { googletag .pubads() .addEventListener('slotResponseReceived', function(evt) { // いろんな枠のイベントが飛んでくるので自分のだけフィルタ if (evt.slot.getAdUnitPath() != '/49282802/ipc-thinkit/pc-all/rect03') { return; } document.getElementById('div-gpt-ad-1450940771091-3')?.classList?.add('dfp-ad-loaded'); }); googletag.display('div-gpt-ad-1450940771091-3'); }); })(); </script></div></div><div id="block-bancho-theme-thinkit-xtwittertimelineembedding" class="panels-container__content hide-sp"> <a class="twitter-timeline" data-width="300" data-height="600" data-dnt="true" href="https://twitter.com/thinkitcojp?ref_src=twsrc%5Etfw" style="max-width:100%;overflow:hidden;">Tweets by thinkitcojp</a><script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><div id="block-bancho-theme-thinkit-facebookpageembed" class="panels-container__content hide-sp"><div class="fb-page-ph" data-href="https://www.facebook.com/thinkit.co.jp" data-width="300" data-hide-cover="false" data-tabs="events" data-show-facepile="true" data-adapt-container-width="true" data-lazy="true" style="max-width:100%;overflow:hidden;min-height:100px"></div><script> (function(){ document.addEventListener('DOMContentLoaded', function(evt) { window.Drupal = window.Drupal || {}; Drupal.behaviors = Drupal.behaviors || {}; Drupal.behaviors.bancho_social_widget_facebook ={ attach: function (context, settings) { once('bancho_social_widget_facebook', '.fb-page-ph', context) .forEach(function (element) { element.classList.remove('fb-page-ph'); element.classList.add('fb-page'); if (typeof window.registerFbAsyncInit == "function") { registerFbAsyncInit(function(tgt){ FB.XFBML.parse(); // 引数指定するとダメになってた }, element); } else if ('undefined' != typeof(FB)) { FB.XFBML.parse(); // 引数指定するとダメになってた } else if ( 'undefined' != typeof(drupalSettings) && 'undefined' != typeof(drupalSettings?.bancho?.userInfo?.insider) ) { console.warn('Neither registerFbAsyncInit() nor FB exists. FB.XFBML.parse() failed.'); } }); } }; }); })(); </script></div></div></div></div> <footer id="footer" class="l-footer"><div class="footer__inner"><div class="footer__block footer__block--sponsor reset"><div class="footer__block footer__block--sponsor"><p class="footer__block__title"> <strong>スポンサー企業さま</strong></p><div class="footer__box"><div class="footer__box__item"><p class="footer__box__caption">ゴールドスポンサー</p><ul class="footer__box__sponsor footer__box__sponsor--gold"><li class="footer__box__sponsor__item"> <a href="https://pingcap.co.jp/" target="_blank" rel="nofollow" title="PingCAP株式会社"> <img src="/sites/default/files/images/_sponsors/_page_footer/logo_TiDB_200x125.png" alt="PingCAP株式会社" width="200" height="125" style="margin:3px 0" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__sponsor__item"> <a href="https://www.gmicloud.ai/en" target="_blank" rel="nofollow" title="GMI Cloud"> <img src="/sites/default/files/images/_sponsors/_page_footer/logo_GMI_166x37.png" alt="GMI Cloud" width="166" height="37" style="margin:3px 0" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li></ul></div><div class="footer__box__item"><p class="footer__box__caption">シルバースポンサー</p><ul class="footer__box__sponsor footer__box__sponsor--silver"><li class="footer__box__sponsor__item"> <a href="https://www.techmatrix.co.jp/product/quality.html" target="_blank" rel="nofollow" title="テクマトリックス株式会社"> <img src="/sites/default/files/images/_sponsors/_page_footer/logo_TechMatrix_160x100.png" alt="テクマトリックス株式会社" width="200" height="45" style="margin:3px 0" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li></ul></div></div></div></div><div class="footer__block footer__block--about"><div class="footer__box"><div class="footer__box__item"><dl class="footer__box__about"><dt class="footer__box__about__head"> <a href="/" title="Think IT(シンクイット)"> <img src="/themes/custom/bancho_theme_thinkit/assets/images/logo.svg" alt="Think IT(シンクイット)" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></dt><dd class="footer__box__about__body"><p>オープンソース技術の実践活用メディア</p></dd></dl></div><div class="footer__box__item"><ul class="footer__box__socials reset"><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsMail" href="/member" title="メルマガを見る"> <span class="text--hidden">メルマガ</span> </a></li><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsFB" href="https://www.facebook.com/thinkit.co.jp" title="Facebookを見る"> <span class="text--hidden">Facebook</span> </a></li><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsX" href="https://twitter.com/thinkitcojp" title="X(エックス)を見る"> <span class="text--hidden">X(エックス)</span> </a></li><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsBluesky" href="https://bsky.app/profile/" target="_blank"> <span class="text--hidden">Bluesky</span> </a></li><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsGoogleNews" href="https://news.google.com/publications/CAAqKAgKIiJDQklTRXdnTWFnOEtEWFJvYVc1cmFYUXVZMjh1YW5Bb0FBUAE?hl=ja&gl=JP&ceid=JP%3Aja" target="_blank" title="Googleニュースでフォロー"> <span class="text--hidden">Googleニュース</span> </a></li><li class="footer__box__socials__item"> <a class="icon --iconMiddle --snsRSS" href="/rss.xml" title="RSSを見る"> <span class="text--hidden">RSS</span> </a></li></ul></div></div><div class="footer__box"><div class="footer__box__item"><ul class="footer__box__links"><li class="footer__box__links__item"><a href="/about">本サイトについて</a></li><li class="footer__box__links__item"><a href="https://ad.impress.co.jp/adguide/business/thinkit.html">広告出稿について(媒体資料)</a></li><li class="footer__box__links__item"><a href="https://inquiry.impress.co.jp/?id=1">お問い合わせ</a></li><li class="footer__box__links__item"><a href="https://www.impress.co.jp/sitepolicy.html">利用規約</a></li><li class="footer__box__links__item"><a href="https://www.impress.co.jp/privacy.html">プライバシーポリシー</a></li><li class="footer__box__links__item"><a href="https://www.impress.co.jp/specific_trade_law/index_bm.html">特定商取引法に基づく表示</a></li><li class="footer__box__links__item"><a href="https://www.impress.co.jp/corporate.html">会社概要</a></li><li class="footer__box__links__item"><a href="http://www.impressholdings.com/">インプレスグループTOP</a></li></ul></div></div></div><div class="footer__block footer__block--navigation"><div id="block-bancho-theme-thinkit-pagefooter-site-header-blocks-on-bottom" class="footer__content_navigation footer__content_navigation__header_appeal_info"><h2 class="block__title">注目リンク</h2><div class="bancho-container site-footer__header-appeal"><ul class="header__main__category"><li class="header__main__category__item"> <a href="/member" class="header__main__category__item__link">メルマガ購読</a></li><li class="header__main__category__item"> <a href="/corner/12694" class="header__main__category__item__link"><center>編集部が読み解く!<br>3行でわかる<br>テックニュース</center></a></li><li class="header__main__category__item"> <a href="/reader-presents" class="header__main__category__item__link">読者プレゼント</a></li></ul></div><div class="bancho-container site-footer__header-info"><ul class="header__main__nav"><li class="header__main__nav__item"> <a href="/about">Think ITについて</a></li><li class="header__main__nav__item"> <a href="https://ad.impress.co.jp/adguide/business/thinkit.html">広告出稿について</a></li></ul></div></div><div id="block-bancho-theme-thinkit-pagefooter-category" class="footer__content_navigation footer__block--navigation--3columns views-element-container block block-views block-views-block--category-list-block-megamenu-category"><h2 class="block__title">カテゴリ</h2><div><div class="view-category-list view-display-block-megamenu-category js-view-dom-id-97f58fe9fb0bd8f236db90cc60b2891776d3a9caefdce64cf52f5c84809adb0c"><div><ul class="header__search__content__list"><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4502%5D=4502">ITインフラ</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4503%5D=4503">サーバー</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4504%5D=4504">ネットワーク</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4505%5D=4505">ストレージ</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4506%5D=4506">クラウド</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4507%5D=4507">仮想化/コンテナ</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6911%5D=6911">IoT/組み込み</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4508%5D=4508">システム開発</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4509%5D=4509">OS</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4510%5D=4510">ミドルウェア</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4511%5D=4511">データベース</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4512%5D=4512">設計/手法/テスト</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4513%5D=4513">開発言語</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4514%5D=4514">開発ツール</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4515%5D=4515">Web開発</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4516%5D=4516">業務アプリ</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4436%5D=4436">クラウド(SaaS)</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4517%5D=4517">データ解析</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4518%5D=4518">モバイル</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4519%5D=4519">CRM/ERP</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4520%5D=4520">OSS</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B5755%5D=5755">VR/AR</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B6904%5D=6904">AI・人工知能</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4521%5D=4521">運用・管理</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4522%5D=4522">プロジェクト管理</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4523%5D=4523">システム運用</a></li><li class="header__search__content__list__item"><a href="/articles?article_category%5B4524%5D=4524">BCP/DR</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4525%5D=4525">運用監視</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B4526%5D=4526">セキュリティ</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6905%5D=6905">働き方</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B5546%5D=5546">資格・試験</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6906%5D=6906">キャリア・人材</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6907%5D=6907">フリーランス/起業</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6908%5D=6908">ライフハック</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6909%5D=6909">教育</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_category%5B6910%5D=6910">制度・法律</a></li></ul></div></div></div></div><div id="block-bancho-theme-thinkit-static-content-archive"><h2>アーカイブ</h2><ul><li><a href="/category/dev.html">システム開発</a></li><li><a href="/category/eip_test.html">業務システム</a></li><li><a href="/category/interview.html">キーパーソンインタビュー</a></li><li><a href="/category/report.html">調査レポート</a></li><li><a href="/category/security.html">情報セキュリティ</a></li><li><a href="/category/server.html">サーバ構築・運用</a></li><li><a href="/category/system.html">業務システム</a></li></ul></div><div id="block-bancho-theme-thinkit-pagefooter-type" class="footer__content_navigation views-element-container block block-views block-views-block--category-list-block-megamenu-type"><h2 class="block__title">種別</h2><div><div class="view-category-list view-display-block-megamenu-type js-view-dom-id-53ac3f3cbdad886eb262ccfd81980382737c5262f104ce69a3218565949dfbc6"><div><ul class="header__search__content__list"><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B4528%5D=4528">ニュース</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B4529%5D=4529">技術解説</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B4530%5D=4530">書籍・書評</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B4531%5D=4531">インタビュー</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B4532%5D=4532">イベント</a></li><li class="header__search__content__list__item"><a href="/articles?article_type%5B4533%5D=4533">コラム</a></li><li class="header__search__content__list__item"><a href="/index%2ephp/articles?article_type%5B5925%5D=5925">TechAcademy</a></li><li class="header__search__content__list__item"><a href="/articles?article_type%5B4534%5D=4534">ReadWrite</a></li></ul></div></div></div></div></div><div class="footer__block footer__block--medias"><div class="footer__box"><div class="footer__box__item reset"><div class="footer__box__logo"> <a href="https://www.impress.co.jp/" target="_blank" title="株式会社インプレス"> <img src="/themes/custom/bancho_theme_base/assets/images/logo_impress.svg" alt="株式会社インプレス" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></div><ul class="footer__box__medias"><li class="footer__box__medias__item"> <a href="https://cloud.watch.impress.co.jp/cdc/" target="_blank" title="戦略的ITインフラがビジネスを強くする「クラウド&データセンター完全ガイド」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_cdc.png" alt="戦略的ITインフラがビジネスを強くする「クラウド&データセンター完全ガイド」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://thinkit.co.jp" target="_blank" title="ソフトウェア開発エンジニアに「Think IT」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_thinkit.png" alt="ソフトウェア開発エンジニアに「Think IT」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://webtan.impress.co.jp" target="_blank" title="ホームページとネットマーケティング「Web担当者Forum」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_webtan.png" alt="ホームページとネットマーケティング「Web担当者Forum」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://r.impressrd.jp/iil/" target="_blank" title="インターネットメディアの総合研究所 調査報告書"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_research.png" alt="インターネットメディアの総合研究所 調査報告書" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://cloud.watch.impress.co.jp" target="_blank" title="法人向けIT・クラウドソリューションの最新ニュース「クラウド Watch」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_cloudwatch.png" alt="法人向けIT・クラウドソリューションの最新ニュース「クラウド Watch」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://it.impress.co.jp" target="_blank" title="日本のITを変える人たちへ!「IT Leaders」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_itleaders.png" alt="日本のITを変える人たちへ!「IT Leaders」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://sgforum.impress.co.jp" target="_blank" title="エネルギーと情報通信の融合時代を拓くスマートグリッド専門サイト"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_sgforum.png" alt="エネルギーと情報通信の融合時代を拓くスマートグリッド専門サイト" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://netshop.impress.co.jp" target="_blank" title="ECに携わる人のためのメディア「ネットショップ担当者フォーラム」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_nettan.png" alt="ECに携わる人のためのメディア「ネットショップ担当者フォーラム」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://b-library.impress.co.jp" target="_blank" title="製品 ⁄ サービスの資料を入手「Impress Business Library」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_blibrary.png" alt="製品 ⁄ サービスの資料を入手「Impress Business Library」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://dcross.impress.co.jp" target="_blank" title="デジタルが生みだす未来を考える「DIGITAL X」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_dcross.png" alt="デジタルが生みだす未来を考える「DIGITAL X」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://drone-journal.impress.co.jp" target="_blank" title="ドローンやロボティクス活用のためのメディア「ドローンジャーナル」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_drone.png" alt="ドローンやロボティクス活用のためのメディア「ドローンジャーナル」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://academy.impress.co.jp" target="_blank" title="最先端技術を理解し身につける「インプレス・アカデミー」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_academy.png" alt="最先端技術を理解し身につける「インプレス・アカデミー」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://b-soudan.impress.co.jp/" target="_blank" title="ECビジネスのお悩み・課題を解決するための情報サイト「ネッ担お悩み相談室」"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_b-soudan.png" alt="ECビジネスのお悩み・課題を解決するための情報サイト「ネッ担お悩み相談室」" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li><li class="footer__box__medias__item"> <a href="https://event.impress.co.jp/" target="_blank" title="インプレス イベント&セミナー"> <img src="/themes/custom/bancho_theme_base/assets/images/media/banner_event_seminar.png" alt="インプレス イベント&セミナー" loading="lazy" decoding="async" class=" lazyload-auto lazyload-processed"> </a></li></ul></div></div></div><p class="copyright">Copyright ©2026 Impress Corporation, An impress Group Company. All rights reserved.</p></div> </footer><div class="overlay" data-drupal-selector="overlay"></div></div></div><script type="application/json" data-drupal-selector="drupal-settings-json">{"path":{"baseUrl":"\/","pathPrefix":"","currentPath":"node\/3525","currentPathIsAdmin":false,"isFront":false,"currentLanguage":"ja","currentQuery":{"page":"1"}},"pluralDelimiter":"\u0003","suppressDeprecationErrors":true,"ajaxPageState":{"libraries":"eJydU1ty2zAMvJBipp3JT27QU3AgCiJR8zUEaFs5fSDFcmK36Uc_pCF3FyCwIIEMkPWxjBCHEbILxcKUKNfY2TzgCd5KthWgkhljccedcSWlko1jtnfIX_ja8GQzXuSB-812ar1CtBJaEYn4p0AQGJsCMUJlfN0V01ztVo_xVbR83omZomhAoEg-iAZOyOYe_KeUZYlo7Yl_Pv94eVBW8JT9R0_gse20esYMbVmZHdtyjuVi9sVO8JjMPP7KJF8R_W5b17RbS3kiB1KaZhhvnLTupDe00CWUZlWKj0OTgAl1KoxGjawlYxa-JyVQPpJcA5-2ulHWHvFSC-N0bVlTY8amud0RJ9JqXqxeE7VBHXBH9c6HrUFzW9nNQT7o-eRskPQfsXNXA9ZQe16Yzov_JoV6pL1dL8LXzeBKQ_Nxuw5zaekOIMH0FIllqNDAN6iBd-4TOfRc-6iygNPACM0Fq89gdb6svkYUNN_gAy-sh5h1CMOJ8Mxm-x9SmXrEdwYUYqc","theme":"bancho_theme_thinkit","theme_token":null},"ajaxTrustedUrl":{"\/search":true},"bancho_lightbox":{"border_size":10,"box_color":"fff","custom_class_handler":0,"custom_trigger_classes":"","default_image":"\/modules\/custom\/bancho_lightbox\/assets\/images\/brokenimage.jpg","disable_close_click":0,"disable_for_acidfree_gallery_lists":true,"disable_for_gallery_lists":1,"disable_resize":0,"disable_zoom":0,"display_image_size":"original","download_link_text":"","enable_acidfree_videos":true,"enable_contact":false,"enable_login":false,"enable_video":0,"fade_in_speed":400,"file_path":"\/(\\w\\w\/)public:\/","font_color":"000","force_show_nav":0,"iframe_border":1,"iframe_height":400,"iframe_width":600,"image_count":"\u30a4\u30e1\u30fc\u30b8 !current \/ !total","image_node_sizes":"()","keys_close":"c x 27","keys_next":"n 39","keys_play_pause":"32","keys_previous":"p 37","keys_zoom":"z","lite_press_x_close":"\u003Ckbd\u003Ex\u003C\/kbd\u003E \u3092\u62bc\u3059\u3068\u9589\u3058\u307e\u3059","loop_items":0,"loop_slides":false,"node_link_target":0,"node_link_text":"\u30a4\u30e1\u30fc\u30b8\u306e\u8a73\u7d30\u3092\u8868\u793a","overlay_color":"000","overlay_opacity":"0.8","page_count":"\u30da\u30fc\u30b8 !current \/ !total","pause_on_next_click":false,"pause_on_previous_click":true,"resize_sequence":0,"resize_speed":400,"rtl":"0","show_caption":1,"show_play_pause":true,"slide_down_speed":600,"slideshow_automatic_exit":true,"slideshow_automatic_start":true,"slideshow_interval":5000,"top_position":"","trigger_lightbox_classes":"","trigger_lightbox_group_classes":"","trigger_lightframe_classes":"","trigger_lightframe_group_classes":"","trigger_slideshow_classes":"","use_alt_layout":0,"useragent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko\/20100101 Firefox\/139.0","video_count":"\u30d3\u30c7\u30aa !current \/ !total"},"bancho_sbm":{"fb_init_obj":{"xfbml":false,"version":"v8.0"}},"bancho":{"breakpoints":{"mobile":"(max-width: 480px)","normal":"(min-width: 480px)"},"userInfo":{"uid":0},"nodeInfo":{"taxonomy_term":{"article_category":[{"tid":"4514"},{"tid":"4518"}],"article_corner":[{"tid":"5074"}],"article_flag":[{"tid":"12187"},{"tid":"12188"},{"tid":"12189"}],"article_tag":[{"tid":"27"},{"tid":"1389"},{"tid":"2742"},{"tid":"2776"},{"tid":"3199"},{"tid":"3311"},{"tid":"3477"}],"article_type":[{"tid":"4529"}]},"created":"1335870000","nid":"3525","nodeType":"article","isNodeBundleLayout":0,"status":1,"ad":0,"total_pages":3,"current_page":2,"canonical_url":"https:\/\/thinkit.co.jp\/story\/2012\/05\/01\/3525"},"defaultTheme":"bancho_theme_thinkit","activeTheme":"bancho_theme_thinkit","cssJsQueryString":"0","bancho_site_id":"thinkit","gaTrackingIds":{"main":"G-B8M4G7RJ1F","distribution":"G-M2NNT1B1PX","admin":"G-FHNT28HPFK"},"nodeContentSelectors":{"main":"[data-bancho-is-system-main-block] [data-bancho-node-body=\u00221\u0022]","alt":"[data-bancho-is-system-main-block]"},"statusMessageClasses":{"status":["messages","alert","alert-block","messages--status","alert--info"],"warning":["messages","alert","alert-block","messages--warning","alert--warning"],"error":["messages","alert","alert-block","messages--error","alert--danger"]}},"field_group":{"html_element":{"mode":"download_links","context":"view","settings":{"classes":"bancho-thinkit-file-download-links","show_empty_fields":false,"id":"","element":"div","show_label":false,"label_element":"h3","label_element_classes":"","attributes":"","effect":"none","speed":"fast","label_as_html":false}}},"bancho_filter_hilight_codes":{"show_copy_button":true,"show_line_numbers":true},"search_api_autocomplete":{"bancho_search":{"auto_submit":true}},"user":{"uid":0,"permissionsHash":"3802e4f9cbf3719cf7fbe5ea85b38473d83fd1a27e7f31cd328aa7af29191ceb"}}</script><script src="/sites/default/files/assets_optimized/js/js_Um14SgCAyyzkocnNwoT880HursNemc5RMkJmjReSLww.js?scope=footer&delta=0&language=ja&theme=bancho_theme_thinkit&include=eJx1T1sOwzAIu1A1zrFTRCShDRMNEaFSj7_skWn72AcSNha2kQE5bKIRZYlYU9GQdN-1wq2HbEdDCV5M3YWmYGVxslBYeCs-9Jk6_JJT-gRRT5jLPPS4wxqvlf2bGfOByVQkcM2c0NXGh7hE8ocJnU075XeQDhtVslEgqRG8Ql9WtX3phJZKwMYBD9fRrAk5wR_-Dj_Lapo"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=G-B8M4G7RJ1F"></script><script> const banchoCookieValue = function(key){ // クッキー処理で使うtrim関数を定義 const trim = function(s){ return String(s).replace(/^(\s+)|(\s+$)/g, ''); }; const cookies = document.cookie.split(';'); const cookie_len = cookies.length; let cookie for (let i=0; i < cookie_len; i++) { cookie = cookies[i].split('='); if (unescape(trim(cookie[0])) == key){ return unescape(trim(cookie[1])); } } return false; } const banchoDateFormat = function(){ return (new Date()) .toISOString() .replace( /(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d+)Z/, '$1 $2' ); } let banchoIsInsider = false; const banchoInsiderFlagName = 'site_insider_flag'; (function(){ // 内部関係者かどうか判断 // URL queryにfake_publishedを入れておくと、編集部アカウントでも非内部関係者扱い if ( !window.location.search.match(/fake_published/) && ( localStorage[banchoInsiderFlagName] == '1' || drupalSettings?.bancho?.userInfo?.insider ) ) { banchoIsInsider = true; if (localStorage[banchoInsiderFlagName] != '1') { localStorage[banchoInsiderFlagName] = '1'; } } })(); window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} // 念のためにclosure (function() { gtag('js', new Date()); const banchoGa4PropertyId = 'G-B8M4G7RJ1F'; const configObj = {}; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // DEBUG // 確認はGA4管理画面のプロパティのDebugViewから //configObj.debug_mode = true; //banchoIsInsider = false; //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// const ga4Main = function() { gtag('config', banchoGa4PropertyId, configObj); if (!banchoIsInsider) { const p = document.location.pathname; // /search以外の場合は、ふつうにトラッキング if (!p.match(/^\/search\/?/)) { gtag('event', 'page_view', { 'access_time': banchoDateFormat(), }); } // サイト内検索系は特別な処理なので注意 else { let matches; const noReultParameter = '&siteSearchCategory=no_results'; // Drupalのサイト内検索 if (matches = p.match(/^\/search\/site\/(.*)$/)) { // 検索結果があるかどうかで判断するのであとから実行 // ga()が使えなくなったのでgtagのcallbackを使う gtag('get', banchoGa4PropertyId, 'client_id', function(){ jQuery(document).ready(function(){ const trackPath = p + '?query=' + matches[1] + (jQuery('.apachesolr_search-results').length ? '' : noReultParameter); gtag('event', 'page_view', { 'page_location': trackPath, 'access_time': banchoDateFormat(), }); }); }); } // Google CSE else if (matches = p.match(/^\/search\/google\/(.*)$/)) { // 検索結果があるかどうかで判断するのであとから実行 // ga()が使えなくなったのでgtagのcallbackを使う gtag('get', banchoGa4PropertyId, 'client_id', function(){ jQuery(document).ready(setTimeout(function(){ const trackPath = p + '?query=' + matches[1] + (jQuery('.gs-no-results-result').length ? noReultParameter : ''); gtag('event', 'page_view', { 'page_location': trackPath, 'access_time': banchoDateFormat(), }); }, 2000)); }); } // ここには来ないはずだけどね else { gtag('event', 'page_view', { 'access_time': banchoDateFormat(), }); console.warn('GA4 page_view triggered unexpected page location'); } } } // 後からする処理をgaのキューに入れる // ga()が使えなくなったのでgtagのcallbackを使う gtag('get', banchoGa4PropertyId, 'client_id', function(v){ if (!banchoIsInsider) { jQuery(document).ready(function(){ if ('undefined' !== typeof(jQuery.scrollDepthGA4)) { // jquery-scrolldepth const scrollDepthOptions = { percentage: true, percentageTarget : 'body', percentageTargetAlt : '', pixelDepth: true, userTiming: true, nonInteraction: true, minHeight : 100, }; // IEフォロー try{ scrollDepthOptions.percentageTarget = drupalSettings?.bancho?.nodeContentSelectors?.main; scrollDepthOptions.percentageTargetAlt = drupalSettings?.bancho?.nodeContentSelectors?.alt; } catch (e) {} jQuery.scrollDepthGA4(scrollDepthOptions); } }); // https://github.com/GoogleChrome/web-vitals // https://codelabs.developers.google.com/codelabs/web-vitals-google-analytics-bigquery?hl=ja#4 const sendCWVToGa = function(metric) { const eventParams = { cwv_metric_name: metric.name, // cwv_metric_id: metric.id, cwv_metric_value: metric.value, cwv_metric_delta: metric.delta, }; gtag('event', 'WebVitals', eventParams); }; const cwvScript = document.createElement('script'); cwvScript.src = 'https://unpkg.com/web-vitals/dist/web-vitals.iife.js'; cwvScript.async = true; cwvScript.onload = function() { // 3指標以外にもメソッドが生えてたらやっとく [ 'getCLS', 'getFID', 'getLCP', 'getFCP', 'getTTFB' ].forEach(function(f) { if ('undefined' != typeof(webVitals[f])) { webVitals[f](sendCWVToGa); } }) } var documentHead = document.getElementsByTagName('head'); if (documentHead.length) { documentHead[0].appendChild(cwvScript); } (function() { const siteSpeedSampleRate = 100; const gaCookiename = '_ga'; // No need to edit anything after this line const shouldItBeTracked = function(siteSpeedSampleRate) { // If we don't pass a sample rate, default value is 1 if (!siteSpeedSampleRate) siteSpeedSampleRate = 1; // Generate a hashId from a String const hashId = function(a) { let b = 1, c; if (a) for ( b = 0, c = a.length - 1; 0 <= c; c-- ) { let d = a.charCodeAt(c); b = (b << 6 & 268435455) + d + (d << 14); d = b & 266338304; b = 0 != d ? b ^ d >> 21 : b } return b } const clientId = ('; ' + document.cookie).split('; '+gaCookiename+'=').pop().split(';').shift().split(/GA1\.[0-9]\./)[1]; if(!clientId) return !1; // If, for any reason the sample speed rate is higher than 100, let's keep it to a 100 max value const b = Math.min(siteSpeedSampleRate, 100); return hashId(clientId) % 100 >= b ? !1 : !0 } if (shouldItBeTracked(siteSpeedSampleRate)) { let pt = window.performance || window.webkitPerformance; pt = pt && pt.timing; if (!pt) return; if (pt.navigationStart === 0) return; let pt_loadEventStart; if (pt.loadEventStart === 0) { pt_loadEventStart = pt.navigationStart; } else { pt_loadEventStart = pt.loadEventStart; } const timingData = { "pagespeed_page_load_time": pt_loadEventStart - pt.navigationStart, "pagespeed_page_download_time": pt.responseEnd - pt.responseStart, "pagespeed_dns_time": pt.domainLookupEnd - pt.domainLookupStart, "pagespeed_redirect_response_time": pt.fetchStart - pt.navigationStart, "pagespeed_server_response_time": pt.responseStart - pt.requestStart, "pagespeed_tcp_connect_time": pt.connectEnd - pt.connectStart, "pagespeed_dom_interactive_time": pt.domInteractive - pt.navigationStart, "pagespeed_content_load_time": pt.domContentLoadedEventStart - pt.navigationStart }; // Sanity Checks if any value is negative abort if (Object.values(timingData).filter(function(e) { if (e < 0) return e; }).length > 0) return; gtag('event', 'performance_timing', timingData); } })(); } if (window.history && window.history.replaceState) { let // replaceStateするフラグ doReplaceState = false, // utm系queryStringの処理 url, queryString, hash, matches, domain, path; // utm系のリスト(+FBのやつも) const utms = { utm_source : true, utm_medium : true, utm_term : true, utm_content : true, utm_campaign : true, _gl: true, fb_action_ids : true, fb_action_types : true, fb_source : true, fbclid : true, action_object_map : true, action_type_map: true, action_ref_map: true }; // document.locationを使わずに自力でURL解析 url = document.location.toString(); if (matches = url.match(/(.+?)#(.+)/)) { url=matches[1]; hash=matches[2]; } if (matches = url.match(/(.+?)\?(.+)/)) { url=matches[1]; queryString=matches[2]; } // URLにquery stringがあれば、utm系の存在をチェック const queries = []; if (queryString) { queryString = queryString.split(/&/); for (var i =0; i < queryString.length; i++) { var param = queryString[i].split(/=/); if (typeof utms[param[0]] != 'undefined') { doReplaceState = true; } else { queries.push(queryString[i]); } } } if (doReplaceState) { // replaceState先の指定 if (queries.length){ url += '?' + queries.join("&"); } if (hash){ url += '#' + hash; } // replaceState setTimeout(function(){history.replaceState('', '', url);},1000); } } }); }; (function() { configObj.page_location = document.location.href; configObj.cookie_flags = 'SameSite=None;Secure'; configObj.send_page_view = false; (function(banchoIsInsider) { configObj.user_properties = configObj.user_properties || {}; configObj.user_properties.isInsider = banchoIsInsider; if (!banchoIsInsider) { if (!banchoCookieValue('_ga')) { configObj.user_properties.firstVisitReferrer = document.referrer; configObj.user_properties.firstVisitPagepath = location.pathname; } } })(banchoIsInsider); if (!banchoIsInsider) { const defineBanchoGa4EventTracking = function() { if ( ('undefined' == typeof(Drupal?.behaviors)) ) { return false; } Drupal.behaviors.banchoGa4EventTracking = { attach: function (context, settings) { // GA4用 if ('undefined' == typeof(gtag)){ return; } // サイト内URL判定用正規表現 const regExpInternal = new RegExp('^https?://'+location.hostname); // パスだけにする関数 const makeUrlToPath = function (url) { return url.replace(regExpInternal, ''); }; // 指定した要素からはじめて親に昇りながら最初にみつけたid属性を返す const getNearestIdAttr = function(obj) { if (obj == null) { return ''; } if (('undefined' != typeof(obj.id)) && obj.id) { return obj.id; } if ('undefined' == typeof(obj.parentNode)){ return ''; } return getNearestIdAttr(obj.parentNode); }; // 指定した要素の属性を全部使ってCSSセレクタ文字列を作って、 // データでどこのクリックか判別できるようにする const buildSelectorStringFromAllAttributes = function(element) { if (!(element instanceof Element)) { return ''; } const tagName = element.tagName.toLowerCase(); const selector = [...element.attributes] // id → class → その他の順でソート .sort((a, b) => { const priority = { id: 0, class: 1, }; return ( (priority[a.name] ?? 2) - (priority[b.name] ?? 2) || a.name.localeCompare(b.name) ); }) // idは`#`、classは`.`、その他は`[name="value"]`の形に変換 .map(attr => { switch (attr.name) { case 'id': return `#${CSS.escape(attr.value)}`; case 'class': return attr.value .trim() .split(/\s+/) .map(cls => `.${CSS.escape(cls)}`) .join(''); default: return `[${attr.name}="${CSS.escape(attr.value)}"]`; } }) // 全部連結して .join(''); // 要素名 + 連結した属性文字列を返す return tagName + selector; }; // クリックイベント用関数 // javascript:プロトコルとかもスルーせずに記録してる const linkClickHandler = function(evt){try{ const linkUrl = this.href, eventParams = {}; // ページ内リンク if (-1 != linkUrl.indexOf(String(location.href.replace(/#.*$/,''))+'#')){ eventParams.link_type = 'inPage'; eventParams.link_destination_url = makeUrlToPath(linkUrl); } // サイト内リンク else if (linkUrl.match(regExpInternal)){ eventParams.link_type = 'internal'; eventParams.link_destination_url = makeUrlToPath(linkUrl); } // その他(外部サイト) else{ eventParams.link_type = 'external'; eventParams.link_destination_url = this.href; eventParams.link_destination_origin = linkUrl.replace(/^((?:[^:]+:)?\/\/[^\/]+)..*$/, '$1'); } eventParams.link_clicked_at = location.href + '#' + getNearestIdAttr(this); eventParams.access_time = banchoDateFormat(); // ビーコン送信 gtag('event', 'link_click', eventParams); }catch(e){console.log(e);}}; // 各a要素にバインド jQuery("a", context).each(function(){ if (this.href && !this.getAttribute('data-bancho-ga4-link-bound')){ this.setAttribute('data-bancho-ga4-link-bound', '1'); jQuery(this).click(linkClickHandler); } }); // 非a要素(button / .jsToggle)のクリックイベント用関数 const buttonClickHandler = function(evt){try{ const eventParams = {}; eventParams.link_type = 'button'; eventParams.link_destination_url = ''; // ホントは#でつなげるのはおかしいんだけど、ほかに良い区切りがない。 // `#`だけだとログみたら微妙に紛らわしかったので`#!`にした。 eventParams.link_clicked_at = location.href + '#!' + buildSelectorStringFromAllAttributes(this); eventParams.access_time = banchoDateFormat(); // ビーコン送信 gtag('event', 'link_click', eventParams); }catch(e){console.log(e);}}; // 各button / .js-toggle要素にバインド jQuery("button, .js-toggle", context).each(function(){ if (!this.getAttribute('data-bancho-ga4-link-bound')){ this.setAttribute('data-bancho-ga4-link-bound', '1'); jQuery(this).click(buttonClickHandler); } }); // フォーム送信イベント用関数 const formSubmitHandler = function(evt){try{ const linkUrl = this.action, eventParams = {}; eventParams.link_destination_origin = linkUrl.replace(/^((?:[^:]+:)?\/\/[^\/]+)..*$/, '$1'); eventParams.link_destination_url = linkUrl.replace(regExpInternal, ''); eventParams.link_clicked_at = location.href + '#' + getNearestIdAttr(this); eventParams.access_time = banchoDateFormat(); // ビーコン使えないブラウザ向け if ('undefined' == typeof(navigator.sendBeacon)) { evt.preventDefault(); // タイムアウト処理含めてhitCallback設定 // https://developers.google.com/analytics/devguides/collection/analyticsjs/sending-hits?hl=ja#handling_timeouts // https://www.58bits.com/blog/2021/03/05/google-analytics-4-custom-events-and-parameters-gtagjs eventParams.event_callback = function (cb, optTimeout) { var called = false; function fn() { if (!called) { called = true; cb(); } } setTimeout(fn, optTimeout || 1000); return fn; }(function(){evt.target.submit();}, 2000); } // ビーコン送信 gtag('event', 'form_submit', eventParams); }catch(e){console.log(e);}}; // 各form要素にバインド jQuery("form", context).each(function(){ if (this.action && !this.getAttribute('data-bancho-ga4-form-bound')){ this.setAttribute('data-bancho-ga4-form-bound', '1'); jQuery(this).submit(formSubmitHandler); } }); } // /attach() }; // /Drupal.behaviors.banchoGa4EventTracking return true; }; // behavior定義がDrupal初回attach後でも動くように手動で実行。 const runBanchoGa4EventTracking = function() { if ( ('undefined' == typeof(Drupal?.behaviors?.banchoGa4EventTracking)) ) { return; } Drupal.behaviors.banchoGa4EventTracking.attach( document, ('undefined' == typeof(drupalSettings)) ? {} : drupalSettings ); }; if (defineBanchoGa4EventTracking()) { runBanchoGa4EventTracking(); } else if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function() { defineBanchoGa4EventTracking(); runBanchoGa4EventTracking(); }); } else { // DOMContentLoaded後にここへ来た場合も、定義できるなら即実行。 if (defineBanchoGa4EventTracking()) { runBanchoGa4EventTracking(); } } } // /!banchoIsInsider (function() { if ('undefined' == typeof(window.impress_id_is_login_callback)) { window.impress_id_is_login_callback = function(json) { try { if (json && json.impress_id_hash) { const hash = json.impress_id_hash; configObj.user_id = hash; configObj.impress_id_hash = hash; configObj.user_properties = configObj.user_properties || {}; configObj.user_properties.impress_id_hash = hash; } } catch (e) { console.log(e); } ga4Main(); }; const iidScrId = 'bm-id-link'; if (!document.querySelector('#'+iidScrId)) { const iidScrElem = document.createElement('script'); iidScrElem.src = 'https://bm-id-link.impress.co.jp/is_login.js'; iidScrElem.async = true; iidScrElem.id = iidScrId; ['error'].forEach(function(evtType){ iidScrElem.addEventListener(evtType, function(evt) { console.warn('impress_id_is_login_callback element ' + evtType + ', triggering callback automatically.'); window.impress_id_is_login_callback(); }); }); document.head.appendChild(iidScrElem); } } })(); })(); })(); </script><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-M63V4ZF');</script><div id="fb-root"></div><script async defer crossorigin="anonymous" src="https://connect.facebook.net/ja_JP/sdk.js"></script><script>window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.defer=true; js.async=true; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script type="application/ld+json" data-source-module="bancho_common"> {"@context": "http://schema.org/","@type": "Organization","url": "https://thinkit.co.jp/","name": "Think IT(シンクイット)","logo": "https://thinkit.co.jp/themes/custom/bancho_theme_thinkit/logo.png" } </script><script type="application/ld+json" data-source-module="bancho_common"> {"@context": "http://schema.org/","@type": "WebSite","url": "https://thinkit.co.jp/","name": "Think IT(シンクイット)","alternateName": ["Think IT"] } </script><script type="application/ld+json" data-source-module="bancho_common">{"@context": "http://schema.org","@type": "Article","mainEntityOfPage": "https://thinkit.co.jp/story/2012/05/01/3525","headline": "翻訳と、facebookへの投稿処理の実装","datePublished": "2012-05-01T20:00:00+09:00","dateModified": "2016-10-07T18:44:17+09:00","publisher": {"@type": "Organization","name": "Think IT(シンクイット)","logo": {"@type": "ImageObject","url": "https://thinkit.co.jp/themes/custom/bancho_theme_thinkit/logo.png","width": 176,"height": 72}},"author": [{"@type": "Person","name": "PROJECT KySS","url": "https://thinkit.co.jp/author/40"}],"image": [{"@type": "ImageObject","url": "https://thinkit.co.jp/sites/default/files/styles/google_news/public/main_images/3525_main_7.png?itok=iWTpBGPe","width": 1248,"height": 702},{"@type": "ImageObject","url": "https://thinkit.co.jp/sites/default/files/main_images/3525_main_7.png","width": 90,"height": 90}],"description": "前回は、マーケットプレイスで無料公開している、俳句・川柳アプリ「一日一句 投稿対応版 Ver.1.0」の実装内容について解説しました。今回と次回では、プログラムについて解説します。プロジェクト一式は、こちらからダウンロードできます。 →「一日一句 投稿対応版 Ver.1.0」プロジェクトファイル(" }</script><script type="application/ld+json" data-source-module="bancho_common">{"@context": "http://schema.org","@type": "WebPage","url": "https://thinkit.co.jp/story/2012/05/01/3525","primaryImageOfPage": {"@type": "ImageObject","url": "https://thinkit.co.jp/sites/default/files/styles/google_news/public/main_images/3525_main_7.png?itok=iWTpBGPe","width": 1248,"height": 702} }</script><script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" crossorigin="anonymous"></script></body></html>